diff --git a/extras/build_src.sh b/extras/build_src.sh index da5b75d20b..a9e3262afd 100755 --- a/extras/build_src.sh +++ b/extras/build_src.sh @@ -24,7 +24,7 @@ cd $CODEHOME && tar zcvf $RPMHOME/SOURCES/pandorafms_server-$LOCAL_VERSION.tar.g cd $CODEHOME/pandora_agents/shellscript && tar zcvf $RPMHOME/SOURCES/pandorafms_agent-$LOCAL_VERSION.tar.gz --exclude \.exe --exclude \.svn --exclude nohup linux || exit 1 # Unix agent -cd $CODEHOME/pandora_agents && tar zvcf $RPMHOME/SOURCES/pandorafms_agent_unix-$LOCAL_VERSION.tar.gz --exclude \.exe --exclude \.svn --exclude nohup --exclude NT4 --exclude Darwin/dmg unix || exit 1 +cd $CODEHOME/pandora_agents && tar zvcf $RPMHOME/SOURCES/pandorafms_agent_linux-$LOCAL_VERSION.tar.gz --exclude \.exe --exclude \.svn --exclude nohup --exclude NT4 --exclude Darwin/dmg unix || exit 1 # Enterprise console cd $PANDHOME_ENT/pandora_console && tar zcvf $RPMHOME/SOURCES/pandorafms_console_enterprise-$LOCAL_VERSION.tar.gz --exclude \.exe --exclude \.svn enterprise/* || exit 1 @@ -37,7 +37,7 @@ if [ "$1" == "nightly" ]; then ln -s $RPMHOME/SOURCES/pandorafms_console-$LOCAL_VERSION.tar.gz $RPMHOME/SOURCES/pandorafms_console-$VERSION.tar.gz || exit 1 ln -s $RPMHOME/SOURCES/pandorafms_server-$LOCAL_VERSION.tar.gz $RPMHOME/SOURCES/pandorafms_server-$VERSION.tar.gz || exit 1 ln -s $RPMHOME/SOURCES/pandorafms_agent-$LOCAL_VERSION.tar.gz $RPMHOME/SOURCES/pandorafms_agent-$VERSION.tar.gz || exit 1 - ln -s $RPMHOME/SOURCES/pandorafms_agent_unix-$LOCAL_VERSION.tar.gz $RPMHOME/SOURCES/pandorafms_agent_unix-$VERSION.tar.gz || exit 1 + ln -s $RPMHOME/SOURCES/pandorafms_agent_linux-$LOCAL_VERSION.tar.gz $RPMHOME/SOURCES/pandorafms_agent_linux-$VERSION.tar.gz || exit 1 ln -s $RPMHOME/SOURCES/pandorafms_console_enterprise-$LOCAL_VERSION.tar.gz $RPMHOME/SOURCES/pandorafms_console_enterprise-$VERSION.tar.gz || exit 1 ln -s $RPMHOME/SOURCES/pandorafms_server_enterprise-$LOCAL_VERSION.tar.gz $RPMHOME/SOURCES/pandorafms_server_enterprise-$VERSION.tar.gz || exit 1 fi diff --git a/extras/deploy-scripts/deploy_ext_database_el8.sh b/extras/deploy-scripts/deploy_ext_database_el8.sh new file mode 100644 index 0000000000..422887b0e2 --- /dev/null +++ b/extras/deploy-scripts/deploy_ext_database_el8.sh @@ -0,0 +1,320 @@ +#!/bin/bash +####################################################### +# PandoraFMS Community online installation script +####################################################### +## Tested versions ## +# Centos 8.4, 8.5 +# Rocky 8.4, 8.5, 8.6, 8.7 +# Almalinuz 8.4, 8.5 +# RedHat 8.5 + +#Constants +S_VERSION='202302081' +LOGFILE="/tmp/deploy-ext-db-$(date +%F).log" + + +# define default variables +[ "$TZ" ] || TZ="Europe/Madrid" +[ "$MYVER" ] || MYVER=57 +[ "$DBHOST" ] || DBHOST=127.0.0.1 +[ "$DBNAME" ] || DBNAME=pandora +[ "$DBUSER" ] || DBUSER=pandora +[ "$DBPASS" ] || DBPASS=pandora +[ "$DBPORT" ] || DBPORT=3306 +[ "$DBROOTUSER" ] || DBROOTUSER=root +[ "$DBROOTPASS" ] || DBROOTPASS=pandora +[ "$SKIP_DATABASE_INSTALL" ] || SKIP_DATABASE_INSTALL=0 +[ "$SKIP_KERNEL_OPTIMIZATIONS" ] || SKIP_KERNEL_OPTIMIZATIONS=0 +[ "$POOL_SIZE" ] || POOL_SIZE=$(grep -i total /proc/meminfo | head -1 | awk '{printf "%.2f \n", $(NF-1)*0.4/1024}' | sed "s/\\..*$/M/g") + +# Ansi color code variables +red="\e[0;91m" +green="\e[0;92m" +cyan="\e[0;36m" +reset="\e[0m" + +# Functions +execute_cmd () { + local cmd="$1" + local msg="$2" + + echo -e "${cyan}$msg...${reset}" + $cmd &>> "$LOGFILE" + if [ $? -ne 0 ]; then + echo -e "${red}Fail${reset}" + [ "$3" ] && echo "$3" + echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE" + rm -rf "$HOME"/pandora_deploy_tmp &>> "$LOGFILE" + exit 1 + else + echo -e "\e[1A\e ${cyan}$msg...${reset} ${green}OK${reset}" + return 0 + fi +} + +check_cmd_status () { + if [ $? -ne 0 ]; then + echo -e "${red}Fail${reset}" + [ "$1" ] && echo "$1" + echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE" + rm -rf "$HOME"/pandora_deploy_tmp/*.rpm* &>> "$LOGFILE" + exit 1 + else + echo -e "${green}OK${reset}" + return 0 + fi +} + +check_root_permissions () { + echo -en "${cyan}Checking root account... ${reset}" + if [ "$(whoami)" != "root" ]; then + echo -e "${red}Fail${reset}" + echo "Please use a root account or sudo for installing Pandora FMS" + echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE" + exit 1 + + else + echo -e "${green}OK${reset}" + fi +} + +## Main +echo "Starting PandoraFMS External DB deployment EL8 ver. $S_VERSION" + +# Centos Version +if [ ! "$(grep -Ei 'centos|rocky|Almalinux|Red Hat Enterprise' /etc/redhat-release)" ]; then + printf "\n ${red}Error this is not a Centos/Rocky/Almalinux Base system, this installer is compatible with RHEL/Almalinux/Centos/Rockylinux systems only${reset}\n" + exit 1 +fi + + +echo -en "${cyan}Check Centos Version...${reset}" +[ $(sed -nr 's/VERSION_ID+=\s*"([0-9]).*"$/\1/p' /etc/os-release) -eq '8' ] +check_cmd_status 'Error OS version, RHEL/Almalinux/Centos/Rockylinux 8+ is expected' + +#Detect OS +os_name=$(grep ^PRETTY_NAME= /etc/os-release | cut -d '=' -f2 | tr -d '"') +execute_cmd "echo $os_name" "OS detected: ${os_name}" + +# initialice logfile +execute_cmd "echo 'Starting community deployment' > $LOGFILE" "All installer activity is logged on $LOGFILE" +echo "Community installer version: $S_VERSION" >> "$LOGFILE" + +# Pre checks +# Root permisions +check_root_permissions + +# Systemd +execute_cmd "systemctl status" "Checking SystemD" 'This is not a SystemD enable system, if tryng to use in a docker env please check: https://github.com/pandorafms/pandorafms/tree/develop/extras/docker/centos8' + +# Check memomry greather or equal to 2G +execute_cmd "[ $(grep MemTotal /proc/meminfo | awk '{print $2}') -ge 1700000 ]" 'Checking memory (required: 2 GB)' + +# Check disk size at least 10 Gb free space +execute_cmd "[ $(df -BM / | tail -1 | awk '{print $4}' | tr -d M) -gt 10000 ]" 'Checking Disk (required: 10 GB free min)' + +# Setting timezone +rm -rf /etc/localtime &>> "$LOGFILE" +execute_cmd "timedatectl set-timezone $TZ" "Setting Timezone $TZ" + +# Execute tools check +execute_cmd "awk --version" 'Checking needed tools: awk' +execute_cmd "grep --version" 'Checking needed tools: grep' +execute_cmd "sed --version" 'Checking needed tools: sed' +execute_cmd "dnf --version" 'Checking needed tools: dnf' + +# Creating working directory +rm -rf "$HOME"/pandora_deploy_tmp/*.rpm* &>> "$LOGFILE" +mkdir "$HOME"/pandora_deploy_tmp &>> "$LOGFILE" +execute_cmd "cd $HOME/pandora_deploy_tmp" "Moving to workspace: $HOME/pandora_deploy_tmp" + +## Extra steps on redhat envs +if [ "$(grep -Ei 'Red Hat Enterprise' /etc/redhat-release)" ]; then + ## In case REDHAT + # Check susbscription manager status: + echo -en "${cyan}Checking Red Hat Enterprise subscription... ${reset}" + subscription-manager list &>> "$LOGFILE" + subscription-manager status &>> "$LOGFILE" + check_cmd_status 'Error checking subscription status, make sure your server is activated and suscribed to Red Hat Enterprise repositories' + + # Ckeck repolist + dnf repolist &>> "$LOGFILE" + echo -en "${cyan}Checking Red Hat Enterprise repolist... ${reset}" + dnf repolist | grep 'rhel-8-for-x86_64-baseos-rpms' &>> "$LOGFILE" + check_cmd_status 'Error checking repositories status, could try a subscription-manager attach command or contact sysadmin' + + #install extra repos + extra_repos=" \ + tar \ + dnf-utils \ + https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm \ + https://repo.percona.com/yum/percona-release-latest.noarch.rpm" + + execute_cmd "dnf install -y $extra_repos" "Installing extra repositories" + execute_cmd "subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms" "Enabling subscription to codeready-builder" +else + # For alma/rocky/centos + extra_repos=" \ + tar \ + dnf-utils \ + epel-release \ + https://repo.percona.com/yum/percona-release-latest.noarch.rpm" + + execute_cmd "dnf install -y $extra_repos" "Installing extra repositories" + execute_cmd "dnf config-manager --set-enabled powertools" "Configuring Powertools" +fi + + +#Installing wget +execute_cmd "dnf install -y wget" "Installing wget" + + +# Install percona Database +execute_cmd "dnf module disable -y mysql" "Disabiling mysql module" + +if [ "$MYVER" -eq '80' ] ; then + execute_cmd "percona-release setup ps80 -y" "Enabling mysql80 module" + execute_cmd "dnf install -y percona-server-server percona-xtrabackup-24" "Installing Percona Server 80" +fi + +if [ "$MYVER" -ne '80' ] ; then + execute_cmd "dnf install -y Percona-Server-server-57 percona-xtrabackup-24" "Installing Percona Server 57" +fi + +# Disabling SELINUX and firewalld +setenforce 0 &>> "$LOGFILE" +sed -i -e "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config &>> "$LOGFILE" +systemctl disable firewalld --now &>> "$LOGFILE" + +# Adding standar cnf for initial setup. +cat > /etc/my.cnf << EO_CONFIG_TMP +[mysqld] +datadir=/var/lib/mysql +socket=/var/lib/mysql/mysql.sock +symbolic-links=0 +log-error=/var/log/mysqld.log +pid-file=/var/run/mysqld/mysqld.pid +EO_CONFIG_TMP + +#Configuring Database +if [ "$SKIP_DATABASE_INSTALL" -eq '0' ] ; then + execute_cmd "systemctl start mysqld" "Starting database engine" + export MYSQL_PWD=$(grep "temporary password" /var/log/mysqld.log | rev | cut -d' ' -f1 | rev) + if [ "$MYVER" -eq '80' ] ; then + echo """ + SET PASSWORD FOR '$DBROOTUSER'@'localhost' = 'Pandor4!'; + UNINSTALL COMPONENT 'file://component_validate_password'; + SET PASSWORD FOR '$DBROOTUSER'@'localhost' = '$DBROOTPASS'; + """ | mysql --connect-expired-password -u$DBROOTUSER &>> "$LOGFILE" + fi + + if [ "$MYVER" -ne '80' ] ; then + echo """ + SET PASSWORD FOR '$DBROOTUSER'@'localhost' = PASSWORD('Pandor4!'); + UNINSTALL PLUGIN validate_password; + SET PASSWORD FOR '$DBROOTUSER'@'localhost' = PASSWORD('$DBROOTPASS'); + """ | mysql --connect-expired-password -u$DBROOTUSER &>> "$LOGFILE"fi + fi + + export MYSQL_PWD=$DBROOTPASS + echo -en "${cyan}Creating Pandora FMS database...${reset}" + echo "create database $DBNAME" | mysql -u$DBROOTUSER -P$DBPORT -h$DBHOST + check_cmd_status "Error creating database $DBNAME, is this an empty node? if you have a previus installation please contact with support." + + echo "CREATE USER \"$DBUSER\"@'%' IDENTIFIED BY \"$DBPASS\";" | mysql -u$DBROOTUSER -P$DBPORT -h$DBHOST + echo "ALTER USER \"$DBUSER\"@'%' IDENTIFIED WITH mysql_native_password BY \"$DBPASS\"" | mysql -u$DBROOTUSER -P$DBPORT -h$DBHOST + echo "GRANT ALL PRIVILEGES ON $DBNAME.* TO \"$DBUSER\"@'%'" | mysql -u$DBROOTUSER -P$DBPORT -h$DBHOST + +#Generating my.cnf +cat > /etc/my.cnf << EO_CONFIG_F +[mysqld] +datadir=/var/lib/mysql +socket=/var/lib/mysql/mysql.sock +user=mysql +character-set-server=utf8 +skip-character-set-client-handshake +# Disabling symbolic-links is recommended to prevent assorted security risks +symbolic-links=0 +# Mysql optimizations for Pandora FMS +# Please check the documentation in http://pandorafms.com for better results + +max_allowed_packet = 64M +innodb_buffer_pool_size = $POOL_SIZE +innodb_lock_wait_timeout = 90 +innodb_file_per_table +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 +thread_cache_size = 8 +thread_stack = 256K +max_connections = 100 + +key_buffer_size=4M +read_buffer_size=128K +read_rnd_buffer_size=128K +sort_buffer_size=128K +join_buffer_size=4M + +query_cache_type = 1 +query_cache_size = 64M +query_cache_min_res_unit = 2k +query_cache_limit = 256K + +#skip-log-bin + +sql_mode="" + +[mysqld_safe] +log-error=/var/log/mysqld.log +pid-file=/var/run/mysqld/mysqld.pid + +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 + fi + + execute_cmd "systemctl restart mysqld" "Configuring database engine" + execute_cmd "systemctl enable mysqld --now" "Enabling Database service" +fi +export MYSQL_PWD=$DBPASS + + +# Kernel optimization + +if [ "$SKIP_KERNEL_OPTIMIZATIONS" -eq '0' ] ; then +cat >> /etc/sysctl.conf < /dev/null # remove last log before start + +# define default variables +[ "$TZ" ] || TZ="Europe/Madrid" +[ "$DBHOST" ] || DBHOST=127.0.0.1 +[ "$DBNAME" ] || DBNAME=pandora +[ "$DBUSER" ] || DBUSER=pandora +[ "$DBPASS" ] || DBPASS=pandora +[ "$DBPORT" ] || DBPORT=3306 +[ "$DBROOTPASS" ] || DBROOTPASS=pandora +[ "$SKIP_DATABASE_INSTALL" ] || SKIP_DATABASE_INSTALL=0 +[ "$SKIP_KERNEL_OPTIMIZATIONS" ] || SKIP_KERNEL_OPTIMIZATIONS=0 +[ "$POOL_SIZE" ] || POOL_SIZE=$(grep -i total /proc/meminfo | head -1 | awk '{printf "%.2f \n", $(NF-1)*0.4/1024}' | sed "s/\\..*$/M/g") + + +# Ansi color code variables +red="\e[0;91m" +green="\e[0;92m" +cyan="\e[0;36m" +reset="\e[0m" + +# Functions + +execute_cmd () { + local cmd="$1" + local msg="$2" + + echo -e "${cyan}$msg...${reset}" + $cmd &>> "$LOGFILE" + if [ $? -ne 0 ]; then + echo -e "${red}Fail${reset}" + [ "$3" ] && echo "$3" + echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE" + rm -rf "$WORKDIR" &>> "$LOGFILE" + exit 1 + else + echo -e "\e[1A\e ${cyan}$msg...${reset} ${green}OK${reset}" + return 0 + fi +} + +check_cmd_status () { + if [ $? -ne 0 ]; then + echo -e "${red}Fail${reset}" + [ "$1" ] && echo "$1" + echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE" + rm -rf "$WORKDIR" &>> "$LOGFILE" + exit 1 + else + echo -e "${green}OK${reset}" + return 0 + fi +} + +check_root_permissions () { + echo -en "${cyan}Checking root account... ${reset}" + if [ "$(whoami)" != "root" ]; then + echo -e "${red}Fail${reset}" + echo "Please use a root account or sudo for installing Pandora FMS" + echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE" + exit 1 + + else + echo -e "${green}OK${reset}" + fi +} + +## Main +echo "Starting PandoraFMS External DB deployment Ubuntu 22.04 ver. $S_VERSION" + +# Ubuntu Version +if [ ! "$(grep -Ei 'Ubuntu' /etc/lsb-release)" ]; then + printf "\n ${red}Error this is not a Ubuntu system, this installer is compatible with Ubuntu systems only${reset}\n" + exit 1 +fi + + +echo -en "${cyan}Check Ubuntu Version...${reset}" +[ $(sed -nr 's/VERSION_ID+=\s*"([0-9][0-9].[0-9][0-9])"$/\1/p' /etc/os-release) == "22.04" ] +check_cmd_status 'Error OS version, Ubuntu 22.04 is expected' + +#Detect OS +os_name=$(grep ^PRETTY_NAME= /etc/os-release | cut -d '=' -f2 | tr -d '"') +execute_cmd "echo $os_name" "OS detected: ${os_name}" + +# initialice logfile +execute_cmd "echo 'Starting community deployment' > $LOGFILE" "All installer activity is logged on $LOGFILE" +echo "Community installer version: $S_VERSION" >> "$LOGFILE" + +# Pre checks +# Root permisions +check_root_permissions + +#Install awk, sed, grep if not present +execute_cmd "apt install -y gawk sed grep" 'Installing needed tools' + +# Systemd +execute_cmd "systemctl --version" "Checking SystemD" 'This is not a SystemD enable system, if tryng to use in a docker env please check: https://github.com/pandorafms/pandorafms/tree/develop/extras/docker/centos8' + +# Check memomry greather or equal to 2G +execute_cmd "[ $(grep MemTotal /proc/meminfo | awk '{print $2}') -ge 1700000 ]" 'Checking memory (required: 2 GB)' + +# Check disk size at least 10 Gb free space +execute_cmd "[ $(df -BM / | tail -1 | awk '{print $4}' | tr -d M) -gt 10000 ]" 'Checking Disk (required: 10 GB free min)' + +# Setting timezone +rm -rf /etc/localtime &>> "$LOGFILE" +execute_cmd "timedatectl set-timezone $TZ" "Setting Timezone $TZ" + +# Execute tools check +execute_cmd "awk --version" 'Checking needed tools: awk' +execute_cmd "grep --version" 'Checking needed tools: grep' +execute_cmd "sed --version" 'Checking needed tools: sed' +execute_cmd "apt --version" 'Checking needed tools: apt' + +# Creating working directory +rm -rf "$WORKDIR" &>> "$LOGFILE" +mkdir -p "$WORKDIR" &>> "$LOGFILE" +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" + +# Disabling apparmor and ufw +systemctl stop ufw.service &>> "$LOGFILE" +systemctl disable ufw &>> "$LOGFILE" +systemctl stop apparmor &>> "$LOGFILE" +systemctl disable apparmor &>> "$LOGFILE" + +#install mysql +execute_cmd "curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb" "Downloading Percona repository for MySQL8" +execute_cmd "apt install -y gnupg2 lsb-release ./percona-release_latest.generic_all.deb" "Installing Percona repository for MySQL8" +execute_cmd "percona-release setup ps80" "Configuring Percona repository for MySQL8" + +echo -en "${cyan}Installing Percona Server for MySQL8...${reset}" + env DEBIAN_FRONTEND=noninteractive apt install -y percona-server-server &>> "$LOGFILE" +check_cmd_status "Error Installing MySql Server" + +#Configuring Database +if [ "$SKIP_DATABASE_INSTALL" -eq '0' ] ; then + execute_cmd "systemctl start mysql" "Starting database engine" + + echo """ + ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$DBROOTPASS'; + """ | mysql -uroot &>> "$LOGFILE" + + export MYSQL_PWD=$DBROOTPASS + echo -en "${cyan}Creating Pandora FMS database...${reset}" + echo "create database $DBNAME" | mysql -uroot -P$DBPORT -h$DBHOST + check_cmd_status "Error creating database $DBNAME, is this an empty node? if you have a previus installation please contact with support." + + echo "CREATE USER \"$DBUSER\"@'%' IDENTIFIED BY \"$DBPASS\";" | mysql -uroot -P$DBPORT -h$DBHOST + echo "ALTER USER \"$DBUSER\"@'%' IDENTIFIED WITH mysql_native_password BY \"$DBPASS\"" | mysql -uroot -P$DBPORT -h$DBHOST + echo "GRANT ALL PRIVILEGES ON $DBNAME.* TO \"$DBUSER\"@'%'" | mysql -uroot -P$DBPORT -h$DBHOST +fi +export MYSQL_PWD=$DBPASS + +#Generating my.cnf +cat > /etc/mysql/my.cnf << EOF_DB +[mysqld] +datadir=/var/lib/mysql +user=mysql +character-set-server=utf8 +skip-character-set-client-handshake +# Disabling symbolic-links is recommended to prevent assorted security risks +symbolic-links=0 +# Mysql optimizations for Pandora FMS +# Please check the documentation in http://pandorafms.com for better results + +max_allowed_packet = 64M +innodb_buffer_pool_size = $POOL_SIZE +innodb_lock_wait_timeout = 90 +innodb_file_per_table +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 +thread_cache_size = 8 +thread_stack = 256K +max_connections = 100 + +key_buffer_size=4M +read_buffer_size=128K +read_rnd_buffer_size=128K +sort_buffer_size=128K +join_buffer_size=4M + +skip-log-bin + +sql_mode="" + +log-error=/var/log/mysql/error.log +[mysqld_safe] +log-error=/var/log/mysqld.log +pid-file=/var/run/mysqld/mysqld.pid + +EOF_DB + +execute_cmd "systemctl restart mysql" "Configuring and restarting database engine" + +# Kernel optimization +if [ "$SKIP_KERNEL_OPTIMIZATIONS" -eq '0' ] ; then +cat >> /etc/sysctl.conf <> $LOGFILE + $package_manager_cmd install -y http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_agent_linux-7.0NG.noarch.rpm &>> $LOGFILE echo -en "${cyan}Installing Pandora FMS agent...${reset}" check_cmd_status 'Error installing Pandora FMS agent' @@ -151,8 +151,8 @@ fi if [[ $OS_RELEASE == 'debian' ]]; then execute_cmd "apt update" 'Updating repos' execute_cmd "apt install -y perl wget curl unzip procps python3 python3-pip" 'Installing agent dependencies' - execute_cmd 'wget http://firefly.artica.es/pandorafms/latest/Debian_Ubuntu/pandorafms.agent_unix_7.0NG.deb' 'Downloading Pandora FMS agent dependencies' - execute_cmd 'apt install -y ./pandorafms.agent_unix_7.0NG.deb' 'Installing Pandora FMS agent' + execute_cmd 'wget http://firefly.artica.es/pandorafms/latest/Debian_Ubuntu/pandorafms.agent_linux_7.0NG.deb' 'Downloading Pandora FMS agent dependencies' + execute_cmd 'apt install -y ./pandorafms.agent_linux_7.0NG.deb' 'Installing Pandora FMS agent' fi # Configuring Agente diff --git a/extras/deploy-scripts/pandora_deploy_community.sh b/extras/deploy-scripts/pandora_deploy_community.sh index fe4af3d924..873b9a3068 100644 --- a/extras/deploy-scripts/pandora_deploy_community.sh +++ b/extras/deploy-scripts/pandora_deploy_community.sh @@ -258,6 +258,7 @@ console_dependencies=" \ mod_ssl \ libzstd \ openldap-clients \ + chromium \ http://firefly.artica.es/centos8/phantomjs-2.1.1-1.el7.x86_64.rpm" execute_cmd "yum install -y $console_dependencies" "Installing Pandora FMS Console dependencies" @@ -284,11 +285,16 @@ server_dependencies=" \ java \ bind-utils \ whois \ + cpanminus \ http://firefly.artica.es/centos7/xprobe2-0.3-12.2.x86_64.rpm \ http://firefly.artica.es/centos7/wmic-1.4-1.el7.x86_64.rpm \ https://firefly.artica.es/centos7/pandorawmic-1.0.0-1.x86_64.rpm" execute_cmd "yum install -y $server_dependencies" "Installing Pandora FMS Server dependencies" +# install cpan dependencies +execute_cmd "cpanm -i Thread::Semaphore" "Installing Thread::Semaphore" + + # SDK VMware perl dependencies vmware_dependencies=" \ http://firefly.artica.es/centos8/VMware-vSphere-Perl-SDK-6.5.0-4566394.x86_64.rpm \ @@ -409,17 +415,17 @@ execute_cmd "systemctl restart mysqld" "Configuring database engine" if [ "$PANDORA_BETA" -eq '0' ] ; then [ "$PANDORA_SERVER_PACKAGE" ] || PANDORA_SERVER_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_server-7.0NG.noarch.rpm" [ "$PANDORA_CONSOLE_PACKAGE" ] || PANDORA_CONSOLE_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_console-7.0NG.noarch.rpm" - [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_agent_unix-7.0NG.noarch.rpm" + [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_agent_linux-7.0NG.noarch.rpm" elif [ "$PANDORA_BETA" -ne '0' ] ; then [ "$PANDORA_SERVER_PACKAGE" ] || PANDORA_SERVER_PACKAGE="http://firefly.artica.es/pandora_enterprise_nightlies/pandorafms_server-latest.x86_64.rpm" [ "$PANDORA_CONSOLE_PACKAGE" ] || PANDORA_CONSOLE_PACKAGE="https://pandorafms.com/community/community-console-rpm-beta/" - [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_agent_unix-7.0NG.noarch.rpm" + [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_agent_linux-7.0NG.noarch.rpm" fi # Downloading Pandora Packages execute_cmd "curl -LSs --output pandorafms_server-7.0NG.noarch.rpm ${PANDORA_SERVER_PACKAGE}" "Downloading Pandora FMS Server community" execute_cmd "curl -LSs --output pandorafms_console-7.0NG.noarch.rpm ${PANDORA_CONSOLE_PACKAGE}" "Downloading Pandora FMS Console community" -execute_cmd "curl -LSs --output pandorafms_agent_unix-7.0NG.noarch.rpm ${PANDORA_AGENT_PACKAGE}" "Downloading Pandora FMS Agent community" +execute_cmd "curl -LSs --output pandorafms_agent_linux-7.0NG.noarch.rpm ${PANDORA_AGENT_PACKAGE}" "Downloading Pandora FMS Agent community" # Install Pandora execute_cmd "yum install -y $HOME/pandora_deploy_tmp/pandorafms*.rpm" "installing PandoraFMS packages" diff --git a/extras/deploy-scripts/pandora_deploy_community_el8.sh b/extras/deploy-scripts/pandora_deploy_community_el8.sh index fd4855f67b..794e11f8fe 100644 --- a/extras/deploy-scripts/pandora_deploy_community_el8.sh +++ b/extras/deploy-scripts/pandora_deploy_community_el8.sh @@ -4,7 +4,7 @@ ####################################################### ## Tested versions ## # Centos 8.4, 8.5 -# Rocky 8.4, 8.5 +# Rocky 8.4, 8.5, 8.6, 8.7 # Almalinuz 8.4, 8.5 # RedHat 8.5 @@ -14,24 +14,25 @@ PANDORA_SERVER_CONF=/etc/pandora/pandora_server.conf PANDORA_AGENT_CONF=/etc/pandora/pandora_agent.conf -S_VERSION='202209231' +S_VERSION='202301251' LOGFILE="/tmp/pandora-deploy-community-$(date +%F).log" # define default variables -[ "$TZ" ] || TZ="Europe/Madrid" -[ "$MYVER" ] || MYVER=57 -[ "$PHPVER" ] || PHPVER=8 -[ "$DBHOST" ] || DBHOST=127.0.0.1 -[ "$DBNAME" ] || DBNAME=pandora -[ "$DBUSER" ] || DBUSER=pandora -[ "$DBPASS" ] || DBPASS=pandora -[ "$DBPORT" ] || DBPORT=3306 +[ "$TZ" ] || TZ="Europe/Madrid" +[ "$MYVER" ] || MYVER=57 +[ "$PHPVER" ] || PHPVER=8 +[ "$DBHOST" ] || DBHOST=127.0.0.1 +[ "$DBNAME" ] || DBNAME=pandora +[ "$DBUSER" ] || DBUSER=pandora +[ "$DBPASS" ] || DBPASS=pandora +[ "$DBPORT" ] || DBPORT=3306 [ "$DBROOTUSER" ] || DBROOTUSER=root [ "$DBROOTPASS" ] || DBROOTPASS=pandora [ "$SKIP_PRECHECK" ] || SKIP_PRECHECK=0 -[ "$SKIP_DATABASE_INSTALL" ] || SKIP_DATABASE_INSTALL=0 +[ "$SKIP_DATABASE_INSTALL" ] || SKIP_DATABASE_INSTALL=0 [ "$SKIP_KERNEL_OPTIMIZATIONS" ] || SKIP_KERNEL_OPTIMIZATIONS=0 -[ "$POOL_SIZE" ] || POOL_SIZE=$(grep -i total /proc/meminfo | head -1 | awk '{printf "%.2f \n", $(NF-1)*0.4/1024}' | sed "s/\\..*$/M/g") +[ "$POOL_SIZE" ] || POOL_SIZE=$(grep -i total /proc/meminfo | head -1 | awk '{printf "%.2f \n", $(NF-1)*0.4/1024}' | sed "s/\\..*$/M/g") +[ "$PANDORA_LTS" ] || PANDORA_LTS=1 [ "$PANDORA_BETA" ] || PANDORA_BETA=0 # Ansi color code variables @@ -41,7 +42,6 @@ cyan="\e[0;36m" reset="\e[0m" # Functions - execute_cmd () { local cmd="$1" local msg="$2" @@ -76,7 +76,7 @@ check_cmd_status () { check_pre_pandora () { echo -en "${cyan}Checking environment ... ${reset}" - rpm -qa | grep 'pandorafms_' &>> /dev/null && local fail=true + rpm -qa | grep -v "pandorawmic" | grep 'pandorafms_' &>> /dev/null && local fail=true [ -d "$PANDORA_CONSOLE" ] && local fail=true [ -f /usr/bin/pandora_server ] && local fail=true @@ -137,7 +137,10 @@ check_root_permissions [ "$SKIP_PRECHECK" == 1 ] || check_pre_pandora #advicing BETA PROGRAM -[ "$PANDORA_BETA" -ne '0' ] && echo -e "${red}BETA version enable using nightly PandoraFMS packages${reset}" +INSTALLING_VER="${green}RRR version enable using RRR PandoraFMS packages${reset}" +[ "$PANDORA_BETA" -ne '0' ] && INSTALLING_VER="${red}BETA version enable using nightly PandoraFMS packages${reset}" +[ "$PANDORA_LTS" -ne '0' ] && INSTALLING_VER="${green}LTS version enable using LTS PandoraFMS packages${reset}" +echo -e $INSTALLING_VER # Connectivity check_repo_connection @@ -312,6 +315,7 @@ console_dependencies=" \ mod_ssl \ libzstd \ openldap-clients \ + chromium \ http://firefly.artica.es/centos8/perl-Net-Telnet-3.04-1.el8.noarch.rpm \ http://firefly.artica.es/centos7/wmic-1.4-1.el7.x86_64.rpm \ http://firefly.artica.es/centos8/phantomjs-2.1.1-1.el7.x86_64.rpm" @@ -466,6 +470,8 @@ query_cache_size = 64M query_cache_min_res_unit = 2k query_cache_limit = 256K +#skip-log-bin + sql_mode="" [mysqld_safe] @@ -476,6 +482,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 fi execute_cmd "systemctl restart mysqld" "Configuring database engine" @@ -484,20 +491,27 @@ fi export MYSQL_PWD=$DBPASS #Define packages -if [ "$PANDORA_BETA" -eq '0' ] ; then +if [ "$PANDORA_LTS" -eq '1' ] ; then + [ "$PANDORA_SERVER_PACKAGE" ] || PANDORA_SERVER_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/LTS/pandorafms_server-7.0NG.noarch.rpm" + [ "$PANDORA_CONSOLE_PACKAGE" ] || PANDORA_CONSOLE_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/LTS/pandorafms_console-7.0NG.noarch.rpm" + [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/LTS/pandorafms_agent_linux-7.0NG.noarch.rpm" +elif [ "$PANDORA_LTS" -ne '1' ] ; then [ "$PANDORA_SERVER_PACKAGE" ] || PANDORA_SERVER_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_server-7.0NG.noarch.rpm" [ "$PANDORA_CONSOLE_PACKAGE" ] || PANDORA_CONSOLE_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_console-7.0NG.noarch.rpm" - [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_agent_unix-7.0NG.noarch.rpm" -elif [ "$PANDORA_BETA" -ne '0' ] ; then + [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_agent_linux-7.0NG.noarch.rpm" +fi + +# if beta is enable +if [ "$PANDORA_BETA" -eq '1' ] ; then [ "$PANDORA_SERVER_PACKAGE" ] || PANDORA_SERVER_PACKAGE="http://firefly.artica.es/pandora_enterprise_nightlies/pandorafms_server-latest.x86_64.rpm" [ "$PANDORA_CONSOLE_PACKAGE" ] || PANDORA_CONSOLE_PACKAGE="https://pandorafms.com/community/community-console-rpm-beta/" - [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_agent_unix-7.0NG.noarch.rpm" + [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/RHEL_CentOS/pandorafms_agent_linux-7.0NG.noarch.rpm" fi # Downloading Pandora Packages execute_cmd "curl -LSs --output pandorafms_server-7.0NG.noarch.rpm ${PANDORA_SERVER_PACKAGE}" "Downloading Pandora FMS Server community" execute_cmd "curl -LSs --output pandorafms_console-7.0NG.noarch.rpm ${PANDORA_CONSOLE_PACKAGE}" "Downloading Pandora FMS Console community" -execute_cmd "curl -LSs --output pandorafms_agent_unix-7.0NG.noarch.rpm ${PANDORA_AGENT_PACKAGE}" "Downloading Pandora FMS Agent community" +execute_cmd "curl -LSs --output pandorafms_agent_linux-7.0NG.noarch.rpm ${PANDORA_AGENT_PACKAGE}" "Downloading Pandora FMS Agent community" # Install Pandora execute_cmd "dnf install -y $HOME/pandora_deploy_tmp/pandorafms*.rpm" "Installing Pandora FMS packages" diff --git a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh index feced2cbe7..f52eb625e2 100644 --- a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh +++ b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh @@ -16,8 +16,9 @@ PANDORA_AGENT_CONF=/etc/pandora/pandora_agent.conf WORKDIR=/opt/pandora/deploy -S_VERSION='2022052501' +S_VERSION='202301251' LOGFILE="/tmp/pandora-deploy-community-$(date +%F).log" +rm -f $LOGFILE &> /dev/null # remove last log before start # define default variables [ "$TZ" ] || TZ="Europe/Madrid" @@ -33,6 +34,8 @@ LOGFILE="/tmp/pandora-deploy-community-$(date +%F).log" [ "$SKIP_KERNEL_OPTIMIZATIONS" ] || SKIP_KERNEL_OPTIMIZATIONS=0 [ "$POOL_SIZE" ] || POOL_SIZE=$(grep -i total /proc/meminfo | head -1 | awk '{printf "%.2f \n", $(NF-1)*0.4/1024}' | sed "s/\\..*$/M/g") [ "$PANDORA_BETA" ] || PANDORA_BETA=0 +[ "$PANDORA_LTS" ] || PANDORA_LTS=1 + # Ansi color code variables red="\e[0;91m" @@ -133,7 +136,10 @@ check_root_permissions [ "$SKIP_PRECHECK" == 1 ] || check_pre_pandora #advicing BETA PROGRAM -[ "$PANDORA_BETA" -ne '0' ] && echo -e "${red}BETA version enable using nightly PandoraFMS packages${reset}" +INSTALLING_VER="${green}RRR version enable using RRR PandoraFMS packages${reset}" +[ "$PANDORA_BETA" -ne '0' ] && INSTALLING_VER="${red}BETA version enable using nightly PandoraFMS packages${reset}" +[ "$PANDORA_LTS" -ne '0' ] && INSTALLING_VER="${green}LTS version enable using LTS PandoraFMS packages${reset}" +echo -e $INSTALLING_VER # Connectivity check_repo_connection @@ -271,10 +277,19 @@ echo -en "${cyan}Installing phantomjs...${reset}" /usr/bin/phantomjs --version &>> "$LOGFILE" check_cmd_status "Error Installing phanromjs" +# create symlink for fping +rm -f /usr/sbin/fping &>> "$LOGFILE" +ln -s /usr/bin/fping /usr/sbin/fping &>> "$LOGFILE" + +# Chrome +rm -f /usr/bin/chromium-browser &>> "$LOGFILE" +execute_cmd "wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" "Downloading google chrome" +execute_cmd "apt install -y ./google-chrome-stable_current_amd64.deb" "Intalling google chrome" +execute_cmd "ln -s /usr/bin/google-chrome /usr/bin/chromium-browser" "Creating /usr/bin/chromium-browser Symlink" # SDK VMware perl dependencies -vmware_dependencies=" \ - lib32z1 \ +vmware_dependencies="\ + lib32z1 \ lib32z1 \ build-essential \ uuid uuid-dev \ @@ -345,16 +360,22 @@ systemctl stop apparmor &>> "$LOGFILE" systemctl disable apparmor &>> "$LOGFILE" #install mysql -debconf-set-selections <<< $(echo -n "mysql-server mysql-server/root_password password $DBROOTPASS") &>> "$LOGFILE" -debconf-set-selections <<< $(echo -n "mysql-server mysql-server/root_password_again password $DBROOTPASS") &>> "$LOGFILE" -echo -en "${cyan}Installing MySql Server...${reset}" - env DEBIAN_FRONTEND=noninteractive apt install -y mysql-server &>> "$LOGFILE" +execute_cmd "curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb" "Downloading Percona repository for MySQL8" +execute_cmd "apt install -y gnupg2 lsb-release ./percona-release_latest.generic_all.deb" "Installing Percona repository for MySQL8" +execute_cmd "percona-release setup ps80" "Configuring Percona repository for MySQL8" + +echo -en "${cyan}Installing Percona Server for MySQL8...${reset}" + env DEBIAN_FRONTEND=noninteractive apt install -y percona-server-server &>> "$LOGFILE" check_cmd_status "Error Installing MySql Server" #Configuring Database if [ "$SKIP_DATABASE_INSTALL" -eq '0' ] ; then execute_cmd "systemctl start mysql" "Starting database engine" + + echo """ + ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$DBROOTPASS'; + """ | mysql -uroot &>> "$LOGFILE" export MYSQL_PWD=$DBROOTPASS echo -en "${cyan}Creating Pandora FMS database...${reset}" @@ -394,11 +415,12 @@ max_connections = 100 key_buffer_size=4M read_buffer_size=128K - read_rnd_buffer_size=128K sort_buffer_size=128K join_buffer_size=4M +skip-log-bin + sql_mode="" log-error=/var/log/mysql/error.log @@ -412,14 +434,20 @@ execute_cmd "systemctl restart mysql" "Configuring and restarting database engin #Define packages -if [ "$PANDORA_BETA" -eq '0' ] ; then +if [ "$PANDORA_LTS" -eq '1' ] ; then + [ "$PANDORA_SERVER_PACKAGE" ] || PANDORA_SERVER_PACKAGE="http://firefly.artica.es/pandorafms/latest/Tarball/LTS/pandorafms_server-7.0NG.tar.gz" + [ "$PANDORA_CONSOLE_PACKAGE" ] || PANDORA_CONSOLE_PACKAGE="http://firefly.artica.es/pandorafms/latest/Tarball/LTS/pandorafms_console-7.0NG.tar.gz" + [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/Tarball/LTS/pandorafms_agent_linux-7.0NG.tar.gz" +elif [ "$PANDORA_LTS" -ne '1' ] ; then [ "$PANDORA_SERVER_PACKAGE" ] || PANDORA_SERVER_PACKAGE="http://firefly.artica.es/pandorafms/latest/Tarball/pandorafms_server-7.0NG.tar.gz" [ "$PANDORA_CONSOLE_PACKAGE" ] || PANDORA_CONSOLE_PACKAGE="http://firefly.artica.es/pandorafms/latest/Tarball/pandorafms_console-7.0NG.tar.gz" - [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/Tarball/pandorafms_agent_unix-7.0NG.tar.gz" -elif [ "$PANDORA_BETA" -ne '0' ] ; then + [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/Tarball/pandorafms_agent_linux-7.0NG.tar.gz" +fi + +if [ "$PANDORA_BETA" -eq '1' ] ; then [ "$PANDORA_SERVER_PACKAGE" ] || PANDORA_SERVER_PACKAGE="http://firefly.artica.es/pandora_enterprise_nightlies/pandorafms_server-latest_x86_64.tar.gz" [ "$PANDORA_CONSOLE_PACKAGE" ] || PANDORA_CONSOLE_PACKAGE="http://firefly.artica.es/pandora_enterprise_nightlies/pandorafms_console-latest.tar.gz" - [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/Tarball/pandorafms_agent_unix-7.0NG.tar.gz" + [ "$PANDORA_AGENT_PACKAGE" ] || PANDORA_AGENT_PACKAGE="http://firefly.artica.es/pandorafms/latest/Tarball/pandorafms_agent_linux-7.0NG.tar.gz" fi # Downloading Pandora Packages @@ -427,7 +455,7 @@ cd $WORKDIR &>> "$LOGFILE" curl -LSs --output pandorafms_console-7.0NG.tar.gz "${PANDORA_CONSOLE_PACKAGE}" &>> "$LOGFILE" curl -LSs --output pandorafms_server-7.0NG.tar.gz "${PANDORA_SERVER_PACKAGE}" &>> "$LOGFILE" -curl -LSs --output pandorafms_agent_unix-7.0NG.tar.gz "${PANDORA_AGENT_PACKAGE}" &>> "$LOGFILE" +curl -LSs --output pandorafms_agent_linux-7.0NG.tar.gz "${PANDORA_AGENT_PACKAGE}" &>> "$LOGFILE" # Install PandoraFMS Console echo -en "${cyan}Installing PandoraFMS Console...${reset}" @@ -444,7 +472,7 @@ check_cmd_status "Error installing PandoraFMS Server" #Install agent: execute_cmd "apt install -y libyaml-tiny-perl perl coreutils wget curl unzip procps python3 python3-pip" "Installing PandoraFMS Agent Dependencies" echo -en "${cyan}Installing PandoraFMS Agent...${reset}" - tar xvzf $WORKDIR/pandorafms_agent_unix-7.0NG.tar.gz &>> "$LOGFILE" && cd unix && ./pandora_agent_installer --install &>> $LOGFILE && cp -a tentacle_client /usr/local/bin/ &>> $LOGFILE && cd $WORKDIR + tar xvzf $WORKDIR/pandorafms_agent_linux-7.0NG.tar.gz &>> "$LOGFILE" && cd unix && ./pandora_agent_installer --install &>> $LOGFILE && cp -a tentacle_client /usr/local/bin/ &>> $LOGFILE && cd $WORKDIR check_cmd_status "Error installing PandoraFMS Agent" # Copy gotty utility diff --git a/extras/docker/centos8/base/Dockerfile b/extras/docker/centos8/base/Dockerfile index c27b2db723..8106abf8ce 100644 --- a/extras/docker/centos8/base/Dockerfile +++ b/extras/docker/centos8/base/Dockerfile @@ -262,13 +262,11 @@ RUN dnf install -y --setopt=tsflags=nodocs \ http://firefly.artica.es/centos7/wmic-1.4-1.el7.x86_64.rpm # Install utils -RUN dnf install -y supervisor crontabs http://firefly.artica.es/centos8/phantomjs-2.1.1-1.el7.x86_64.rpm --setopt=tsflags=nodocs +RUN dnf install -y supervisor chromium crontabs http://firefly.artica.es/centos8/phantomjs-2.1.1-1.el7.x86_64.rpm --setopt=tsflags=nodocs # SDK VMware perl dependencies RUN dnf install -y http://firefly.artica.es/centos8/perl-Crypt-OpenSSL-AES-0.02-1.el8.x86_64.rpm http://firefly.artica.es/centos8/perl-Crypt-SSLeay-0.73_07-1.gf.el8.x86_64.rpm perl-Net-HTTP perl-libwww-perl openssl-devel perl-Crypt-CBC perl-Bytes-Random-Secure perl-Crypt-Random-Seed perl-Math-Random-ISAAC perl-JSON http://firefly.artica.es/centos8/VMware-vSphere-Perl-SDK-6.5.0-4566394.x86_64.rpm # Instant client Oracle RUN dnf install -y https://download.oracle.com/otn_software/linux/instantclient/19800/oracle-instantclient19.8-basic-19.8.0.0.0-1.x86_64.rpm https://download.oracle.com/otn_software/linux/instantclient/19800/oracle-instantclient19.8-sqlplus-19.8.0.0.0-1.x86_64.rpm -# Install Phantom -RUN dnf install -y supervisor crontabs http://firefly.artica.es/centos8/phantomjs-2.1.1-1.el7.x86_64.rpm --setopt=tsflags=nodocs EXPOSE 80 443 41121 162/udp diff --git a/extras/fedora_official_specs/pandorafms-agent.spec b/extras/fedora_official_specs/pandorafms-agent.spec index 8819a76cf4..2603777a1e 100644 --- a/extras/fedora_official_specs/pandorafms-agent.spec +++ b/extras/fedora_official_specs/pandorafms-agent.spec @@ -4,9 +4,9 @@ Release: 140223.sp3%{?dist} Summary: Host/service/network agent for Pandora FMS monitoring system License: GPLv2 Vendor: Artica -Source: http://code.pandorafms.com/static_download/pandorafms_agent_unix-5.0SP3.tar.gz +Source: http://code.pandorafms.com/static_download/pandorafms_agent_linux-5.0SP3.tar.gz #Source: %{name}-%{version}.tar.gz -#Source0: http://code.pandorafms.com/static_download/pandorafms_agent_unix-5.0SP3.tar.gz +#Source0: http://code.pandorafms.com/static_download/pandorafms_agent_linux-5.0SP3.tar.gz URL: http://pandorafms.com Group: Applications/System #Prefix: /usr/share diff --git a/pandora_agents/pc/AIX/pandora_agent.conf b/pandora_agents/pc/AIX/pandora_agent.conf index 0091dc48da..c8512ffc13 100644 --- a/pandora_agents/pc/AIX/pandora_agent.conf +++ b/pandora_agents/pc/AIX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.766, AIX version +# Version 7.0NG.768, AIX version # Licensed under GPL license v2, # Copyright (c) 2003-2021 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/DEBIAN/make_deb_package.sh b/pandora_agents/pc/DEBIAN/make_deb_package.sh index 483afe1b2e..1496975d21 100644 --- a/pandora_agents/pc/DEBIAN/make_deb_package.sh +++ b/pandora_agents/pc/DEBIAN/make_deb_package.sh @@ -114,7 +114,7 @@ echo "END" echo "Make the package \"Pandorafms console\"." dpkg-deb --build temp_package -mv temp_package.deb pandorafms.agent_unix_$pandora_version.deb +mv temp_package.deb pandorafms.agent_linux_$pandora_version.deb echo "Delete the \"temp_package\" temp dir for job." rm -rf temp_package diff --git a/pandora_agents/pc/FreeBSD/pandora_agent.conf b/pandora_agents/pc/FreeBSD/pandora_agent.conf index 513191c42f..c98b6c4f48 100644 --- a/pandora_agents/pc/FreeBSD/pandora_agent.conf +++ b/pandora_agents/pc/FreeBSD/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.766, FreeBSD Version +# Version 7.0NG.768, FreeBSD Version # Licensed under GPL license v2, # Copyright (c) 2003-2021 Artica Soluciones Tecnologicas # http://www.pandorafms.com @@ -207,6 +207,6 @@ module_end module_plugin grep_log /var/log/auth.log Syslog sshd -# Plugin for inventory on the agent (Only Enterprise) +# Plugin for inventory on the agent. # module_plugin inventory 1 cpu ram video nic hd cdrom software diff --git a/pandora_agents/pc/HP-UX/pandora_agent.conf b/pandora_agents/pc/HP-UX/pandora_agent.conf index efdfbe7496..a17181b6c2 100644 --- a/pandora_agents/pc/HP-UX/pandora_agent.conf +++ b/pandora_agents/pc/HP-UX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.766, HP-UX Version +# Version 7.0NG.768, HP-UX Version # Licensed under GPL license v2, # Copyright (c) 2003-2021 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/Linux/pandora_agent.conf b/pandora_agents/pc/Linux/pandora_agent.conf index cb8239a255..7eea50cdac 100644 --- a/pandora_agents/pc/Linux/pandora_agent.conf +++ b/pandora_agents/pc/Linux/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.766, GNU/Linux +# Version 7.0NG.768, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2021 Artica Soluciones Tecnologicas # http://www.pandorafms.com @@ -269,7 +269,7 @@ module_plugin grep_log /var/log/syslog Syslog ssh #module_description Used memory in KB postprocessed to be in MB #module_end -# Plugin for inventory on the agent (Only Enterprise) +# Plugin for inventory on the agent. # module_plugin inventory 1 cpu ram video nic hd cdrom software init_services filesystem users process ip route diff --git a/pandora_agents/pc/NT4/pandora_agent.conf b/pandora_agents/pc/NT4/pandora_agent.conf index dddb8f7d83..ed7aae82b3 100644 --- a/pandora_agents/pc/NT4/pandora_agent.conf +++ b/pandora_agents/pc/NT4/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.766, GNU/Linux +# Version 7.0NG.768, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2021 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/OpenWRT/INSTALL b/pandora_agents/pc/OpenWRT/INSTALL index 6975acdfbb..cae96b27cf 100644 --- a/pandora_agents/pc/OpenWRT/INSTALL +++ b/pandora_agents/pc/OpenWRT/INSTALL @@ -31,14 +31,14 @@ Install procedure Step 1 - Get the latest package and copy to /tmp, you can get the latest package at: - http://sourceforge.net/projects/pandora/files/Pandora%20FMS%203.2/Stable%20release/Unix%20%28Tarball%29/pandorafms_agent_unix-3.2.tar.gz/download + http://sourceforge.net/projects/pandora/files/Pandora%20FMS%203.2/Stable%20release/Unix%20%28Tarball%29/pandorafms_agent_linux-3.2.tar.gz/download Note: You will get a special version of the launcher, you can get it from our SVN repository and replace the perl daemon launcher with this special version for OpenWRT. Just replace it after do the package install for the Unix/Perl generic agent. Step 2 - Install it cd /tmp - tar xvzf pandorafms_agent_unix-3.2.tar.gz + tar xvzf pandorafms_agent_linux-3.2.tar.gz cd unix ./pandora_agent --install diff --git a/pandora_agents/pc/SunOS/pandora_agent.conf b/pandora_agents/pc/SunOS/pandora_agent.conf index af8e110f90..8c189f05bf 100644 --- a/pandora_agents/pc/SunOS/pandora_agent.conf +++ b/pandora_agents/pc/SunOS/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.766, Solaris Version +# Version 7.0NG.768, Solaris Version # Licensed under GPL license v2, # Copyright (c) 2003-2021 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/Win32/pandora_agent.conf b/pandora_agents/pc/Win32/pandora_agent.conf index a7625d8d63..46a569686d 100644 --- a/pandora_agents/pc/Win32/pandora_agent.conf +++ b/pandora_agents/pc/Win32/pandora_agent.conf @@ -1,6 +1,6 @@ # Base config file for Pandora FMS Windows Agent # (c) 2006-2021 Artica Soluciones Tecnologicas -# Version 7.0NG.766 +# Version 7.0NG.768 # This program is Free Software, you can redistribute it and/or modify it # under the terms of the GNU General Public Licence as published by the Free Software # Foundation; either version 2 of the Licence or any later version diff --git a/pandora_agents/pc/pandora_agent.redhat.spec b/pandora_agents/pc/pandora_agent.redhat.spec index b09d423d36..ae481e3403 100644 --- a/pandora_agents/pc/pandora_agent.redhat.spec +++ b/pandora_agents/pc/pandora_agent.redhat.spec @@ -1,7 +1,7 @@ # #Pandora FMS Linux Agent # -%define name pandorafms_agent_unix +%define name pandorafms_agent_linux %define version 4.0 %define release 1 diff --git a/pandora_agents/pc/pandora_agent.spec b/pandora_agents/pc/pandora_agent.spec index 1378fa26c1..1bfc289d52 100644 --- a/pandora_agents/pc/pandora_agent.spec +++ b/pandora_agents/pc/pandora_agent.spec @@ -1,7 +1,7 @@ # #Pandora FMS Linux Agent # -%define name pandorafms_agent_unix +%define name pandorafms_agent_linux %define version 4.0.1 %define release 1 diff --git a/pandora_agents/pc/pandora_agent_exec b/pandora_agents/pc/pandora_agent_exec index 48fba5c0d8..2a990067ae 100644 --- a/pandora_agents/pc/pandora_agent_exec +++ b/pandora_agents/pc/pandora_agent_exec @@ -1,15 +1,8 @@ #!/usr/bin/perl -########################################################################## -# pandora_agent_exec +################################################################################ +# pandora_exec - Execute a command with a time limit. # -# Executes the given command and prints its output to stdout. If the -# execution times out or the command does not exist nothing is printed -# to stdout. This is part of Pandora FMS Plugin server, do not delete!. -# -# Usage: pandora_agent_exec -########################################################################## -# Copyright (c) 2008-2010 Ramon Novoa, rnovoa@gmail.com -# (c) 2008-2010 Artica Soluciones Tecnologicas S.L +# Copyright (c) 2008-2023 Artica PFMS S.L. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -22,37 +15,41 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -########################################################################## - +################################################################################ use strict; use warnings; +use POSIX qw(WEXITSTATUS WIFEXITED); -# Check command line parameters +# Check command line arguments. if ($#ARGV < 1) { + print("Usage: $0 \n"); exit 1; } my @opts = @ARGV; my $timeout = shift(@opts); -my $command = join(' ', @opts); -my $output = ''; -my $ReturnCode = 0; +my $command = ($0 =~ m/_agent_exec$/) ? # For backward compatibility with pandora_agent. + join(' ', @opts) : + join(' ', map { quotemeta($_) } @opts); -# Execute the command -eval { - local $SIG{ALRM} = sub { die "alarm\n" }; - alarm $timeout; - - $output = `$command`; - $ReturnCode = ($? >> 8) & 0xff; - alarm 0; -}; - -# Timeout -if ($@ eq "alarm\n") { - exit 3; +# Fork: +# * The child will run the command. +# * The parent will timeout if needed +# and exit with the appropriate exit status. +my $pid = fork(); +if ($pid == 0) { + setpgrp(); + exec($command); +} else { + eval { + local $SIG{ALRM} = sub { kill(9, -$pid); exit 1; }; + alarm $timeout; + waitpid($pid, 0); + alarm 0; + if (WIFEXITED(${^CHILD_ERROR_NATIVE})) { + exit WEXITSTATUS(${^CHILD_ERROR_NATIVE}); + } + }; } -print $output; - -exit $ReturnCode; +exit 1; diff --git a/pandora_agents/shellscript/aix/pandora_agent.conf b/pandora_agents/shellscript/aix/pandora_agent.conf index 1558b0e45f..a723aa503b 100644 --- a/pandora_agents/shellscript/aix/pandora_agent.conf +++ b/pandora_agents/shellscript/aix/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.766, AIX version +# Version 7.0NG.768, AIX version # General Parameters # ================== diff --git a/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf b/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf index 253244c7ca..e8dd39e1d2 100644 --- a/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf +++ b/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.766 +# Version 7.0NG.768 # FreeBSD/IPSO version # Licenced under GPL licence, 2003-2007 Sancho Lerena diff --git a/pandora_agents/shellscript/hp-ux/pandora_agent.conf b/pandora_agents/shellscript/hp-ux/pandora_agent.conf index 18b71e79fa..6b4ea56e3d 100644 --- a/pandora_agents/shellscript/hp-ux/pandora_agent.conf +++ b/pandora_agents/shellscript/hp-ux/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.766, HPUX Version +# Version 7.0NG.768, HPUX Version # General Parameters # ================== diff --git a/pandora_agents/shellscript/linux/pandora_agent.conf b/pandora_agents/shellscript/linux/pandora_agent.conf index bea94bc9fe..5ca49a15e1 100644 --- a/pandora_agents/shellscript/linux/pandora_agent.conf +++ b/pandora_agents/shellscript/linux/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.766 +# Version 7.0NG.768 # Licensed under GPL license v2, # (c) 2003-2021 Artica Soluciones Tecnologicas # please visit http://pandora.sourceforge.net @@ -164,5 +164,5 @@ module_end module_plugin grep_log /var/log/syslog Syslog ssh -# Plugin for inventory on the agent (Only Enterprise) +# Plugin for inventory on the agent. # module_plugin inventory 1 cpu ram video nic hd cdrom software diff --git a/pandora_agents/shellscript/mac_osx/pandora_agent.conf b/pandora_agents/shellscript/mac_osx/pandora_agent.conf index caa0816d30..b26ec72942 100644 --- a/pandora_agents/shellscript/mac_osx/pandora_agent.conf +++ b/pandora_agents/shellscript/mac_osx/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.766 +# Version 7.0NG.768 # Licensed under GPL license v2, # (c) 2003-2021 Artica Soluciones Tecnologicas # please visit http://pandora.sourceforge.net @@ -379,6 +379,6 @@ module_end #module_plugin grep_log /var/log/syslog Syslog ssh -# Plugin for inventory on the agent (Only Enterprise) +# Plugin for inventory on the agent. # module_plugin inventory 1 cpu ram video nic hd cdrom software diff --git a/pandora_agents/shellscript/openWRT/pandora_agent.conf b/pandora_agents/shellscript/openWRT/pandora_agent.conf index 6f69daed5a..b9b09e0f02 100644 --- a/pandora_agents/shellscript/openWRT/pandora_agent.conf +++ b/pandora_agents/shellscript/openWRT/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.766 +# Version 7.0NG.768 # Licensed under GPL license v2, # please visit http://pandora.sourceforge.net diff --git a/pandora_agents/shellscript/solaris/pandora_agent.conf b/pandora_agents/shellscript/solaris/pandora_agent.conf index 4be4e0f2e0..20036302b7 100644 --- a/pandora_agents/shellscript/solaris/pandora_agent.conf +++ b/pandora_agents/shellscript/solaris/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.766, Solaris version +# Version 7.0NG.768, Solaris version # General Parameters # ================== diff --git a/pandora_agents/unix/AIX/pandora_agent.conf b/pandora_agents/unix/AIX/pandora_agent.conf index 38ca0e560e..e2050f1a5c 100644 --- a/pandora_agents/unix/AIX/pandora_agent.conf +++ b/pandora_agents/unix/AIX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.766, AIX version +# Version 7.0NG.768, AIX version # Licensed under GPL license v2, # Copyright (c) 2003-2021 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 257d97b8d9..b565d1ff22 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.766-221122 +Version: 7.0NG.768-230210 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 8f92bc4e9b..7dc4394f80 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.766-221122" +pandora_version="7.0NG.768-230210" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null @@ -61,7 +61,7 @@ chmod 755 -R temp_package/DEBIAN #cp -aRf * temp_package/usr/share/pandora_agent/ #but don't copy recursive the temp_package into temp_package -for item in `ls | grep -v NT4 | grep -v AIX | grep -v FreeBSD | grep -v NetBSD | grep -v HP-UX | grep -v SunOS | grep -v Darwin | grep -v OpenWRT | grep -v pandorafms.agent_unix | grep -v temp_package` +for item in `ls | grep -v NT4 | grep -v AIX | grep -v FreeBSD | grep -v NetBSD | grep -v HP-UX | grep -v SunOS | grep -v Darwin | grep -v OpenWRT | grep -v pandorafms.agent_linux | grep -v temp_package` do #if [ \( $item != 'temp_package' \) -a \( $item != 'NT4' \) ] #then @@ -137,7 +137,7 @@ if [ "$USE_DOCKER_APP" == "1" ]; then else dpkg-deb --root-owner-group --build temp_package fi -mv temp_package.deb pandorafms.agent_unix_$pandora_version.deb +mv temp_package.deb pandorafms.agent_linux_$pandora_version.deb echo "Delete the \"temp_package\" temp dir for job." rm -rf temp_package diff --git a/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh b/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh index 8b7d14dab2..fd449c646b 100644 --- a/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh +++ b/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh @@ -31,7 +31,7 @@ fi if [ "$#" -ge 2 ]; then VERSION="$2" else - VERSION="7.0NG.766" + VERSION="7.0NG.768" fi # Path for the generated DMG file diff --git a/pandora_agents/unix/Darwin/dmg/extras/distribution.xml b/pandora_agents/unix/Darwin/dmg/extras/distribution.xml index b9a6fc7997..4e4b347f08 100644 --- a/pandora_agents/unix/Darwin/dmg/extras/distribution.xml +++ b/pandora_agents/unix/Darwin/dmg/extras/distribution.xml @@ -19,11 +19,11 @@ - pandorafms_src.pdk + pandorafms_src.pdk - pandorafms_uninstall.pdk + pandorafms_uninstall.pdk '.io_safe_output($agent_name)."\n"; + $out_csv .= __('Timestamp').' = '.$row['timestamp']."\n"; + $out_csv .= io_safe_output($row['data_format'])."\n"; + + // Filter data by search string. + if ($inventory_search_string !== '') { + $str = io_safe_output($row['data']); + $matches = []; + $re = '/.*'.$inventory_search_string.'.*\n/m'; + if (preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0)) { + // Print the entire match result. + foreach ($matches as $match) { + $out_csv .= $match[0]; + } + + $out_csv .= "\n\n"; + } + } else { + $out_csv .= io_safe_output($row['data'])."\n\n"; + } + } else { + $agent_name = db_get_value('alias', 'tagente', 'id_agente', $row['id_agente']); + $agent_inventory_temp = []; + $agent_inventory[$agent_name][] = [ + 'name' => $row['name'], + 'data_formtat' => $row['data_format'], + 'data' => $row['data'], + ]; + } + } + + if ($order_by_agent) { + if (empty($agent_inventory) === false) { + foreach ($agent_inventory as $alias => $agent_data) { + $out_csv .= __('Agent alias').' --> '.io_safe_output($alias)."\n"; + $out_csv .= __('Timestamp').' = '.$row['timestamp']."\n"; + + foreach ($agent_data as $data) { + $out_csv .= io_safe_output($data['name'])."\n"; + $out_csv .= io_safe_output($data['data_format'])."\n"; + + // Filter data by search string. + if ($inventory_search_string !== '') { + $str = io_safe_output($data['data']); + $matches = []; + $re = '/.*'.$inventory_search_string.'.*\n/m'; + if (preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0)) { + // Print the entire match result. + foreach ($matches as $match) { + $out_csv .= $match[0]; + } + + $out_csv .= "\n\n"; + } + } else { + $out_csv .= io_safe_output($row['data'])."\n\n"; + } + } + } + } + } + } + + if ($export_csv) { + $name_file = 'inventory_'.md5( + $inventory_module_name.$utimestamp.$inventory_search_string + ).'.csv'; + file_put_contents( + $config['attachment_store'].'/'.$name_file, + $out_csv + ); + + echo "".__('Get CSV file').''; + return; + } else if ($return_mode === 'csv') { + return $out_csv; + } else if ($return_mode === 'hash') { + if ($utimestamp > 0) { + $timestamp = db_get_value_sql( + "SELECT timestamp + FROM tagente_datos_inventory + WHERE utimestamp = $utimestamp" + ); + } else { + $timestamp = db_get_value_sql( + 'SELECT timestamp + FROM tagente_datos_inventory + WHERE utimestamp = + (SELECT MAX(tagente_datos_inventory.utimestamp) + FROM tagente_datos_inventory, tmodule_inventory, + tagent_module_inventory + WHERE '.implode(' AND ', $where).' + AND tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory + AND tagent_module_inventory.id_agent_module_inventory = tagente_datos_inventory.id_agent_module_inventory)' + ); + } + + $out_array = []; + foreach ($rows as $k => $row) { + $out_array[$k]['timestamp'] = $timestamp; + $out_array[$k]['id_module_inventory'] = $row['id_module_inventory']; + $out_array[$k]['id_os'] = $row['id_os']; + $out_array[$k]['name'] = io_safe_output($row['name']); + $out_array[$k]['description'] = io_safe_output($row['description']); + $out_array[$k]['interpreter'] = $row['interpreter']; + $out_array[$k]['id_agent_module_inventory'] = $row['id_agent_module_inventory']; + $out_array[$k]['id_agente'] = $row['id_agente']; + $agent_name = db_get_value('alias', 'tagente', 'id_agente', $row['id_agente']); + $out_array[$k]['agent_name'] = $agent_name; + $out_array[$k]['target'] = $row['target']; + $out_array[$k]['interval'] = $row['interval']; + $out_array[$k]['username'] = $row['username']; + + $items = explode(';', io_safe_output($row['data_format'])); + + $data = []; + if (empty($row['data']) === false) { + $data_rows = explode("\n", io_safe_output($row['data'])); + $data = []; + foreach ($data_rows as $data_row) { + $cells = explode(';', $data_row); + + $temp_row = []; + $i = 0; + foreach ($cells as $cell) { + $temp_row[$items[$i]] = $cell; + $i++; + } + + $data[] = $temp_row; + } + } + + $out_array[$k]['data'] = $data; + $out_array[$k]['timestamp'] = io_safe_output($row['timestamp']); + $out_array[$k]['flag'] = io_safe_output($row['flag']); + } + + return $out_array; + } else if ($return_mode === 'array') { + $out_array = []; + foreach ($rows as $k => $row) { + $out_array[$k]['id_module_inventory'] = $row['id_module_inventory']; + $out_array[$k]['id_os'] = $row['id_os']; + $out_array[$k]['name'] = io_safe_output($row['name']); + $out_array[$k]['description'] = io_safe_output($row['description']); + $out_array[$k]['interpreter'] = $row['interpreter']; + $out_array[$k]['data_format'] = $row['data_format']; + $out_array[$k]['id_agent_module_inventory'] = $row['id_agent_module_inventory']; + $out_array[$k]['id_agente'] = $row['id_agente']; + $out_array[$k]['target'] = $row['target']; + $out_array[$k]['interval'] = $row['interval']; + $out_array[$k]['username'] = $row['username']; + $out_array[$k]['data'] = ''; + $out_array[$k]['timestamp'] = io_safe_output($row['timestamp']); + $out_array[$k]['flag'] = io_safe_output($row['flag']); + } + + if (empty($out_array) === true) { + return __('No data found'); + } + + return $out_array; + } + + $idModuleInventory = null; + + $rowTable = 1; + + // Timestamp filter only allowed in nodes for performance. + if (is_metaconsole() === false) { + if ($utimestamp > 0) { + $timestamp = db_get_value_sql( + "SELECT timestamp + FROM tagente_datos_inventory + WHERE utimestamp = $utimestamp" + ); + } else { + $timestamp = db_get_value_sql( + 'SELECT timestamp + FROM tagente_datos_inventory + WHERE utimestamp = + (SELECT MAX(tagente_datos_inventory.utimestamp) + FROM tagente_datos_inventory, tmodule_inventory, + tagent_module_inventory + WHERE '.implode(' AND ', $where).' + AND tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory + AND tagent_module_inventory.id_agent_module_inventory = tagente_datos_inventory.id_agent_module_inventory)' + ); + } + } + + // TODO: Workaround. + $timestamp = 'Last'; + if (!$order_by_agent) { + $countRows = 0; + foreach ($rows as $row) { + // Check for not show more elements that allowed in config. + if ($countRows >= (int) $config['meta_num_elements']) { + break; + } + + $countRows++; + + // Continue. + if (is_metaconsole() === false && $utimestamp > 0) { + $data_row = db_get_row_sql( + "SELECT data, timestamp + FROM tagente_datos_inventory + WHERE utimestamp <= '".$utimestamp."' + AND id_agent_module_inventory = ".$row['id_agent_module_inventory'].' ORDER BY utimestamp DESC' + ); + if ($data_row !== false) { + $row['data'] = $data_row['data']; + $row['timestamp'] = $data_row['timestamp']; + } else { + // Continue to next row in case there is no data for that timestamp. + continue; + } + } + + if ($idModuleInventory != $row['id_module_inventory']) { + if (isset($table) === true) { + $out .= "
"; + $out .= html_print_table($table, true); + $out .= '
'; + unset($table); + $rowTable = 1; + } + + $table = new stdClass(); + $table->width = '100%'; + $table->align = []; + $table->cellpadding = 0; + $table->cellspacing = 0; + $table->class = 'info_table inventory_tables'; + $table->head = []; + $table->head[0] = ''.$row['name'].' '.html_print_image('images/timestamp.png', true, ['title' => __('Timestamp'), 'style' => 'vertical-align:middle']).' ('.$timestamp.')'; + $table->headstyle[0] = 'text-align:center'; + + $subHeadTitles = explode(';', io_safe_output($row['data_format'])); + + $table->head_colspan = []; + $table->head_colspan[0] = (2 + count($subHeadTitles)); + $total_fields = count($subHeadTitles); + $table->rowspan = []; + + $table->data = []; + + $iterator = 1; + + $table->data[0][0] = __('Agent'); + foreach ($subHeadTitles as $titleData) { + $table->data[0][$iterator] = $titleData; + $iterator++; + } + + $table->data[0][] = __('Timestamp'); + $iterator++; + } + + // Setting for link the agent with the proper server. + if (is_metaconsole() === true && empty($node) === false) { + $loginHash = metaconsole_get_servers_url_hash($node); + $urlToAgent = sprintf( + '%sindex.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=%s%s', + $node['server_url'], + $row['id_agente'], + $loginHash + ); + } else { + $urlToAgent = sprintf( + 'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=%s', + $row['id_agente'] + ); + } + + $agent_name = db_get_value_sql( + 'SELECT alias + FROM tagente + WHERE id_agente = '.$row['id_agente'] + ); + + $table->data[$rowTable][0] = html_print_anchor( + [ + 'href' => $urlToAgent, + 'content' => ''.$agent_name.'', + ], + true + ); + + $arrayDataRowsInventory = explode(SEPARATOR_ROW, io_safe_output($row['data'])); + // SPLIT DATA IN ROWS + // Remove the empty item caused by a line ending with a new line. + $len = count($arrayDataRowsInventory); + if (end($arrayDataRowsInventory) == '') { + $len--; + unset($arrayDataRowsInventory[$len]); + } + + $iterator1 = 0; + $numRowHasNameAgent = $rowTable; + + $rowPair = true; + $iterator = 0; + foreach ($arrayDataRowsInventory as $dataRowInventory) { + if ($rowPair === true) { + $table->rowclass[$iterator] = 'rowPair'; + } else { + $table->rowclass[$iterator] = 'rowOdd'; + } + + $rowPair = !$rowPair; + $iterator++; + + // Because SQL query extract all rows (row1;row2;row3...) and only I want the row has + // the search string. + if ($inventory_search_string && preg_match('/'.io_safe_output($inventory_search_string).'/', ($dataRowInventory)) == 0) { + continue; + } + + if ($rowTable > $numRowHasNameAgent) { + $table->data[$rowTable][0] = ''; + } + + $arrayDataColumnInventory = explode(SEPARATOR_COLUMN, $dataRowInventory); + // SPLIT ROW IN COLUMNS. + $iterator2 = 1; + + foreach ($arrayDataColumnInventory as $dataColumnInventory) { + $table->data[$rowTable][$iterator2] = $dataColumnInventory; + $iterator2++; + } + + // Fill unfilled cells with empty string. + $countArray = count($arrayDataColumnInventory); + for ($i = 0; $i < ($total_fields - $countArray); $i++) { + $table->data[$rowTable][$iterator2] = ''; + $iterator2++; + } + + $table->data[$rowTable][$iterator2] = $row['timestamp']; + + $iterator1++; + + $rowTable++; + if ($rowPair === true) { + $table->rowclass[$rowTable] = 'rowPair'; + } else { + $table->rowclass[$rowTable] = 'rowOdd'; + } + } + + if ($rowPair === true) { + $table->rowclass[$iterator] = 'rowPair'; + } else { + $table->rowclass[$iterator] = 'rowOdd'; + } + + $rowPair = !$rowPair; + if ($rowPair) { + $table->rowclass[($iterator + 1)] = 'rowPair'; + } else { + $table->rowclass[($iterator + 1)] = 'rowOdd'; + } + + if ($iterator1 > 5) { + // PRINT COUNT TOTAL. + $table->data[$rowTable][0] = ''; + $table->data[$rowTable][1] = ''.__('Total').': '.$iterator1; + $countSubHeadTitles = count($subHeadTitles); + for ($row_i = 2; $row_i <= $countSubHeadTitles; $row_i++) { + $table->data[$rowTable][$row_i] = ''; + } + + $rowTable++; + } + + $idModuleInventory = $row['id_module_inventory']; + } + } else { + $agent_data = []; + foreach ($rows as $row) { + $agent_data[$row['id_agente']][] = $row; + } + + foreach ($agent_data as $id_agent => $rows) { + $agent_name = db_get_value_sql( + 'SELECT alias + FROM tagente + WHERE id_agente = '.$id_agent + ); + + $out .= '
'; + $out .= '
'.$agent_name.'
'; + $out .= '
'; + + foreach ($rows as $row) { + if ($utimestamp > 0) { + $data_row = db_get_row_sql( + "SELECT data, timestamp + FROM tagente_datos_inventory + WHERE utimestamp <= '".$utimestamp."' + AND id_agent_module_inventory = ".$row['id_agent_module_inventory'].' ORDER BY utimestamp DESC' + ); + + if ($data_row !== false) { + $row['data'] = $data_row['data']; + $row['timestamp'] = $data_row['timestamp']; + } else { + continue; + } + } + + $table = new stdClass(); + $table->colspan = []; + if ($idModuleInventory != $row['id_module_inventory']) { + $table->width = '98%'; + $table->align = []; + $table->styleTable = 'margin:0 auto; text-align:left;'; + $table->cellpadding = 0; + $table->cellspacing = 0; + $table->class = 'databox data'; + $table->head = []; + $table->head[0] = $row['name'].' - ('.$timestamp.')'; + $table->headstyle[0] = 'text-align:center'; + + $subHeadTitles = explode(';', io_safe_output($row['data_format'])); + + $table->head_colspan = []; + $table->head_colspan[0] = (2 + count($subHeadTitles)); + $total_fields = count($subHeadTitles); + $table->rowspan = []; + + $table->data = []; + + $iterator = 0; + + foreach ($subHeadTitles as $titleData) { + $table->data[0][$iterator] = $titleData; + $iterator++; + } + + $table->data[0][] = __('Timestamp'); + $iterator++; + } + + $rowTable = 1; + + $arrayDataRowsInventory = explode(SEPARATOR_ROW, io_safe_output($row['data'])); + // SPLIT DATA IN ROWS + // Remove the empty item caused by a line ending with a new line. + $len = count($arrayDataRowsInventory); + if (end($arrayDataRowsInventory) == '') { + $len--; + unset($arrayDataRowsInventory[$len]); + } + + $iterator1 = 0; + $rowPair = true; + + foreach ($arrayDataRowsInventory as $dataRowInventory) { + if ($rowPair === true) { + $table->rowclass[$iterator] = 'rowPair'; + } else { + $table->rowclass[$iterator] = 'rowOdd'; + } + + $rowPair = !$rowPair; + $iterator++; + + // Because SQL query extract all rows (row1;row2;row3...) and only I want the row has + // the search string. + if ($inventory_search_string && preg_match('/'.io_safe_output($inventory_search_string).'/', ($dataRowInventory)) == 0) { + continue; + } + + if ($rowTable > $numRowHasNameAgent) { + $table->data[$rowTable][0] = ''; + } + + $arrayDataColumnInventory = explode(SEPARATOR_COLUMN, $dataRowInventory); + // SPLIT ROW IN COLUMNS. + $iterator2 = 0; + + foreach ($arrayDataColumnInventory as $dataColumnInventory) { + $table->data[$rowTable][$iterator2] = $dataColumnInventory; + $iterator2++; + } + + // Fill unfilled cells with empty string. + $countArrayDataColumnInventory = count($arrayDataColumnInventory); + for ($i = 0; $i < ($total_fields - $countArrayDataColumnInventory); $i++) { + $table->data[$rowTable][$iterator2] = ''; + $iterator2++; + } + + $table->data[$rowTable][$iterator2] = $row['timestamp']; + + $iterator1++; + + $rowTable++; + if ($rowPair === true) { + $table->rowclass[$rowTable] = 'rowPair'; + } else { + $table->rowclass[$rowTable] = 'rowOdd'; + } + } + + if ($iterator1 > 5) { + // PRINT COUNT TOTAL. + $table->data[$rowTable][0] = ''; + $table->data[$rowTable][1] = ''.__('Total').': '.$iterator1; + $countSubHeadTitles = count($subHeadTitles); + for ($row_i = 2; $row_i <= $countSubHeadTitles; $row_i++) { + $table->data[$rowTable][$row_i] = ''; + } + + $rowTable++; + } + + $idModuleInventory = $row['id_module_inventory']; + + if (isset($table) === true) { + $out .= html_print_table($table, true); + } + + $out .= '
'; + } + + $out .= '
'; + $out .= '
'; + $out .= '
'; + $out .= '
'; + } + + return $out; + } + + if (isset($table) === true) { + $out .= html_print_table($table, true); + $out .= ui_pagination($count, $url, $offset, 0, true); + } + + return $out; +} + + +function inventory_get_dates($module_inventory_name, $inventory_agent, $inventory_id_group) +{ + $sql = 'SELECT tagente_datos_inventory.utimestamp, + tagente_datos_inventory.timestamp + FROM tmodule_inventory, tagent_module_inventory, + tagente_datos_inventory, tagente + WHERE + tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory + AND tagente_datos_inventory.id_agent_module_inventory = tagent_module_inventory.id_agent_module_inventory + AND tagente.id_agente = tagent_module_inventory.id_agente'; + + if ($inventory_agent != 0) { + $sql .= ' AND tagent_module_inventory.id_agente IN ('."'".implode(',', (array) $inventory_agent)."'".')'; + } + + if ($inventory_id_group != 0) { + $sql .= " AND tagente.id_grupo = $inventory_id_group"; + } + + if (is_string($module_inventory_name) === true + && $module_inventory_name != 'all' + ) { + $sql .= " AND tmodule_inventory.name IN ('".str_replace(',', "','", $module_inventory_name)."')"; + } + + $sql .= ' ORDER BY tagente_datos_inventory.utimestamp DESC'; + + $dates_raw = db_get_all_rows_sql($sql); + + if ($dates_raw == false) { + return []; + } + + $dates = []; + foreach ($dates_raw as $date) { + $dates[$date['utimestamp']] = $date['timestamp']; + } + + return $dates; +} + + +function inventory_get_agents($filter=false, $fields=false) +{ + $inventory_agents_id = db_get_all_rows_sql( + 'SELECT DISTINCT(id_agente) + FROM tagent_module_inventory' + ); + + if ($inventory_agents_id == false) { + $inventory_agents_id = []; + return []; + } + + $ids = []; + foreach ($inventory_agents_id as $ia) { + $ids[] = $ia['id_agente']; + } + + $filter['id_agente'] = $ids; + + $agents = agents_get_agents($filter, $fields); + + if ($agents === false) { + $agents = []; + } + + return $agents; +} + + +function inventory_get_changes( + $id_agent, + $module_names, + $start_utimestamp, + $end_utimestamp, + $return_mode=false +) { + global $config; + + $any_inventory_modules = false; + if (empty($module_names)) { + $any_inventory_modules = true; + } else if (((string) ($module_names[0])) === '0') { + $any_inventory_modules = true; + } + + $module_names = (array) $module_names; + + if ($id_agent[0] == -1) { + // Any agent + $sql = sprintf( + "SELECT evento, utimestamp + FROM tevento + WHERE utimestamp >= %d + AND utimestamp <= %d + AND event_type = 'configuration_change'", + $start_utimestamp, + $end_utimestamp + ); + } else { + $sql = sprintf( + "SELECT evento, utimestamp + FROM tevento + WHERE id_agente IN (%s) + AND utimestamp >= %d + AND utimestamp <= %d + AND event_type = 'configuration_change'", + implode(',', (array) $id_agent), + $start_utimestamp, + $end_utimestamp + ); + } + + $events = db_get_all_rows_sql($sql); + + if ($events === false) { + return ERR_NODATA; + } + + $inventory_changes = []; + $are_data = false; + + foreach ($events as $k => $event) { + $changes = io_safe_output($event['evento']); + $changes = explode("\n", $changes); + + $check = preg_match( + '/agent \'(.*)\' module \'(.*)\'/', + end($changes), + $matches + ); + + $agent_name = $matches[1]; + $module_name = $matches[2]; + + if (!$any_inventory_modules) { + if (!in_array($module_name, $module_names)) { + continue; + } + } + + $are_data = true; + + $inventory_changes[$k]['agent_name'] = $matches[1]; + $inventory_changes[$k]['module_name'] = $module_name; + $inventory_changes[$k]['utimestamp'] = $event['utimestamp']; + $changes[0] = str_replace('Configuration changes (', '', $changes[0]); + + unset($changes[(count($changes) - 1)]); + $state = ''; + foreach ($changes as $ch) { + if (preg_match('/NEW RECORD: (.*)/', $ch)) { + $ch = preg_replace('/NEW RECORD: /', '', $ch); + $ch = preg_replace('/^\'/', '', $ch); + $ch = '
'.$ch.'
'; + $state = 'new'; + } + + if (preg_match('/\s*DELETED RECORD: (.*)/', $ch)) { + $ch = preg_replace('/\s*DELETED RECORD/', '', $ch); + $ch = preg_replace('/^\'/', '', $ch); + $ch = '
'.$ch.'
'; + $state = 'deleted'; + } + + $inventory_changes[$k][$state][] = $ch; + } + } + + if ($are_data === false) { + if ($return_mode !== false) { + switch ($return_mode) { + case 'array': + return ERR_NODATA; + + break; + default: + return __('No changes found'); + break; + } + } + + return ERR_NODATA; + } + + switch ($return_mode) { + case 'csv': + $out_csv = ''; + foreach ($inventory_changes as $ic) { + $out_csv .= __('Agent').SEPARATOR_COLUMN_CSV.$ic['agent_name']."\n"; + $out_csv .= __('Module').SEPARATOR_COLUMN_CSV.$ic['module_name']."\n"; + $out_csv .= __('Date').SEPARATOR_COLUMN_CSV.date($config['date_format'], $ic['utimestamp'])."\n"; + if (isset($ic['new'])) { + foreach ($ic['new'] as $icc) { + $out_csv .= __('Added').SEPARATOR_COLUMN_CSV.$icc."\n"; + } + } + + if (isset($ic['deleted'])) { + foreach ($ic['deleted'] as $icc) { + $out_csv .= __('Deleted').SEPARATOR_COLUMN_CSV.$icc."\n"; + } + } + } + return $out_csv; + + break; + case 'array': + $out_array = []; + + foreach ($inventory_changes as $k => $ic) { + $out_array[$k]['agent'] = $ic['agent_name']; + $out_array[$k]['module'] = $ic['module_name']; + $out_array[$k]['date'] = date($config['date_format'], $ic['utimestamp']); + + if (isset($ic['new'])) { + foreach ($ic['new'] as $icc) { + $out_array[$k]['added'][] = $icc; + } + } + + if (isset($ic['deleted'])) { + foreach ($ic['deleted'] as $icc) { + $out_array[$k]['deleted'][] = $icc; + } + } + } + + if (empty($out_array)) { + return ERR_NODATA; + } + return $out_array; + + break; + } + + $out = ''; + foreach ($inventory_changes as $ic) { + $out .= ''; + } + + $out .= '
'; + + unset($table); + $table->width = '98%'; + $table->style[0] = 'text-align:50%'; + $table->style[1] = 'text-align:50%'; + + $table->data[0][0] = ''.__('Agent').': '.$ic['agent_name']; + $table->data[0][1] = ''.__('Module').': '.$ic['module_name']; + + $timestamp = date($config['date_format'], $ic['utimestamp']); + + $table->colspan[1][0] = 2; + $table->data[1][0] = '
('.$timestamp.')
'; + $row = 2; + + if (isset($ic['new'])) { + foreach ($ic['new'] as $icc) { + $table->colspan[$row][0] = 2; + $table->data[$row][0] = ''.__('Added').': '.$icc; + $row++; + } + } + + if (isset($ic['deleted'])) { + foreach ($ic['deleted'] as $icc) { + $table->colspan[$row][0] = 2; + $table->data[$row][0] = ''.__('Deleted').': '.$icc; + $row++; + } + } + + $out .= html_print_table($table, true); + + $out .= '
'; + + return $out; +} + + +/** + * Get a list with inventory modules + * + * @param mixed An integer can be place here to get a response + * to paginate. If this parameter is false, return full list + * + * @return array with inventory modules (paginated or not) + */ +function inventory_get_modules_list($offset=false) +{ + global $config; + + $filter = []; + if (is_numeric($offset)) { + $filter['limit'] = $config['block_size']; + $filter['offset'] = $offset; + } + + return db_get_all_rows_filter( + 'tmodule_inventory LEFT JOIN tconfig_os + ON tmodule_inventory.id_os = tconfig_os.id_os', + $filter, + [ + 'tmodule_inventory.id_module_inventory', + 'tmodule_inventory.name', + 'tmodule_inventory.description', + 'tmodule_inventory.interpreter', + 'tconfig_os.name AS os_name', + 'tconfig_os.id_os', + ] + ); +} + + +/** + * Validate the modules inventory + * + * @param array with inventory modules data. + * + * @return boolean True if the values are valid + */ +function inventory_validate_inventory_module($values) +{ + return !(empty($values['name']) || empty($values['id_os']) || + empty($values['data_format']) + ); +} + + +/** + * Insert the module inventory data into database + * + * @param array with inventory modules data. + * + * @return boolean False if values are invalid or cannot put it on database + */ +function inventory_create_inventory_module($values) +{ + if (!inventory_validate_inventory_module($values)) { + return false; + } + + return db_process_sql_insert('tmodule_inventory', $values); +} + + +/** + * Update the module inventory data into database + * + * @param int ID inventory module + * @param array with inventory modules data. + * + * @return boolean False if values are invalid or cannot put it on database + */ +function inventory_update_inventory_module($id_module_inventory, $values) +{ + if (!inventory_validate_inventory_module($values)) { + return false; + } + + return db_process_sql_update( + 'tmodule_inventory', + $values, + ['id_module_inventory' => $id_module_inventory] + ); +} + + +/** + * Returns inventory module names given agent id. + * + * @param integer $id_agent + * @param string $all + * @param integer $server_id + * @param string $server_name + * @return void + */ +function inventory_get_agent_modules($id_agent, $all='all', $server_id=0, $server_name=null) +{ + global $config; + + if ($config['metaconsole']) { + $server_id = metaconsole_get_id_server($server_name); + } + + switch ($all) { + default: + case 'all': + $enabled = '1 = 1'; + break; + case 'enabled': + $enabled = 'disabled = 0'; + break; + } + + if (is_array($id_agent)) { + $count_id_agent = count(($id_agent)); + $id_agent = implode(',', $id_agent); + } else { + $count_id_agent = 1; + } + + $sql = 'SELECT t1.id_module_inventory, name + FROM tmodule_inventory t1, tagent_module_inventory t2 + WHERE t1.id_module_inventory = t2.id_module_inventory + AND id_agente IN ('.$id_agent.') AND ( + SELECT count(name) + FROM tmodule_inventory t3, tagent_module_inventory t4 + WHERE t3.id_module_inventory = t4.id_module_inventory + AND t3.name = t1.name + AND t4.id_agente IN ('.$id_agent.')) = ('.$count_id_agent.') + ORDER BY name'; + + // Only in template editor from metaconsole. + if ($config['metaconsole']) { + $server_data = metaconsole_get_connection_by_id($server_id); + + if ($server_data === false) { + return ''; + } + + $modules = []; + + // Establishes connection. + if (metaconsole_load_external_db($server_data) !== NOERR) { + return ''; + } + + $modules = db_get_all_rows_sql($sql); + + if ($modules == false) { + $modules = []; + } + + $result = []; + foreach ($modules as $module) { + $result[$module['name']] = io_safe_output($module['name']); + } + + // Restore DB connection. + metaconsole_restore_db(); + } else { + $modules = db_get_all_rows_sql($sql); + + if ($modules == false) { + $modules = []; + } + + $result = []; + foreach ($modules as $module) { + $result[$module['name']] = io_safe_output($module['name']); + } + } + + return $result; +} diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 9bfc5dbdbc..d101d8f3eb 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -508,7 +508,7 @@ function menu_add_extras(&$menu) $menu_extra['gusuarios']['sub']['godmode/users/configure_profile']['text'] = __('Configure profile'); $menu_extra['gmodules']['sub']['godmode/modules/manage_network_templates_form']['text'] = __('Module templates management'); - $menu_extra['gmodules']['sub']['enterprise/godmode/modules/manage_inventory_modules_form']['text'] = __('Inventory modules management'); + $menu_extra['gmodules']['sub']['godmode/modules/manage_inventory_modules_form']['text'] = __('Inventory modules management'); $menu_extra['gagente']['sub']['godmode/agentes/configurar_agente']['text'] = __('Agents management'); @@ -529,6 +529,14 @@ function menu_add_extras(&$menu) $menu_extra['reporting']['sub']['enterprise/godmode/reporting/graph_template_wizard']['text'] = __('Graph template wizard'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=wizard&action=wizard']['text'] = __('Templates wizard'); $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=template&action=list_template']['text'] = __('Templates'); + $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&action=edit']['text'] = __('Edit custom reports'); + $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=list_items&action=edit']['text'] = __('List items'); + $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=item_editor&action=new']['text'] = __('Edit item'); + $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=wizard&action=edit']['text'] = __('Wizard'); + $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=wizard_sla&action=edit']['text'] = __('Wizard sla'); + $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=global&action=edit']['text'] = __('Global custom reports'); + $menu_extra['reporting']['sub']['godmode/reporting/reporting_builder&tab=advanced&action=edit']['text'] = __('Avanced options'); + if ($config['activate_gis']) { $menu_extra['godgismaps']['sub']['godmode/gis_maps/configure_gis_map']['text'] = __('Manage GIS Maps'); } @@ -793,3 +801,313 @@ function menu_pepare_acl_select_data($pages, $sec) return $pages; } + + +if (is_ajax()) { + $about = (bool) get_parameter('about'); + if ($about) { + global $config; + global $pandora_version; + global $build_version; + $product_name = io_safe_output(get_product_name()); + + include_once $config['homedir'].'/include/class/Diagnostics.class.php'; + $d = new Diagnostics; + $db_health = json_decode($d->getDatabaseHealthStatus()); + $db_info = json_decode($d->getDatabaseStatusInfo()); + $db_fragmentation = json_decode($d->getTablesFragmentation()); + $sys_info = json_decode($d->getSystemInfo()); + $php_sys = json_decode($d->getPHPSetup()); + + $fragmentation_status = ''; + if ($db_fragmentation->data->tablesFragmentationStatus->status === 1) { + $fragmentation_status = html_print_image( + 'images/exito.png', + true, + [ + 'title' => __('Successfully'), + 'style' => 'width:15px;', + ] + ); + } else { + $fragmentation_status = html_print_image( + 'images/error_1.png', + true, + [ + 'title' => __('Error'), + 'style' => 'width:15px;', + ] + ); + } + + $image_about = ui_get_full_url('/images/custom_logo/logo-default-pandorafms.png', false, false, false); + if (enterprise_installed() === false) { + if ($config['style'] === 'pandora_black') { + $image_about = 'images/custom_logo/'.HEADER_LOGO_BLACK_CLASSIC; + } else if ($config['style'] === 'pandora') { + $image_about = 'images/custom_logo/'.HEADER_LOGO_DEFAULT_CLASSIC; + } + } else { + if ($config['style'] === 'pandora_black' && $config['custom_logo'] === HEADER_LOGO_DEFAULT_CLASSIC) { + $config['custom_logo'] = HEADER_LOGO_BLACK_CLASSIC; + } else if ($config['style'] === 'pandora' && $config['custom_logo'] === HEADER_LOGO_BLACK_CLASSIC) { + $config['custom_logo'] = HEADER_LOGO_DEFAULT_CLASSIC; + } + + $image_about = 'images/custom_logo/'.$config['custom_logo']; + + if (file_exists(ENTERPRISE_DIR.'/'.$image_about) === true) { + $image_about = ENTERPRISE_DIR.'/'.$image_about; + } + } + + $dialog = ' + + '; + + echo $dialog; + } +} diff --git a/pandora_console/include/functions_modules.php b/pandora_console/include/functions_modules.php index 443e482173..15c6da909e 100755 --- a/pandora_console/include/functions_modules.php +++ b/pandora_console/include/functions_modules.php @@ -2589,12 +2589,12 @@ function modules_get_agentmodule_data_for_humans($module) $salida = human_milliseconds_to_string($module['datos']); } } else { - $salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'])); + $salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])); } break; default: - $salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'])); + $salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])); break; } break; @@ -2613,12 +2613,12 @@ function modules_get_agentmodule_data_for_humans($module) $salida = human_milliseconds_to_string($module['datos']); } } else { - $salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'])); + $salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])); } break; default: - $salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'])); + $salida = remove_right_zeros(number_format($module['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])); break; } } @@ -2900,7 +2900,7 @@ function modules_get_status($id_agent_module, $db_status, $data, &$status, &$tit } if (is_numeric($data)) { - $title .= ': '.remove_right_zeros(number_format($data, $config['graph_precision'])); + $title .= ': '.remove_right_zeros(number_format($data, $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])); } else { $text = io_safe_output($data); @@ -3112,7 +3112,7 @@ function modules_get_relations($params=[]) } $distinct = ''; - if (empty($params)) { + if (empty($params) || isset($params['distinct'])) { $distinct = 'DISTINCT'; } @@ -3136,6 +3136,11 @@ function modules_get_relations($params=[]) ); } + $id_rt_filter = ''; + if (isset($params['id_rt'])) { + $id_rt_filter = sprintf('AND tmr.id_rt = %d', $params['id_rt']); + } + $sql = sprintf( 'SELECT %s tmr.id, tmr.module_a, tmr.module_b, tmr.disable_update, tmr.type @@ -3153,7 +3158,8 @@ function modules_get_relations($params=[]) $module_type, $agent_filter, $disabled_update_filter, - $modules_type_filter + $modules_type_filter, + $id_rt_filter ); return db_get_all_rows_sql($sql); @@ -3982,6 +3988,93 @@ function recursive_get_dt_from_modules_tree(&$f_modules, $modules, $deep) } +/** + * Get the module data from a children + * + * @param integer $id_module Id module + * @param boolean $recursive Recursive children search. + * @return array Children module data + */ +function get_children_module($id_module, $fields=false, $recursion=false) +{ + $children_module_data = db_get_all_rows_filter( + 'tagente_modulo', + ['parent_module_id' => $id_module], + $fields + ); + + if ($children_module_data !== false && $recursion === true) { + foreach ($children_module_data as $child) { + $niece = get_children_module($child['id_agente_modulo'], $fields, false); + if ((bool) $niece === false) { + continue; + } else { + $children_module_data = array_merge($children_module_data, $niece); + } + } + } + + return $children_module_data; +} + + +/** + * Find and delete the childers modules from the $id_module + * + * @param mixed $id_module + * @return void + */ +function module_check_childrens_and_delete($id_module) +{ + $children_data = get_children_module($id_module); + // Check if exist have a childer + if ($children_data) { + // If have more than 1 children + if (is_array($children_data)) { + foreach ($children_data as $children_module_data) { + if ($children_module_data['parent_module_id']) { + // Search children and delete this module + // Before delete, lets check if exist (Just for cases it's already deleted) + if (modules_check_agentmodule_exists($children_module_data['parent_module_id'])) { + modules_delete_agent_module($children_module_data['parent_module_id']); + } + + module_check_childrens_and_delete($children_module_data['id_agente_modulo']); + } else { + // If haven't children just delete + // Before delete, lets check if exist (Just for cases it's already deleted) + if (modules_check_agentmodule_exists($children_module_data['id_agente_modulo'])) { + modules_delete_agent_module($children_module_data['id_agente_modulo']); + } + } + } + } else { + // If just have 1 children + if ($children_data['parent_module_id']) { + // Before delete, lets check if exist (Just for cases it's already deleted) + if (modules_check_agentmodule_exists($children_data['parent_module_id'])) { + modules_delete_agent_module($children_data['parent_module_id']); + } + + module_check_childrens_and_delete($children_data['id_agente_modulo']); + } else { + // If haven't children just delete + // Before delete, lets check if exist (Just for cases it's already deleted) + if (modules_check_agentmodule_exists($children_data['id_agente_modulo'])) { + modules_delete_agent_module($children_data['id_agente_modulo']); + } + } + } + } else { + // Haven't childrens, so delete + // Before delete, lets check if exist (Just for cases it's already deleted) + if (modules_check_agentmodule_exists($id_module)) { + modules_delete_agent_module($id_module); + } + } +} + + /** * @brief Get the button with the link to open realtime stats into a new window * Only to native (not satellite discovered) snmp modules. @@ -4336,3 +4429,129 @@ function modules_get_regex( return $result; } + + +/** + * Status for data thresholds modules. + * + * @param integer $id_module Module ID. + * @param mixed $data Data int, bool, null, etc. + * @param array $thresholds Array thresholds. + * + * @return array + */ +function get_status_data_modules(int $id_module, $data, $thresholds) +{ + // Check not init. + if ($data === false) { + return ['color' => COL_NOTINIT]; + } + + // Check boolean. + $is_bolean = modules_is_boolean($id_module); + if ($is_bolean === true) { + if ($data > 0) { + return ['color' => COL_CRITICAL]; + } else { + return ['color' => COL_NORMAL]; + } + } + + $thresholds = calculateThreshold($thresholds); + + foreach (getStatuses() as $status) { + if ($thresholds[$status]['min'] === null + && $thresholds[$status]['max'] === null + ) { + continue; + } + + if (($thresholds[$status]['min'] === null + && $thresholds[$status]['max'] >= $data) + || ($thresholds[$status]['max'] === null + && $thresholds[$status]['min'] <= $data) + || ($thresholds[$status]['min'] <= $data + && $thresholds[$status]['max'] >= $data) + ) { + if ($status === 'critical') { + return ['color' => COL_CRITICAL]; + } else if ($status === 'warning') { + return ['color' => COL_WARNING]; + } else { + return ['color' => COL_NORMAL]; + } + } + } + + return ['color' => COL_NORMAL]; +} + + +/** + * Calculate thresholds. + * + * @param array $thresholds_array + * + * @return array + */ +function calculateThreshold(array $thresholds_array) +{ + $nMax = null; + if ($thresholds_array['min_warning'] !== null) { + $nMax = $thresholds_array['min_warning']; + } else if ($thresholds_array['min_critical'] !== null) { + $nMax = $thresholds_array['min_critical']; + } + + $wMin = null; + if ($thresholds_array['min_warning'] !== null) { + $wMin = $thresholds_array['min_warning']; + } + + $wMax = null; + if ($thresholds_array['max_warning'] !== null) { + $wMax = $thresholds_array['max_warning']; + } + + $cMin = null; + if ($thresholds_array['min_critical'] !== null) { + $cMin = $thresholds_array['min_critical']; + } + + $cMax = null; + if ($thresholds_array['max_critical'] !== null) { + $cMax = $thresholds_array['max_critical']; + } + + $thresholds = [ + 'normal' => [ + 'min' => null, + 'max' => $nMax, + ], + 'warning' => [ + 'min' => $wMin, + 'max' => $wMax, + ], + 'critical' => [ + 'min' => $cMin, + 'max' => $cMax, + ], + ]; + + return $thresholds; +} + + +/** + * Get status. + * + * @return array + */ +function getStatuses() +{ + return [ + 'critical', + 'warning', + 'normal', + ]; +} diff --git a/pandora_console/include/functions_netflow.php b/pandora_console/include/functions_netflow.php index 6a0c68d3d7..e4ac71e690 100644 --- a/pandora_console/include/functions_netflow.php +++ b/pandora_console/include/functions_netflow.php @@ -1479,7 +1479,7 @@ function netflow_draw_item( } if ($output === 'HTML' || $output === 'PDF') { - return graph_nodata_image(300, 110, 'data'); + return graph_nodata_image(['height' => 110]); } } diff --git a/pandora_console/include/functions_network.php b/pandora_console/include/functions_network.php index 9df4f8dbc4..c503945c87 100644 --- a/pandora_console/include/functions_network.php +++ b/pandora_console/include/functions_network.php @@ -124,8 +124,9 @@ function network_general_map_configuration($nodes, $relations) 'map_options' => [ 'generation_method' => LAYOUT_SPRING1, 'map_filter' => [ - 'node_radius' => 40, - 'node_sep' => 7, + 'node_radius' => 40, + 'node_sep' => 7, + 'node_separation' => 5, ], ], ]; @@ -171,8 +172,8 @@ function network_init_node_map($name) return [ 'name' => $name, 'type' => NODE_GENERIC, - 'width' => 20, - 'height' => 20, - 'status' => '#82B92E', + 'width' => 40, + 'height' => 40, + 'status' => 0, ]; } diff --git a/pandora_console/include/functions_networkmap.php b/pandora_console/include/functions_networkmap.php index 54005a571a..120af5b571 100644 --- a/pandora_console/include/functions_networkmap.php +++ b/pandora_console/include/functions_networkmap.php @@ -3393,13 +3393,16 @@ function get_status_color_networkmap_fictional_point($id_networkmap, $parent='') $exit = false; foreach ($agents as $agent) { - if ($agent['source_data'] == -1) { + if ($agent['source_data'] == -1 || $agent['type'] == 2) { continue; } if ($agent['source_data'] == -2) { if (empty($parent) === true) { - $option = json_decode($agent, true); + if (is_array($agent) === false) { + $option = json_decode($agent, true); + } + if ($option['networkmap'] == 0) { $status = 0; } else { @@ -4158,7 +4161,149 @@ function networkmap_get_new_nodes_and_links($networkmap, $x, $y) } if ((int) $networkmap['source'] === SOURCE_TASK) { - $agents = get_discovery_agents($id_recon, true); + $agents = enterprise_hook('get_discovery_agents', [$id_recon, true]); + + $relations_discovery = modules_get_relations(['id_rt' => $id_recon, 'distinct' => true]); + $array_aux = $relations_discovery; + $target_aux = $relations_discovery; + + foreach ($relations_discovery as $key => $rel) { + foreach ($array_aux as $key2 => $rel2) { + if ($key2 <= $key) { + continue; + } + + if ($rel['module_a'] === $rel2['module_a']) { + $agent1 = modules_get_agentmodule_agent($rel['module_b']); + $agent2 = modules_get_agentmodule_agent($rel2['module_b']); + + if ($agent1 === $agent2) { + $name1 = modules_get_agentmodule_name($rel['module_b']); + $name2 = modules_get_agentmodule_name($rel2['module_b']); + if ($name1 == 'Host Alive') { + unset($target_aux[$key]); + } else if ($name2 == 'Host Alive') { + unset($target_aux[$key2]); + } + + continue; + } + } + + if ($rel['module_b'] === $rel2['module_b']) { + $agent1 = modules_get_agentmodule_agent($rel['module_a']); + $agent2 = modules_get_agentmodule_agent($rel2['module_a']); + + if ($agent1 === $agent2) { + $name1 = modules_get_agentmodule_name($rel['module_a']); + $name2 = modules_get_agentmodule_name($rel2['module_a']); + if ($name1 == 'Host Alive') { + unset($target_aux[$key]); + } else if ($name2 == 'Host Alive') { + unset($target_aux[$key2]); + } + + continue; + } + } + + if ($rel['module_a'] === $rel2['module_b']) { + $agent1 = modules_get_agentmodule_agent($rel['module_b']); + $agent2 = modules_get_agentmodule_agent($rel2['module_a']); + + if ($agent1 === $agent2) { + $name1 = modules_get_agentmodule_name($rel['module_b']); + $name2 = modules_get_agentmodule_name($rel2['module_a']); + if ($name1 == 'Host Alive') { + unset($target_aux[$key]); + } else if ($name2 == 'Host Alive') { + unset($target_aux[$key2]); + } + + continue; + } + } + + if ($rel['module_b'] === $rel2['module_a']) { + $agent1 = modules_get_agentmodule_agent($rel['module_a']); + $agent2 = modules_get_agentmodule_agent($rel2['module_b']); + + if ($agent1 === $agent2) { + $name1 = modules_get_agentmodule_name($rel['module_a']); + $name2 = modules_get_agentmodule_name($rel2['module_b']); + if ($name1 == 'Host Alive') { + unset($target_aux[$key]); + } else if ($name2 == 'Host Alive') { + unset($target_aux[$key2]); + } + + continue; + } + } + } + } + + $relations_discovery = $target_aux; + + db_process_sql_delete('trel_item', ['id_map' => $id_networkmap, 'parent_type' => 1, 'child_type' => 1]); + + $id_recon = $id_networkmap; + + // Relations Module <-> Module. + foreach ($relations_discovery as $key => $relation) { + $module_a = $relation['module_a']; + $agent_a = modules_get_agentmodule_agent($module_a); + $module_b = $relation['module_b']; + $agent_b = modules_get_agentmodule_agent($module_b); + + $exist = db_get_row_filter( + 'trel_item', + [ + 'id_map' => $id_networkmap, + 'id_parent_source_data' => $module_a, + 'id_child_source_data' => $module_b, + 'deleted' => 0, + ] + ); + $exist_reverse = db_get_row_filter( + 'trel_item', + [ + 'id_map' => $id_networkmap, + 'id_parent_source_data' => $module_b, + 'id_child_source_data' => $module_a, + 'deleted' => 0, + ] + ); + + if (empty($exist) === true && empty($exist_reverse) === true) { + $item_a = db_get_value( + 'id', + 'titem', + 'source_data', + $agent_a + ); + + $item_b = db_get_value( + 'id', + 'titem', + 'source_data', + $agent_b + ); + + db_process_sql_insert( + 'trel_item', + [ + 'id_map' => $id_networkmap, + 'id_parent' => $item_a, + 'id_child' => $item_b, + 'id_parent_source_data' => $module_a, + 'id_child_source_data' => $module_b, + 'parent_type' => 1, + 'child_type' => 1, + ] + ); + } + } } else if ((int) $networkmap['source'] === SOURCE_NETWORK) { // Network map, based on direct network. $agents = networkmap_get_nodes_from_ip_mask( @@ -4372,280 +4517,6 @@ function networkmap_get_new_nodes_and_links($networkmap, $x, $y) } } - // foreach ($interfaces as $interface) { - // $relations = modules_get_relations( - // ['id_module' => $interface['id_agente_modulo']] - // ); - // if (empty($relations) === true) { - // $relations = []; - // } - // foreach ($relations as $relation) { - // Get the links althought they are deleted (for to - // avoid to add) - // Check if the module is ping. - // if (modules_get_agentmodule_type($relation['module_a']) === '6') { - // The pings modules are not exist as interface - // the link is with the agent. - // $node_a = db_get_value_filter( - // 'id', - // 'titem', - // [ - // 'source_data' => modules_get_agentmodule_agent( - // $relation['module_a'] - // ), - // 'id_map' => $id_networkmap, - // ] - // ); - // } else { - // $node_a = db_get_value_filter( - // 'id', - // 'titem', - // [ - // 'source_data' => $relation['module_a'], - // 'type' => 1, - // 'id_map' => $id_networkmap, - // ] - // ); - // } - // Check if the module is ping. - // if (modules_get_agentmodule_type($relation['module_b']) == 6) { - // The pings modules are not exist as interface - // the link is with the agent. - // $node_b = db_get_value_filter( - // 'id', - // 'titem', - // [ - // 'source_data' => modules_get_agentmodule_agent( - // $relation['module_b'] - // ), - // 'id_map' => $id_networkmap, - // ] - // ); - // } else { - // $node_b = db_get_value_filter( - // 'id', - // 'titem', - // [ - // 'source_data' => $relation['module_b'], - // 'type' => 1, - // 'id_map' => $id_networkmap, - // ] - // ); - // } - // $exist = db_get_row_filter( - // 'trel_item', - // [ - // 'id_map' => $id_networkmap, - // 'id_parent_source_data' => $relation['module_a'], - // 'id_child_source_data' => $relation['module_b'], - // 'deleted' => 0, - // ] - // ); - // $exist_reverse = db_get_row_filter( - // 'trel_item', - // [ - // 'id_map' => $id_networkmap, - // 'id_parent_source_data' => $relation['module_b'], - // 'id_child_source_data' => $relation['module_a'], - // 'deleted' => 0, - // ] - // ); - // if (empty($exist) && empty($exist_reverse)) { - // Create the nodes for interfaces - // Ag1 ----- I1 ------ I2 ----- Ag2 - // * 2 interfaces nodes - // * 3 relations - // * I1 between I2 - // * Ag1 between I1 - // * Ag2 between I2 - // - // But check if it exists the relations - // agent between interface. - // if ($interface['id_agente_modulo'] == $relation['module_a']) { - // $agent_a = $interface['id_agente']; - // $agent_b = modules_get_agentmodule_agent( - // $relation['module_b'] - // ); - // } else { - // $agent_a = modules_get_agentmodule_agent( - // $relation['module_a'] - // ); - // $agent_b = $interface['id_agente']; - // } - // $item_a = db_get_value( - // 'id', - // 'titem', - // 'source_data', - // $agent_a - // ); - // $item_b = db_get_value( - // 'id', - // 'titem', - // 'source_data', - // $agent_b - // ); - // hd('----------------------', true); - // hd($agent_a, true); - // hd($agent_b, true); - // foreach ($interfaces as $interface) { - // $relations = modules_get_relations( - // ['id_module' => $interface['id_agente_modulo']] - // ); - // if (empty($relations) === true) { - // $relations = []; - // } - // foreach ($relations as $relation) {hd($item_a. '<->'. $item_b, true); - // hd('----------------------', true); - // continue; - // $exist_node_interface1 = db_get_row_filter( - // 'titem', - // [ - // 'id_map' => $id_networkmap, - // 'type' => 0, - // 'source_data' => $relation['module_a'], - // ] - // ); - // if (empty($exist_node_interface1) === true) { - // Crete the interface node - // and create the relation between agent and - // interface. - // $style = []; - // $style['id_agent'] = $agent_a; - // $style['shape'] = 'circle'; - // $style['image'] = 'images/mod_snmp_proc.png'; - // $style['width'] = 50; - // $style['height'] = 16; - // $style['label'] = modules_get_agentmodule_name($relation['module_a']); - // $id_int1 = db_process_sql_insert( - // 'titem', - // [ - // 'id_map' => $id_networkmap, - // 'x' => 666, - // 'y' => 666, - // 'z' => 0, - // 'deleted' => 0, - // 'type' => 1, - // 'refresh' => 0, - // 'source' => 0, - // 'source_data' => $relation['module_a'], - // 'style' => json_encode($style), - // ] - // ); - // $node_interface1 = db_get_row_filter( - // 'titem', - // [ - // 'id_map' => $id_networkmap, - // 'type' => 1, - // 'id' => $id_int1, - // ] - // ); - // $node_agent1 = db_get_value( - // 'id', - // 'titem', - // 'source_data', - // $agent_a - // ); - // db_process_sql_insert( - // 'trel_item', - // [ - // 'id_map' => $id_networkmap, - // 'id_parent' => $node_agent1, - // 'id_child' => $node_interface1, - // 'id_parent-source_data' => $agent_a, - // 'id_child-source_data' => $relation['module_a'], - // 'parent_type' => 0, - // 'child_type' => 1, - // ] - // ); - // } else { - // $node_interface1 = $exist_node_interface1; - // } - // $exist_node_interface2 = db_get_row_filter( - // 'titem', - // [ - // 'id_map' => $id_networkmap, - // 'type' => 1, - // 'source_data' => $relation['module_b'], - // ] - // ); - // if (empty($exist_node_interface2) === true) { - // Crete the interface node - // and create the relation between agent and - // interface. - // $style = []; - // $style['id_agent'] = $agent_a; - // $style['shape'] = 'circle'; - // $style['image'] = 'images/mod_snmp_proc.png'; - // $style['width'] = 50; - // $style['height'] = 16; - // $style['label'] = modules_get_agentmodule_name($relation['module_b']); - // $id_int2 = db_process_sql_insert( - // 'titem', - // [ - // 'id_map' => $id_networkmap, - // 'x' => 666, - // 'y' => 666, - // 'z' => 0, - // 'deleted' => 0, - // 'type' => 1, - // 'refresh' => 0, - // 'source' => 0, - // 'source_data' => $relation['module_b'], - // 'style' => json_encode($style), - // ] - // ); - // $node_interface2 = db_get_row_filter( - // 'titem', - // [ - // 'id_map' => $id_networkmap, - // 'type' => 1, - // 'id' => $id_int1, - // ] - // ); - // $node_agent1 = db_get_value( - // 'id', - // 'titem', - // 'source_data', - // $agent_a - // ); - // db_process_sql_insert( - // 'trel_item', - // [ - // 'id_map' => $id_networkmap, - // 'id_parent' => $node_agent1, - // 'id_child' => $node_interface1, - // 'id_parent-source_data' => $agent_a, - // 'id_child-source_data' => $relation['module_b'], - // 'parent_type' => 0, - // 'child_type' => 1, - // ] - // ); - // } else { - // $node_interface2 = $exist_node_interface2; - // } - // if (empty($node_interface1) === false && empty($node_interface2) === false) { - // if (is_array($node_interface1) === true) { - // $node_interface1 = $node_interface1['id']; - // } - // if (is_array($node_interface2) === true) { - // $node_interface2 = $node_interface2['id']; - // } - // db_process_sql_insert( - // 'trel_item', - // [ - // 'id_map' => $id_networkmap, - // 'id_parent' => $node_interface2, - // 'id_child' => $node_interface1, - // 'id_parent_source_data' => $relation['module_b'], - // 'id_child_source_data' => $relation['module_a'], - // 'parent_type' => 1, - // 'child_type' => 1, - // ] - // ); - // } - // } - // } - // } $relations = modules_get_relations( [ 'id_agent' => $node['source_data'], @@ -4723,18 +4594,6 @@ function networkmap_get_new_nodes_and_links($networkmap, $x, $y) if (empty($interfaces) === true) { $interfaces = []; } - - // hd('interfaces', true); - // foreach ($interfaces as $interface) { - // $relations = modules_get_relations( - // ['id_module' => $interface['id_agente_modulo']] - // ); - // if (empty($relations) === true) { - // $relations = []; - // } - // foreach ($relations as $relation) { - // } - // } } } diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index a0cb16faa0..705d67ab3b 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -134,7 +134,7 @@ function notifications_get_subtypes(?string $source=null) 'NOTIF.PHP.UPLOAD_MAX_FILESIZE', 'NOTIF.PHP.MEMORY_LIMIT', 'NOTIF.PHP.DISABLE_FUNCTIONS', - 'NOTIF.PHP.PHANTOMJS', + 'NOTIF.PHP.CHROMIUM', 'NOTIF.PHP.VERSION', 'NOTIF.HISTORYDB', 'NOTIF.PANDORADB', diff --git a/pandora_console/include/functions_planned_downtimes.php b/pandora_console/include/functions_planned_downtimes.php index e8c4344c05..38ee77a422 100644 --- a/pandora_console/include/functions_planned_downtimes.php +++ b/pandora_console/include/functions_planned_downtimes.php @@ -24,7 +24,8 @@ global $config; * Include the usual functions */ require_once $config['homedir'].'/include/functions_ui.php'; -// enterprise_include_once('include/functions_inventory.php'); + + function planned_downtimes_check_dates($type_execution='once', $type_periodicity='', $datetime_from=false, $datetime_to=false, $periodically_time_from=false, $periodically_time_to=false, $periodically_day_from=false, $periodically_day_to=false) { global $config; diff --git a/pandora_console/include/functions_profile.php b/pandora_console/include/functions_profile.php index ad052dadbd..5132817588 100644 --- a/pandora_console/include/functions_profile.php +++ b/pandora_console/include/functions_profile.php @@ -181,7 +181,7 @@ function profile_delete_profile_and_clean_users($id_profile) * @param int User id * @param bool Show the tags select or not */ -function profile_print_profile_table($id, $json_profile=false, $return=false) +function profile_print_profile_table($id, $json_profile=false, $return=false, $create_user=false) { global $config; @@ -284,7 +284,7 @@ function profile_print_profile_table($id, $json_profile=false, $return=false) if (empty($profile['tags'])) { $data['tags'] = ''; } else { - if (is_array($profile['tags'] === false)) { + if (is_array($profile['tags']) === false) { $tags_ids = explode(',', $profile['tags']); } else { $tags_ids = $profile['tags']; @@ -296,12 +296,26 @@ function profile_print_profile_table($id, $json_profile=false, $return=false) $data['hierarchy'] = $profile['no_hierarchy'] ? __('Yes') : __('No'); - $data['actions'] = '
'; - $data['actions'] .= html_print_input_image('del', 'images/cross.png', 1, ['class' => 'invert_filter'], true); - $data['actions'] .= html_print_input_hidden('delete_profile', 1, true); - $data['actions'] .= html_print_input_hidden('id_user_profile', $profile['id_up'], true); - $data['actions'] .= html_print_input_hidden('id_user', $id, true); - $data['actions'] .= '
'; + if ($create_user) { + $data['actions'] .= html_print_input_image( + 'del', + 'images/cross.png', + 1, + '', + true, + [ + 'onclick' => 'delete_profile(event, this)', + 'class' => 'invert_filter', + ] + ); + } else { + $data['actions'] = '
'; + $data['actions'] .= html_print_input_image('del', 'images/cross.png', 1, ['class' => 'invert_filter'], true); + $data['actions'] .= html_print_input_hidden('delete_profile', 1, true); + $data['actions'] .= html_print_input_hidden('id_user_profile', $profile['id_up'], true); + $data['actions'] .= html_print_input_hidden('id_user', $id, true); + $data['actions'] .= '
'; + } array_push($table->data, $data); } diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 09322c7a8c..637ae59752 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -257,6 +257,10 @@ function reporting_make_reporting_data( $content['style'] = json_decode(io_safe_output($content['style']), true); + if (!empty($content['style']['event_filter_search'])) { + $content['style']['event_filter_search'] = io_safe_input($content['style']['event_filter_search']); + } + $graphs_to_macro = db_get_all_rows_field_filter( 'tgraph_source', 'id_graph', @@ -844,7 +848,8 @@ function reporting_make_reporting_data( $content, $type, $force_width_chart, - $force_height_chart + $force_height_chart, + $pdf ); if ($report_control['total_events'] == 0 && $content['hide_no_data'] == 1) { break; @@ -1780,7 +1785,9 @@ function reporting_event_top_n( if ($order_uptodown == 1 || $order_uptodown == 2) { $i = 0; - $data_pie_graph = []; + $labels_pie = []; + $labels_hbar = []; + $data_pie = []; $data_hbar = []; foreach ($data_top as $key_dt => $dt) { $item_name = ui_print_truncate_text( @@ -1801,28 +1808,14 @@ function reporting_event_top_n( '...' ); - $item_name_key_pie = $item_name; - $exist_key = true; - while ($exist_key) { - if (isset($data_pie_graph[$item_name_key_pie])) { - $item_name_key_pie .= ' '; - } else { - $exist_key = false; - } - } + $labels_hbar[] = io_safe_output($item_name); + $data_hbar[] = [ + 'y' => io_safe_output($item_name), + 'x' => $dt, + ]; - $item_name_key_hbar = $item_name; - $exist_key = true; - while ($exist_key) { - if (isset($data_hbar[$item_name_key_hbar])) { - $item_name_key_hbar = ' '.$item_name_key_hbar; - } else { - $exist_key = false; - } - } - - $data_hbar[$item_name]['g'] = $dt; - $data_pie_graph[$item_name] = $dt; + $labels_pie[] = io_safe_output($item_name); + $data_pie[] = $dt; if ($show_graph == 0 || $show_graph == 1) { $data = []; @@ -1833,14 +1826,24 @@ function reporting_event_top_n( $divisor = get_data_multiplier($units[$key_dt]); - $data['formated_value'] = format_for_graph( - $dt, - 2, - '.', - ',', - $divisor, - $units[$key_dt] - ); + if ((bool) $content['use_prefix_notation'] === false) { + $data['formated_value'] = number_format( + $dt, + 2, + $config['decimal_separator'], + $config['thousand_separator'] + ).' '.$units[$key_dt]; + } else { + $data['formated_value'] = format_for_graph( + $dt, + 2, + '.', + ',', + $divisor, + $units[$key_dt] + ); + } + $data_return[] = $data; } @@ -1851,7 +1854,9 @@ function reporting_event_top_n( } } else if ($order_uptodown == 0 || $order_uptodown == 3) { $i = 0; - $data_pie_graph = []; + $labels_pie = []; + $labels_hbar = []; + $data_pie = []; $data_hbar = []; foreach ($agent_name as $key_an => $an) { $item_name = ''; @@ -1871,16 +1876,6 @@ function reporting_event_top_n( '...' ); - $item_name_key_pie = $item_name; - $exist_key = true; - while ($exist_key) { - if (isset($data_pie_graph[$item_name_key_pie])) { - $item_name_key_pie .= ' '; - } else { - $exist_key = false; - } - } - $item_name_key_hbar = $item_name; $exist_key = true; while ($exist_key) { @@ -1891,8 +1886,18 @@ function reporting_event_top_n( } } - $data_pie_graph[$item_name] = $data_top[$key_an]; - $data_hbar[$item_name]['g'] = $data_top[$key_an]; + $labels_hbar[] = io_safe_output($item_name); + $data_hbar[] = [ + 'y' => io_safe_output($item_name), + 'x' => $data_top[$key_an], + ]; + if ((int) $ttl === 2) { + $data_top[$key_an] = (empty($data_top[$key_an]) === false) ? $data_top[$key_an] : 0; + $item_name .= ' ('.$data_top[$key_an].')'; + } + + $labels_pie[] = io_safe_output($item_name); + $data_pie[] = $data_top[$key_an]; $divisor = get_data_multiplier($units[$key_an]); @@ -1901,14 +1906,25 @@ function reporting_event_top_n( $data['agent'] = $an; $data['module'] = $module_name[$key_an]; $data['value'] = $data_top[$key_an]; - $data['formated_value'] = format_for_graph( - $data_top[$key_an], - 2, - '.', - ',', - $divisor, - $units[$key_an] - ); + + if ((bool) $content['use_prefix_notation'] === false) { + $data['formated_value'] = number_format( + $data_top[$key_an], + 2, + $config['decimal_separator'], + $config['thousand_separator'] + ).' '.$units[$key_an]; + } else { + $data['formated_value'] = format_for_graph( + $data_top[$key_an], + 2, + '.', + ',', + $divisor, + $units[$key_an] + ); + } + $data_return[] = $data; } @@ -1923,39 +1939,80 @@ function reporting_event_top_n( $return['charts']['pie'] = null; if ($show_graph != REPORT_TOP_N_ONLY_TABLE) { - arsort($data_pie_graph); - $return['charts']['pie'] = pie_graph( - $data_pie_graph, - $width, - $height, - __('other'), - ui_get_full_url(false, true, false, false).'/', - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl + $options_charts = [ + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'ttl' => $ttl, + 'labels' => $labels_pie, + ]; + + if ((int) $ttl === 2) { + $options_charts['dataLabel'] = ['display' => 'auto']; + $options_charts['layout'] = [ + 'padding' => [ + 'top' => 15, + 'bottom' => 15, + ], + ]; + } + + $return['charts']['pie'] = '
'; + if ((int) $ttl === 2) { + $return['charts']['pie'] .= ''; + } + + $return['charts']['pie'] .= '
'; + + $options = [ + 'height' => (count($data_hbar) * 30), + 'ttl' => $ttl, + 'axis' => 'y', + 'legend' => ['display' => false], + 'scales' => [ + 'x' => [ + 'grid' => ['display' => false], + ], + 'y' => [ + 'grid' => ['display' => false], + ], + ], + 'labels' => $labels_hbar, + ]; + + if ((int) $ttl === 2) { + $options['dataLabel'] = ['display' => 'auto']; + $options['layout'] = [ + 'padding' => ['right' => 35], + ]; + } + + $return['charts']['bars'] = '
'; + if ((int) $ttl === 2) { + $return['charts']['bars'] .= ''; + } + + $return['charts']['bars'] .= '
'; } $return['resume'] = null; @@ -2008,7 +2065,8 @@ function reporting_event_report_group( $content, $type='dinamic', $force_width_chart=null, - $force_height_chart=null + $force_height_chart=null, + $pdf=false ) { global $config; @@ -2154,6 +2212,28 @@ function reporting_event_report_group( $return['chart']['by_criticity'] = null; $return['chart']['validated_vs_unvalidated'] = null; + $options_charts = [ + 'width' => 500, + 'height' => 150, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'pdf' => $pdf, + 'ttl' => $ttl, + ]; + + if ($pdf === true) { + $options_charts['dataLabel'] = ['display' => 'auto']; + $options_charts['layout'] = [ + 'padding' => [ + 'top' => 15, + 'bottom' => 15, + ], + ]; + } + if ($event_graph_by_agent) { $data_graph_by_agent = []; if (empty($data) === false) { @@ -2163,70 +2243,118 @@ function reporting_event_report_group( $k = '('.$value['server_name'].') '.$value['alias']; } + $k = io_safe_output($k); + if (isset($data_graph_by_agent[$k]) === true) { $data_graph_by_agent[$k]++; } else { $data_graph_by_agent[$k] = 1; } } + + if ($pdf === true) { + $result_data_graph_by_agent = []; + foreach ($data_graph_by_agent as $key => $value) { + $result_data_graph_by_agent[$key.' ('.$value.')'] = $value; + } + + $data_graph_by_agent = $result_data_graph_by_agent; + } } - $return['chart']['by_agent'] = pie_graph( - $data_graph_by_agent, - 500, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl + if ($pdf === true) { + $return['chart']['by_agent'] = ''; + } + + $options_charts['labels'] = array_keys($data_graph_by_agent); + $return['chart']['by_agent'] .= pie_graph( + array_values($data_graph_by_agent), + $options_charts ); + + if ($pdf === true) { + $return['chart']['by_agent'] .= '" />'; + } else { + $return['chart']['by_agent'] .= ''; + } } if ($event_graph_by_user_validator) { $data_graph_by_user = events_get_count_events_validated_by_user($data); - $return['chart']['by_user_validator'] = pie_graph( - $data_graph_by_user, - 500, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl + if ($pdf === true) { + $result_data_graph_by_user = []; + foreach ($data_graph_by_user as $key => $value) { + $result_data_graph_by_user[$key.' ('.$value.')'] = $value; + } + + $data_graph_by_user = $result_data_graph_by_user; + } + + if ($pdf === true) { + $return['chart']['by_user_validator'] = ''; + } + + $options_charts['labels'] = array_keys($data_graph_by_user); + $return['chart']['by_user_validator'] .= pie_graph( + array_values($data_graph_by_user), + $options_charts ); + + if ($pdf === true) { + $return['chart']['by_user_validator'] .= '" />'; + } else { + $return['chart']['by_user_validator'] .= ''; + } } if ($event_graph_by_criticity) { $data_graph_by_criticity = []; if (empty($data) === false) { foreach ($data as $value) { - $k = get_priority_name($value['criticity']); + $k = io_safe_output(get_priority_name($value['criticity'])); if (isset($data_graph_by_criticity[$k]) === true) { $data_graph_by_criticity[$k]++; } else { $data_graph_by_criticity[$k] = 1; } } + + $colors = get_criticity_pie_colors($data_graph_by_criticity); + $options_charts['colors'] = array_values($colors); + + if ($pdf === true) { + $result_data_graph_by_criticity = []; + foreach ($data_graph_by_criticity as $key => $value) { + $result_data_graph_by_criticity[$key.' ('.$value.')'] = $value; + } + + $data_graph_by_criticity = $result_data_graph_by_criticity; + } } - $colors = get_criticity_pie_colors($data_graph_by_criticity); + if ($pdf === true) { + $return['chart']['by_criticity'] = ''; + } - $return['chart']['by_criticity'] = pie_graph( - $data_graph_by_criticity, - 500, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl, - false, - $colors + $options_charts['labels'] = array_keys($data_graph_by_criticity); + $return['chart']['by_criticity'] .= pie_graph( + array_values($data_graph_by_criticity), + $options_charts ); + + if ($pdf === true) { + $return['chart']['by_criticity'] .= '" />'; + } else { + $return['chart']['by_criticity'] .= ''; + } + + unset($options_charts['colors']); } if ($event_graph_validated_vs_unvalidated) { @@ -2244,19 +2372,34 @@ function reporting_event_report_group( $data_graph_by_status[$k] = 1; } } + + if ($pdf === true) { + $result_data_graph_by_status = []; + foreach ($data_graph_by_status as $key => $value) { + $result_data_graph_by_status[$key.' ('.$value.')'] = $value; + } + + $data_graph_by_status = $result_data_graph_by_status; + } } - $return['chart']['validated_vs_unvalidated'] = pie_graph( - $data_graph_by_status, - 500, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl + if ($pdf === true) { + $return['chart']['validated_vs_unvalidated'] = ''; + } + + $options_charts['labels'] = array_keys($data_graph_by_status); + $return['chart']['validated_vs_unvalidated'] .= pie_graph( + array_values($data_graph_by_status), + $options_charts ); + + if ($pdf === true) { + $return['chart']['validated_vs_unvalidated'] .= '" />'; + } else { + $return['chart']['validated_vs_unvalidated'] .= ''; + } } // Total events. @@ -3767,26 +3910,6 @@ function reporting_exception( } ); - $data_pie_graph = []; - $data_hbar = []; - foreach ($items as $key => $item) { - if ($show_graph == 1 || $show_graph == 2) { - // TODO: Find a better way to show the graphs - $data_hbar[$item['agent'].' - '.$item['operation']]['g'] = $item['value']; - $data_pie_graph[$item['agent'].' - '.$item['operation']] = $item['value']; - } - - if ($show_graph == 0 || $show_graph == 1) { - $data = []; - $data['agent'] = $item['agent']; - $data['module'] = $item['module']; - $data['operation'] = __($item['operation']); - $data['value'] = $item['value']; - $data['formated_value'] = format_for_graph($item['value'], 2).' '.$item['unit']; - $return['data'][] = $data; - } - } - if ($show_graph == 1 || $show_graph == 2) { reporting_set_conf_charts( $width, @@ -3797,6 +3920,61 @@ function reporting_exception( $ttl ); + $data_pie = []; + $labels_pie = []; + $data_hbar = []; + $labels_hbar = []; + + $other = 0; + foreach ($items as $key => $item) { + if ($show_graph == 1 || $show_graph == 2) { + if ($key <= 10) { + $label = $item['agent'].' - '.$item['operation']; + $labels_hbar[] = io_safe_output($label); + $data_hbar[] = [ + 'x' => $item['value'], + 'y' => io_safe_output($label), + ]; + + if ((int) $ttl === 2) { + $item['value'] = (empty($item['value']) === false) ? $item['value'] : 0; + $label .= ' ('.$item['value'].')'; + } + + $labels_pie[] = io_safe_output($label); + $data_pie[] = $item['value']; + } else { + $other += $item['value']; + } + } + + if ($show_graph == 0 || $show_graph == 1) { + $data = []; + $data['agent'] = $item['agent']; + $data['module'] = $item['module']; + $data['operation'] = __($item['operation']); + $data['value'] = $item['value']; + $data['formated_value'] = format_for_graph($item['value'], 2).' '.$item['unit']; + $return['data'][] = $data; + } + } + + if (empty($other) === false) { + $label = __('Others'); + $labels_hbar[] = $label; + $data_hbar[] = [ + 'x' => $other, + 'y' => $label, + ]; + + if ((int) $ttl === 2) { + $label .= ' ('.$other.')'; + } + + $labels_pie[] = $label; + $data_pie[] = $other; + } + if (!empty($force_width_chart)) { $width = $force_width_chart; } @@ -3805,40 +3983,82 @@ function reporting_exception( $height = $force_height_chart; } - $return['chart']['pie'] = pie_graph( - $data_pie_graph, - 600, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl + $options_charts = [ + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'ttl' => $ttl, + 'labels' => $labels_pie, + ]; + + if ((int) $ttl === 2) { + $options_charts['dataLabel'] = ['display' => 'auto']; + $options_charts['layout'] = [ + 'padding' => [ + 'top' => 15, + 'bottom' => 15, + ], + ]; + } + + if ((int) $ttl === 2) { + $return['chart']['pie'] = ''; + } + + $return['chart']['pie'] .= pie_graph( + $data_pie, + $options_charts ); - $params = [ - 'chart_data' => $data_hbar, - 'width' => 600, - 'height' => (25 * count($data_hbar)), - 'color' => [], - 'legend' => [], - 'long_index' => [], - 'no_data_image' => ui_get_full_url('images/image_problem_area_small.png', false, false, false), - 'xaxisname' => '', - 'yaxisname' => '', - 'water_mark' => ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - 'font' => '', - 'font_size' => '', - 'unit' => '', - 'ttl' => $ttl, - 'homeurl' => ui_get_full_url(false, false, false, false), - 'backgroundColor' => 'white', + if ((int) $ttl === 2) { + $return['chart']['pie'] .= '" />'; + } else { + $return['chart']['pie'] .= ''; + } + + if ((int) $ttl === 2) { + $return['chart']['hbar'] = ''; + } + + $options = [ + 'height' => (count($data_hbar) * 30), + 'ttl' => $ttl, + 'axis' => 'y', + 'legend' => ['display' => false], + 'scales' => [ + 'x' => [ + 'grid' => ['display' => false], + ], + 'y' => [ + 'grid' => ['display' => false], + ], + ], + 'labels' => $labels_hbar, ]; - $return['chart']['hbar'] = call_user_func_array( - 'hbar_graph', - array_values(($params ?? [])) + + if ((int) $ttl === 2) { + $options['dataLabel'] = ['display' => 'auto']; + $options['layout'] = [ + 'padding' => ['right' => 35], + ]; + } + + $return['chart']['hbar'] .= vbar_graph( + $data_hbar, + $options ); + + if ((int) $ttl === 2) { + $return['chart']['hbar'] .= '" />'; + } else { + $return['chart']['hbar'] .= ''; + } } if ($content['show_resume'] && $i > 0) { @@ -4171,49 +4391,102 @@ function reporting_event_report_agent( $return['chart']['by_criticity'] = null; $return['chart']['validated_vs_unvalidated'] = null; + $options_charts = [ + 'width' => 500, + 'height' => 150, + 'radius' => null, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'ttl' => $ttl, + ]; + + if ((int) $ttl === 2) { + $options_charts['dataLabel'] = ['display' => 'auto']; + $options_charts['layout'] = [ + 'padding' => [ + 'top' => 15, + 'bottom' => 15, + ], + ]; + } + if ($event_graph_by_user_validator) { $data_graph_by_user = events_get_count_events_validated_by_user($return['data']); - $return['chart']['by_user_validator'] = pie_graph( - $data_graph_by_user, - 500, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl + if ((int) $ttl === 2) { + $result_data_graph_by_user = []; + foreach ($data_graph_by_user as $key => $value) { + $result_data_graph_by_user[$key.' ('.$value.')'] = $value; + } + + $data_graph_by_user = $result_data_graph_by_user; + } + + if ((int) $ttl === 2) { + $return['chart']['by_user_validator'] = ''; + } + + $options_charts['labels'] = array_keys($data_graph_by_user); + $return['chart']['by_user_validator'] .= pie_graph( + array_values($data_graph_by_user), + $options_charts ); + + if ((int) $ttl === 2) { + $return['chart']['by_user_validator'] .= '" />'; + } else { + $return['chart']['by_user_validator'] .= ''; + } } if ($event_graph_by_criticity) { $data_graph_by_criticity = []; if (empty($return['data']) === false) { foreach ($return['data'] as $value) { - $k = get_priority_name($value['criticity']); + $k = io_safe_output(get_priority_name($value['criticity'])); if (isset($data_graph_by_criticity[$k]) === true) { $data_graph_by_criticity[$k]++; } else { $data_graph_by_criticity[$k] = 1; } } + + $colors = get_criticity_pie_colors($data_graph_by_criticity); + $options_charts['colors'] = array_values($colors); + + if ((int) $ttl === 2) { + $result_data_graph_by_criticity = []; + foreach ($data_graph_by_criticity as $key => $value) { + $result_data_graph_by_criticity[$key.' ('.$value.')'] = $value; + } + + $data_graph_by_criticity = $result_data_graph_by_criticity; + } } - $colors = get_criticity_pie_colors($data_graph_by_criticity); + if ((int) $ttl === 2) { + $return['chart']['by_criticity'] = ''; + } - $return['chart']['by_criticity'] = pie_graph( - $data_graph_by_criticity, - 500, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl, - false, - $colors + $options_charts['labels'] = array_keys($data_graph_by_criticity); + $return['chart']['by_criticity'] .= pie_graph( + array_values($data_graph_by_criticity), + $options_charts ); + + if ((int) $ttl === 2) { + $return['chart']['by_criticity'] .= '" />'; + } else { + $return['chart']['by_criticity'] .= ''; + } + + unset($options_charts['colors']); } if ($event_graph_validated_vs_unvalidated) { @@ -4224,26 +4497,41 @@ function reporting_event_report_agent( 0 => __('Not validated'), ]; foreach ($return['data'] as $value) { - $k = $status[$value['estado']]; + $k = $status[$value['status']]; if (isset($data_graph_by_status[$k]) === true) { $data_graph_by_status[$k]++; } else { $data_graph_by_status[$k] = 1; } } + + if ((int) $ttl === 2) { + $result_data_graph_by_status = []; + foreach ($data_graph_by_status as $key => $value) { + $result_data_graph_by_status[$key.' ('.$value.')'] = $value; + } + + $data_graph_by_status = $result_data_graph_by_status; + } } - $return['chart']['validated_vs_unvalidated'] = pie_graph( - $data_graph_by_status, - 500, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl + if ((int) $ttl === 2) { + $return['chart']['validated_vs_unvalidated'] = ''; + } + + $options_charts['labels'] = array_keys($data_graph_by_status); + $return['chart']['validated_vs_unvalidated'] .= pie_graph( + array_values($data_graph_by_status), + $options_charts ); + + if ((int) $ttl === 2) { + $return['chart']['validated_vs_unvalidated'] .= '" />'; + } else { + $return['chart']['validated_vs_unvalidated'] .= ''; + } } // Total events. @@ -5115,111 +5403,59 @@ function reporting_custom_render($report, $content, $type='dinamic', $pdf=0) $height = $data_macro['height']; } - // TODO: Allow to paint horizontal and vertical bar graphs for the moment only pie graphs. - $type = 'sql_graph_pie'; + $options = [ + 'width' => $width, + 'height' => $height, + 'ttl' => ($pdf === true) ? 2 : 1, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + ]; - $SQL_GRAPH_MAX_LABEL_SIZE = 5; - - $count = 0; - $flagOther = false; - foreach ($data_query as $data_item) { - $count++; - $value = 0; - if (empty($data_item['value']) === false) { - $value = $data_item['value']; - } - - if ($count <= 5) { - $label = __('Data'); - if (empty($data_item['label']) === false) { - $label = io_safe_output($data_item['label']); - if (strlen($label) > $SQL_GRAPH_MAX_LABEL_SIZE) { - $first_label = $label; - $label = substr( - $first_label, - 0, - floor($SQL_GRAPH_MAX_LABEL_SIZE / 2) - ); - $label .= '...
'; - $label .= substr( - $first_label, - floor(-$SQL_GRAPH_MAX_LABEL_SIZE / 2) - ); - } - } - - switch ($type) { - case 'sql_graph_vbar': - default: - // Vertical bar. - $data[] = [ - 'tick' => $label.'_'.$count, - 'data' => $value, - ]; - break; - - case 'sql_graph_hbar': - // Horizontal bar. - $data[$label.'_'.$count]['g'] = $value; - break; - - case 'sql_graph_pie': - // Pie. - $data[$label.'_'.$count] = $value; - break; - } - } else { - switch ($type) { - case 'sql_graph_vbar': - default: - // Vertical bar. - if ($flagOther === false) { - $data[] = [ - 'tick' => __('Other'), - 'data' => $value, - ]; - - $flagOther = true; - } - - $data[(count($data) - 1)]['data'] += $value; - break; - - case 'sql_graph_hbar': - // Horizontal bar. - if (isset($data[__('Other')]['g']) === false) { - $data[__('Other')]['g'] = 0; - } - - $data[__('Other')]['g'] += $value; - break; - - case 'sql_graph_pie': - // Pie. - if (isset($data[__('Other')]) === false) { - $data[__('Other')] = 0; - } - - $data[__('Other')] += $value; - break; - } - } + if ($pdf === true) { + $options['dataLabel'] = ['display' => 'auto']; + $options['layout'] = [ + 'padding' => [ + 'top' => 15, + 'bottom' => 15, + ], + ]; } - $value_query = pie_graph( - $data, - $width, - $height, - __('other'), - ui_get_full_url(false, false, false, false), - '', - $config['fontpath'], - $config['font_size'], - ($pdf === true) ? 2 : 1, - 'hidden', - '', - true + $data = array_reduce( + $data_query, + function ($carry, $item) use ($pdf) { + if ($pdf === true) { + $carry['labels'][] = io_safe_output($item['label']).' ('.$item['value'].')'; + } else { + $carry['labels'][] = io_safe_output($item['label']); + } + + $carry['data'][] = $item['value']; + + return $carry; + }, + [] ); + + $value_query = '
'; + if ($pdf === true) { + $value_query .= ''; + } + + $value_query .= '
'; } } @@ -5331,6 +5567,10 @@ function agents_get_network_interfaces_array( $row_data['agent'] = $agent['name']; $row_data['interfaces'] = []; foreach ($agent['interfaces'] as $interface_name => $interface) { + if (isset($interface['traffic']) === false) { + $interface['traffic'] = []; + } + $row_interface = []; $row_interface['name'] = $interface_name; $row_interface['ip'] = $interface['ip']; @@ -6917,6 +7157,13 @@ function reporting_value($report, $content, $type, $pdf=false) if (!$config['simple_module_value']) { $formated_value = $value; + } else if ((bool) $content['use_prefix_notation'] === false) { + $formated_value = number_format( + $value, + $config['graph_precision'], + $config['decimal_separator'], + $config['thousand_separator'] + ).' '.$unit; } else { $formated_value = format_for_graph( $value, @@ -7077,6 +7324,13 @@ function reporting_value($report, $content, $type, $pdf=false) ); if (!$config['simple_module_value']) { $formated_value = $value; + } else if ((bool) $content['use_prefix_notation'] === false) { + $formated_value = number_format( + $value, + $config['graph_precision'], + $config['decimal_separator'], + $config['thousand_separator'] + ).' '.$unit; } else { $divisor = get_data_multiplier($unit); @@ -8295,14 +8549,17 @@ function reporting_advanced_sla( $sla_check_value_warning = false; if ($sla_check_value === true) { - // Warning SLA check. - $sla_check_value_warning = sla_check_value( - $current_data['datos'], - $min_value_warning, - $max_value_warning, - $inverse_interval_warning, - 1 - ); + if ((isset($min_value_warning) === false + && isset($max_value_warning) === false) === false + ) { + // Warning SLA check. + $sla_check_value_warning = sla_check_value( + $current_data['datos'], + $min_value_warning, + $max_value_warning, + $inverse_interval_warning + ); + } } } @@ -8549,24 +8806,27 @@ function reporting_availability($report, $content, $date=false, $time=false) $data = []; $style = io_safe_output($content['style']); - if ($style['hide_notinit_agents']) { - $aux_id_agents = $agents; - $i = 0; - foreach ($items as $item) { - $utimestamp = db_get_value( - 'utimestamp', - 'tagente_datos', - 'id_agente_modulo', - $item['id_agent_module'], - true - ); - if (($utimestamp === false) - || (intval($utimestamp) > intval($datetime_to)) - ) { - unset($items[$i]); - } - $i++; + if (is_array($style)) { + if ($style['hide_notinit_agents']) { + $aux_id_agents = $agents; + $i = 0; + foreach ($items as $item) { + $utimestamp = db_get_value( + 'utimestamp', + 'tagente_datos', + 'id_agente_modulo', + $item['id_agent_module'], + true + ); + if (($utimestamp === false) + || (intval($utimestamp) > intval($datetime_to)) + ) { + unset($items[$i]); + } + + $i++; + } } } @@ -10837,49 +11097,102 @@ function reporting_get_module_detailed_event( $height = $force_height_chart; } + $options_charts = [ + 'width' => 500, + 'height' => 150, + 'radius' => null, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'ttl' => $ttl, + ]; + + if ((int) $ttl === 2) { + $options_charts['dataLabel'] = ['display' => 'auto']; + $options_charts['layout'] = [ + 'padding' => [ + 'top' => 15, + 'bottom' => 15, + ], + ]; + } + if ($event_graph_by_user_validator) { $data_graph_by_user = events_get_count_events_validated_by_user($event['data']); - $event['chart']['by_user_validator'] = pie_graph( - $data_graph_by_user, - 500, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl + if ((int) $ttl === 2) { + $result_data_graph_by_user = []; + foreach ($data_graph_by_user as $key => $value) { + $result_data_graph_by_user[$key.' ('.$value.')'] = $value; + } + + $data_graph_by_user = $result_data_graph_by_user; + } + + if ((int) $ttl === 2) { + $event['chart']['by_user_validator'] = ''; + } + + $options_charts['labels'] = array_keys($data_graph_by_user); + $event['chart']['by_user_validator'] .= pie_graph( + array_values($data_graph_by_user), + $options_charts ); + + if ((int) $ttl === 2) { + $event['chart']['by_user_validator'] .= '" />'; + } else { + $event['chart']['by_user_validator'] .= ''; + } } if ($event_graph_by_criticity) { $data_graph_by_criticity = []; if (empty($event['data']) === false) { foreach ($event['data'] as $value) { - $k = get_priority_name($value['criticity']); + $k = io_safe_output(get_priority_name($value['criticity'])); if (isset($data_graph_by_criticity[$k]) === true) { $data_graph_by_criticity[$k]++; } else { $data_graph_by_criticity[$k] = 1; } } + + $colors = get_criticity_pie_colors($data_graph_by_criticity); + $options_charts['colors'] = array_values($colors); + + if ((int) $ttl === 2) { + $result_data_graph_by_criticity = []; + foreach ($data_graph_by_criticity as $key => $value) { + $result_data_graph_by_criticity[$key.' ('.$value.')'] = $value; + } + + $data_graph_by_criticity = $result_data_graph_by_criticity; + } } - $colors = get_criticity_pie_colors($data_graph_by_criticity); + if ((int) $ttl === 2) { + $event['chart']['by_criticity'] = ''; + } - $event['chart']['by_criticity'] = pie_graph( - $data_graph_by_criticity, - 500, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl, - false, - $colors + $options_charts['labels'] = array_keys($data_graph_by_criticity); + $event['chart']['by_criticity'] .= pie_graph( + array_values($data_graph_by_criticity), + $options_charts ); + + if ((int) $ttl === 2) { + $event['chart']['by_criticity'] .= '" />'; + } else { + $event['chart']['by_criticity'] .= ''; + } + + unset($options_charts['colors']); } if ($event_graph_validated_vs_unvalidated) { @@ -10897,19 +11210,34 @@ function reporting_get_module_detailed_event( $data_graph_by_status[$k] = 1; } } + + if ((int) $ttl === 2) { + $result_data_graph_by_status = []; + foreach ($data_graph_by_status as $key => $value) { + $result_data_graph_by_status[$key.' ('.$value.')'] = $value; + } + + $data_graph_by_status = $result_data_graph_by_status; + } } - $event['chart']['validated_vs_unvalidated'] = pie_graph( - $data_graph_by_status, - 500, - 150, - __('other'), - ui_get_full_url(false, false, false, false), - ui_get_full_url(false, false, false, false).'/images/logo_vertical_water.png', - $config['fontpath'], - $config['font_size'], - $ttl + if ((int) $ttl === 2) { + $event['chart']['validated_vs_unvalidated'] = ''; + } + + $options_charts['labels'] = array_keys($data_graph_by_status); + $event['chart']['validated_vs_unvalidated'] .= pie_graph( + array_values($data_graph_by_status), + $options_charts ); + + if ((int) $ttl === 2) { + $event['chart']['validated_vs_unvalidated'] .= '" />'; + } else { + $event['chart']['validated_vs_unvalidated'] .= ''; + } } if (!empty($event)) { @@ -14951,8 +15279,6 @@ function reporting_module_histogram_graph($report, $content, $pdf=0) $return = []; - $urlImage = ui_get_full_url(false, true, false, false); - $return['type'] = $content['type']; $ttl = 1; @@ -15061,10 +15387,24 @@ function reporting_module_histogram_graph($report, $content, $pdf=0) return false; } - $uncompress_module = db_uncompress_module_data( + $module_interval = modules_get_interval( + $content['id_agent_module'] + ); + $slice = ($content['period'] / $module_interval); + + $result_sla = reporting_advanced_sla( $content['id_agent_module'], ($report['datetime'] - $content['period']), - $report['datetime'] + $report['datetime'], + null, + null, + 0, + null, + null, + null, + $slice, + 1, + true ); // Select Warning and critical values. @@ -15113,125 +15453,84 @@ function reporting_module_histogram_graph($report, $content, $pdf=0) $inverse_warning = $agentmodule_info['warning_inverse']; - // Initialize vars. - $tstart = 0; - $tend = 0; - $tacum = 0; - $tacum_data = 0; + $data = []; + $data['time_total'] = 0; + $data['time_ok'] = 0; + $data['time_error'] = 0; + $data['time_warning'] = 0; + $data['time_unknown'] = 0; + $data['time_not_init'] = 0; + $data['time_downtime'] = 0; + $data['checks_total'] = 0; + $data['checks_ok'] = 0; + $data['checks_error'] = 0; + $data['checks_warning'] = 0; + $data['checks_unknown'] = 0; + $data['checks_not_init'] = 0; $array_graph = []; + $i = 0; + foreach ($result_sla as $value_sla) { + $data['time_total'] += $value_sla['time_total']; + $data['time_ok'] += $value_sla['time_ok']; + $data['time_error'] += $value_sla['time_error']; + $data['time_warning'] += $value_sla['time_warning']; + $data['time_unknown'] += $value_sla['time_unknown']; + $data['time_downtime'] += $value_sla['time_downtime']; + $data['time_not_init'] += $value_sla['time_not_init']; + $data['checks_total'] += $value_sla['checks_total']; + $data['checks_ok'] += $value_sla['checks_ok']; + $data['checks_error'] += $value_sla['checks_error']; + $data['checks_warning'] += $value_sla['checks_warning']; + $data['checks_unknown'] += $value_sla['checks_unknown']; + $data['checks_not_init'] += $value_sla['checks_not_init']; - $data_not_init = 0; - $data_unknown = 0; - $data_critical = 0; - $data_warning = 0; - $data_ok = 0; - $data_total = 0; - - $time_not_init = 0; - $time_unknown = 0; - $time_critical = 0; - $time_warning = 0; - $time_ok = 0; - - $legend = []; - foreach ($uncompress_module as $data) { - foreach ($data['data'] as $key => $value) { - if ($tacum == 0) { - // Initialize the accumulators. - $tacum = $value['utimestamp']; - $tacum_data = $value['datos']; + // Generate raw data for graph. + if ($value_sla['time_total'] != 0) { + if ($value_sla['time_error'] > 0) { + // ERR. + $array_graph[$i]['data'] = 3; + } else if ($value_sla['time_unknown'] > 0) { + // UNKNOWN. + $array_graph[$i]['data'] = 4; + } else if ($value_sla['time_warning'] > 0) { + // Warning. + $array_graph[$i]['data'] = 2; + } else if ($value_sla['time_not_init'] == $value_sla['time_total']) { + // NOT INIT. + $array_graph[$i]['data'] = 6; } else { - // Utimestand end and final. - $tstart = $tacum; - $tend = $value['utimestamp']; - - // Module type isn't string. - $sla_check_value_critical = sla_check_value( - $tacum_data, - $min_value_critical, - $max_value_critical, - $inverse_critical - ); - $sla_check_value_warning = sla_check_value( - $tacum_data, - $min_value_warning, - $max_value_warning, - $inverse_warning - ); - - // Module type is string. - $string_check_value_critical = preg_match('/'.$max_value_critical.'/', $tacum_data); - $string_check_value_warning = preg_match('/'.$max_value_warning.'/', $tacum_data); - - if ($inverse_critical) { - $string_check_value_critical = !preg_match('/'.$max_value_critical.'/', $tacum_data); - } - - if ($string_check_value_warning) { - $string_check_value_warning = !preg_match('/'.$max_value_warning.'/', $tacum_data); - } - - // Contruct array period and data. - if ($tacum_data === false) { - $array_graph[$data_total]['data'] = AGENT_MODULE_STATUS_NOT_INIT; - // NOT INIT. - $time_not_init = ($time_not_init + ($tend - $tstart)); - $data_not_init++; - } else if ($tacum_data === null) { - $array_graph[$data_total]['data'] = AGENT_MODULE_STATUS_UNKNOWN; - // UNKNOWN. - $time_unknown = ($time_unknown + ($tend - $tstart)); - $data_unknown++; - } else if (( (isset($min_value_critical) || isset($max_value_critical)) && ($modules_is_string === false) && ($sla_check_value_critical == true) ) - || ( isset($max_value_critical) && ($modules_is_string === true) && $string_check_value_critical ) - ) { - $array_graph[$data_total]['data'] = AGENT_MODULE_STATUS_CRITICAL_BAD; - // CRITICAL. - $time_critical = ($time_critical + ($tend - $tstart)); - $data_critical++; - } else if (( (isset($min_value_warning) || isset($max_value_warning)) && ($modules_is_string === false) && ($sla_check_value_warning == true) ) - || ( isset($max_value_warning) && ($modules_is_string === true) && $sla_check_value_warning ) - ) { - $array_graph[$data_total]['data'] = AGENT_MODULE_STATUS_WARNING; - // WARNING. - $time_warning = ($time_warning + ($tend - $tstart)); - $data_warning++; - } else { - $array_graph[$data_total]['data'] = AGENT_MODULE_STATUS_NORMAL; - // OK. - $time_ok = ($time_ok + ($tend - $tstart)); - $data_ok++; - } - - $array_graph[$data_total]['utimestamp'] = ($tend - $tstart); - $array_graph[$data_total]['real_data'] = $tacum_data; - - // Reassign accumulators. - $tacum = $value['utimestamp']; - $tacum_data = $value['datos']; - $data_total++; + $array_graph[$i]['data'] = 1; } + } else { + $array_graph[$i]['data'] = 7; } + + $array_graph[$i]['utimestamp'] = ($value_sla['date_to'] - $value_sla['date_from']); + $i++; } + $data['sla_value'] = reporting_sla_get_compliance_from_array( + $data + ); + + $data['sla_fixed'] = sla_truncate( + $data['sla_value'], + $config['graph_precision'] + ); + $data_init = -1; $acum = 0; $sum = 0; $array_result = []; $i = 0; - foreach ($array_graph as $key => $value) { + foreach ($array_graph as $value) { if ($data_init == -1) { $data_init = $value['data']; $acum = $value['utimestamp']; } else { if ($data_init == $value['data']) { $acum = ($acum + $value['utimestamp']); - if ($modules_is_string === false) { - $sum = ($sum + $value['real_data']); - } else { - $sum = $value['real_data']; - } } else { $array_result[$i]['data'] = $data_init; $array_result[$i]['utimestamp'] = $acum; @@ -15239,7 +15538,6 @@ function reporting_module_histogram_graph($report, $content, $pdf=0) $i++; $data_init = $value['data']; $acum = $value['utimestamp']; - $sum = $value['real_data']; } } } @@ -15252,39 +15550,42 @@ function reporting_module_histogram_graph($report, $content, $pdf=0) $array_result[$i]['real_data'] = $sum; } - $time_total = ($time_not_init + $time_unknown + $time_critical + $time_warning + $time_ok); + $time_total = $data['time_total']; // Slice graphs calculation. - $return['agent'] = modules_get_agentmodule_agent_alias( + $return['agent'] = modules_get_agentmodule_agent_alias( $content['id_agent_module'] ); - $return['module'] = modules_get_agentmodule_name( + $return['module'] = modules_get_agentmodule_name( $content['id_agent_module'] ); - $return['max_critical'] = $max_value_critical; - $return['min_critical'] = $min_value_critical; + + $return['max_critical'] = $max_value_critical; + $return['min_critical'] = $min_value_critical; $return['critical_inverse'] = $inverse_critical; - $return['max_warning'] = $max_value_warning; - $return['min_warning'] = $min_value_warning; - $return['warning_inverse'] = $inverse_warning; - $return['data_not_init'] = $data_not_init; - $return['data_unknown'] = $data_unknown; - $return['data_critical'] = $data_critical; - $return['data_warning'] = $data_warning; - $return['data_ok'] = $data_ok; - $return['data_total'] = $data_total; - $return['time_not_init'] = $time_not_init; - $return['time_unknown'] = $time_unknown; - $return['time_critical'] = $time_critical; - $return['time_warning'] = $time_warning; - $return['time_ok'] = $time_ok; - $return['percent_ok'] = (($data_ok * 100) / $data_total); + $return['max_warning'] = $max_value_warning; + $return['min_warning'] = $min_value_warning; + $return['warning_inverse'] = $inverse_warning; + $return['data_not_init'] = $data['checks_not_init']; + $return['data_unknown'] = $data['checks_unknown']; + $return['data_critical'] = $data['checks_error']; + $return['data_warning'] = $data['checks_warning']; + $return['data_ok'] = $data['checks_ok']; + $return['data_total'] = $data['checks_total']; + $return['time_not_init'] = $data['time_not_init']; + $return['time_unknown'] = $data['time_unknown']; + $return['time_critical'] = $data['time_error']; + $return['time_warning'] = $data['time_warning']; + $return['time_ok'] = $data['time_ok']; + $return['percent_ok'] = (($data['checks_ok'] * 100) / $data['checks_total']); $colors = [ - AGENT_MODULE_STATUS_NORMAL => COL_NORMAL, - AGENT_MODULE_STATUS_WARNING => COL_WARNING, - AGENT_MODULE_STATUS_CRITICAL_BAD => COL_CRITICAL, - AGENT_MODULE_STATUS_UNKNOWN => COL_UNKNOWN, - AGENT_MODULE_STATUS_NOT_INIT => COL_NOTINIT, + 1 => COL_NORMAL, + 2 => COL_WARNING, + 3 => COL_CRITICAL, + 4 => COL_UNKNOWN, + 5 => COL_DOWNTIME, + 6 => COL_NOTINIT, + 7 => COL_IGNORED, ]; $width_graph = 100; @@ -15294,7 +15595,7 @@ function reporting_module_histogram_graph($report, $content, $pdf=0) $time_total, $width_graph, $height_graph, - $legend, + [], $colors, $config['fontpath'], $config['round_corner'], @@ -15311,11 +15612,7 @@ function reporting_module_histogram_graph($report, $content, $pdf=0) $report['datetime'] ); } else { - $return['chart'] = graph_nodata_image( - $width_graph, - $height_graph, - 'area' - ); + $return['chart'] = graph_nodata_image(['height' => $height_graph]); } if ($metaconsole_on && $server_name != '') { diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index a468a451fe..8d709a1003 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -38,6 +38,7 @@ require_once $config['homedir'].'/include/functions_alerts.php'; require_once $config['homedir'].'/include/functions_users.php'; enterprise_include_once('include/functions_metaconsole.php'); enterprise_include_once('include/functions_inventory.php'); +require_once $config['homedir'].'/include/functions_inventory.php'; require_once $config['homedir'].'/include/functions_forecast.php'; require_once $config['homedir'].'/include/functions_ui.php'; require_once $config['homedir'].'/include/functions_netflow.php'; @@ -652,18 +653,18 @@ function reporting_html_SLA($table, $item, $mini, $pdf=0) $row[] = round($sla['sla_limit'], 2).'%'; if (reporting_sla_is_not_init_from_array($sla)) { - $row[] = ''.__('N/A').''; - $row[] = ''.__('Not init').''; + $row[] = ''.__('N/A').''; + $row[] = ''.__('Not init').''; } else if (reporting_sla_is_ignored_from_array($sla)) { - $row[] = ''.__('N/A').''; - $row[] = ''.__('No data').''; + $row[] = ''.__('N/A').''; + $row[] = ''.__('No data').''; // Normal calculation. } else if ($sla['sla_status']) { - $row[] = ''.sla_truncate($sla['sla_value'], $config['graph_precision']).'%'; - $row[] = ''.__('OK').''; + $row[] = ''.sla_truncate($sla['sla_value'], $config['graph_precision']).'%'; + $row[] = ''.__('OK').''; } else { - $row[] = ''.sla_truncate($sla['sla_value'], $config['graph_precision']).'%'; - $row[] = ''.__('Fail').''; + $row[] = ''.sla_truncate($sla['sla_value'], $config['graph_precision']).'%'; + $row[] = ''.__('Fail').''; } // Second table for time globals. @@ -961,7 +962,7 @@ function reporting_html_top_n($table, $item, $pdf=0) $table->data['top_n']['cell'] = html_print_table($table1, true); } - if (!empty($item['charts']['pie'])) { + if (empty($item['charts']['pie']) === false) { if ($pdf !== 0) { $return_pdf .= $item['charts']['pie']; } else { @@ -970,16 +971,15 @@ function reporting_html_top_n($table, $item, $pdf=0) } } - if (!empty($item['charts']['bars'])) { + if (empty($item['charts']['bars']) === false) { if ($pdf !== 0) { $return_pdf .= $item['charts']['bars']; } else { - // $table->colspan['char_bars']['cell'] = 3; $table->data['char_pie'][1] = $item['charts']['bars']; } } - if (!empty($item['resume'])) { + if (empty($item['resume']) === false) { $table1 = new stdClass(); $table1->width = '99%'; @@ -2292,7 +2292,9 @@ function reporting_html_agent_module_status($table, $item, $pdf=0) $row['data_module'] = remove_right_zeros( number_format( $data['data_module'], - $config['graph_precision'] + $config['graph_precision'], + $config['decimal_separator'], + $config['thousand_separator'] ) ); } else { @@ -2785,7 +2787,7 @@ function reporting_html_historical_data($table, $item, $pdf=0) } else { $row = [ $data[__('Date')], - remove_right_zeros(number_format($data[__('Data')], $config['graph_precision'])), + remove_right_zeros(number_format($data[__('Data')], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])), ]; } @@ -2925,7 +2927,9 @@ function reporting_html_last_value($table, $item, $pdf=0) $dataDatos = remove_right_zeros( number_format( $item['data']['datos'], - $config['graph_precision'] + $config['graph_precision'], + $config['decimal_separator'], + $config['thousand_separator'] ) ); } else { @@ -3460,28 +3464,32 @@ function reporting_html_monitor_report($table, $item, $mini, $pdf=0) $table1->head = []; $table1->data = []; if ($item['data']['unknown'] == 1) { - $table1->data['data']['unknown'] = '

'; + $table1->data['data']['unknown'] = '

'; $table1->data['data']['unknown'] .= __('Unknown').'

'; } else { - $table1->data['data']['ok'] = '

'; + $table1->data['data']['ok'] = '

'; $table1->data['data']['ok'] .= html_print_image( 'images/module_ok.png', true ).' '.__('OK').': '.remove_right_zeros( number_format( $item['data']['ok']['value'], - $config['graph_precision'] + $config['graph_precision'], + $config['decimal_separator'], + $config['thousand_separator'] ) ).' %

'; - $table1->data['data']['fail'] = '

'; + $table1->data['data']['fail'] = '

'; $table1->data['data']['fail'] .= html_print_image( 'images/module_critical.png', true ).' '.__('Not OK').': '.remove_right_zeros( number_format( $item['data']['fail']['value'], - $config['graph_precision'] + $config['graph_precision'], + $config['decimal_separator'], + $config['thousand_separator'] ) ).' % '.'

'; } @@ -3835,7 +3843,9 @@ function reporting_html_value( remove_right_zeros( number_format( $data[__('Maximun')], - $config['graph_precision'] + $config['graph_precision'], + $config['decimal_separator'], + $config['thousand_separator'] ) ), ]; @@ -4674,7 +4684,7 @@ function reporting_html_availability_graph($table, $item, $pdf=0) $checks_resume_text = ''; $checks_resume_text .= $checks_resume; $checks_resume_text .= ''; - $sla_value_text = "".$sla_value.''; + $sla_value_text = "".$sla_value.''; switch ($item['data'][$k_chart]['failover']) { case 'primary_compare': $title = ''.__('Primary').' (24x7)'; @@ -4702,7 +4712,7 @@ function reporting_html_availability_graph($table, $item, $pdf=0) case 'result_compare': $title = ''.__('Result').' (24x7)'; - $sla_value_text = "".$sla_value.''; + $sla_value_text = "".$sla_value.''; $checks_resume_text = ''; $checks_resume_text .= $checks_resume; $checks_resume_text .= ''; @@ -4713,7 +4723,7 @@ function reporting_html_availability_graph($table, $item, $pdf=0) $total_values += $sla_value; $count_total_charts++; $title = ''.__('Result').''; - $sla_value_text = "".$sla_value.''; + $sla_value_text = "".$sla_value.''; $checks_resume_text = ''; $checks_resume_text .= $checks_resume; $checks_resume_text .= ''; @@ -4747,7 +4757,7 @@ function reporting_html_availability_graph($table, $item, $pdf=0) $table_summary->data = []; $table_summary->data[0][0] = ''.__('Summary').''; - $table_summary->data[0][1] = ''; + $table_summary->data[0][1] = ''; $table_summary->data[0][1] .= sla_truncate($total_values / $count_total_charts); $table_summary->data[0][1] .= ' %'; $table_summary->data[0][1] .= ''; @@ -5131,7 +5141,17 @@ function reporting_get_stats_summary($data, $graph_width, $graph_height) // Fixed width non interactive charts. $status_chart_width = $graph_width; - $tdata[0] = '
'.graph_agent_status(false, $graph_width, $graph_height, true, true).'
'; + $tdata[0] = '
'; + $tdata[0] .= '
'; + $tdata[0] .= graph_agent_status( + false, + $graph_width, + $graph_height, + true, + true + ); + $tdata[0] .= '
'; + $tdata[0] .= '
'; } else { $tdata[2] = html_print_image( 'images/image_problem_area_small.png', @@ -5141,7 +5161,16 @@ function reporting_get_stats_summary($data, $graph_width, $graph_height) } if ($data['monitor_alerts'] > 0) { - $tdata[2] = '
'.graph_alert_status($data['monitor_alerts'], $data['monitor_alerts_fired'], $graph_width, $graph_height, true, true).'
'; + $tdata[2] = '
'; + $tdata[2] .= graph_alert_status( + $data['monitor_alerts'], + $data['monitor_alerts_fired'], + $graph_width, + $graph_height, + true, + true + ); + $tdata[2] .= '
'; } else { $tdata[2] = html_print_image( 'images/image_problem_area_small.png', @@ -5150,8 +5179,8 @@ function reporting_get_stats_summary($data, $graph_width, $graph_height) ); } - $table_sum->rowclass[] = ''; - $table_sum->data[] = $tdata; + $table_sum->rowclass[] = ''; + $table_sum->data[] = $tdata; $output = '
'.__('Summary').''.html_print_table($table_sum, true).'
'; diff --git a/pandora_console/include/functions_reporting_xml.php b/pandora_console/include/functions_reporting_xml.php index 196027e90c..9b733c40d3 100644 --- a/pandora_console/include/functions_reporting_xml.php +++ b/pandora_console/include/functions_reporting_xml.php @@ -46,6 +46,8 @@ function reporting_xml_get_report($report, $filename, $return=false) // Download if marked to download. if ($filename !== false) { + // Cookie for download control. + setDownloadCookieToken(); header('Content-Type: application/xml; charset=UTF-8'); header('Content-Disposition: attachment; filename="'.$filename.'.xml"'); } diff --git a/pandora_console/include/functions_servers.php b/pandora_console/include/functions_servers.php index cf61fec7a7..3f9fe1a6b2 100644 --- a/pandora_console/include/functions_servers.php +++ b/pandora_console/include/functions_servers.php @@ -1349,9 +1349,6 @@ function servers_get_server_string_name(int $server) case SERVER_TYPE_ENTERPRISE_SATELLITE: return __('Satellite server'); - case SERVER_TYPE_ENTERPRISE_TRANSACTIONAL: - return __('Transactional server'); - case SERVER_TYPE_ALERT: return __('Alert server'); diff --git a/pandora_console/include/functions_snmp_browser.php b/pandora_console/include/functions_snmp_browser.php index cbf812d2bd..b97f6cc313 100644 --- a/pandora_console/include/functions_snmp_browser.php +++ b/pandora_console/include/functions_snmp_browser.php @@ -460,7 +460,7 @@ function snmp_browser_get_oid( $snmptranslate_bin = $config['snmptranslate']; } - if ($server_to_exec != 0 && enterprise_installed()) { + if (empty($server_to_exec) === false && enterprise_installed()) { $server_data = db_get_row('tserver', 'id_server', $server_to_exec); $command_output = $snmptranslate_bin.' -m ALL -M +'.escapeshellarg($config['homedir'].'/attachment/mibs').' -Td '.escapeshellarg($oid); diff --git a/pandora_console/include/functions_tactical.php b/pandora_console/include/functions_tactical.php index dec75ae13e..deb39c4e88 100644 --- a/pandora_console/include/functions_tactical.php +++ b/pandora_console/include/functions_tactical.php @@ -478,8 +478,13 @@ function tactical_get_data( $list['_monitors_alerts_fired_'] = tactical_monitor_fired_alerts(explode(',', $user_groups_ids), $user_strict, explode(',', $user_groups_ids)); $list['_monitors_alerts_'] = tactical_monitor_alerts($user_strict); + $filter_agents = []; + if (users_is_admin() === false) { + $filter_agents = ['id_grupo' => explode(',', $user_groups_ids)]; + } + $total_agentes = agents_get_agents( - ['id_grupo' => explode(',', $user_groups_ids)], + $filter_agents, ['count(DISTINCT id_agente) as total_agents'], 'AR', false, diff --git a/pandora_console/include/functions_tags.php b/pandora_console/include/functions_tags.php index 06dc8b1ada..9e7d55a648 100644 --- a/pandora_console/include/functions_tags.php +++ b/pandora_console/include/functions_tags.php @@ -1107,7 +1107,7 @@ function tags_get_user_tags($id_user=false, $access='AR', $return_tag_any=false) $profiles_without_tags = db_get_value_sql($query); - if ($profiles_without_tags == 0) { + if (users_is_admin() === true || $profiles_without_tags == 0) { // -------------------------------------------------------------- // FIXED FOR TICKET #1921 // diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index 3fc35f4d84..198d4a51c8 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -193,7 +193,7 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals if ($value == '.1.3.6.1.2.1.1.3.0' || $value == '.1.3.6.1.2.1.25.1.1.0') { $data = "".human_milliseconds_to_string($last_data['datos']).''; } else if (is_numeric($last_data['datos'])) { - $data = "".remove_right_zeros(number_format($last_data['datos'], $config['graph_precision'])).''; + $data = "".remove_right_zeros(number_format($last_data['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])).''; } else { $data = ui_print_truncate_text( io_safe_output($last_data['datos']), @@ -209,7 +209,7 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals default: if (is_numeric($last_data['datos'])) { - $data = "".remove_right_zeros(number_format($last_data['datos'], $config['graph_precision'])).''; + $data = "".remove_right_zeros(number_format($last_data['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])).''; } else { $data = ui_print_truncate_text( io_safe_output($last_data['datos']), @@ -232,7 +232,7 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals if ($value == '.1.3.6.1.2.1.1.3.0' || $value == '.1.3.6.1.2.1.25.1.1.0') { $data = "".human_milliseconds_to_string($last_data['datos']).''; } else if (is_numeric($last_data['datos'])) { - $data = "".remove_right_zeros(number_format($last_data['datos'], $config['graph_precision'])).''; + $data = "".remove_right_zeros(number_format($last_data['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])).''; } else { $data = ui_print_truncate_text( io_safe_output($last_data['datos']), @@ -248,7 +248,7 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals default: if (is_numeric($last_data['datos'])) { - $data = "".remove_right_zeros(number_format($last_data['datos'], $config['graph_precision'])).''; + $data = "".remove_right_zeros(number_format($last_data['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])).''; } else { $data = ui_print_truncate_text( io_safe_output($last_data['datos']), @@ -271,7 +271,7 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $data_macro = modules_get_unit_macro($last_data['datos'], $module['unit']); if ($data_macro) { if (is_numeric($data_macro)) { - $last_data_str = "".remove_right_zeros(number_format($data_macro, $config['graph_precision'])).''; + $last_data_str = "".remove_right_zeros(number_format($data_macro, $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])).''; } else { $last_data_str = ui_print_truncate_text( io_safe_output($data_macro), @@ -594,10 +594,10 @@ 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'].'&'.'loginhash=auto&'."loginhash_data=$hashdata&".'loginhash_user='.str_rot13($user); + $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 .= ''.''.$agent['alias'].''; + $cellName .= ''.$agent['alias'].''; } else { $cellName .= ''.$agent['alias'].''; } @@ -690,20 +690,13 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $go_to_agent = '
'; if ($agent['id_os'] == CLUSTER_OS_ID) { - if (enterprise_installed()) { - $cluster = PandoraFMS\Enterprise\Cluster::loadFromAgentId( - $agent['id_agente'] - ); - $url = 'index.php?sec=reporting&sec2='.ENTERPRISE_DIR; - $url .= '/operation/cluster/cluster'; - $url = ui_get_full_url( - $url.'&op=update&id='.$cluster->id() - ); - $go_to_agent .= ''; - $go_to_agent .= html_print_submit_button(__('Edit cluster'), 'upd_button', false, 'class="sub config"', true); - } + $cluster = PandoraFMS\Cluster::loadFromAgentId( + $agent['id_agente'] + ); + $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 .= ''; $go_to_agent .= html_print_submit_button(__('Go to agent edition'), 'upd_button', false, 'class="sub config"', true); } @@ -854,30 +847,38 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $permission = check_acl($config['id_user'], $agent['id_grupo'], 'RR'); if ($permission) { - $params = [ - 'interface_name' => $interface_name, - 'agent_id' => $id_agente, - 'traffic_module_in' => $interface['traffic']['in'], - 'traffic_module_out' => $interface['traffic']['out'], - ]; + if ($interface['traffic']['in'] > 0 && $interface['traffic']['out'] > 0) { + $params = [ + 'interface_name' => $interface_name, + 'agent_id' => $id_agente, + 'traffic_module_in' => $interface['traffic']['in'], + 'traffic_module_out' => $interface['traffic']['out'], + ]; - if (defined('METACONSOLE') && !empty($server_id)) { - $params['server'] = $server_id; + if (defined('METACONSOLE') && !empty($server_id)) { + $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"; + $win_handle = dechex(crc32($interface['status_module_id'].$interface_name)); + + $graph_link = ""; + $graph_link .= html_print_image( + 'images/chart_curve.png', + true, + ['title' => __('Interface traffic')] + ); + $graph_link .= ''; + } else { + $graph_link = html_print_image( + 'images/chart_curve.disabled.png', + true, + ['title' => __('inOctets and outOctets must be enabled.')] + ); } - - $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"; - $win_handle = dechex(crc32($interface['status_module_id'].$interface_name)); - - $graph_link = ""; - $graph_link .= html_print_image( - 'images/chart_curve.png', - true, - ['title' => __('Interface traffic')] - ); - $graph_link .= ''; } else { $graph_link = ''; } @@ -905,5 +906,12 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) metaconsole_restore_db(); } - return; + echo " + "; } diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 9b877f07f6..0a665c5f23 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2371,13 +2371,17 @@ function ui_print_help_tip( $return=false, $img='images/tip_help.png', $is_relative=false, - $style='' + $style='', + $blink=false ) { $output = ''; $output .= html_print_image( $img, true, - ['title' => $text], + [ + 'title' => $text, + 'class' => $blink === true ? 'blink' : '', + ], false, $is_relative && is_metaconsole() ).''; @@ -3541,6 +3545,11 @@ function ui_print_datatable(array $parameters) titleAttr: "'.__('Export current page to CSV').'", title: "export_'.$parameters['id'].'_current_page_'.date('Y-m-d').'", fieldSeparator: "'.$config['csv_divider'].'", + action: function ( e, dt, node, config ) { + blockResubmit(node); + // Call the default csvHtml5 action method to create the CSV file + $.fn.dataTable.ext.buttons.csvHtml5.action.call(this, e, dt, node, config); + }, exportOptions : { modifier : { // DataTables core @@ -3548,7 +3557,7 @@ function ui_print_datatable(array $parameters) page : "All", search : "applied" }'.$export_columns.' - } + }, } ] : [], lengthMenu: '.json_encode($pagination_options).', @@ -3672,6 +3681,16 @@ function ui_print_datatable(array $parameters) $js .= '$(".datatables_thead_tr").css("height", 0);'; } + if (isset($parameters['csv']) === true) { + $js."'$('#".$table_id."').on( 'buttons-processing', function ( e, indicator ) { + if ( indicator ) { + console.log('a'); + } + else { + console.log('b'); + }"; + } + $js .= '});'; $js .= ''; @@ -4004,10 +4023,10 @@ function ui_toggle( // Options. $style = 'overflow:hidden;'; if ($hidden_default) { - $style .= 'height:0;'; + $style .= 'height:0;position:absolute;'; $original = $img_b; } else { - $style .= 'height:auto;'; + $style .= 'height:auto;position:relative;'; $original = $img_a; } @@ -4114,10 +4133,12 @@ function ui_toggle( $output .= ' if (hide_tgl_ctrl_'.$uniqid.") {\n"; $output .= ' hide_tgl_ctrl_'.$uniqid." = 0;\n"; $output .= " $('#tgl_div_".$uniqid."').css('height', 'auto');\n"; + $output .= " $('#tgl_div_".$uniqid."').css('position', 'relative');\n"; $output .= " }\n"; $output .= " else {\n"; $output .= ' hide_tgl_ctrl_'.$uniqid." = 1;\n"; $output .= " $('#tgl_div_".$uniqid."').css('height', 0);\n"; + $output .= " $('#tgl_div_".$uniqid."').css('position', 'absolute');\n"; $output .= " }\n"; $output .= " }\n"; $output .= " });\n"; @@ -4125,12 +4146,14 @@ function ui_toggle( $output .= ' if (hide_tgl_ctrl_'.$uniqid.") {\n"; $output .= ' hide_tgl_ctrl_'.$uniqid." = 0;\n"; $output .= " $('#tgl_div_".$uniqid."').css('height', 'auto');\n"; + $output .= " $('#tgl_div_".$uniqid."').css('position', 'relative');\n"; $output .= " $('#image_".$uniqid."').attr({src: '".$image_a."'});\n"; $output .= " $('#checkbox-".$switch_name."').prop('checked', true);\n"; $output .= " }\n"; $output .= " else {\n"; $output .= ' hide_tgl_ctrl_'.$uniqid." = 1;\n"; $output .= " $('#tgl_div_".$uniqid."').css('height', 0);\n"; + $output .= " $('#tgl_div_".$uniqid."').css('position', 'absolute');\n"; $output .= " $('#image_".$uniqid."').attr({src: '".$image_b."'});\n"; $output .= " $('#checkbox-".$switch_name."').prop('checked', false);\n"; $output .= " }\n"; @@ -6574,10 +6597,11 @@ function ui_print_comments($comments) } else { $rest_time = (time() - $last_comment['utimestamp']); $time_last = (($rest_time / 60) / 60); - $comentario = ''.number_format($time_last, 0).'  Hours  ('.$last_comment['id_user'].'): '.$last_comment['comment'].''; + + $comentario = ''.number_format($time_last, 0, $config['decimal_separator'], ($config['thousand_separator'] ?? ',')).'  Hours  ('.$last_comment['id_user'].'): '.$last_comment['comment'].''; if (strlen($comentario) > '200px') { - $comentario = ''.number_format($time_last, 0).'  Hours  ('.$last_comment['id_user'].'): '.$short_comment.'...'; + $comentario = ''.number_format($time_last, 0, $config['decimal_separator'], ($config['thousand_separator'] ?? ',')).'  Hours  ('.$last_comment['id_user'].'): '.$short_comment.'...'; } } @@ -6805,3 +6829,259 @@ function ui_print_spinner(string $text='Loading', bool $return=false) echo $output; } } + + +function ui_get_inventory_module_add_form( + $form_action, + $form_buttons='', + $inventory_module_id=0, + $os_id=false, + $target=false, + $interval=3600, + $username='', + $password='', + $custom_fields_enabled=false, + $custom_fields=[] +) { + $table = new stdClass(); + $table->id = 'inventory-module-form'; + $table->width = '100%'; + $table->class = 'databox filters'; + $table->style['module-title'] = 'font-weight: bold;'; + $table->style['interval-title'] = 'font-weight: bold;'; + $table->style['target-title'] = 'font-weight: bold;'; + $table->style['chkbx-custom-fields-title'] = 'font-weight: bold;'; + $table->style['username-title'] = 'font-weight: bold;'; + $table->style['password-title'] = 'font-weight: bold;'; + $table->rowstyle = []; + $table->rowstyle['hidden-custom-field-row'] = 'display: none;'; + $table->colspan = []; + $table->colspan['custom-fields-row'] = []; + $table->colspan['custom-fields-row']['custom-fields-column'] = 4; + $table->data = []; + + $row = []; + $row['module-title'] = __('Module'); + if (empty($inventory_module_id)) { + if (empty($os_id)) { + $sql = 'SELECT mi.id_module_inventory AS id, mi.name AS name, co.name AS os + FROM tmodule_inventory mi, tconfig_os co + WHERE co.id_os = mi.id_os + ORDER BY co.name, mi.name'; + $inventory_modules_raw = db_get_all_rows_sql($sql); + + $inventory_modules = []; + foreach ($inventory_modules_raw as $im) { + $inventory_modules[$im['id']] = [ + 'name' => $im['name'], + 'optgroup' => $im['os'], + ]; + } + } else { + $sql = sprintf( + 'SELECT id_module_inventory AS id, name + FROM tmodule_inventory + WHERE id_os = %d + ORDER BY name', + $os_id + ); + $inventory_modules_raw = db_get_all_rows_sql($sql); + + $inventory_modules = []; + foreach ($inventory_modules_raw as $im) { + $inventory_modules[$im['id']] = $im['name']; + } + } + + $row['module-input'] = html_print_select($inventory_modules, 'id_module_inventory', 0, '', __('Select inventory module'), 0, true, false, false); + } else { + $row['module-input'] = db_get_sql('SELECT name FROM tmodule_inventory WHERE id_module_inventory = '.$inventory_module_id); + } + + $row['interval-title'] = __('Interval'); + $row['interval-input'] = html_print_extended_select_for_time('interval', $interval, '', '', '', false, true); + + $table->data['first-row'] = $row; + + $row = []; + + if ($target !== false) { + $row['target-title'] = __('Target'); + $row['target-input'] = html_print_input_text('target', $target, '', 25, 40, true); + } + + $row['chkbx-custom-fields-title'] = __('Use custom fields'); + $row['chkbx-custom-fields-input'] = html_print_checkbox('custom_fields_enabled', 1, $custom_fields_enabled, true); + + $table->data['second-row'] = $row; + + $row = []; + $row['username-title'] = __('Username'); + $row['username-input'] = html_print_input_text('username', $username, '', 25, 40, true); + $row['password-title'] = __('Password'); + $row['password-input'] = html_print_input_password('password', $password, '', 25, 40, true); + + $table->data['userpass-row'] = $row; + + $row = []; + $row['hidden-title'] = ''; + $row['hidden-input'] = html_print_input_hidden('hidden-custom-field-name', '', true); + $row['hidden-input'] .= html_print_input_hidden('hidden-custom-field-is-secure', 0, true); + $row['hidden-input'] .= html_print_input_text('hidden-custom-field-input', '', '', 25, 40, true); + $row['hidden-input'] .= ' '; + $row['hidden-input'] .= html_print_image( + 'images/cross.png', + true, + [ + 'border' => '0', + 'title' => __('Remove'), + 'style' => 'cursor: pointer;', + 'class' => 'remove-custom-field invert_filter', + ] + ); + + $table->data['hidden-custom-field-row'] = $row; + + if ($custom_fields_enabled) { + foreach ($custom_fields as $i => $field) { + $row = []; + $row['title'] = ''.$field['name'].''; + $row['input'] = html_print_input_hidden( + 'custom_fields['.$i.'][name]', + $field['name'], + true + ); + $row['input'] .= html_print_input_hidden( + 'custom_fields['.$i.'][secure]', + $field['secure'], + true + ); + if ($field['secure']) { + $row['input'] .= html_print_input_password( + 'custom_fields['.$i.'][value]', + $field['value'], + '', + 25, + 40, + true + ); + } else { + $row['input'] .= html_print_input_text( + 'custom_fields['.$i.'][value]', + $field['value'], + '', + 25, + 40, + true + ); + } + + $row['input'] .= ' '; + $row['input'] .= html_print_image( + 'images/cross.png', + true, + [ + 'border' => '0', + 'title' => __('Remove'), + 'style' => 'cursor: pointer;', + 'class' => 'remove-custom-field invert_filter', + ] + ); + + $table->data['custom-field-row-'.$i] = $row; + } + } + + $row = []; + $row['custom-fields-column'] = ''.__('Field name').''.'  '.html_print_input_text('field-name', '', '', 25, 40, true).'   '.html_print_checkbox('field-is-password', 1, false, true).__("It's a password").'   '.html_print_button(__('Add field'), 'add-field', false, '', 'class="sub add"', true); + + $table->data['custom-fields-row'] = $row; + + ob_start(); + + echo '
'; + echo html_print_table($table); + echo '
'; + echo $form_buttons; + echo '
'; + echo '
'; + + ?> + + + $id_group) { + $children[] = groups_get_children($id_group); } - unset($user_groups[$id_groups]); + if (empty($children) === false) { + foreach ($children as $child) { + unset($user_groups[$child['id_grupo']]); + } + } + + foreach ($id_groups as $key => $id_group) { + unset($user_groups[$id_group]); + } } if (empty($user_groups)) { @@ -811,6 +819,20 @@ function users_get_users_by_group($id_group, $um=false, $disabled=true) } +/** + * Delete session user if exist + * + * @param string $id_user User id. + * + * @return boolean Return . + */ +function delete_session_user($id_user) +{ + $sql = "DELETE FROM tsessions_php where data like '%\"".$id_user."\"%'"; + return db_process_sql($sql); +} + + function users_has_profile_without_UM($id_user, $id_groups) { $sql = sprintf( @@ -884,6 +906,69 @@ function users_get_users_group_by_group($id_group) } +/** + * Generates a cryptographically secure chain for use with API. + * + * @return string + */ +function api_token_generate() +{ + include_once 'functions_api.php'; + // Generate a cryptographically secure chain. + $generateToken = bin2hex(openssl_random_pseudo_bytes(16)); + // Check if token exists in DB. + $tokenExists = (bool) api_token_check($generateToken); + // If not exists, can be assigned. In other case, try again. + return ($tokenExists === false) ? $generateToken : api_token_generate(); +} + + +/** + * Returns User API Token + * + * @param string $idUser Id of the user. + * + * @return string + */ +function users_get_API_token(string $idUser) +{ + $output = db_get_value('api_token', 'tusuario', 'id_user', $idUser); + + if (empty($output) === true) { + $output = '<< '.__('NONE').' >>'; + } + + return $output; +} + + +/** + * Renews the API Token. + * + * @param integer $idUser Id of the user. + * + * @return boolean Return true if the token was renewed. + */ +function users_renew_API_token(int $idUser) +{ + $apiToken = api_token_generate(); + + if (empty($apiToken) === false) { + $result = db_process_sql_update( + 'tusuario', + ['api_token' => $apiToken], + ['id_user' => $idUser] + ); + + if ($result !== false) { + return true; + } + } + + return false; +} + + /** * Check if IP is in range. Check wildcard `*`, single IP and IP ranges. * diff --git a/pandora_console/include/functions_visual_map.php b/pandora_console/include/functions_visual_map.php index 9b1454ab4b..b6e3932293 100755 --- a/pandora_console/include/functions_visual_map.php +++ b/pandora_console/include/functions_visual_map.php @@ -924,7 +924,7 @@ function visual_map_print_item( $value_text = format_for_graph($module_value, 2); if ($value_text <= 0) { - $value_text = remove_right_zeros(number_format($module_value, $config['graph_precision'])); + $value_text = remove_right_zeros(number_format($module_value, $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])); } if (!empty($unit_text)) { @@ -1227,7 +1227,7 @@ function visual_map_print_item( $module_data = get_bars_module_data( $id_module, - ($layoutData['type_graph'] !== 'horizontal') + $layoutData['type_graph'] ); $options = []; $options['generals']['rotate'] = true; @@ -1743,7 +1743,7 @@ function visual_map_print_item( || (modules_is_boolean($layoutData['id_agente_modulo']) && $layoutData['show_last_value'] != 0) ) { if (is_numeric($value)) { - $img_style_title .= '
'.__('Last value: ').remove_right_zeros(number_format($value, $config['graph_precision'])); + $img_style_title .= '
'.__('Last value: ').remove_right_zeros(number_format($value, $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])); } else { $img_style_title .= '
'.__('Last value: ').$value; } @@ -1881,13 +1881,13 @@ function visual_map_print_item( echo ''; echo ""; echo ''; - echo "
".remove_right_zeros(number_format($stat_agent_cr, 2)).'%
'; + echo "
".remove_right_zeros(number_format($stat_agent_cr, 2, $config['decimal_separator'], $config['thousand_separator'])).'%
'; echo "
Critical
"; - echo "
".remove_right_zeros(number_format($stat_agent_wa, 2)).'%
'; + echo "
".remove_right_zeros(number_format($stat_agent_wa, 2, $config['decimal_separator'], $config['thousand_separator'])).'%
'; echo "
Warning
"; - echo "
".remove_right_zeros(number_format($stat_agent_ok, 2)).'%
'; + echo "
".remove_right_zeros(number_format($stat_agent_ok, 2, $config['decimal_separator'], $config['thousand_separator'])).'%
'; echo "
Normal
"; - echo "
".remove_right_zeros(number_format($stat_agent_un, 2)).'%
'; + echo "
".remove_right_zeros(number_format($stat_agent_un, 2, $config['decimal_separator'], $config['thousand_separator'])).'%
'; echo "
Unknown
"; echo ''; echo ''; @@ -2344,7 +2344,7 @@ function get_if_module_is_image($id_module) } -function get_bars_module_data($id_module, $vBars=false) +function get_bars_module_data($id_module, $typeGraph='horizontal') { // This charts is only serialize graphs. // In other string show image no data to show. @@ -2355,7 +2355,7 @@ function get_bars_module_data($id_module, $vBars=false) ); $values = false; - // avoid showing the image type modules. WUX + // Avoid showing the image type modules. WUX. if (strpos($mod_values, 'data:image/png;base64') !== 0) { if (preg_match("/\r\n/", $mod_values)) { $values = explode("\r\n", $mod_values); @@ -2364,26 +2364,28 @@ function get_bars_module_data($id_module, $vBars=false) } } - $values_to_return = []; - $index = 0; - $color_index = 0; - $total = 0; - if (!$values) { return false; } - if ($vBars === false) { - foreach ($values as $val) { - $data = explode(',', $val); - $values_to_return[$data[0]] = ['g' => $data[1]]; + $values_to_return = []; + foreach ($values as $val) { + $data = explode(',', $val); + + if ($data[0] === $val) { + continue; } - } else { - foreach ($values as $val) { - $data = explode(',', $val); - $values_to_return[] = [ - 'tick' => $data[0], - 'data' => $data[1], + + $values_to_return['labels'][] = io_safe_output($data[0]); + if ($typeGraph === 'horizontal') { + $values_to_return['data'][] = [ + 'y' => io_safe_output($data[0]), + 'x' => $data[1], + ]; + } else { + $values_to_return['data'][] = [ + 'x' => io_safe_output($data[0]), + 'y' => $data[1], ]; } } @@ -2462,7 +2464,7 @@ function visual_map_get_simple_value($type, $id_module, $period=SECONDS_1DAY) } else { if (is_numeric($value)) { if ($config['simple_module_value']) { - $value = remove_right_zeros(number_format($value, $config['graph_precision'])); + $value = remove_right_zeros(number_format($value, $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])); } } @@ -2842,74 +2844,23 @@ function get_donut_module_data($id_module) $no_data_to_show = true; } - $colors = []; - $colors[] = '#aa3333'; - $colors[] = '#045FB4'; - $colors[] = '#8181F7'; - $colors[] = '#F78181'; - $colors[] = '#D0A9F5'; - $colors[] = '#BDBDBD'; - $colors[] = '#6AB277'; - - $max_elements = 6; $values_to_return = []; - $index = 0; - $total = 0; foreach ($values as $val) { - if ($index < $max_elements) { - $data = explode(',', $val); + $data = explode(',', $val); - if ($no_data_to_show) { - $values_to_return[$index]['tag_name'] = $data[0]; - } else { - $values_to_return[$index]['tag_name'] = $data[0].': '.$data[1]; - } + if ($data[0] === $val) { + continue; + } - $values_to_return[$index]['color'] = $colors[$index]; - $values_to_return[$index]['value'] = (int) $data[1]; - $total += (int) $data[1]; - $index++; + if ($no_data_to_show) { + $values_to_return['labels'][] = $data[0]; } else { - $data = explode(',', $val); - $values_to_return[$index]['tag_name'] = __('Others').': '.$data[1]; - $values_to_return[$index]['color'] = $colors[$index]; - $values_to_return[$index]['value'] += (int) $data[1]; - $total += (int) $data[1]; - } - } - - foreach ($values_to_return as $ind => $donut_data) { - $values_to_return[$ind]['percent'] = (($donut_data['value'] * 100) / $total); - } - - // sort array - $new_values_to_return = []; - while (!empty($values_to_return)) { - $first = true; - $max_elem = 0; - $max_elem_array = []; - $index_to_del = 0; - foreach ($values_to_return as $i => $val) { - if ($first) { - $max_elem = $val['value']; - $max_elem_array = $val; - $index_to_del = $i; - $first = false; - } else { - if ($val['value'] > $max_elem) { - $max_elem = $val['value']; - $max_elem_array = $val; - $index_to_del = $i; - } - } + $values_to_return['labels'][] = $data[0].': '.$data[1]; } - $new_values_to_return[] = $max_elem_array; - unset($values_to_return[$index_to_del]); + $values_to_return['data'][] = (int) $data[1]; } - $values_to_return = $new_values_to_return; - return $values_to_return; } diff --git a/pandora_console/include/functions_visual_map_editor.php b/pandora_console/include/functions_visual_map_editor.php index b32714b819..9d4eaad1d6 100755 --- a/pandora_console/include/functions_visual_map_editor.php +++ b/pandora_console/include/functions_visual_map_editor.php @@ -685,7 +685,7 @@ function visual_map_editor_print_item_palette($visualConsole_id, $background) $percentile_type = [ 'percentile' => __('Percentile'), 'bubble' => __('Bubble'), - 'circular_progress_bar' => __('Circular porgress bar'), + 'circular_progress_bar' => __('Circular progress bar'), 'interior_circular_progress_bar' => __('Circular progress bar (interior)'), ]; $percentile_value = [ diff --git a/pandora_console/include/graphs/chartjs/chart.js b/pandora_console/include/graphs/chartjs/chart.js new file mode 100644 index 0000000000..cf279cc849 --- /dev/null +++ b/pandora_console/include/graphs/chartjs/chart.js @@ -0,0 +1,11526 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/chart.js@4.0.1/dist/chart.umd.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +/*! + * Chart.js v4.0.1 + * https://www.chartjs.org + * (c) 2022 Chart.js Contributors + * Released under the MIT License + */ +!(function(t, e) { + "object" == typeof exports && "undefined" != typeof module + ? (module.exports = e()) + : "function" == typeof define && define.amd + ? define(e) + : ((t = + "undefined" != typeof globalThis ? globalThis : t || self).Chart = e()); +})(this, function() { + "use strict"; + function t() {} + const e = (() => { + let t = 0; + return () => t++; + })(); + function i(t) { + return null == t; + } + function s(t) { + if (Array.isArray && Array.isArray(t)) return !0; + const e = Object.prototype.toString.call(t); + return "[object" === e.slice(0, 7) && "Array]" === e.slice(-6); + } + function n(t) { + return ( + null !== t && "[object Object]" === Object.prototype.toString.call(t) + ); + } + function o(t) { + return ("number" == typeof t || t instanceof Number) && isFinite(+t); + } + function a(t, e) { + return o(t) ? t : e; + } + function r(t, e) { + return void 0 === t ? e : t; + } + const l = (t, e) => + "string" == typeof t && t.endsWith("%") ? parseFloat(t) / 100 : +t / e, + h = (t, e) => + "string" == typeof t && t.endsWith("%") ? (parseFloat(t) / 100) * e : +t; + function c(t, e, i) { + if (t && "function" == typeof t.call) return t.apply(i, e); + } + function d(t, e, i, o) { + let a, r, l; + if (s(t)) + if (((r = t.length), o)) for (a = r - 1; a >= 0; a--) e.call(i, t[a], a); + else for (a = 0; a < r; a++) e.call(i, t[a], a); + else if (n(t)) + for (l = Object.keys(t), r = l.length, a = 0; a < r; a++) + e.call(i, t[l[a]], l[a]); + } + function u(t, e) { + let i, s, n, o; + if (!t || !e || t.length !== e.length) return !1; + for (i = 0, s = t.length; i < s; ++i) + if ( + ((n = t[i]), + (o = e[i]), + n.datasetIndex !== o.datasetIndex || n.index !== o.index) + ) + return !1; + return !0; + } + function f(t) { + if (s(t)) return t.map(f); + if (n(t)) { + const e = Object.create(null), + i = Object.keys(t), + s = i.length; + let n = 0; + for (; n < s; ++n) e[i[n]] = f(t[i[n]]); + return e; + } + return t; + } + function g(t) { + return -1 === ["__proto__", "prototype", "constructor"].indexOf(t); + } + function p(t, e, i, s) { + if (!g(t)) return; + const o = e[t], + a = i[t]; + n(o) && n(a) ? m(o, a, s) : (e[t] = f(a)); + } + function m(t, e, i) { + const o = s(e) ? e : [e], + a = o.length; + if (!n(t)) return t; + const r = (i = i || {}).merger || p; + let l; + for (let e = 0; e < a; ++e) { + if (((l = o[e]), !n(l))) continue; + const s = Object.keys(l); + for (let e = 0, n = s.length; e < n; ++e) r(s[e], t, l, i); + } + return t; + } + function b(t, e) { + return m(t, e, { merger: x }); + } + function x(t, e, i) { + if (!g(t)) return; + const s = e[t], + o = i[t]; + n(s) && n(o) + ? b(s, o) + : Object.prototype.hasOwnProperty.call(e, t) || (e[t] = f(o)); + } + const _ = { "": t => t, x: t => t.x, y: t => t.y }; + function y(t) { + const e = t.split("."), + i = []; + let s = ""; + for (const t of e) + (s += t), + s.endsWith("\\") ? (s = s.slice(0, -1) + ".") : (i.push(s), (s = "")); + return i; + } + function v(t, e) { + const i = + _[e] || + (_[e] = (function(t) { + const e = y(t); + return t => { + for (const i of e) { + if ("" === i) break; + t = t && t[i]; + } + return t; + }; + })(e)); + return i(t); + } + function M(t) { + return t.charAt(0).toUpperCase() + t.slice(1); + } + const w = t => void 0 !== t, + k = t => "function" == typeof t, + S = (t, e) => { + if (t.size !== e.size) return !1; + for (const i of t) if (!e.has(i)) return !1; + return !0; + }; + function P(t) { + return ( + "mouseup" === t.type || "click" === t.type || "contextmenu" === t.type + ); + } + const D = Math.PI, + C = 2 * D, + O = C + D, + A = Number.POSITIVE_INFINITY, + T = D / 180, + L = D / 2, + E = D / 4, + R = (2 * D) / 3, + I = Math.log10, + z = Math.sign; + function F(t, e, i) { + return Math.abs(t - e) < i; + } + function V(t) { + const e = Math.round(t); + t = F(t, e, t / 1e3) ? e : t; + const i = Math.pow(10, Math.floor(I(t))), + s = t / i; + return (s <= 1 ? 1 : s <= 2 ? 2 : s <= 5 ? 5 : 10) * i; + } + function B(t) { + const e = [], + i = Math.sqrt(t); + let s; + for (s = 1; s < i; s++) t % s == 0 && (e.push(s), e.push(t / s)); + return i === (0 | i) && e.push(i), e.sort((t, e) => t - e).pop(), e; + } + function N(t) { + return !isNaN(parseFloat(t)) && isFinite(t); + } + function W(t, e) { + const i = Math.round(t); + return i - e <= t && i + e >= t; + } + function H(t, e, i) { + let s, n, o; + for (s = 0, n = t.length; s < n; s++) + (o = t[s][i]), + isNaN(o) || + ((e.min = Math.min(e.min, o)), (e.max = Math.max(e.max, o))); + } + function j(t) { + return t * (D / 180); + } + function $(t) { + return t * (180 / D); + } + function Y(t) { + if (!o(t)) return; + let e = 1, + i = 0; + for (; Math.round(t * e) / e !== t; ) (e *= 10), i++; + return i; + } + function U(t, e) { + const i = e.x - t.x, + s = e.y - t.y, + n = Math.sqrt(i * i + s * s); + let o = Math.atan2(s, i); + return o < -0.5 * D && (o += C), { angle: o, distance: n }; + } + function X(t, e) { + return Math.sqrt(Math.pow(e.x - t.x, 2) + Math.pow(e.y - t.y, 2)); + } + function q(t, e) { + return ((t - e + O) % C) - D; + } + function K(t) { + return ((t % C) + C) % C; + } + function G(t, e, i, s) { + const n = K(t), + o = K(e), + a = K(i), + r = K(o - n), + l = K(a - n), + h = K(n - o), + c = K(n - a); + return n === o || n === a || (s && o === a) || (r > l && h < c); + } + function Z(t, e, i) { + return Math.max(e, Math.min(i, t)); + } + function J(t) { + return Z(t, -32768, 32767); + } + function Q(t, e, i, s = 1e-6) { + return t >= Math.min(e, i) - s && t <= Math.max(e, i) + s; + } + function tt(t, e, i) { + i = i || (i => t[i] < e); + let s, + n = t.length - 1, + o = 0; + for (; n - o > 1; ) (s = (o + n) >> 1), i(s) ? (o = s) : (n = s); + return { lo: o, hi: n }; + } + const et = (t, e, i, s) => + tt( + t, + i, + s + ? s => { + const n = t[s][e]; + return n < i || (n === i && t[s + 1][e] === i); + } + : s => t[s][e] < i + ), + it = (t, e, i) => tt(t, i, s => t[s][e] >= i); + function st(t, e, i) { + let s = 0, + n = t.length; + for (; s < n && t[s] < e; ) s++; + for (; n > s && t[n - 1] > i; ) n--; + return s > 0 || n < t.length ? t.slice(s, n) : t; + } + const nt = ["push", "pop", "shift", "splice", "unshift"]; + function ot(t, e) { + t._chartjs + ? t._chartjs.listeners.push(e) + : (Object.defineProperty(t, "_chartjs", { + configurable: !0, + enumerable: !1, + value: { listeners: [e] } + }), + nt.forEach(e => { + const i = "_onData" + M(e), + s = t[e]; + Object.defineProperty(t, e, { + configurable: !0, + enumerable: !1, + value(...e) { + const n = s.apply(this, e); + return ( + t._chartjs.listeners.forEach(t => { + "function" == typeof t[i] && t[i](...e); + }), + n + ); + } + }); + })); + } + function at(t, e) { + const i = t._chartjs; + if (!i) return; + const s = i.listeners, + n = s.indexOf(e); + -1 !== n && s.splice(n, 1), + s.length > 0 || + (nt.forEach(e => { + delete t[e]; + }), + delete t._chartjs); + } + function rt(t) { + const e = new Set(); + let i, s; + for (i = 0, s = t.length; i < s; ++i) e.add(t[i]); + return e.size === s ? t : Array.from(e); + } + const lt = + "undefined" == typeof window + ? function(t) { + return t(); + } + : window.requestAnimationFrame; + function ht(t, e) { + let i = !1; + return function(...s) { + i || + ((i = !0), + lt.call(window, () => { + (i = !1), t.apply(e, s); + })); + }; + } + function ct(t, e) { + let i; + return function(...s) { + return ( + e ? (clearTimeout(i), (i = setTimeout(t, e, s))) : t.apply(this, s), e + ); + }; + } + const dt = t => ("start" === t ? "left" : "end" === t ? "right" : "center"), + ut = (t, e, i) => ("start" === t ? e : "end" === t ? i : (e + i) / 2), + ft = (t, e, i, s) => + t === (s ? "left" : "right") ? i : "center" === t ? (e + i) / 2 : e; + function gt(t, e, i) { + const s = e.length; + let n = 0, + o = s; + if (t._sorted) { + const { iScale: a, _parsed: r } = t, + l = a.axis, + { min: h, max: c, minDefined: d, maxDefined: u } = a.getUserBounds(); + d && + (n = Z( + Math.min( + et(r, a.axis, h).lo, + i ? s : et(e, l, a.getPixelForValue(h)).lo + ), + 0, + s - 1 + )), + (o = u + ? Z( + Math.max( + et(r, a.axis, c, !0).hi + 1, + i ? 0 : et(e, l, a.getPixelForValue(c), !0).hi + 1 + ), + n, + s + ) - n + : s - n); + } + return { start: n, count: o }; + } + function pt(t) { + const { xScale: e, yScale: i, _scaleRanges: s } = t, + n = { xmin: e.min, xmax: e.max, ymin: i.min, ymax: i.max }; + if (!s) return (t._scaleRanges = n), !0; + const o = + s.xmin !== e.min || + s.xmax !== e.max || + s.ymin !== i.min || + s.ymax !== i.max; + return Object.assign(s, n), o; + } + class mt { + constructor() { + (this._request = null), + (this._charts = new Map()), + (this._running = !1), + (this._lastDate = void 0); + } + _notify(t, e, i, s) { + const n = e.listeners[s], + o = e.duration; + n.forEach(s => + s({ + chart: t, + initial: e.initial, + numSteps: o, + currentStep: Math.min(i - e.start, o) + }) + ); + } + _refresh() { + this._request || + ((this._running = !0), + (this._request = lt.call(window, () => { + this._update(), + (this._request = null), + this._running && this._refresh(); + }))); + } + _update(t = Date.now()) { + let e = 0; + this._charts.forEach((i, s) => { + if (!i.running || !i.items.length) return; + const n = i.items; + let o, + a = n.length - 1, + r = !1; + for (; a >= 0; --a) + (o = n[a]), + o._active + ? (o._total > i.duration && (i.duration = o._total), + o.tick(t), + (r = !0)) + : ((n[a] = n[n.length - 1]), n.pop()); + r && (s.draw(), this._notify(s, i, t, "progress")), + n.length || + ((i.running = !1), + this._notify(s, i, t, "complete"), + (i.initial = !1)), + (e += n.length); + }), + (this._lastDate = t), + 0 === e && (this._running = !1); + } + _getAnims(t) { + const e = this._charts; + let i = e.get(t); + return ( + i || + ((i = { + running: !1, + initial: !0, + items: [], + listeners: { complete: [], progress: [] } + }), + e.set(t, i)), + i + ); + } + listen(t, e, i) { + this._getAnims(t).listeners[e].push(i); + } + add(t, e) { + e && e.length && this._getAnims(t).items.push(...e); + } + has(t) { + return this._getAnims(t).items.length > 0; + } + start(t) { + const e = this._charts.get(t); + e && + ((e.running = !0), + (e.start = Date.now()), + (e.duration = e.items.reduce((t, e) => Math.max(t, e._duration), 0)), + this._refresh()); + } + running(t) { + if (!this._running) return !1; + const e = this._charts.get(t); + return !!(e && e.running && e.items.length); + } + stop(t) { + const e = this._charts.get(t); + if (!e || !e.items.length) return; + const i = e.items; + let s = i.length - 1; + for (; s >= 0; --s) i[s].cancel(); + (e.items = []), this._notify(t, e, Date.now(), "complete"); + } + remove(t) { + return this._charts.delete(t); + } + } + var bt = new mt(); + /*! + * @kurkle/color v0.2.1 + * https://github.com/kurkle/color#readme + * (c) 2022 Jukka Kurkela + * Released under the MIT License + */ function xt(t) { + return (t + 0.5) | 0; + } + const _t = (t, e, i) => Math.max(Math.min(t, i), e); + function yt(t) { + return _t(xt(2.55 * t), 0, 255); + } + function vt(t) { + return _t(xt(255 * t), 0, 255); + } + function Mt(t) { + return _t(xt(t / 2.55) / 100, 0, 1); + } + function wt(t) { + return _t(xt(100 * t), 0, 100); + } + const kt = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15, + a: 10, + b: 11, + c: 12, + d: 13, + e: 14, + f: 15 + }, + St = [..."0123456789ABCDEF"], + Pt = t => St[15 & t], + Dt = t => St[(240 & t) >> 4] + St[15 & t], + Ct = t => (240 & t) >> 4 == (15 & t); + function Ot(t) { + var e = (t => Ct(t.r) && Ct(t.g) && Ct(t.b) && Ct(t.a))(t) ? Pt : Dt; + return t + ? "#" + + e(t.r) + + e(t.g) + + e(t.b) + + ((t, e) => (t < 255 ? e(t) : ""))(t.a, e) + : void 0; + } + const At = /^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/; + function Tt(t, e, i) { + const s = e * Math.min(i, 1 - i), + n = (e, n = (e + t / 30) % 12) => + i - s * Math.max(Math.min(n - 3, 9 - n, 1), -1); + return [n(0), n(8), n(4)]; + } + function Lt(t, e, i) { + const s = (s, n = (s + t / 60) % 6) => + i - i * e * Math.max(Math.min(n, 4 - n, 1), 0); + return [s(5), s(3), s(1)]; + } + function Et(t, e, i) { + const s = Tt(t, 1, 0.5); + let n; + for ( + e + i > 1 && ((n = 1 / (e + i)), (e *= n), (i *= n)), n = 0; + n < 3; + n++ + ) + (s[n] *= 1 - e - i), (s[n] += e); + return s; + } + function Rt(t) { + const e = t.r / 255, + i = t.g / 255, + s = t.b / 255, + n = Math.max(e, i, s), + o = Math.min(e, i, s), + a = (n + o) / 2; + let r, l, h; + return ( + n !== o && + ((h = n - o), + (l = a > 0.5 ? h / (2 - n - o) : h / (n + o)), + (r = (function(t, e, i, s, n) { + return t === n + ? (e - i) / s + (e < i ? 6 : 0) + : e === n + ? (i - t) / s + 2 + : (t - e) / s + 4; + })(e, i, s, h, n)), + (r = 60 * r + 0.5)), + [0 | r, l || 0, a] + ); + } + function It(t, e, i, s) { + return (Array.isArray(e) ? t(e[0], e[1], e[2]) : t(e, i, s)).map(vt); + } + function zt(t, e, i) { + return It(Tt, t, e, i); + } + function Ft(t) { + return ((t % 360) + 360) % 360; + } + function Vt(t) { + const e = At.exec(t); + let i, + s = 255; + if (!e) return; + e[5] !== i && (s = e[6] ? yt(+e[5]) : vt(+e[5])); + const n = Ft(+e[2]), + o = +e[3] / 100, + a = +e[4] / 100; + return ( + (i = + "hwb" === e[1] + ? (function(t, e, i) { + return It(Et, t, e, i); + })(n, o, a) + : "hsv" === e[1] + ? (function(t, e, i) { + return It(Lt, t, e, i); + })(n, o, a) + : zt(n, o, a)), + { r: i[0], g: i[1], b: i[2], a: s } + ); + } + const Bt = { + x: "dark", + Z: "light", + Y: "re", + X: "blu", + W: "gr", + V: "medium", + U: "slate", + A: "ee", + T: "ol", + S: "or", + B: "ra", + C: "lateg", + D: "ights", + R: "in", + Q: "turquois", + E: "hi", + P: "ro", + O: "al", + N: "le", + M: "de", + L: "yello", + F: "en", + K: "ch", + G: "arks", + H: "ea", + I: "ightg", + J: "wh" + }, + Nt = { + OiceXe: "f0f8ff", + antiquewEte: "faebd7", + aqua: "ffff", + aquamarRe: "7fffd4", + azuY: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "0", + blanKedOmond: "ffebcd", + Xe: "ff", + XeviTet: "8a2be2", + bPwn: "a52a2a", + burlywood: "deb887", + caMtXe: "5f9ea0", + KartYuse: "7fff00", + KocTate: "d2691e", + cSO: "ff7f50", + cSnflowerXe: "6495ed", + cSnsilk: "fff8dc", + crimson: "dc143c", + cyan: "ffff", + xXe: "8b", + xcyan: "8b8b", + xgTMnPd: "b8860b", + xWay: "a9a9a9", + xgYF: "6400", + xgYy: "a9a9a9", + xkhaki: "bdb76b", + xmagFta: "8b008b", + xTivegYF: "556b2f", + xSange: "ff8c00", + xScEd: "9932cc", + xYd: "8b0000", + xsOmon: "e9967a", + xsHgYF: "8fbc8f", + xUXe: "483d8b", + xUWay: "2f4f4f", + xUgYy: "2f4f4f", + xQe: "ced1", + xviTet: "9400d3", + dAppRk: "ff1493", + dApskyXe: "bfff", + dimWay: "696969", + dimgYy: "696969", + dodgerXe: "1e90ff", + fiYbrick: "b22222", + flSOwEte: "fffaf0", + foYstWAn: "228b22", + fuKsia: "ff00ff", + gaRsbSo: "dcdcdc", + ghostwEte: "f8f8ff", + gTd: "ffd700", + gTMnPd: "daa520", + Way: "808080", + gYF: "8000", + gYFLw: "adff2f", + gYy: "808080", + honeyMw: "f0fff0", + hotpRk: "ff69b4", + RdianYd: "cd5c5c", + Rdigo: "4b0082", + ivSy: "fffff0", + khaki: "f0e68c", + lavFMr: "e6e6fa", + lavFMrXsh: "fff0f5", + lawngYF: "7cfc00", + NmoncEffon: "fffacd", + ZXe: "add8e6", + ZcSO: "f08080", + Zcyan: "e0ffff", + ZgTMnPdLw: "fafad2", + ZWay: "d3d3d3", + ZgYF: "90ee90", + ZgYy: "d3d3d3", + ZpRk: "ffb6c1", + ZsOmon: "ffa07a", + ZsHgYF: "20b2aa", + ZskyXe: "87cefa", + ZUWay: "778899", + ZUgYy: "778899", + ZstAlXe: "b0c4de", + ZLw: "ffffe0", + lime: "ff00", + limegYF: "32cd32", + lRF: "faf0e6", + magFta: "ff00ff", + maPon: "800000", + VaquamarRe: "66cdaa", + VXe: "cd", + VScEd: "ba55d3", + VpurpN: "9370db", + VsHgYF: "3cb371", + VUXe: "7b68ee", + VsprRggYF: "fa9a", + VQe: "48d1cc", + VviTetYd: "c71585", + midnightXe: "191970", + mRtcYam: "f5fffa", + mistyPse: "ffe4e1", + moccasR: "ffe4b5", + navajowEte: "ffdead", + navy: "80", + Tdlace: "fdf5e6", + Tive: "808000", + TivedBb: "6b8e23", + Sange: "ffa500", + SangeYd: "ff4500", + ScEd: "da70d6", + pOegTMnPd: "eee8aa", + pOegYF: "98fb98", + pOeQe: "afeeee", + pOeviTetYd: "db7093", + papayawEp: "ffefd5", + pHKpuff: "ffdab9", + peru: "cd853f", + pRk: "ffc0cb", + plum: "dda0dd", + powMrXe: "b0e0e6", + purpN: "800080", + YbeccapurpN: "663399", + Yd: "ff0000", + Psybrown: "bc8f8f", + PyOXe: "4169e1", + saddNbPwn: "8b4513", + sOmon: "fa8072", + sandybPwn: "f4a460", + sHgYF: "2e8b57", + sHshell: "fff5ee", + siFna: "a0522d", + silver: "c0c0c0", + skyXe: "87ceeb", + UXe: "6a5acd", + UWay: "708090", + UgYy: "708090", + snow: "fffafa", + sprRggYF: "ff7f", + stAlXe: "4682b4", + tan: "d2b48c", + teO: "8080", + tEstN: "d8bfd8", + tomato: "ff6347", + Qe: "40e0d0", + viTet: "ee82ee", + JHt: "f5deb3", + wEte: "ffffff", + wEtesmoke: "f5f5f5", + Lw: "ffff00", + LwgYF: "9acd32" + }; + let Wt; + function Ht(t) { + Wt || + ((Wt = (function() { + const t = {}, + e = Object.keys(Nt), + i = Object.keys(Bt); + let s, n, o, a, r; + for (s = 0; s < e.length; s++) { + for (a = r = e[s], n = 0; n < i.length; n++) + (o = i[n]), (r = r.replace(o, Bt[o])); + (o = parseInt(Nt[a], 16)), + (t[r] = [(o >> 16) & 255, (o >> 8) & 255, 255 & o]); + } + return t; + })()), + (Wt.transparent = [0, 0, 0, 0])); + const e = Wt[t.toLowerCase()]; + return e && { r: e[0], g: e[1], b: e[2], a: 4 === e.length ? e[3] : 255 }; + } + const jt = /^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/; + const $t = t => + t <= 0.0031308 ? 12.92 * t : 1.055 * Math.pow(t, 1 / 2.4) - 0.055, + Yt = t => (t <= 0.04045 ? t / 12.92 : Math.pow((t + 0.055) / 1.055, 2.4)); + function Ut(t, e, i) { + if (t) { + let s = Rt(t); + (s[e] = Math.max(0, Math.min(s[e] + s[e] * i, 0 === e ? 360 : 1))), + (s = zt(s)), + (t.r = s[0]), + (t.g = s[1]), + (t.b = s[2]); + } + } + function Xt(t, e) { + return t ? Object.assign(e || {}, t) : t; + } + function qt(t) { + var e = { r: 0, g: 0, b: 0, a: 255 }; + return ( + Array.isArray(t) + ? t.length >= 3 && + ((e = { r: t[0], g: t[1], b: t[2], a: 255 }), + t.length > 3 && (e.a = vt(t[3]))) + : ((e = Xt(t, { r: 0, g: 0, b: 0, a: 1 })).a = vt(e.a)), + e + ); + } + function Kt(t) { + return "r" === t.charAt(0) + ? (function(t) { + const e = jt.exec(t); + let i, + s, + n, + o = 255; + if (e) { + if (e[7] !== i) { + const t = +e[7]; + o = e[8] ? yt(t) : _t(255 * t, 0, 255); + } + return ( + (i = +e[1]), + (s = +e[3]), + (n = +e[5]), + (i = 255 & (e[2] ? yt(i) : _t(i, 0, 255))), + (s = 255 & (e[4] ? yt(s) : _t(s, 0, 255))), + (n = 255 & (e[6] ? yt(n) : _t(n, 0, 255))), + { r: i, g: s, b: n, a: o } + ); + } + })(t) + : Vt(t); + } + class Gt { + constructor(t) { + if (t instanceof Gt) return t; + const e = typeof t; + let i; + var s, n, o; + "object" === e + ? (i = qt(t)) + : "string" === e && + ((o = (s = t).length), + "#" === s[0] && + (4 === o || 5 === o + ? (n = { + r: 255 & (17 * kt[s[1]]), + g: 255 & (17 * kt[s[2]]), + b: 255 & (17 * kt[s[3]]), + a: 5 === o ? 17 * kt[s[4]] : 255 + }) + : (7 !== o && 9 !== o) || + (n = { + r: (kt[s[1]] << 4) | kt[s[2]], + g: (kt[s[3]] << 4) | kt[s[4]], + b: (kt[s[5]] << 4) | kt[s[6]], + a: 9 === o ? (kt[s[7]] << 4) | kt[s[8]] : 255 + })), + (i = n || Ht(t) || Kt(t))), + (this._rgb = i), + (this._valid = !!i); + } + get valid() { + return this._valid; + } + get rgb() { + var t = Xt(this._rgb); + return t && (t.a = Mt(t.a)), t; + } + set rgb(t) { + this._rgb = qt(t); + } + rgbString() { + return this._valid + ? (t = this._rgb) && + (t.a < 255 + ? `rgba(${t.r}, ${t.g}, ${t.b}, ${Mt(t.a)})` + : `rgb(${t.r}, ${t.g}, ${t.b})`) + : void 0; + var t; + } + hexString() { + return this._valid ? Ot(this._rgb) : void 0; + } + hslString() { + return this._valid + ? (function(t) { + if (!t) return; + const e = Rt(t), + i = e[0], + s = wt(e[1]), + n = wt(e[2]); + return t.a < 255 + ? `hsla(${i}, ${s}%, ${n}%, ${Mt(t.a)})` + : `hsl(${i}, ${s}%, ${n}%)`; + })(this._rgb) + : void 0; + } + mix(t, e) { + if (t) { + const i = this.rgb, + s = t.rgb; + let n; + const o = e === n ? 0.5 : e, + a = 2 * o - 1, + r = i.a - s.a, + l = ((a * r == -1 ? a : (a + r) / (1 + a * r)) + 1) / 2; + (n = 1 - l), + (i.r = 255 & (l * i.r + n * s.r + 0.5)), + (i.g = 255 & (l * i.g + n * s.g + 0.5)), + (i.b = 255 & (l * i.b + n * s.b + 0.5)), + (i.a = o * i.a + (1 - o) * s.a), + (this.rgb = i); + } + return this; + } + interpolate(t, e) { + return ( + t && + (this._rgb = (function(t, e, i) { + const s = Yt(Mt(t.r)), + n = Yt(Mt(t.g)), + o = Yt(Mt(t.b)); + return { + r: vt($t(s + i * (Yt(Mt(e.r)) - s))), + g: vt($t(n + i * (Yt(Mt(e.g)) - n))), + b: vt($t(o + i * (Yt(Mt(e.b)) - o))), + a: t.a + i * (e.a - t.a) + }; + })(this._rgb, t._rgb, e)), + this + ); + } + clone() { + return new Gt(this.rgb); + } + alpha(t) { + return (this._rgb.a = vt(t)), this; + } + clearer(t) { + return (this._rgb.a *= 1 - t), this; + } + greyscale() { + const t = this._rgb, + e = xt(0.3 * t.r + 0.59 * t.g + 0.11 * t.b); + return (t.r = t.g = t.b = e), this; + } + opaquer(t) { + return (this._rgb.a *= 1 + t), this; + } + negate() { + const t = this._rgb; + return (t.r = 255 - t.r), (t.g = 255 - t.g), (t.b = 255 - t.b), this; + } + lighten(t) { + return Ut(this._rgb, 2, t), this; + } + darken(t) { + return Ut(this._rgb, 2, -t), this; + } + saturate(t) { + return Ut(this._rgb, 1, t), this; + } + desaturate(t) { + return Ut(this._rgb, 1, -t), this; + } + rotate(t) { + return ( + (function(t, e) { + var i = Rt(t); + (i[0] = Ft(i[0] + e)), + (i = zt(i)), + (t.r = i[0]), + (t.g = i[1]), + (t.b = i[2]); + })(this._rgb, t), + this + ); + } + } + function Zt(t) { + return new Gt(t); + } + function Jt(t) { + if (t && "object" == typeof t) { + const e = t.toString(); + return "[object CanvasPattern]" === e || "[object CanvasGradient]" === e; + } + return !1; + } + function Qt(t) { + return Jt(t) ? t : Zt(t); + } + function te(t) { + return Jt(t) + ? t + : Zt(t) + .saturate(0.5) + .darken(0.1) + .hexString(); + } + const ee = ["x", "y", "borderWidth", "radius", "tension"], + ie = ["color", "borderColor", "backgroundColor"]; + const se = new Map(); + function ne(t, e, i) { + return (function(t, e) { + e = e || {}; + const i = t + JSON.stringify(e); + let s = se.get(i); + return s || ((s = new Intl.NumberFormat(t, e)), se.set(i, s)), s; + })(e, i).format(t); + } + const oe = { + values: t => (s(t) ? t : "" + t), + numeric(t, e, i) { + if (0 === t) return "0"; + const s = this.chart.options.locale; + let n, + o = t; + if (i.length > 1) { + const e = Math.max( + Math.abs(i[0].value), + Math.abs(i[i.length - 1].value) + ); + (e < 1e-4 || e > 1e15) && (n = "scientific"), + (o = (function(t, e) { + let i = + e.length > 3 ? e[2].value - e[1].value : e[1].value - e[0].value; + Math.abs(i) >= 1 && t !== Math.floor(t) && (i = t - Math.floor(t)); + return i; + })(t, i)); + } + const a = I(Math.abs(o)), + r = Math.max(Math.min(-1 * Math.floor(a), 20), 0), + l = { notation: n, minimumFractionDigits: r, maximumFractionDigits: r }; + return Object.assign(l, this.options.ticks.format), ne(t, s, l); + }, + logarithmic(t, e, i) { + if (0 === t) return "0"; + const s = i[e].significand || t / Math.pow(10, Math.floor(I(t))); + return [1, 2, 3, 5, 10, 15].includes(s) || e > 0.8 * i.length + ? oe.numeric.call(this, t, e, i) + : ""; + } + }; + var ae = { formatters: oe }; + const re = Object.create(null), + le = Object.create(null); + function he(t, e) { + if (!e) return t; + const i = e.split("."); + for (let e = 0, s = i.length; e < s; ++e) { + const s = i[e]; + t = t[s] || (t[s] = Object.create(null)); + } + return t; + } + function ce(t, e, i) { + return "string" == typeof e ? m(he(t, e), i) : m(he(t, ""), e); + } + class de { + constructor(t, e) { + (this.animation = void 0), + (this.backgroundColor = "rgba(0,0,0,0.1)"), + (this.borderColor = "rgba(0,0,0,0.1)"), + (this.color = "#666"), + (this.datasets = {}), + (this.devicePixelRatio = t => t.chart.platform.getDevicePixelRatio()), + (this.elements = {}), + (this.events = [ + "mousemove", + "mouseout", + "click", + "touchstart", + "touchmove" + ]), + (this.font = { + family: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + size: 12, + style: "normal", + lineHeight: 1.2, + weight: null + }), + (this.hover = {}), + (this.hoverBackgroundColor = (t, e) => te(e.backgroundColor)), + (this.hoverBorderColor = (t, e) => te(e.borderColor)), + (this.hoverColor = (t, e) => te(e.color)), + (this.indexAxis = "x"), + (this.interaction = { + mode: "nearest", + intersect: !0, + includeInvisible: !1 + }), + (this.maintainAspectRatio = !0), + (this.onHover = null), + (this.onClick = null), + (this.parsing = !0), + (this.plugins = {}), + (this.responsive = !0), + (this.scale = void 0), + (this.scales = {}), + (this.showLine = !0), + (this.drawActiveElementsOnTop = !0), + this.describe(t), + this.apply(e); + } + set(t, e) { + return ce(this, t, e); + } + get(t) { + return he(this, t); + } + describe(t, e) { + return ce(le, t, e); + } + override(t, e) { + return ce(re, t, e); + } + route(t, e, i, s) { + const o = he(this, t), + a = he(this, i), + l = "_" + e; + Object.defineProperties(o, { + [l]: { value: o[e], writable: !0 }, + [e]: { + enumerable: !0, + get() { + const t = this[l], + e = a[s]; + return n(t) ? Object.assign({}, e, t) : r(t, e); + }, + set(t) { + this[l] = t; + } + } + }); + } + apply(t) { + t.forEach(t => t(this)); + } + } + var ue = new de( + { + _scriptable: t => !t.startsWith("on"), + _indexable: t => "events" !== t, + hover: { _fallback: "interaction" }, + interaction: { _scriptable: !1, _indexable: !1 } + }, + [ + function(t) { + t.set("animation", { + delay: void 0, + duration: 1e3, + easing: "easeOutQuart", + fn: void 0, + from: void 0, + loop: void 0, + to: void 0, + type: void 0 + }), + t.describe("animation", { + _fallback: !1, + _indexable: !1, + _scriptable: t => + "onProgress" !== t && "onComplete" !== t && "fn" !== t + }), + t.set("animations", { + colors: { type: "color", properties: ie }, + numbers: { type: "number", properties: ee } + }), + t.describe("animations", { _fallback: "animation" }), + t.set("transitions", { + active: { animation: { duration: 400 } }, + resize: { animation: { duration: 0 } }, + show: { + animations: { + colors: { from: "transparent" }, + visible: { type: "boolean", duration: 0 } + } + }, + hide: { + animations: { + colors: { to: "transparent" }, + visible: { type: "boolean", easing: "linear", fn: t => 0 | t } + } + } + }); + }, + function(t) { + t.set("layout", { + autoPadding: !0, + padding: { top: 0, right: 0, bottom: 0, left: 0 } + }); + }, + function(t) { + t.set("scale", { + display: !0, + offset: !1, + reverse: !1, + beginAtZero: !1, + bounds: "ticks", + grace: 0, + grid: { + display: !0, + lineWidth: 1, + drawOnChartArea: !0, + drawTicks: !0, + tickLength: 8, + tickWidth: (t, e) => e.lineWidth, + tickColor: (t, e) => e.color, + offset: !1 + }, + border: { display: !0, dash: [], dashOffset: 0, width: 1 }, + title: { display: !1, text: "", padding: { top: 4, bottom: 4 } }, + ticks: { + minRotation: 0, + maxRotation: 50, + mirror: !1, + textStrokeWidth: 0, + textStrokeColor: "", + padding: 3, + display: !0, + autoSkip: !0, + autoSkipPadding: 3, + labelOffset: 0, + callback: ae.formatters.values, + minor: {}, + major: {}, + align: "center", + crossAlign: "near", + showLabelBackdrop: !1, + backdropColor: "rgba(255, 255, 255, 0.75)", + backdropPadding: 2 + } + }), + t.route("scale.ticks", "color", "", "color"), + t.route("scale.grid", "color", "", "borderColor"), + t.route("scale.border", "color", "", "borderColor"), + t.route("scale.title", "color", "", "color"), + t.describe("scale", { + _fallback: !1, + _scriptable: t => + !t.startsWith("before") && + !t.startsWith("after") && + "callback" !== t && + "parser" !== t, + _indexable: t => + "borderDash" !== t && "tickBorderDash" !== t && "dash" !== t + }), + t.describe("scales", { _fallback: "scale" }), + t.describe("scale.ticks", { + _scriptable: t => "backdropPadding" !== t && "callback" !== t, + _indexable: t => "backdropPadding" !== t + }); + } + ] + ); + function fe() { + return "undefined" != typeof window && "undefined" != typeof document; + } + function ge(t) { + let e = t.parentNode; + return e && "[object ShadowRoot]" === e.toString() && (e = e.host), e; + } + function pe(t, e, i) { + let s; + return ( + "string" == typeof t + ? ((s = parseInt(t, 10)), + -1 !== t.indexOf("%") && (s = (s / 100) * e.parentNode[i])) + : (s = t), + s + ); + } + const me = t => t.ownerDocument.defaultView.getComputedStyle(t, null); + function be(t, e) { + return me(t).getPropertyValue(e); + } + const xe = ["top", "right", "bottom", "left"]; + function _e(t, e, i) { + const s = {}; + i = i ? "-" + i : ""; + for (let n = 0; n < 4; n++) { + const o = xe[n]; + s[o] = parseFloat(t[e + "-" + o + i]) || 0; + } + return (s.width = s.left + s.right), (s.height = s.top + s.bottom), s; + } + function ye(t, e) { + if ("native" in t) return t; + const { canvas: i, currentDevicePixelRatio: s } = e, + n = me(i), + o = "border-box" === n.boxSizing, + a = _e(n, "padding"), + r = _e(n, "border", "width"), + { x: l, y: h, box: c } = (function(t, e) { + const i = t.touches, + s = i && i.length ? i[0] : t, + { offsetX: n, offsetY: o } = s; + let a, + r, + l = !1; + if ( + ((t, e, i) => (t > 0 || e > 0) && (!i || !i.shadowRoot))( + n, + o, + t.target + ) + ) + (a = n), (r = o); + else { + const t = e.getBoundingClientRect(); + (a = s.clientX - t.left), (r = s.clientY - t.top), (l = !0); + } + return { x: a, y: r, box: l }; + })(t, i), + d = a.left + (c && r.left), + u = a.top + (c && r.top); + let { width: f, height: g } = e; + return ( + o && ((f -= a.width + r.width), (g -= a.height + r.height)), + { + x: Math.round((((l - d) / f) * i.width) / s), + y: Math.round((((h - u) / g) * i.height) / s) + } + ); + } + const ve = t => Math.round(10 * t) / 10; + function Me(t, e, i, s) { + const n = me(t), + o = _e(n, "margin"), + a = pe(n.maxWidth, t, "clientWidth") || A, + r = pe(n.maxHeight, t, "clientHeight") || A, + l = (function(t, e, i) { + let s, n; + if (void 0 === e || void 0 === i) { + const o = ge(t); + if (o) { + const t = o.getBoundingClientRect(), + a = me(o), + r = _e(a, "border", "width"), + l = _e(a, "padding"); + (e = t.width - l.width - r.width), + (i = t.height - l.height - r.height), + (s = pe(a.maxWidth, o, "clientWidth")), + (n = pe(a.maxHeight, o, "clientHeight")); + } else (e = t.clientWidth), (i = t.clientHeight); + } + return { width: e, height: i, maxWidth: s || A, maxHeight: n || A }; + })(t, e, i); + let { width: h, height: c } = l; + if ("content-box" === n.boxSizing) { + const t = _e(n, "border", "width"), + e = _e(n, "padding"); + (h -= e.width + t.width), (c -= e.height + t.height); + } + (h = Math.max(0, h - o.width)), + (c = Math.max(0, s ? Math.floor(h / s) : c - o.height)), + (h = ve(Math.min(h, a, l.maxWidth))), + (c = ve(Math.min(c, r, l.maxHeight))), + h && !c && (c = ve(h / 2)); + return ( + (void 0 !== e || void 0 !== i) && + s && + l.height && + c > l.height && + ((c = l.height), (h = ve(Math.floor(c * s)))), + { width: h, height: c } + ); + } + function we(t, e, i) { + const s = e || 1, + n = Math.floor(t.height * s), + o = Math.floor(t.width * s); + (t.height = n / s), (t.width = o / s); + const a = t.canvas; + return ( + a.style && + (i || (!a.style.height && !a.style.width)) && + ((a.style.height = `${t.height}px`), (a.style.width = `${t.width}px`)), + (t.currentDevicePixelRatio !== s || a.height !== n || a.width !== o) && + ((t.currentDevicePixelRatio = s), + (a.height = n), + (a.width = o), + t.ctx.setTransform(s, 0, 0, s, 0, 0), + !0) + ); + } + const ke = (function() { + let t = !1; + try { + const e = { + get passive() { + return (t = !0), !1; + } + }; + window.addEventListener("test", null, e), + window.removeEventListener("test", null, e); + } catch (t) {} + return t; + })(); + function Se(t, e) { + const i = be(t, e), + s = i && i.match(/^(\d+)(\.\d+)?px$/); + return s ? +s[1] : void 0; + } + function Pe(t) { + return !t || i(t.size) || i(t.family) + ? null + : (t.style ? t.style + " " : "") + + (t.weight ? t.weight + " " : "") + + t.size + + "px " + + t.family; + } + function De(t, e, i, s, n) { + let o = e[n]; + return ( + o || ((o = e[n] = t.measureText(n).width), i.push(n)), o > s && (s = o), s + ); + } + function Ce(t, e, i, n) { + let o = ((n = n || {}).data = n.data || {}), + a = (n.garbageCollect = n.garbageCollect || []); + n.font !== e && + ((o = n.data = {}), (a = n.garbageCollect = []), (n.font = e)), + t.save(), + (t.font = e); + let r = 0; + const l = i.length; + let h, c, d, u, f; + for (h = 0; h < l; h++) + if (((u = i[h]), null != u && !0 !== s(u))) r = De(t, o, a, r, u); + else if (s(u)) + for (c = 0, d = u.length; c < d; c++) + (f = u[c]), null == f || s(f) || (r = De(t, o, a, r, f)); + t.restore(); + const g = a.length / 2; + if (g > i.length) { + for (h = 0; h < g; h++) delete o[a[h]]; + a.splice(0, g); + } + return r; + } + function Oe(t, e, i) { + const s = t.currentDevicePixelRatio, + n = 0 !== i ? Math.max(i / 2, 0.5) : 0; + return Math.round((e - n) * s) / s + n; + } + function Ae(t, e) { + (e = e || t.getContext("2d")).save(), + e.resetTransform(), + e.clearRect(0, 0, t.width, t.height), + e.restore(); + } + function Te(t, e, i, s) { + Le(t, e, i, s, null); + } + function Le(t, e, i, s, n) { + let o, a, r, l, h, c, d, u; + const f = e.pointStyle, + g = e.rotation, + p = e.radius; + let m = (g || 0) * T; + if ( + f && + "object" == typeof f && + ((o = f.toString()), + "[object HTMLImageElement]" === o || "[object HTMLCanvasElement]" === o) + ) + return ( + t.save(), + t.translate(i, s), + t.rotate(m), + t.drawImage(f, -f.width / 2, -f.height / 2, f.width, f.height), + void t.restore() + ); + if (!(isNaN(p) || p <= 0)) { + switch ((t.beginPath(), f)) { + default: + n ? t.ellipse(i, s, n / 2, p, 0, 0, C) : t.arc(i, s, p, 0, C), + t.closePath(); + break; + case "triangle": + (c = n ? n / 2 : p), + t.moveTo(i + Math.sin(m) * c, s - Math.cos(m) * p), + (m += R), + t.lineTo(i + Math.sin(m) * c, s - Math.cos(m) * p), + (m += R), + t.lineTo(i + Math.sin(m) * c, s - Math.cos(m) * p), + t.closePath(); + break; + case "rectRounded": + (h = 0.516 * p), + (l = p - h), + (a = Math.cos(m + E) * l), + (d = Math.cos(m + E) * (n ? n / 2 - h : l)), + (r = Math.sin(m + E) * l), + (u = Math.sin(m + E) * (n ? n / 2 - h : l)), + t.arc(i - d, s - r, h, m - D, m - L), + t.arc(i + u, s - a, h, m - L, m), + t.arc(i + d, s + r, h, m, m + L), + t.arc(i - u, s + a, h, m + L, m + D), + t.closePath(); + break; + case "rect": + if (!g) { + (l = Math.SQRT1_2 * p), + (c = n ? n / 2 : l), + t.rect(i - c, s - l, 2 * c, 2 * l); + break; + } + m += E; + case "rectRot": + (d = Math.cos(m) * (n ? n / 2 : p)), + (a = Math.cos(m) * p), + (r = Math.sin(m) * p), + (u = Math.sin(m) * (n ? n / 2 : p)), + t.moveTo(i - d, s - r), + t.lineTo(i + u, s - a), + t.lineTo(i + d, s + r), + t.lineTo(i - u, s + a), + t.closePath(); + break; + case "crossRot": + m += E; + case "cross": + (d = Math.cos(m) * (n ? n / 2 : p)), + (a = Math.cos(m) * p), + (r = Math.sin(m) * p), + (u = Math.sin(m) * (n ? n / 2 : p)), + t.moveTo(i - d, s - r), + t.lineTo(i + d, s + r), + t.moveTo(i + u, s - a), + t.lineTo(i - u, s + a); + break; + case "star": + (d = Math.cos(m) * (n ? n / 2 : p)), + (a = Math.cos(m) * p), + (r = Math.sin(m) * p), + (u = Math.sin(m) * (n ? n / 2 : p)), + t.moveTo(i - d, s - r), + t.lineTo(i + d, s + r), + t.moveTo(i + u, s - a), + t.lineTo(i - u, s + a), + (m += E), + (d = Math.cos(m) * (n ? n / 2 : p)), + (a = Math.cos(m) * p), + (r = Math.sin(m) * p), + (u = Math.sin(m) * (n ? n / 2 : p)), + t.moveTo(i - d, s - r), + t.lineTo(i + d, s + r), + t.moveTo(i + u, s - a), + t.lineTo(i - u, s + a); + break; + case "line": + (a = n ? n / 2 : Math.cos(m) * p), + (r = Math.sin(m) * p), + t.moveTo(i - a, s - r), + t.lineTo(i + a, s + r); + break; + case "dash": + t.moveTo(i, s), + t.lineTo(i + Math.cos(m) * (n ? n / 2 : p), s + Math.sin(m) * p); + } + t.fill(), e.borderWidth > 0 && t.stroke(); + } + } + function Ee(t, e, i) { + return ( + (i = i || 0.5), + !e || + (t && + t.x > e.left - i && + t.x < e.right + i && + t.y > e.top - i && + t.y < e.bottom + i) + ); + } + function Re(t, e) { + t.save(), + t.beginPath(), + t.rect(e.left, e.top, e.right - e.left, e.bottom - e.top), + t.clip(); + } + function Ie(t) { + t.restore(); + } + function ze(t, e, i, s, n) { + if (!e) return t.lineTo(i.x, i.y); + if ("middle" === n) { + const s = (e.x + i.x) / 2; + t.lineTo(s, e.y), t.lineTo(s, i.y); + } else ("after" === n) != !!s ? t.lineTo(e.x, i.y) : t.lineTo(i.x, e.y); + t.lineTo(i.x, i.y); + } + function Fe(t, e, i, s) { + if (!e) return t.lineTo(i.x, i.y); + t.bezierCurveTo( + s ? e.cp1x : e.cp2x, + s ? e.cp1y : e.cp2y, + s ? i.cp2x : i.cp1x, + s ? i.cp2y : i.cp1y, + i.x, + i.y + ); + } + function Ve(t, e, n, o, a, r = {}) { + const l = s(e) ? e : [e], + h = r.strokeWidth > 0 && "" !== r.strokeColor; + let c, d; + for ( + t.save(), + t.font = a.string, + (function(t, e) { + e.translation && t.translate(e.translation[0], e.translation[1]); + i(e.rotation) || t.rotate(e.rotation); + e.color && (t.fillStyle = e.color); + e.textAlign && (t.textAlign = e.textAlign); + e.textBaseline && (t.textBaseline = e.textBaseline); + })(t, r), + c = 0; + c < l.length; + ++c + ) + (d = l[c]), + r.backdrop && Ne(t, r.backdrop), + h && + (r.strokeColor && (t.strokeStyle = r.strokeColor), + i(r.strokeWidth) || (t.lineWidth = r.strokeWidth), + t.strokeText(d, n, o, r.maxWidth)), + t.fillText(d, n, o, r.maxWidth), + Be(t, n, o, d, r), + (o += a.lineHeight); + t.restore(); + } + function Be(t, e, i, s, n) { + if (n.strikethrough || n.underline) { + const o = t.measureText(s), + a = e - o.actualBoundingBoxLeft, + r = e + o.actualBoundingBoxRight, + l = i - o.actualBoundingBoxAscent, + h = i + o.actualBoundingBoxDescent, + c = n.strikethrough ? (l + h) / 2 : h; + (t.strokeStyle = t.fillStyle), + t.beginPath(), + (t.lineWidth = n.decorationWidth || 2), + t.moveTo(a, c), + t.lineTo(r, c), + t.stroke(); + } + } + function Ne(t, e) { + const i = t.fillStyle; + (t.fillStyle = e.color), + t.fillRect(e.left, e.top, e.width, e.height), + (t.fillStyle = i); + } + function We(t, e) { + const { x: i, y: s, w: n, h: o, radius: a } = e; + t.arc(i + a.topLeft, s + a.topLeft, a.topLeft, -L, D, !0), + t.lineTo(i, s + o - a.bottomLeft), + t.arc(i + a.bottomLeft, s + o - a.bottomLeft, a.bottomLeft, D, L, !0), + t.lineTo(i + n - a.bottomRight, s + o), + t.arc( + i + n - a.bottomRight, + s + o - a.bottomRight, + a.bottomRight, + L, + 0, + !0 + ), + t.lineTo(i + n, s + a.topRight), + t.arc(i + n - a.topRight, s + a.topRight, a.topRight, 0, -L, !0), + t.lineTo(i + a.topLeft, s); + } + function He(t, e = [""], i = t, s, n = () => t[0]) { + w(s) || (s = Qe("_fallback", t)); + const o = { + [Symbol.toStringTag]: "Object", + _cacheable: !0, + _scopes: t, + _rootScopes: i, + _fallback: s, + _getTarget: n, + override: n => He([n, ...t], e, i, s) + }; + return new Proxy(o, { + deleteProperty: (e, i) => ( + delete e[i], delete e._keys, delete t[0][i], !0 + ), + get: (i, s) => + Xe(i, s, () => + (function(t, e, i, s) { + let n; + for (const o of e) + if (((n = Qe(Ye(o, t), i)), w(n))) + return Ue(t, n) ? Ze(i, s, t, n) : n; + })(s, e, t, i) + ), + getOwnPropertyDescriptor: (t, e) => + Reflect.getOwnPropertyDescriptor(t._scopes[0], e), + getPrototypeOf: () => Reflect.getPrototypeOf(t[0]), + has: (t, e) => ti(t).includes(e), + ownKeys: t => ti(t), + set(t, e, i) { + const s = t._storage || (t._storage = n()); + return (t[e] = s[e] = i), delete t._keys, !0; + } + }); + } + function je(t, e, i, o) { + const a = { + _cacheable: !1, + _proxy: t, + _context: e, + _subProxy: i, + _stack: new Set(), + _descriptors: $e(t, o), + setContext: e => je(t, e, i, o), + override: s => je(t.override(s), e, i, o) + }; + return new Proxy(a, { + deleteProperty: (e, i) => (delete e[i], delete t[i], !0), + get: (t, e, i) => + Xe(t, e, () => + (function(t, e, i) { + const { _proxy: o, _context: a, _subProxy: r, _descriptors: l } = t; + let h = o[e]; + k(h) && + l.isScriptable(e) && + (h = (function(t, e, i, s) { + const { _proxy: n, _context: o, _subProxy: a, _stack: r } = i; + if (r.has(t)) + throw new Error( + "Recursion detected: " + Array.from(r).join("->") + "->" + t + ); + r.add(t), + (e = e(o, a || s)), + r.delete(t), + Ue(t, e) && (e = Ze(n._scopes, n, t, e)); + return e; + })(e, h, t, i)); + s(h) && + h.length && + (h = (function(t, e, i, s) { + const { + _proxy: o, + _context: a, + _subProxy: r, + _descriptors: l + } = i; + if (w(a.index) && s(t)) e = e[a.index % e.length]; + else if (n(e[0])) { + const i = e, + s = o._scopes.filter(t => t !== i); + e = []; + for (const n of i) { + const i = Ze(s, o, t, n); + e.push(je(i, a, r && r[t], l)); + } + } + return e; + })(e, h, t, l.isIndexable)); + Ue(e, h) && (h = je(h, a, r && r[e], l)); + return h; + })(t, e, i) + ), + getOwnPropertyDescriptor: (e, i) => + e._descriptors.allKeys + ? Reflect.has(t, i) + ? { enumerable: !0, configurable: !0 } + : void 0 + : Reflect.getOwnPropertyDescriptor(t, i), + getPrototypeOf: () => Reflect.getPrototypeOf(t), + has: (e, i) => Reflect.has(t, i), + ownKeys: () => Reflect.ownKeys(t), + set: (e, i, s) => ((t[i] = s), delete e[i], !0) + }); + } + function $e(t, e = { scriptable: !0, indexable: !0 }) { + const { + _scriptable: i = e.scriptable, + _indexable: s = e.indexable, + _allKeys: n = e.allKeys + } = t; + return { + allKeys: n, + scriptable: i, + indexable: s, + isScriptable: k(i) ? i : () => i, + isIndexable: k(s) ? s : () => s + }; + } + const Ye = (t, e) => (t ? t + M(e) : e), + Ue = (t, e) => + n(e) && + "adapters" !== t && + (null === Object.getPrototypeOf(e) || e.constructor === Object); + function Xe(t, e, i) { + if (Object.prototype.hasOwnProperty.call(t, e)) return t[e]; + const s = i(); + return (t[e] = s), s; + } + function qe(t, e, i) { + return k(t) ? t(e, i) : t; + } + const Ke = (t, e) => (!0 === t ? e : "string" == typeof t ? v(e, t) : void 0); + function Ge(t, e, i, s, n) { + for (const o of e) { + const e = Ke(i, o); + if (e) { + t.add(e); + const o = qe(e._fallback, i, n); + if (w(o) && o !== i && o !== s) return o; + } else if (!1 === e && w(s) && i !== s) return null; + } + return !1; + } + function Ze(t, e, i, o) { + const a = e._rootScopes, + r = qe(e._fallback, i, o), + l = [...t, ...a], + h = new Set(); + h.add(o); + let c = Je(h, l, i, r || i, o); + return ( + null !== c && + (!w(r) || r === i || ((c = Je(h, l, r, c, o)), null !== c)) && + He(Array.from(h), [""], a, r, () => + (function(t, e, i) { + const o = t._getTarget(); + e in o || (o[e] = {}); + const a = o[e]; + if (s(a) && n(i)) return i; + return a || {}; + })(e, i, o) + ) + ); + } + function Je(t, e, i, s, n) { + for (; i; ) i = Ge(t, e, i, s, n); + return i; + } + function Qe(t, e) { + for (const i of e) { + if (!i) continue; + const e = i[t]; + if (w(e)) return e; + } + } + function ti(t) { + let e = t._keys; + return ( + e || + (e = t._keys = (function(t) { + const e = new Set(); + for (const i of t) + for (const t of Object.keys(i).filter(t => !t.startsWith("_"))) + e.add(t); + return Array.from(e); + })(t._scopes)), + e + ); + } + function ei(t, e, i, s) { + const { iScale: n } = t, + { key: o = "r" } = this._parsing, + a = new Array(s); + let r, l, h, c; + for (r = 0, l = s; r < l; ++r) + (h = r + i), (c = e[h]), (a[r] = { r: n.parse(v(c, o), h) }); + return a; + } + const ii = Number.EPSILON || 1e-14, + si = (t, e) => e < t.length && !t[e].skip && t[e], + ni = t => ("x" === t ? "y" : "x"); + function oi(t, e, i, s) { + const n = t.skip ? e : t, + o = e, + a = i.skip ? e : i, + r = X(o, n), + l = X(a, o); + let h = r / (r + l), + c = l / (r + l); + (h = isNaN(h) ? 0 : h), (c = isNaN(c) ? 0 : c); + const d = s * h, + u = s * c; + return { + previous: { x: o.x - d * (a.x - n.x), y: o.y - d * (a.y - n.y) }, + next: { x: o.x + u * (a.x - n.x), y: o.y + u * (a.y - n.y) } + }; + } + function ai(t, e = "x") { + const i = ni(e), + s = t.length, + n = Array(s).fill(0), + o = Array(s); + let a, + r, + l, + h = si(t, 0); + for (a = 0; a < s; ++a) + if (((r = l), (l = h), (h = si(t, a + 1)), l)) { + if (h) { + const t = h[e] - l[e]; + n[a] = 0 !== t ? (h[i] - l[i]) / t : 0; + } + o[a] = r + ? h + ? z(n[a - 1]) !== z(n[a]) + ? 0 + : (n[a - 1] + n[a]) / 2 + : n[a - 1] + : n[a]; + } + !(function(t, e, i) { + const s = t.length; + let n, + o, + a, + r, + l, + h = si(t, 0); + for (let c = 0; c < s - 1; ++c) + (l = h), + (h = si(t, c + 1)), + l && + h && + (F(e[c], 0, ii) + ? (i[c] = i[c + 1] = 0) + : ((n = i[c] / e[c]), + (o = i[c + 1] / e[c]), + (r = Math.pow(n, 2) + Math.pow(o, 2)), + r <= 9 || + ((a = 3 / Math.sqrt(r)), + (i[c] = n * a * e[c]), + (i[c + 1] = o * a * e[c])))); + })(t, n, o), + (function(t, e, i = "x") { + const s = ni(i), + n = t.length; + let o, + a, + r, + l = si(t, 0); + for (let h = 0; h < n; ++h) { + if (((a = r), (r = l), (l = si(t, h + 1)), !r)) continue; + const n = r[i], + c = r[s]; + a && + ((o = (n - a[i]) / 3), + (r[`cp1${i}`] = n - o), + (r[`cp1${s}`] = c - o * e[h])), + l && + ((o = (l[i] - n) / 3), + (r[`cp2${i}`] = n + o), + (r[`cp2${s}`] = c + o * e[h])); + } + })(t, o, e); + } + function ri(t, e, i) { + return Math.max(Math.min(t, i), e); + } + function li(t, e, i, s, n) { + let o, a, r, l; + if ( + (e.spanGaps && (t = t.filter(t => !t.skip)), + "monotone" === e.cubicInterpolationMode) + ) + ai(t, n); + else { + let i = s ? t[t.length - 1] : t[0]; + for (o = 0, a = t.length; o < a; ++o) + (r = t[o]), + (l = oi(i, r, t[Math.min(o + 1, a - (s ? 0 : 1)) % a], e.tension)), + (r.cp1x = l.previous.x), + (r.cp1y = l.previous.y), + (r.cp2x = l.next.x), + (r.cp2y = l.next.y), + (i = r); + } + e.capBezierPoints && + (function(t, e) { + let i, + s, + n, + o, + a, + r = Ee(t[0], e); + for (i = 0, s = t.length; i < s; ++i) + (a = o), + (o = r), + (r = i < s - 1 && Ee(t[i + 1], e)), + o && + ((n = t[i]), + a && + ((n.cp1x = ri(n.cp1x, e.left, e.right)), + (n.cp1y = ri(n.cp1y, e.top, e.bottom))), + r && + ((n.cp2x = ri(n.cp2x, e.left, e.right)), + (n.cp2y = ri(n.cp2y, e.top, e.bottom)))); + })(t, i); + } + const hi = t => 0 === t || 1 === t, + ci = (t, e, i) => -Math.pow(2, 10 * (t -= 1)) * Math.sin(((t - e) * C) / i), + di = (t, e, i) => Math.pow(2, -10 * t) * Math.sin(((t - e) * C) / i) + 1, + ui = { + linear: t => t, + easeInQuad: t => t * t, + easeOutQuad: t => -t * (t - 2), + easeInOutQuad: t => + (t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1), + easeInCubic: t => t * t * t, + easeOutCubic: t => (t -= 1) * t * t + 1, + easeInOutCubic: t => + (t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2), + easeInQuart: t => t * t * t * t, + easeOutQuart: t => -((t -= 1) * t * t * t - 1), + easeInOutQuart: t => + (t /= 0.5) < 1 + ? 0.5 * t * t * t * t + : -0.5 * ((t -= 2) * t * t * t - 2), + easeInQuint: t => t * t * t * t * t, + easeOutQuint: t => (t -= 1) * t * t * t * t + 1, + easeInOutQuint: t => + (t /= 0.5) < 1 + ? 0.5 * t * t * t * t * t + : 0.5 * ((t -= 2) * t * t * t * t + 2), + easeInSine: t => 1 - Math.cos(t * L), + easeOutSine: t => Math.sin(t * L), + easeInOutSine: t => -0.5 * (Math.cos(D * t) - 1), + easeInExpo: t => (0 === t ? 0 : Math.pow(2, 10 * (t - 1))), + easeOutExpo: t => (1 === t ? 1 : 1 - Math.pow(2, -10 * t)), + easeInOutExpo: t => + hi(t) + ? t + : t < 0.5 + ? 0.5 * Math.pow(2, 10 * (2 * t - 1)) + : 0.5 * (2 - Math.pow(2, -10 * (2 * t - 1))), + easeInCirc: t => (t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1)), + easeOutCirc: t => Math.sqrt(1 - (t -= 1) * t), + easeInOutCirc: t => + (t /= 0.5) < 1 + ? -0.5 * (Math.sqrt(1 - t * t) - 1) + : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1), + easeInElastic: t => (hi(t) ? t : ci(t, 0.075, 0.3)), + easeOutElastic: t => (hi(t) ? t : di(t, 0.075, 0.3)), + easeInOutElastic(t) { + const e = 0.1125; + return hi(t) + ? t + : t < 0.5 + ? 0.5 * ci(2 * t, e, 0.45) + : 0.5 + 0.5 * di(2 * t - 1, e, 0.45); + }, + easeInBack(t) { + const e = 1.70158; + return t * t * ((e + 1) * t - e); + }, + easeOutBack(t) { + const e = 1.70158; + return (t -= 1) * t * ((e + 1) * t + e) + 1; + }, + easeInOutBack(t) { + let e = 1.70158; + return (t /= 0.5) < 1 + ? t * t * ((1 + (e *= 1.525)) * t - e) * 0.5 + : 0.5 * ((t -= 2) * t * ((1 + (e *= 1.525)) * t + e) + 2); + }, + easeInBounce: t => 1 - ui.easeOutBounce(1 - t), + easeOutBounce(t) { + const e = 7.5625, + i = 2.75; + return t < 1 / i + ? e * t * t + : t < 2 / i + ? e * (t -= 1.5 / i) * t + 0.75 + : t < 2.5 / i + ? e * (t -= 2.25 / i) * t + 0.9375 + : e * (t -= 2.625 / i) * t + 0.984375; + }, + easeInOutBounce: t => + t < 0.5 + ? 0.5 * ui.easeInBounce(2 * t) + : 0.5 * ui.easeOutBounce(2 * t - 1) + 0.5 + }; + var fi = ui; + function gi(t, e, i, s) { + return { x: t.x + i * (e.x - t.x), y: t.y + i * (e.y - t.y) }; + } + function pi(t, e, i, s) { + return { + x: t.x + i * (e.x - t.x), + y: + "middle" === s + ? i < 0.5 + ? t.y + : e.y + : "after" === s + ? i < 1 + ? t.y + : e.y + : i > 0 + ? e.y + : t.y + }; + } + function mi(t, e, i, s) { + const n = { x: t.cp2x, y: t.cp2y }, + o = { x: e.cp1x, y: e.cp1y }, + a = gi(t, n, i), + r = gi(n, o, i), + l = gi(o, e, i), + h = gi(a, r, i), + c = gi(r, l, i); + return gi(h, c, i); + } + const bi = /^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/, + xi = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/; + function _i(t, e) { + const i = ("" + t).match(bi); + if (!i || "normal" === i[1]) return 1.2 * e; + switch (((t = +i[2]), i[3])) { + case "px": + return t; + case "%": + t /= 100; + } + return e * t; + } + function yi(t, e) { + const i = {}, + s = n(e), + o = s ? Object.keys(e) : e, + a = n(t) ? (s ? i => r(t[i], t[e[i]]) : e => t[e]) : () => t; + for (const t of o) i[t] = +a(t) || 0; + return i; + } + function vi(t) { + return yi(t, { top: "y", right: "x", bottom: "y", left: "x" }); + } + function Mi(t) { + return yi(t, ["topLeft", "topRight", "bottomLeft", "bottomRight"]); + } + function wi(t) { + const e = vi(t); + return (e.width = e.left + e.right), (e.height = e.top + e.bottom), e; + } + function ki(t, e) { + (t = t || {}), (e = e || ue.font); + let i = r(t.size, e.size); + "string" == typeof i && (i = parseInt(i, 10)); + let s = r(t.style, e.style); + s && + !("" + s).match(xi) && + (console.warn('Invalid font style specified: "' + s + '"'), (s = void 0)); + const n = { + family: r(t.family, e.family), + lineHeight: _i(r(t.lineHeight, e.lineHeight), i), + size: i, + style: s, + weight: r(t.weight, e.weight), + string: "" + }; + return (n.string = Pe(n)), n; + } + function Si(t, e, i, n) { + let o, + a, + r, + l = !0; + for (o = 0, a = t.length; o < a; ++o) + if ( + ((r = t[o]), + void 0 !== r && + (void 0 !== e && "function" == typeof r && ((r = r(e)), (l = !1)), + void 0 !== i && s(r) && ((r = r[i % r.length]), (l = !1)), + void 0 !== r)) + ) + return n && !l && (n.cacheable = !1), r; + } + function Pi(t, e, i) { + const { min: s, max: n } = t, + o = h(e, (n - s) / 2), + a = (t, e) => (i && 0 === t ? 0 : t + e); + return { min: a(s, -Math.abs(o)), max: a(n, o) }; + } + function Di(t, e) { + return Object.assign(Object.create(t), e); + } + function Ci(t, e, i) { + return t + ? (function(t, e) { + return { + x: i => t + t + e - i, + setWidth(t) { + e = t; + }, + textAlign: t => + "center" === t ? t : "right" === t ? "left" : "right", + xPlus: (t, e) => t - e, + leftForLtr: (t, e) => t - e + }; + })(e, i) + : { + x: t => t, + setWidth(t) {}, + textAlign: t => t, + xPlus: (t, e) => t + e, + leftForLtr: (t, e) => t + }; + } + function Oi(t, e) { + let i, s; + ("ltr" !== e && "rtl" !== e) || + ((i = t.canvas.style), + (s = [ + i.getPropertyValue("direction"), + i.getPropertyPriority("direction") + ]), + i.setProperty("direction", e, "important"), + (t.prevTextDirection = s)); + } + function Ai(t, e) { + void 0 !== e && + (delete t.prevTextDirection, + t.canvas.style.setProperty("direction", e[0], e[1])); + } + function Ti(t) { + return "angle" === t + ? { between: G, compare: q, normalize: K } + : { between: Q, compare: (t, e) => t - e, normalize: t => t }; + } + function Li({ start: t, end: e, count: i, loop: s, style: n }) { + return { + start: t % i, + end: e % i, + loop: s && (e - t + 1) % i == 0, + style: n + }; + } + function Ei(t, e, i) { + if (!i) return [t]; + const { property: s, start: n, end: o } = i, + a = e.length, + { compare: r, between: l, normalize: h } = Ti(s), + { start: c, end: d, loop: u, style: f } = (function(t, e, i) { + const { property: s, start: n, end: o } = i, + { between: a, normalize: r } = Ti(s), + l = e.length; + let h, + c, + { start: d, end: u, loop: f } = t; + if (f) { + for ( + d += l, u += l, h = 0, c = l; + h < c && a(r(e[d % l][s]), n, o); + ++h + ) + d--, u--; + (d %= l), (u %= l); + } + return u < d && (u += l), { start: d, end: u, loop: f, style: t.style }; + })(t, e, i), + g = []; + let p, + m, + b, + x = !1, + _ = null; + const y = () => x || (l(n, b, p) && 0 !== r(n, b)), + v = () => !x || 0 === r(o, p) || l(o, b, p); + for (let t = c, i = c; t <= d; ++t) + (m = e[t % a]), + m.skip || + ((p = h(m[s])), + p !== b && + ((x = l(p, n, o)), + null === _ && y() && (_ = 0 === r(p, n) ? t : i), + null !== _ && + v() && + (g.push(Li({ start: _, end: t, loop: u, count: a, style: f })), + (_ = null)), + (i = t), + (b = p))); + return ( + null !== _ && + g.push(Li({ start: _, end: d, loop: u, count: a, style: f })), + g + ); + } + function Ri(t, e) { + const i = [], + s = t.segments; + for (let n = 0; n < s.length; n++) { + const o = Ei(s[n], t.points, e); + o.length && i.push(...o); + } + return i; + } + function Ii(t, e) { + const i = t.points, + s = t.options.spanGaps, + n = i.length; + if (!n) return []; + const o = !!t._loop, + { start: a, end: r } = (function(t, e, i, s) { + let n = 0, + o = e - 1; + if (i && !s) for (; n < e && !t[n].skip; ) n++; + for (; n < e && t[n].skip; ) n++; + for (n %= e, i && (o += n); o > n && t[o % e].skip; ) o--; + return (o %= e), { start: n, end: o }; + })(i, n, o, s); + if (!0 === s) return zi(t, [{ start: a, end: r, loop: o }], i, e); + return zi( + t, + (function(t, e, i, s) { + const n = t.length, + o = []; + let a, + r = e, + l = t[e]; + for (a = e + 1; a <= i; ++a) { + const i = t[a % n]; + i.skip || i.stop + ? l.skip || + ((s = !1), + o.push({ start: e % n, end: (a - 1) % n, loop: s }), + (e = r = i.stop ? a : null)) + : ((r = a), l.skip && (e = a)), + (l = i); + } + return null !== r && o.push({ start: e % n, end: r % n, loop: s }), o; + })(i, a, r < a ? r + n : r, !!t._fullLoop && 0 === a && r === n - 1), + i, + e + ); + } + function zi(t, e, i, s) { + return s && s.setContext && i + ? (function(t, e, i, s) { + const n = t._chart.getContext(), + o = Fi(t.options), + { + _datasetIndex: a, + options: { spanGaps: r } + } = t, + l = i.length, + h = []; + let c = o, + d = e[0].start, + u = d; + function f(t, e, s, n) { + const o = r ? -1 : 1; + if (t !== e) { + for (t += l; i[t % l].skip; ) t -= o; + for (; i[e % l].skip; ) e += o; + t % l != e % l && + (h.push({ start: t % l, end: e % l, loop: s, style: n }), + (c = n), + (d = e % l)); + } + } + for (const t of e) { + d = r ? d : t.start; + let e, + o = i[d % l]; + for (u = d + 1; u <= t.end; u++) { + const r = i[u % l]; + (e = Fi( + s.setContext( + Di(n, { + type: "segment", + p0: o, + p1: r, + p0DataIndex: (u - 1) % l, + p1DataIndex: u % l, + datasetIndex: a + }) + ) + )), + Vi(e, c) && f(d, u - 1, t.loop, c), + (o = r), + (c = e); + } + d < u - 1 && f(d, u - 1, t.loop, c); + } + return h; + })(t, e, i, s) + : e; + } + function Fi(t) { + return { + backgroundColor: t.backgroundColor, + borderCapStyle: t.borderCapStyle, + borderDash: t.borderDash, + borderDashOffset: t.borderDashOffset, + borderJoinStyle: t.borderJoinStyle, + borderWidth: t.borderWidth, + borderColor: t.borderColor + }; + } + function Vi(t, e) { + return e && JSON.stringify(t) !== JSON.stringify(e); + } + var Bi = Object.freeze({ + __proto__: null, + easingEffects: fi, + isPatternOrGradient: Jt, + color: Qt, + getHoverColor: te, + noop: t, + uid: e, + isNullOrUndef: i, + isArray: s, + isObject: n, + isFinite: o, + finiteOrDefault: a, + valueOrDefault: r, + toPercentage: l, + toDimension: h, + callback: c, + each: d, + _elementsEqual: u, + clone: f, + _merger: p, + merge: m, + mergeIf: b, + _mergerIf: x, + _deprecated: function(t, e, i, s) { + void 0 !== e && + console.warn( + t + ': "' + i + '" is deprecated. Please use "' + s + '" instead' + ); + }, + _splitKey: y, + resolveObjectKey: v, + _capitalize: M, + defined: w, + isFunction: k, + setsEqual: S, + _isClickEvent: P, + toFontString: Pe, + _measureText: De, + _longestText: Ce, + _alignPixel: Oe, + clearCanvas: Ae, + drawPoint: Te, + drawPointLegend: Le, + _isPointInArea: Ee, + clipArea: Re, + unclipArea: Ie, + _steppedLineTo: ze, + _bezierCurveTo: Fe, + renderText: Ve, + addRoundedRectPath: We, + _lookup: tt, + _lookupByKey: et, + _rlookupByKey: it, + _filterBetween: st, + listenArrayEvents: ot, + unlistenArrayEvents: at, + _arrayUnique: rt, + _createResolver: He, + _attachContext: je, + _descriptors: $e, + _parseObjectDataRadialScale: ei, + splineCurve: oi, + splineCurveMonotone: ai, + _updateBezierControlPoints: li, + _isDomSupported: fe, + _getParentNode: ge, + getStyle: be, + getRelativePosition: ye, + getMaximumSize: Me, + retinaScale: we, + supportsEventListenerOptions: ke, + readUsedSize: Se, + fontString: function(t, e, i) { + return e + " " + t + "px " + i; + }, + requestAnimFrame: lt, + throttled: ht, + debounce: ct, + _toLeftRightCenter: dt, + _alignStartEnd: ut, + _textX: ft, + _getStartAndCountOfVisiblePoints: gt, + _scaleRangesChanged: pt, + _pointInLine: gi, + _steppedInterpolation: pi, + _bezierInterpolation: mi, + formatNumber: ne, + toLineHeight: _i, + _readValueToProps: yi, + toTRBL: vi, + toTRBLCorners: Mi, + toPadding: wi, + toFont: ki, + resolve: Si, + _addGrace: Pi, + createContext: Di, + PI: D, + TAU: C, + PITAU: O, + INFINITY: A, + RAD_PER_DEG: T, + HALF_PI: L, + QUARTER_PI: E, + TWO_THIRDS_PI: R, + log10: I, + sign: z, + almostEquals: F, + niceNum: V, + _factorize: B, + isNumber: N, + almostWhole: W, + _setMinAndMaxByKey: H, + toRadians: j, + toDegrees: $, + _decimalPlaces: Y, + getAngleFromPoint: U, + distanceBetweenPoints: X, + _angleDiff: q, + _normalizeAngle: K, + _angleBetween: G, + _limitValue: Z, + _int16Range: J, + _isBetween: Q, + getRtlAdapter: Ci, + overrideTextDirection: Oi, + restoreTextDirection: Ai, + _boundSegment: Ei, + _boundSegments: Ri, + _computeSegments: Ii + }); + function Ni(t, e, i, s) { + const { controller: n, data: o, _sorted: a } = t, + r = n._cachedMeta.iScale; + if (r && e === r.axis && "r" !== e && a && o.length) { + const t = r._reversePixels ? it : et; + if (!s) return t(o, e, i); + if (n._sharedOptions) { + const s = o[0], + n = "function" == typeof s.getRange && s.getRange(e); + if (n) { + const s = t(o, e, i - n), + a = t(o, e, i + n); + return { lo: s.lo, hi: a.hi }; + } + } + } + return { lo: 0, hi: o.length - 1 }; + } + function Wi(t, e, i, s, n) { + const o = t.getSortedVisibleDatasetMetas(), + a = i[e]; + for (let t = 0, i = o.length; t < i; ++t) { + const { index: i, data: r } = o[t], + { lo: l, hi: h } = Ni(o[t], e, a, n); + for (let t = l; t <= h; ++t) { + const e = r[t]; + e.skip || s(e, i, t); + } + } + } + function Hi(t, e, i, s, n) { + const o = []; + if (!n && !t.isPointInArea(e)) return o; + return ( + Wi( + t, + i, + e, + function(i, a, r) { + (n || Ee(i, t.chartArea, 0)) && + i.inRange(e.x, e.y, s) && + o.push({ element: i, datasetIndex: a, index: r }); + }, + !0 + ), + o + ); + } + function ji(t, e, i, s, n, o) { + let a = []; + const r = (function(t) { + const e = -1 !== t.indexOf("x"), + i = -1 !== t.indexOf("y"); + return function(t, s) { + const n = e ? Math.abs(t.x - s.x) : 0, + o = i ? Math.abs(t.y - s.y) : 0; + return Math.sqrt(Math.pow(n, 2) + Math.pow(o, 2)); + }; + })(i); + let l = Number.POSITIVE_INFINITY; + return ( + Wi(t, i, e, function(i, h, c) { + const d = i.inRange(e.x, e.y, n); + if (s && !d) return; + const u = i.getCenterPoint(n); + if (!(!!o || t.isPointInArea(u)) && !d) return; + const f = r(e, u); + f < l + ? ((a = [{ element: i, datasetIndex: h, index: c }]), (l = f)) + : f === l && a.push({ element: i, datasetIndex: h, index: c }); + }), + a + ); + } + function $i(t, e, i, s, n, o) { + return o || t.isPointInArea(e) + ? "r" !== i || s + ? ji(t, e, i, s, n, o) + : (function(t, e, i, s) { + let n = []; + return ( + Wi(t, i, e, function(t, i, o) { + const { startAngle: a, endAngle: r } = t.getProps( + ["startAngle", "endAngle"], + s + ), + { angle: l } = U(t, { x: e.x, y: e.y }); + G(l, a, r) && n.push({ element: t, datasetIndex: i, index: o }); + }), + n + ); + })(t, e, i, n) + : []; + } + function Yi(t, e, i, s, n) { + const o = [], + a = "x" === i ? "inXRange" : "inYRange"; + let r = !1; + return ( + Wi(t, i, e, (t, s, l) => { + t[a](e[i], n) && + (o.push({ element: t, datasetIndex: s, index: l }), + (r = r || t.inRange(e.x, e.y, n))); + }), + s && !r ? [] : o + ); + } + var Ui = { + evaluateInteractionItems: Wi, + modes: { + index(t, e, i, s) { + const n = ye(e, t), + o = i.axis || "x", + a = i.includeInvisible || !1, + r = i.intersect ? Hi(t, n, o, s, a) : $i(t, n, o, !1, s, a), + l = []; + return r.length + ? (t.getSortedVisibleDatasetMetas().forEach(t => { + const e = r[0].index, + i = t.data[e]; + i && + !i.skip && + l.push({ element: i, datasetIndex: t.index, index: e }); + }), + l) + : []; + }, + dataset(t, e, i, s) { + const n = ye(e, t), + o = i.axis || "xy", + a = i.includeInvisible || !1; + let r = i.intersect ? Hi(t, n, o, s, a) : $i(t, n, o, !1, s, a); + if (r.length > 0) { + const e = r[0].datasetIndex, + i = t.getDatasetMeta(e).data; + r = []; + for (let t = 0; t < i.length; ++t) + r.push({ element: i[t], datasetIndex: e, index: t }); + } + return r; + }, + point: (t, e, i, s) => + Hi(t, ye(e, t), i.axis || "xy", s, i.includeInvisible || !1), + nearest(t, e, i, s) { + const n = ye(e, t), + o = i.axis || "xy", + a = i.includeInvisible || !1; + return $i(t, n, o, i.intersect, s, a); + }, + x: (t, e, i, s) => Yi(t, ye(e, t), "x", i.intersect, s), + y: (t, e, i, s) => Yi(t, ye(e, t), "y", i.intersect, s) + } + }; + const Xi = ["left", "top", "right", "bottom"]; + function qi(t, e) { + return t.filter(t => t.pos === e); + } + function Ki(t, e) { + return t.filter(t => -1 === Xi.indexOf(t.pos) && t.box.axis === e); + } + function Gi(t, e) { + return t.sort((t, i) => { + const s = e ? i : t, + n = e ? t : i; + return s.weight === n.weight ? s.index - n.index : s.weight - n.weight; + }); + } + function Zi(t, e) { + const i = (function(t) { + const e = {}; + for (const i of t) { + const { stack: t, pos: s, stackWeight: n } = i; + if (!t || !Xi.includes(s)) continue; + const o = + e[t] || (e[t] = { count: 0, placed: 0, weight: 0, size: 0 }); + o.count++, (o.weight += n); + } + return e; + })(t), + { vBoxMaxWidth: s, hBoxMaxHeight: n } = e; + let o, a, r; + for (o = 0, a = t.length; o < a; ++o) { + r = t[o]; + const { fullSize: a } = r.box, + l = i[r.stack], + h = l && r.stackWeight / l.weight; + r.horizontal + ? ((r.width = h ? h * s : a && e.availableWidth), (r.height = n)) + : ((r.width = s), (r.height = h ? h * n : a && e.availableHeight)); + } + return i; + } + function Ji(t, e, i, s) { + return Math.max(t[i], e[i]) + Math.max(t[s], e[s]); + } + function Qi(t, e) { + (t.top = Math.max(t.top, e.top)), + (t.left = Math.max(t.left, e.left)), + (t.bottom = Math.max(t.bottom, e.bottom)), + (t.right = Math.max(t.right, e.right)); + } + function ts(t, e, i, s) { + const { pos: o, box: a } = i, + r = t.maxPadding; + if (!n(o)) { + i.size && (t[o] -= i.size); + const e = s[i.stack] || { size: 0, count: 1 }; + (e.size = Math.max(e.size, i.horizontal ? a.height : a.width)), + (i.size = e.size / e.count), + (t[o] += i.size); + } + a.getPadding && Qi(r, a.getPadding()); + const l = Math.max(0, e.outerWidth - Ji(r, t, "left", "right")), + h = Math.max(0, e.outerHeight - Ji(r, t, "top", "bottom")), + c = l !== t.w, + d = h !== t.h; + return ( + (t.w = l), + (t.h = h), + i.horizontal ? { same: c, other: d } : { same: d, other: c } + ); + } + function es(t, e) { + const i = e.maxPadding; + function s(t) { + const s = { left: 0, top: 0, right: 0, bottom: 0 }; + return ( + t.forEach(t => { + s[t] = Math.max(e[t], i[t]); + }), + s + ); + } + return s(t ? ["left", "right"] : ["top", "bottom"]); + } + function is(t, e, i, s) { + const n = []; + let o, a, r, l, h, c; + for (o = 0, a = t.length, h = 0; o < a; ++o) { + (r = t[o]), + (l = r.box), + l.update(r.width || e.w, r.height || e.h, es(r.horizontal, e)); + const { same: a, other: d } = ts(e, i, r, s); + (h |= a && n.length), (c = c || d), l.fullSize || n.push(r); + } + return (h && is(n, e, i, s)) || c; + } + function ss(t, e, i, s, n) { + (t.top = i), + (t.left = e), + (t.right = e + s), + (t.bottom = i + n), + (t.width = s), + (t.height = n); + } + function ns(t, e, i, s) { + const n = i.padding; + let { x: o, y: a } = e; + for (const r of t) { + const t = r.box, + l = s[r.stack] || { count: 1, placed: 0, weight: 1 }, + h = r.stackWeight / l.weight || 1; + if (r.horizontal) { + const s = e.w * h, + o = l.size || t.height; + w(l.start) && (a = l.start), + t.fullSize + ? ss(t, n.left, a, i.outerWidth - n.right - n.left, o) + : ss(t, e.left + l.placed, a, s, o), + (l.start = a), + (l.placed += s), + (a = t.bottom); + } else { + const s = e.h * h, + a = l.size || t.width; + w(l.start) && (o = l.start), + t.fullSize + ? ss(t, o, n.top, a, i.outerHeight - n.bottom - n.top) + : ss(t, o, e.top + l.placed, a, s), + (l.start = o), + (l.placed += s), + (o = t.right); + } + } + (e.x = o), (e.y = a); + } + var os = { + addBox(t, e) { + t.boxes || (t.boxes = []), + (e.fullSize = e.fullSize || !1), + (e.position = e.position || "top"), + (e.weight = e.weight || 0), + (e._layers = + e._layers || + function() { + return [ + { + z: 0, + draw(t) { + e.draw(t); + } + } + ]; + }), + t.boxes.push(e); + }, + removeBox(t, e) { + const i = t.boxes ? t.boxes.indexOf(e) : -1; + -1 !== i && t.boxes.splice(i, 1); + }, + configure(t, e, i) { + (e.fullSize = i.fullSize), + (e.position = i.position), + (e.weight = i.weight); + }, + update(t, e, i, s) { + if (!t) return; + const n = wi(t.options.layout.padding), + o = Math.max(e - n.width, 0), + a = Math.max(i - n.height, 0), + r = (function(t) { + const e = (function(t) { + const e = []; + let i, s, n, o, a, r; + for (i = 0, s = (t || []).length; i < s; ++i) + (n = t[i]), + ({ + position: o, + options: { stack: a, stackWeight: r = 1 } + } = n), + e.push({ + index: i, + box: n, + pos: o, + horizontal: n.isHorizontal(), + weight: n.weight, + stack: a && o + a, + stackWeight: r + }); + return e; + })(t), + i = Gi( + e.filter(t => t.box.fullSize), + !0 + ), + s = Gi(qi(e, "left"), !0), + n = Gi(qi(e, "right")), + o = Gi(qi(e, "top"), !0), + a = Gi(qi(e, "bottom")), + r = Ki(e, "x"), + l = Ki(e, "y"); + return { + fullSize: i, + leftAndTop: s.concat(o), + rightAndBottom: n + .concat(l) + .concat(a) + .concat(r), + chartArea: qi(e, "chartArea"), + vertical: s.concat(n).concat(l), + horizontal: o.concat(a).concat(r) + }; + })(t.boxes), + l = r.vertical, + h = r.horizontal; + d(t.boxes, t => { + "function" == typeof t.beforeLayout && t.beforeLayout(); + }); + const c = + l.reduce( + (t, e) => + e.box.options && !1 === e.box.options.display ? t : t + 1, + 0 + ) || 1, + u = Object.freeze({ + outerWidth: e, + outerHeight: i, + padding: n, + availableWidth: o, + availableHeight: a, + vBoxMaxWidth: o / 2 / c, + hBoxMaxHeight: a / 2 + }), + f = Object.assign({}, n); + Qi(f, wi(s)); + const g = Object.assign( + { maxPadding: f, w: o, h: a, x: n.left, y: n.top }, + n + ), + p = Zi(l.concat(h), u); + is(r.fullSize, g, u, p), + is(l, g, u, p), + is(h, g, u, p) && is(l, g, u, p), + (function(t) { + const e = t.maxPadding; + function i(i) { + const s = Math.max(e[i] - t[i], 0); + return (t[i] += s), s; + } + (t.y += i("top")), (t.x += i("left")), i("right"), i("bottom"); + })(g), + ns(r.leftAndTop, g, u, p), + (g.x += g.w), + (g.y += g.h), + ns(r.rightAndBottom, g, u, p), + (t.chartArea = { + left: g.left, + top: g.top, + right: g.left + g.w, + bottom: g.top + g.h, + height: g.h, + width: g.w + }), + d(r.chartArea, e => { + const i = e.box; + Object.assign(i, t.chartArea), + i.update(g.w, g.h, { left: 0, top: 0, right: 0, bottom: 0 }); + }); + } + }; + class as { + acquireContext(t, e) {} + releaseContext(t) { + return !1; + } + addEventListener(t, e, i) {} + removeEventListener(t, e, i) {} + getDevicePixelRatio() { + return 1; + } + getMaximumSize(t, e, i, s) { + return ( + (e = Math.max(0, e || t.width)), + (i = i || t.height), + { width: e, height: Math.max(0, s ? Math.floor(e / s) : i) } + ); + } + isAttached(t) { + return !0; + } + updateConfig(t) {} + } + class rs extends as { + acquireContext(t) { + return (t && t.getContext && t.getContext("2d")) || null; + } + updateConfig(t) { + t.options.animation = !1; + } + } + const ls = { + touchstart: "mousedown", + touchmove: "mousemove", + touchend: "mouseup", + pointerenter: "mouseenter", + pointerdown: "mousedown", + pointermove: "mousemove", + pointerup: "mouseup", + pointerleave: "mouseout", + pointerout: "mouseout" + }, + hs = t => null === t || "" === t; + const cs = !!ke && { passive: !0 }; + function ds(t, e, i) { + t.canvas.removeEventListener(e, i, cs); + } + function us(t, e) { + for (const i of t) if (i === e || i.contains(e)) return !0; + } + function fs(t, e, i) { + const s = t.canvas, + n = new MutationObserver(t => { + let e = !1; + for (const i of t) + (e = e || us(i.addedNodes, s)), (e = e && !us(i.removedNodes, s)); + e && i(); + }); + return n.observe(document, { childList: !0, subtree: !0 }), n; + } + function gs(t, e, i) { + const s = t.canvas, + n = new MutationObserver(t => { + let e = !1; + for (const i of t) + (e = e || us(i.removedNodes, s)), (e = e && !us(i.addedNodes, s)); + e && i(); + }); + return n.observe(document, { childList: !0, subtree: !0 }), n; + } + const ps = new Map(); + let ms = 0; + function bs() { + const t = window.devicePixelRatio; + t !== ms && + ((ms = t), + ps.forEach((e, i) => { + i.currentDevicePixelRatio !== t && e(); + })); + } + function xs(t, e, i) { + const s = t.canvas, + n = s && ge(s); + if (!n) return; + const o = ht((t, e) => { + const s = n.clientWidth; + i(t, e), s < n.clientWidth && i(); + }, window), + a = new ResizeObserver(t => { + const e = t[0], + i = e.contentRect.width, + s = e.contentRect.height; + (0 === i && 0 === s) || o(i, s); + }); + return ( + a.observe(n), + (function(t, e) { + ps.size || window.addEventListener("resize", bs), ps.set(t, e); + })(t, o), + a + ); + } + function _s(t, e, i) { + i && i.disconnect(), + "resize" === e && + (function(t) { + ps.delete(t), ps.size || window.removeEventListener("resize", bs); + })(t); + } + function ys(t, e, i) { + const s = t.canvas, + n = ht(e => { + null !== t.ctx && + i( + (function(t, e) { + const i = ls[t.type] || t.type, + { x: s, y: n } = ye(t, e); + return { + type: i, + chart: e, + native: t, + x: void 0 !== s ? s : null, + y: void 0 !== n ? n : null + }; + })(e, t) + ); + }, t); + return ( + (function(t, e, i) { + t.addEventListener(e, i, cs); + })(s, e, n), + n + ); + } + class vs extends as { + acquireContext(t, e) { + const i = t && t.getContext && t.getContext("2d"); + return i && i.canvas === t + ? ((function(t, e) { + const i = t.style, + s = t.getAttribute("height"), + n = t.getAttribute("width"); + if ( + ((t.$chartjs = { + initial: { + height: s, + width: n, + style: { + display: i.display, + height: i.height, + width: i.width + } + } + }), + (i.display = i.display || "block"), + (i.boxSizing = i.boxSizing || "border-box"), + hs(n)) + ) { + const e = Se(t, "width"); + void 0 !== e && (t.width = e); + } + if (hs(s)) + if ("" === t.style.height) t.height = t.width / (e || 2); + else { + const e = Se(t, "height"); + void 0 !== e && (t.height = e); + } + })(t, e), + i) + : null; + } + releaseContext(t) { + const e = t.canvas; + if (!e.$chartjs) return !1; + const s = e.$chartjs.initial; + ["height", "width"].forEach(t => { + const n = s[t]; + i(n) ? e.removeAttribute(t) : e.setAttribute(t, n); + }); + const n = s.style || {}; + return ( + Object.keys(n).forEach(t => { + e.style[t] = n[t]; + }), + (e.width = e.width), + delete e.$chartjs, + !0 + ); + } + addEventListener(t, e, i) { + this.removeEventListener(t, e); + const s = t.$proxies || (t.$proxies = {}), + n = { attach: fs, detach: gs, resize: xs }[e] || ys; + s[e] = n(t, e, i); + } + removeEventListener(t, e) { + const i = t.$proxies || (t.$proxies = {}), + s = i[e]; + if (!s) return; + (({ attach: _s, detach: _s, resize: _s }[e] || ds)(t, e, s), + (i[e] = void 0)); + } + getDevicePixelRatio() { + return window.devicePixelRatio; + } + getMaximumSize(t, e, i, s) { + return Me(t, e, i, s); + } + isAttached(t) { + const e = ge(t); + return !(!e || !e.isConnected); + } + } + function Ms(t) { + return !fe() || + ("undefined" != typeof OffscreenCanvas && t instanceof OffscreenCanvas) + ? rs + : vs; + } + var ws = Object.freeze({ + __proto__: null, + _detectPlatform: Ms, + BasePlatform: as, + BasicPlatform: rs, + DomPlatform: vs + }); + const ks = "transparent", + Ss = { + boolean: (t, e, i) => (i > 0.5 ? e : t), + color(t, e, i) { + const s = Qt(t || ks), + n = s.valid && Qt(e || ks); + return n && n.valid ? n.mix(s, i).hexString() : e; + }, + number: (t, e, i) => t + (e - t) * i + }; + class Ps { + constructor(t, e, i, s) { + const n = e[i]; + s = Si([t.to, s, n, t.from]); + const o = Si([t.from, n, s]); + (this._active = !0), + (this._fn = t.fn || Ss[t.type || typeof o]), + (this._easing = fi[t.easing] || fi.linear), + (this._start = Math.floor(Date.now() + (t.delay || 0))), + (this._duration = this._total = Math.floor(t.duration)), + (this._loop = !!t.loop), + (this._target = e), + (this._prop = i), + (this._from = o), + (this._to = s), + (this._promises = void 0); + } + active() { + return this._active; + } + update(t, e, i) { + if (this._active) { + this._notify(!1); + const s = this._target[this._prop], + n = i - this._start, + o = this._duration - n; + (this._start = i), + (this._duration = Math.floor(Math.max(o, t.duration))), + (this._total += n), + (this._loop = !!t.loop), + (this._to = Si([t.to, e, s, t.from])), + (this._from = Si([t.from, s, e])); + } + } + cancel() { + this._active && + (this.tick(Date.now()), (this._active = !1), this._notify(!1)); + } + tick(t) { + const e = t - this._start, + i = this._duration, + s = this._prop, + n = this._from, + o = this._loop, + a = this._to; + let r; + if (((this._active = n !== a && (o || e < i)), !this._active)) + return (this._target[s] = a), void this._notify(!0); + e < 0 + ? (this._target[s] = n) + : ((r = (e / i) % 2), + (r = o && r > 1 ? 2 - r : r), + (r = this._easing(Math.min(1, Math.max(0, r)))), + (this._target[s] = this._fn(n, a, r))); + } + wait() { + const t = this._promises || (this._promises = []); + return new Promise((e, i) => { + t.push({ res: e, rej: i }); + }); + } + _notify(t) { + const e = t ? "res" : "rej", + i = this._promises || []; + for (let t = 0; t < i.length; t++) i[t][e](); + } + } + class Ds { + constructor(t, e) { + (this._chart = t), (this._properties = new Map()), this.configure(e); + } + configure(t) { + if (!n(t)) return; + const e = Object.keys(ue.animation), + i = this._properties; + Object.getOwnPropertyNames(t).forEach(o => { + const a = t[o]; + if (!n(a)) return; + const r = {}; + for (const t of e) r[t] = a[t]; + ((s(a.properties) && a.properties) || [o]).forEach(t => { + (t !== o && i.has(t)) || i.set(t, r); + }); + }); + } + _animateOptions(t, e) { + const i = e.options, + s = (function(t, e) { + if (!e) return; + let i = t.options; + if (!i) return void (t.options = e); + i.$shared && + (t.options = i = Object.assign({}, i, { + $shared: !1, + $animations: {} + })); + return i; + })(t, i); + if (!s) return []; + const n = this._createAnimations(s, i); + return ( + i.$shared && + (function(t, e) { + const i = [], + s = Object.keys(e); + for (let e = 0; e < s.length; e++) { + const n = t[s[e]]; + n && n.active() && i.push(n.wait()); + } + return Promise.all(i); + })(t.options.$animations, i).then( + () => { + t.options = i; + }, + () => {} + ), + n + ); + } + _createAnimations(t, e) { + const i = this._properties, + s = [], + n = t.$animations || (t.$animations = {}), + o = Object.keys(e), + a = Date.now(); + let r; + for (r = o.length - 1; r >= 0; --r) { + const l = o[r]; + if ("$" === l.charAt(0)) continue; + if ("options" === l) { + s.push(...this._animateOptions(t, e)); + continue; + } + const h = e[l]; + let c = n[l]; + const d = i.get(l); + if (c) { + if (d && c.active()) { + c.update(d, h, a); + continue; + } + c.cancel(); + } + d && d.duration + ? ((n[l] = c = new Ps(d, t, l, h)), s.push(c)) + : (t[l] = h); + } + return s; + } + update(t, e) { + if (0 === this._properties.size) return void Object.assign(t, e); + const i = this._createAnimations(t, e); + return i.length ? (bt.add(this._chart, i), !0) : void 0; + } + } + function Cs(t, e) { + const i = (t && t.options) || {}, + s = i.reverse, + n = void 0 === i.min ? e : 0, + o = void 0 === i.max ? e : 0; + return { start: s ? o : n, end: s ? n : o }; + } + function Os(t, e) { + const i = [], + s = t._getSortedDatasetMetas(e); + let n, o; + for (n = 0, o = s.length; n < o; ++n) i.push(s[n].index); + return i; + } + function As(t, e, i, s = {}) { + const n = t.keys, + a = "single" === s.mode; + let r, l, h, c; + if (null !== e) { + for (r = 0, l = n.length; r < l; ++r) { + if (((h = +n[r]), h === i)) { + if (s.all) continue; + break; + } + (c = t.values[h]), o(c) && (a || 0 === e || z(e) === z(c)) && (e += c); + } + return e; + } + } + function Ts(t, e) { + const i = t && t.options.stacked; + return i || (void 0 === i && void 0 !== e.stack); + } + function Ls(t, e, i) { + const s = t[e] || (t[e] = {}); + return s[i] || (s[i] = {}); + } + function Es(t, e, i, s) { + for (const n of e.getMatchingVisibleMetas(s).reverse()) { + const e = t[n.index]; + if ((i && e > 0) || (!i && e < 0)) return n.index; + } + return null; + } + function Rs(t, e) { + const { chart: i, _cachedMeta: s } = t, + n = i._stacks || (i._stacks = {}), + { iScale: o, vScale: a, index: r } = s, + l = o.axis, + h = a.axis, + c = (function(t, e, i) { + return `${t.id}.${e.id}.${i.stack || i.type}`; + })(o, a, s), + d = e.length; + let u; + for (let t = 0; t < d; ++t) { + const i = e[t], + { [l]: o, [h]: d } = i; + (u = (i._stacks || (i._stacks = {}))[h] = Ls(n, c, o)), + (u[r] = d), + (u._top = Es(u, a, !0, s.type)), + (u._bottom = Es(u, a, !1, s.type)); + } + } + function Is(t, e) { + const i = t.scales; + return Object.keys(i) + .filter(t => i[t].axis === e) + .shift(); + } + function zs(t, e) { + const i = t.controller.index, + s = t.vScale && t.vScale.axis; + if (s) { + e = e || t._parsed; + for (const t of e) { + const e = t._stacks; + if (!e || void 0 === e[s] || void 0 === e[s][i]) return; + delete e[s][i]; + } + } + } + const Fs = t => "reset" === t || "none" === t, + Vs = (t, e) => (e ? t : Object.assign({}, t)); + class Bs { + static defaults = {}; + static datasetElementType = null; + static dataElementType = null; + constructor(t, e) { + (this.chart = t), + (this._ctx = t.ctx), + (this.index = e), + (this._cachedDataOpts = {}), + (this._cachedMeta = this.getMeta()), + (this._type = this._cachedMeta.type), + (this.options = void 0), + (this._parsing = !1), + (this._data = void 0), + (this._objectData = void 0), + (this._sharedOptions = void 0), + (this._drawStart = void 0), + (this._drawCount = void 0), + (this.enableOptionSharing = !1), + (this.supportsDecimation = !1), + (this.$context = void 0), + (this._syncList = []), + (this.datasetElementType = new.target.datasetElementType), + (this.dataElementType = new.target.dataElementType), + this.initialize(); + } + initialize() { + const t = this._cachedMeta; + this.configure(), + this.linkScales(), + (t._stacked = Ts(t.vScale, t)), + this.addElements(), + this.options.fill && + !this.chart.isPluginEnabled("filler") && + console.warn( + "Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options" + ); + } + updateIndex(t) { + this.index !== t && zs(this._cachedMeta), (this.index = t); + } + linkScales() { + const t = this.chart, + e = this._cachedMeta, + i = this.getDataset(), + s = (t, e, i, s) => ("x" === t ? e : "r" === t ? s : i), + n = (e.xAxisID = r(i.xAxisID, Is(t, "x"))), + o = (e.yAxisID = r(i.yAxisID, Is(t, "y"))), + a = (e.rAxisID = r(i.rAxisID, Is(t, "r"))), + l = e.indexAxis, + h = (e.iAxisID = s(l, n, o, a)), + c = (e.vAxisID = s(l, o, n, a)); + (e.xScale = this.getScaleForId(n)), + (e.yScale = this.getScaleForId(o)), + (e.rScale = this.getScaleForId(a)), + (e.iScale = this.getScaleForId(h)), + (e.vScale = this.getScaleForId(c)); + } + getDataset() { + return this.chart.data.datasets[this.index]; + } + getMeta() { + return this.chart.getDatasetMeta(this.index); + } + getScaleForId(t) { + return this.chart.scales[t]; + } + _getOtherScale(t) { + const e = this._cachedMeta; + return t === e.iScale ? e.vScale : e.iScale; + } + reset() { + this._update("reset"); + } + _destroy() { + const t = this._cachedMeta; + this._data && at(this._data, this), t._stacked && zs(t); + } + _dataCheck() { + const t = this.getDataset(), + e = t.data || (t.data = []), + i = this._data; + if (n(e)) + this._data = (function(t) { + const e = Object.keys(t), + i = new Array(e.length); + let s, n, o; + for (s = 0, n = e.length; s < n; ++s) + (o = e[s]), (i[s] = { x: o, y: t[o] }); + return i; + })(e); + else if (i !== e) { + if (i) { + at(i, this); + const t = this._cachedMeta; + zs(t), (t._parsed = []); + } + e && Object.isExtensible(e) && ot(e, this), + (this._syncList = []), + (this._data = e); + } + } + addElements() { + const t = this._cachedMeta; + this._dataCheck(), + this.datasetElementType && (t.dataset = new this.datasetElementType()); + } + buildOrUpdateElements(t) { + const e = this._cachedMeta, + i = this.getDataset(); + let s = !1; + this._dataCheck(); + const n = e._stacked; + (e._stacked = Ts(e.vScale, e)), + e.stack !== i.stack && ((s = !0), zs(e), (e.stack = i.stack)), + this._resyncElements(t), + (s || n !== e._stacked) && Rs(this, e._parsed); + } + configure() { + const t = this.chart.config, + e = t.datasetScopeKeys(this._type), + i = t.getOptionScopes(this.getDataset(), e, !0); + (this.options = t.createResolver(i, this.getContext())), + (this._parsing = this.options.parsing), + (this._cachedDataOpts = {}); + } + parse(t, e) { + const { _cachedMeta: i, _data: o } = this, + { iScale: a, _stacked: r } = i, + l = a.axis; + let h, + c, + d, + u = (0 === t && e === o.length) || i._sorted, + f = t > 0 && i._parsed[t - 1]; + if (!1 === this._parsing) (i._parsed = o), (i._sorted = !0), (d = o); + else { + d = s(o[t]) + ? this.parseArrayData(i, o, t, e) + : n(o[t]) + ? this.parseObjectData(i, o, t, e) + : this.parsePrimitiveData(i, o, t, e); + const a = () => null === c[l] || (f && c[l] < f[l]); + for (h = 0; h < e; ++h) + (i._parsed[h + t] = c = d[h]), u && (a() && (u = !1), (f = c)); + i._sorted = u; + } + r && Rs(this, d); + } + parsePrimitiveData(t, e, i, s) { + const { iScale: n, vScale: o } = t, + a = n.axis, + r = o.axis, + l = n.getLabels(), + h = n === o, + c = new Array(s); + let d, u, f; + for (d = 0, u = s; d < u; ++d) + (f = d + i), + (c[d] = { [a]: h || n.parse(l[f], f), [r]: o.parse(e[f], f) }); + return c; + } + parseArrayData(t, e, i, s) { + const { xScale: n, yScale: o } = t, + a = new Array(s); + let r, l, h, c; + for (r = 0, l = s; r < l; ++r) + (h = r + i), + (c = e[h]), + (a[r] = { x: n.parse(c[0], h), y: o.parse(c[1], h) }); + return a; + } + parseObjectData(t, e, i, s) { + const { xScale: n, yScale: o } = t, + { xAxisKey: a = "x", yAxisKey: r = "y" } = this._parsing, + l = new Array(s); + let h, c, d, u; + for (h = 0, c = s; h < c; ++h) + (d = h + i), + (u = e[d]), + (l[h] = { x: n.parse(v(u, a), d), y: o.parse(v(u, r), d) }); + return l; + } + getParsed(t) { + return this._cachedMeta._parsed[t]; + } + getDataElement(t) { + return this._cachedMeta.data[t]; + } + applyStack(t, e, i) { + const s = this.chart, + n = this._cachedMeta, + o = e[t.axis]; + return As({ keys: Os(s, !0), values: e._stacks[t.axis] }, o, n.index, { + mode: i + }); + } + updateRangeFromParsed(t, e, i, s) { + const n = i[e.axis]; + let o = null === n ? NaN : n; + const a = s && i._stacks[e.axis]; + s && a && ((s.values = a), (o = As(s, n, this._cachedMeta.index))), + (t.min = Math.min(t.min, o)), + (t.max = Math.max(t.max, o)); + } + getMinMax(t, e) { + const i = this._cachedMeta, + s = i._parsed, + n = i._sorted && t === i.iScale, + a = s.length, + r = this._getOtherScale(t), + l = ((t, e, i) => + t && !e.hidden && e._stacked && { keys: Os(i, !0), values: null })( + e, + i, + this.chart + ), + h = { min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY }, + { min: c, max: d } = (function(t) { + const { + min: e, + max: i, + minDefined: s, + maxDefined: n + } = t.getUserBounds(); + return { + min: s ? e : Number.NEGATIVE_INFINITY, + max: n ? i : Number.POSITIVE_INFINITY + }; + })(r); + let u, f; + function g() { + f = s[u]; + const e = f[r.axis]; + return !o(f[t.axis]) || c > e || d < e; + } + for ( + u = 0; + u < a && (g() || (this.updateRangeFromParsed(h, t, f, l), !n)); + ++u + ); + if (n) + for (u = a - 1; u >= 0; --u) + if (!g()) { + this.updateRangeFromParsed(h, t, f, l); + break; + } + return h; + } + getAllParsedValues(t) { + const e = this._cachedMeta._parsed, + i = []; + let s, n, a; + for (s = 0, n = e.length; s < n; ++s) + (a = e[s][t.axis]), o(a) && i.push(a); + return i; + } + getMaxOverflow() { + return !1; + } + getLabelAndValue(t) { + const e = this._cachedMeta, + i = e.iScale, + s = e.vScale, + n = this.getParsed(t); + return { + label: i ? "" + i.getLabelForValue(n[i.axis]) : "", + value: s ? "" + s.getLabelForValue(n[s.axis]) : "" + }; + } + _update(t) { + const e = this._cachedMeta; + this.update(t || "default"), + (e._clip = (function(t) { + let e, i, s, o; + return ( + n(t) + ? ((e = t.top), (i = t.right), (s = t.bottom), (o = t.left)) + : (e = i = s = o = t), + { top: e, right: i, bottom: s, left: o, disabled: !1 === t } + ); + })( + r( + this.options.clip, + (function(t, e, i) { + if (!1 === i) return !1; + const s = Cs(t, i), + n = Cs(e, i); + return { + top: n.end, + right: s.end, + bottom: n.start, + left: s.start + }; + })(e.xScale, e.yScale, this.getMaxOverflow()) + ) + )); + } + update(t) {} + draw() { + const t = this._ctx, + e = this.chart, + i = this._cachedMeta, + s = i.data || [], + n = e.chartArea, + o = [], + a = this._drawStart || 0, + r = this._drawCount || s.length - a, + l = this.options.drawActiveElementsOnTop; + let h; + for (i.dataset && i.dataset.draw(t, n, a, r), h = a; h < a + r; ++h) { + const e = s[h]; + e.hidden || (e.active && l ? o.push(e) : e.draw(t, n)); + } + for (h = 0; h < o.length; ++h) o[h].draw(t, n); + } + getStyle(t, e) { + const i = e ? "active" : "default"; + return void 0 === t && this._cachedMeta.dataset + ? this.resolveDatasetElementOptions(i) + : this.resolveDataElementOptions(t || 0, i); + } + getContext(t, e, i) { + const s = this.getDataset(); + let n; + if (t >= 0 && t < this._cachedMeta.data.length) { + const e = this._cachedMeta.data[t]; + (n = + e.$context || + (e.$context = (function(t, e, i) { + return Di(t, { + active: !1, + dataIndex: e, + parsed: void 0, + raw: void 0, + element: i, + index: e, + mode: "default", + type: "data" + }); + })(this.getContext(), t, e))), + (n.parsed = this.getParsed(t)), + (n.raw = s.data[t]), + (n.index = n.dataIndex = t); + } else + (n = + this.$context || + (this.$context = (function(t, e) { + return Di(t, { + active: !1, + dataset: void 0, + datasetIndex: e, + index: e, + mode: "default", + type: "dataset" + }); + })(this.chart.getContext(), this.index))), + (n.dataset = s), + (n.index = n.datasetIndex = this.index); + return (n.active = !!e), (n.mode = i), n; + } + resolveDatasetElementOptions(t) { + return this._resolveElementOptions(this.datasetElementType.id, t); + } + resolveDataElementOptions(t, e) { + return this._resolveElementOptions(this.dataElementType.id, e, t); + } + _resolveElementOptions(t, e = "default", i) { + const s = "active" === e, + n = this._cachedDataOpts, + o = t + "-" + e, + a = n[o], + r = this.enableOptionSharing && w(i); + if (a) return Vs(a, r); + const l = this.chart.config, + h = l.datasetElementScopeKeys(this._type, t), + c = s ? [`${t}Hover`, "hover", t, ""] : [t, ""], + d = l.getOptionScopes(this.getDataset(), h), + u = Object.keys(ue.elements[t]), + f = l.resolveNamedOptions(d, u, () => this.getContext(i, s), c); + return ( + f.$shared && ((f.$shared = r), (n[o] = Object.freeze(Vs(f, r)))), f + ); + } + _resolveAnimations(t, e, i) { + const s = this.chart, + n = this._cachedDataOpts, + o = `animation-${e}`, + a = n[o]; + if (a) return a; + let r; + if (!1 !== s.options.animation) { + const s = this.chart.config, + n = s.datasetAnimationScopeKeys(this._type, e), + o = s.getOptionScopes(this.getDataset(), n); + r = s.createResolver(o, this.getContext(t, i, e)); + } + const l = new Ds(s, r && r.animations); + return r && r._cacheable && (n[o] = Object.freeze(l)), l; + } + getSharedOptions(t) { + if (t.$shared) + return ( + this._sharedOptions || (this._sharedOptions = Object.assign({}, t)) + ); + } + includeOptions(t, e) { + return !e || Fs(t) || this.chart._animationsDisabled; + } + _getSharedOptions(t, e) { + const i = this.resolveDataElementOptions(t, e), + s = this._sharedOptions, + n = this.getSharedOptions(i), + o = this.includeOptions(e, n) || n !== s; + return ( + this.updateSharedOptions(n, e, i), + { sharedOptions: n, includeOptions: o } + ); + } + updateElement(t, e, i, s) { + Fs(s) ? Object.assign(t, i) : this._resolveAnimations(e, s).update(t, i); + } + updateSharedOptions(t, e, i) { + t && !Fs(e) && this._resolveAnimations(void 0, e).update(t, i); + } + _setStyle(t, e, i, s) { + t.active = s; + const n = this.getStyle(e, s); + this._resolveAnimations(e, i, s).update(t, { + options: (!s && this.getSharedOptions(n)) || n + }); + } + removeHoverStyle(t, e, i) { + this._setStyle(t, i, "active", !1); + } + setHoverStyle(t, e, i) { + this._setStyle(t, i, "active", !0); + } + _removeDatasetHoverStyle() { + const t = this._cachedMeta.dataset; + t && this._setStyle(t, void 0, "active", !1); + } + _setDatasetHoverStyle() { + const t = this._cachedMeta.dataset; + t && this._setStyle(t, void 0, "active", !0); + } + _resyncElements(t) { + const e = this._data, + i = this._cachedMeta.data; + for (const [t, e, i] of this._syncList) this[t](e, i); + this._syncList = []; + const s = i.length, + n = e.length, + o = Math.min(n, s); + o && this.parse(0, o), + n > s + ? this._insertElements(s, n - s, t) + : n < s && this._removeElements(n, s - n); + } + _insertElements(t, e, i = !0) { + const s = this._cachedMeta, + n = s.data, + o = t + e; + let a; + const r = t => { + for (t.length += e, a = t.length - 1; a >= o; a--) t[a] = t[a - e]; + }; + for (r(n), a = t; a < o; ++a) n[a] = new this.dataElementType(); + this._parsing && r(s._parsed), + this.parse(t, e), + i && this.updateElements(n, t, e, "reset"); + } + updateElements(t, e, i, s) {} + _removeElements(t, e) { + const i = this._cachedMeta; + if (this._parsing) { + const s = i._parsed.splice(t, e); + i._stacked && zs(i, s); + } + i.data.splice(t, e); + } + _sync(t) { + if (this._parsing) this._syncList.push(t); + else { + const [e, i, s] = t; + this[e](i, s); + } + this.chart._dataChanges.push([this.index, ...t]); + } + _onDataPush() { + const t = arguments.length; + this._sync(["_insertElements", this.getDataset().data.length - t, t]); + } + _onDataPop() { + this._sync(["_removeElements", this._cachedMeta.data.length - 1, 1]); + } + _onDataShift() { + this._sync(["_removeElements", 0, 1]); + } + _onDataSplice(t, e) { + e && this._sync(["_removeElements", t, e]); + const i = arguments.length - 2; + i && this._sync(["_insertElements", t, i]); + } + _onDataUnshift() { + this._sync(["_insertElements", 0, arguments.length]); + } + } + class Ns { + static defaults = {}; + static defaultRoutes = void 0; + active = !1; + tooltipPosition(t) { + const { x: e, y: i } = this.getProps(["x", "y"], t); + return { x: e, y: i }; + } + hasValue() { + return N(this.x) && N(this.y); + } + getProps(t, e) { + const i = this.$animations; + if (!e || !i) return this; + const s = {}; + return ( + t.forEach(t => { + s[t] = i[t] && i[t].active() ? i[t]._to : this[t]; + }), + s + ); + } + } + function Ws(t, e) { + const s = t.options.ticks, + n = (function(t) { + const e = t.options.offset, + i = t._tickSize(), + s = t._length / i + (e ? 0 : 1), + n = t._maxLength / i; + return Math.floor(Math.min(s, n)); + })(t), + o = Math.min(s.maxTicksLimit || n, n), + a = s.major.enabled + ? (function(t) { + const e = []; + let i, s; + for (i = 0, s = t.length; i < s; i++) t[i].major && e.push(i); + return e; + })(e) + : [], + r = a.length, + l = a[0], + h = a[r - 1], + c = []; + if (r > o) + return ( + (function(t, e, i, s) { + let n, + o = 0, + a = i[0]; + for (s = Math.ceil(s), n = 0; n < t.length; n++) + n === a && (e.push(t[n]), o++, (a = i[o * s])); + })(e, c, a, r / o), + c + ); + const d = (function(t, e, i) { + const s = (function(t) { + const e = t.length; + let i, s; + if (e < 2) return !1; + for (s = t[0], i = 1; i < e; ++i) + if (t[i] - t[i - 1] !== s) return !1; + return s; + })(t), + n = e.length / i; + if (!s) return Math.max(n, 1); + const o = B(s); + for (let t = 0, e = o.length - 1; t < e; t++) { + const e = o[t]; + if (e > n) return e; + } + return Math.max(n, 1); + })(a, e, o); + if (r > 0) { + let t, s; + const n = r > 1 ? Math.round((h - l) / (r - 1)) : null; + for (Hs(e, c, d, i(n) ? 0 : l - n, l), t = 0, s = r - 1; t < s; t++) + Hs(e, c, d, a[t], a[t + 1]); + return Hs(e, c, d, h, i(n) ? e.length : h + n), c; + } + return Hs(e, c, d), c; + } + function Hs(t, e, i, s, n) { + const o = r(s, 0), + a = Math.min(r(n, t.length), t.length); + let l, + h, + c, + d = 0; + for ( + i = Math.ceil(i), n && ((l = n - s), (i = l / Math.floor(l / i))), c = o; + c < 0; + + ) + d++, (c = Math.round(o + d * i)); + for (h = Math.max(o, 0); h < a; h++) + h === c && (e.push(t[h]), d++, (c = Math.round(o + d * i))); + } + const js = (t, e, i) => ("top" === e || "left" === e ? t[e] + i : t[e] - i); + function $s(t, e) { + const i = [], + s = t.length / e, + n = t.length; + let o = 0; + for (; o < n; o += s) i.push(t[Math.floor(o)]); + return i; + } + function Ys(t, e, i) { + const s = t.ticks.length, + n = Math.min(e, s - 1), + o = t._startPixel, + a = t._endPixel, + r = 1e-6; + let l, + h = t.getPixelForTick(n); + if ( + !( + i && + ((l = + 1 === s + ? Math.max(h - o, a - h) + : 0 === e + ? (t.getPixelForTick(1) - h) / 2 + : (h - t.getPixelForTick(n - 1)) / 2), + (h += n < e ? l : -l), + h < o - r || h > a + r) + ) + ) + return h; + } + function Us(t) { + return t.drawTicks ? t.tickLength : 0; + } + function Xs(t, e) { + if (!t.display) return 0; + const i = ki(t.font, e), + n = wi(t.padding); + return (s(t.text) ? t.text.length : 1) * i.lineHeight + n.height; + } + function qs(t, e, i) { + let s = dt(t); + return ( + ((i && "right" !== e) || (!i && "right" === e)) && + (s = (t => ("left" === t ? "right" : "right" === t ? "left" : t))(s)), + s + ); + } + class Ks extends Ns { + constructor(t) { + super(), + (this.id = t.id), + (this.type = t.type), + (this.options = void 0), + (this.ctx = t.ctx), + (this.chart = t.chart), + (this.top = void 0), + (this.bottom = void 0), + (this.left = void 0), + (this.right = void 0), + (this.width = void 0), + (this.height = void 0), + (this._margins = { left: 0, right: 0, top: 0, bottom: 0 }), + (this.maxWidth = void 0), + (this.maxHeight = void 0), + (this.paddingTop = void 0), + (this.paddingBottom = void 0), + (this.paddingLeft = void 0), + (this.paddingRight = void 0), + (this.axis = void 0), + (this.labelRotation = void 0), + (this.min = void 0), + (this.max = void 0), + (this._range = void 0), + (this.ticks = []), + (this._gridLineItems = null), + (this._labelItems = null), + (this._labelSizes = null), + (this._length = 0), + (this._maxLength = 0), + (this._longestTextCache = {}), + (this._startPixel = void 0), + (this._endPixel = void 0), + (this._reversePixels = !1), + (this._userMax = void 0), + (this._userMin = void 0), + (this._suggestedMax = void 0), + (this._suggestedMin = void 0), + (this._ticksLength = 0), + (this._borderValue = 0), + (this._cache = {}), + (this._dataLimitsCached = !1), + (this.$context = void 0); + } + init(t) { + (this.options = t.setContext(this.getContext())), + (this.axis = t.axis), + (this._userMin = this.parse(t.min)), + (this._userMax = this.parse(t.max)), + (this._suggestedMin = this.parse(t.suggestedMin)), + (this._suggestedMax = this.parse(t.suggestedMax)); + } + parse(t, e) { + return t; + } + getUserBounds() { + let { + _userMin: t, + _userMax: e, + _suggestedMin: i, + _suggestedMax: s + } = this; + return ( + (t = a(t, Number.POSITIVE_INFINITY)), + (e = a(e, Number.NEGATIVE_INFINITY)), + (i = a(i, Number.POSITIVE_INFINITY)), + (s = a(s, Number.NEGATIVE_INFINITY)), + { min: a(t, i), max: a(e, s), minDefined: o(t), maxDefined: o(e) } + ); + } + getMinMax(t) { + let e, + { min: i, max: s, minDefined: n, maxDefined: o } = this.getUserBounds(); + if (n && o) return { min: i, max: s }; + const r = this.getMatchingVisibleMetas(); + for (let a = 0, l = r.length; a < l; ++a) + (e = r[a].controller.getMinMax(this, t)), + n || (i = Math.min(i, e.min)), + o || (s = Math.max(s, e.max)); + return ( + (i = o && i > s ? s : i), + (s = n && i > s ? i : s), + { min: a(i, a(s, i)), max: a(s, a(i, s)) } + ); + } + getPadding() { + return { + left: this.paddingLeft || 0, + top: this.paddingTop || 0, + right: this.paddingRight || 0, + bottom: this.paddingBottom || 0 + }; + } + getTicks() { + return this.ticks; + } + getLabels() { + const t = this.chart.data; + return ( + this.options.labels || + (this.isHorizontal() ? t.xLabels : t.yLabels) || + t.labels || + [] + ); + } + beforeLayout() { + (this._cache = {}), (this._dataLimitsCached = !1); + } + beforeUpdate() { + c(this.options.beforeUpdate, [this]); + } + update(t, e, i) { + const { beginAtZero: s, grace: n, ticks: o } = this.options, + a = o.sampleSize; + this.beforeUpdate(), + (this.maxWidth = t), + (this.maxHeight = e), + (this._margins = i = Object.assign( + { left: 0, right: 0, top: 0, bottom: 0 }, + i + )), + (this.ticks = null), + (this._labelSizes = null), + (this._gridLineItems = null), + (this._labelItems = null), + this.beforeSetDimensions(), + this.setDimensions(), + this.afterSetDimensions(), + (this._maxLength = this.isHorizontal() + ? this.width + i.left + i.right + : this.height + i.top + i.bottom), + this._dataLimitsCached || + (this.beforeDataLimits(), + this.determineDataLimits(), + this.afterDataLimits(), + (this._range = Pi(this, n, s)), + (this._dataLimitsCached = !0)), + this.beforeBuildTicks(), + (this.ticks = this.buildTicks() || []), + this.afterBuildTicks(); + const r = a < this.ticks.length; + this._convertTicksToLabels(r ? $s(this.ticks, a) : this.ticks), + this.configure(), + this.beforeCalculateLabelRotation(), + this.calculateLabelRotation(), + this.afterCalculateLabelRotation(), + o.display && + (o.autoSkip || "auto" === o.source) && + ((this.ticks = Ws(this, this.ticks)), + (this._labelSizes = null), + this.afterAutoSkip()), + r && this._convertTicksToLabels(this.ticks), + this.beforeFit(), + this.fit(), + this.afterFit(), + this.afterUpdate(); + } + configure() { + let t, + e, + i = this.options.reverse; + this.isHorizontal() + ? ((t = this.left), (e = this.right)) + : ((t = this.top), (e = this.bottom), (i = !i)), + (this._startPixel = t), + (this._endPixel = e), + (this._reversePixels = i), + (this._length = e - t), + (this._alignToPixels = this.options.alignToPixels); + } + afterUpdate() { + c(this.options.afterUpdate, [this]); + } + beforeSetDimensions() { + c(this.options.beforeSetDimensions, [this]); + } + setDimensions() { + this.isHorizontal() + ? ((this.width = this.maxWidth), + (this.left = 0), + (this.right = this.width)) + : ((this.height = this.maxHeight), + (this.top = 0), + (this.bottom = this.height)), + (this.paddingLeft = 0), + (this.paddingTop = 0), + (this.paddingRight = 0), + (this.paddingBottom = 0); + } + afterSetDimensions() { + c(this.options.afterSetDimensions, [this]); + } + _callHooks(t) { + this.chart.notifyPlugins(t, this.getContext()), + c(this.options[t], [this]); + } + beforeDataLimits() { + this._callHooks("beforeDataLimits"); + } + determineDataLimits() {} + afterDataLimits() { + this._callHooks("afterDataLimits"); + } + beforeBuildTicks() { + this._callHooks("beforeBuildTicks"); + } + buildTicks() { + return []; + } + afterBuildTicks() { + this._callHooks("afterBuildTicks"); + } + beforeTickToLabelConversion() { + c(this.options.beforeTickToLabelConversion, [this]); + } + generateTickLabels(t) { + const e = this.options.ticks; + let i, s, n; + for (i = 0, s = t.length; i < s; i++) + (n = t[i]), (n.label = c(e.callback, [n.value, i, t], this)); + } + afterTickToLabelConversion() { + c(this.options.afterTickToLabelConversion, [this]); + } + beforeCalculateLabelRotation() { + c(this.options.beforeCalculateLabelRotation, [this]); + } + calculateLabelRotation() { + const t = this.options, + e = t.ticks, + i = this.ticks.length, + s = e.minRotation || 0, + n = e.maxRotation; + let o, + a, + r, + l = s; + if ( + !this._isVisible() || + !e.display || + s >= n || + i <= 1 || + !this.isHorizontal() + ) + return void (this.labelRotation = s); + const h = this._getLabelSizes(), + c = h.widest.width, + d = h.highest.height, + u = Z(this.chart.width - c, 0, this.maxWidth); + (o = t.offset ? this.maxWidth / i : u / (i - 1)), + c + 6 > o && + ((o = u / (i - (t.offset ? 0.5 : 1))), + (a = + this.maxHeight - + Us(t.grid) - + e.padding - + Xs(t.title, this.chart.options.font)), + (r = Math.sqrt(c * c + d * d)), + (l = $( + Math.min( + Math.asin(Z((h.highest.height + 6) / o, -1, 1)), + Math.asin(Z(a / r, -1, 1)) - Math.asin(Z(d / r, -1, 1)) + ) + )), + (l = Math.max(s, Math.min(n, l)))), + (this.labelRotation = l); + } + afterCalculateLabelRotation() { + c(this.options.afterCalculateLabelRotation, [this]); + } + afterAutoSkip() {} + beforeFit() { + c(this.options.beforeFit, [this]); + } + fit() { + const t = { width: 0, height: 0 }, + { + chart: e, + options: { ticks: i, title: s, grid: n } + } = this, + o = this._isVisible(), + a = this.isHorizontal(); + if (o) { + const o = Xs(s, e.options.font); + if ( + (a + ? ((t.width = this.maxWidth), (t.height = Us(n) + o)) + : ((t.height = this.maxHeight), (t.width = Us(n) + o)), + i.display && this.ticks.length) + ) { + const { + first: e, + last: s, + widest: n, + highest: o + } = this._getLabelSizes(), + r = 2 * i.padding, + l = j(this.labelRotation), + h = Math.cos(l), + c = Math.sin(l); + if (a) { + const e = i.mirror ? 0 : c * n.width + h * o.height; + t.height = Math.min(this.maxHeight, t.height + e + r); + } else { + const e = i.mirror ? 0 : h * n.width + c * o.height; + t.width = Math.min(this.maxWidth, t.width + e + r); + } + this._calculatePadding(e, s, c, h); + } + } + this._handleMargins(), + a + ? ((this.width = this._length = + e.width - this._margins.left - this._margins.right), + (this.height = t.height)) + : ((this.width = t.width), + (this.height = this._length = + e.height - this._margins.top - this._margins.bottom)); + } + _calculatePadding(t, e, i, s) { + const { + ticks: { align: n, padding: o }, + position: a + } = this.options, + r = 0 !== this.labelRotation, + l = "top" !== a && "x" === this.axis; + if (this.isHorizontal()) { + const a = this.getPixelForTick(0) - this.left, + h = this.right - this.getPixelForTick(this.ticks.length - 1); + let c = 0, + d = 0; + r + ? l + ? ((c = s * t.width), (d = i * e.height)) + : ((c = i * t.height), (d = s * e.width)) + : "start" === n + ? (d = e.width) + : "end" === n + ? (c = t.width) + : "inner" !== n && ((c = t.width / 2), (d = e.width / 2)), + (this.paddingLeft = Math.max( + ((c - a + o) * this.width) / (this.width - a), + 0 + )), + (this.paddingRight = Math.max( + ((d - h + o) * this.width) / (this.width - h), + 0 + )); + } else { + let i = e.height / 2, + s = t.height / 2; + "start" === n + ? ((i = 0), (s = t.height)) + : "end" === n && ((i = e.height), (s = 0)), + (this.paddingTop = i + o), + (this.paddingBottom = s + o); + } + } + _handleMargins() { + this._margins && + ((this._margins.left = Math.max(this.paddingLeft, this._margins.left)), + (this._margins.top = Math.max(this.paddingTop, this._margins.top)), + (this._margins.right = Math.max( + this.paddingRight, + this._margins.right + )), + (this._margins.bottom = Math.max( + this.paddingBottom, + this._margins.bottom + ))); + } + afterFit() { + c(this.options.afterFit, [this]); + } + isHorizontal() { + const { axis: t, position: e } = this.options; + return "top" === e || "bottom" === e || "x" === t; + } + isFullSize() { + return this.options.fullSize; + } + _convertTicksToLabels(t) { + let e, s; + for ( + this.beforeTickToLabelConversion(), + this.generateTickLabels(t), + e = 0, + s = t.length; + e < s; + e++ + ) + i(t[e].label) && (t.splice(e, 1), s--, e--); + this.afterTickToLabelConversion(); + } + _getLabelSizes() { + let t = this._labelSizes; + if (!t) { + const e = this.options.ticks.sampleSize; + let i = this.ticks; + e < i.length && (i = $s(i, e)), + (this._labelSizes = t = this._computeLabelSizes(i, i.length)); + } + return t; + } + _computeLabelSizes(t, e) { + const { ctx: n, _longestTextCache: o } = this, + a = [], + r = []; + let l, + h, + c, + u, + f, + g, + p, + m, + b, + x, + _, + y = 0, + v = 0; + for (l = 0; l < e; ++l) { + if ( + ((u = t[l].label), + (f = this._resolveTickFontOptions(l)), + (n.font = g = f.string), + (p = o[g] = o[g] || { data: {}, gc: [] }), + (m = f.lineHeight), + (b = x = 0), + i(u) || s(u)) + ) { + if (s(u)) + for (h = 0, c = u.length; h < c; ++h) + (_ = u[h]), + i(_) || s(_) || ((b = De(n, p.data, p.gc, b, _)), (x += m)); + } else (b = De(n, p.data, p.gc, b, u)), (x = m); + a.push(b), r.push(x), (y = Math.max(b, y)), (v = Math.max(x, v)); + } + !(function(t, e) { + d(t, t => { + const i = t.gc, + s = i.length / 2; + let n; + if (s > e) { + for (n = 0; n < s; ++n) delete t.data[i[n]]; + i.splice(0, s); + } + }); + })(o, e); + const M = a.indexOf(y), + w = r.indexOf(v), + k = t => ({ width: a[t] || 0, height: r[t] || 0 }); + return { + first: k(0), + last: k(e - 1), + widest: k(M), + highest: k(w), + widths: a, + heights: r + }; + } + getLabelForValue(t) { + return t; + } + getPixelForValue(t, e) { + return NaN; + } + getValueForPixel(t) {} + getPixelForTick(t) { + const e = this.ticks; + return t < 0 || t > e.length - 1 + ? null + : this.getPixelForValue(e[t].value); + } + getPixelForDecimal(t) { + this._reversePixels && (t = 1 - t); + const e = this._startPixel + t * this._length; + return J(this._alignToPixels ? Oe(this.chart, e, 0) : e); + } + getDecimalForPixel(t) { + const e = (t - this._startPixel) / this._length; + return this._reversePixels ? 1 - e : e; + } + getBasePixel() { + return this.getPixelForValue(this.getBaseValue()); + } + getBaseValue() { + const { min: t, max: e } = this; + return t < 0 && e < 0 ? e : t > 0 && e > 0 ? t : 0; + } + getContext(t) { + const e = this.ticks || []; + if (t >= 0 && t < e.length) { + const i = e[t]; + return ( + i.$context || + (i.$context = (function(t, e, i) { + return Di(t, { tick: i, index: e, type: "tick" }); + })(this.getContext(), t, i)) + ); + } + return ( + this.$context || + (this.$context = Di(this.chart.getContext(), { + scale: this, + type: "scale" + })) + ); + } + _tickSize() { + const t = this.options.ticks, + e = j(this.labelRotation), + i = Math.abs(Math.cos(e)), + s = Math.abs(Math.sin(e)), + n = this._getLabelSizes(), + o = t.autoSkipPadding || 0, + a = n ? n.widest.width + o : 0, + r = n ? n.highest.height + o : 0; + return this.isHorizontal() + ? r * i > a * s + ? a / i + : r / s + : r * s < a * i + ? r / i + : a / s; + } + _isVisible() { + const t = this.options.display; + return "auto" !== t ? !!t : this.getMatchingVisibleMetas().length > 0; + } + _computeGridLineItems(t) { + const e = this.axis, + i = this.chart, + s = this.options, + { grid: o, position: a, border: l } = s, + h = o.offset, + c = this.isHorizontal(), + d = this.ticks.length + (h ? 1 : 0), + u = Us(o), + f = [], + g = l.setContext(this.getContext()), + p = g.display ? g.width : 0, + m = p / 2, + b = function(t) { + return Oe(i, t, p); + }; + let x, _, y, v, M, w, k, S, P, D, C, O; + if ("top" === a) + (x = b(this.bottom)), + (w = this.bottom - u), + (S = x - m), + (D = b(t.top) + m), + (O = t.bottom); + else if ("bottom" === a) + (x = b(this.top)), + (D = t.top), + (O = b(t.bottom) - m), + (w = x + m), + (S = this.top + u); + else if ("left" === a) + (x = b(this.right)), + (M = this.right - u), + (k = x - m), + (P = b(t.left) + m), + (C = t.right); + else if ("right" === a) + (x = b(this.left)), + (P = t.left), + (C = b(t.right) - m), + (M = x + m), + (k = this.left + u); + else if ("x" === e) { + if ("center" === a) x = b((t.top + t.bottom) / 2 + 0.5); + else if (n(a)) { + const t = Object.keys(a)[0], + e = a[t]; + x = b(this.chart.scales[t].getPixelForValue(e)); + } + (D = t.top), (O = t.bottom), (w = x + m), (S = w + u); + } else if ("y" === e) { + if ("center" === a) x = b((t.left + t.right) / 2); + else if (n(a)) { + const t = Object.keys(a)[0], + e = a[t]; + x = b(this.chart.scales[t].getPixelForValue(e)); + } + (M = x - m), (k = M - u), (P = t.left), (C = t.right); + } + const A = r(s.ticks.maxTicksLimit, d), + T = Math.max(1, Math.ceil(d / A)); + for (_ = 0; _ < d; _ += T) { + const t = this.getContext(_), + e = o.setContext(t), + s = l.setContext(t), + n = e.lineWidth, + a = e.color, + r = s.dash || [], + d = s.dashOffset, + u = e.tickWidth, + g = e.tickColor, + p = e.tickBorderDash || [], + m = e.tickBorderDashOffset; + (y = Ys(this, _, h)), + void 0 !== y && + ((v = Oe(i, y, n)), + c ? (M = k = P = C = v) : (w = S = D = O = v), + f.push({ + tx1: M, + ty1: w, + tx2: k, + ty2: S, + x1: P, + y1: D, + x2: C, + y2: O, + width: n, + color: a, + borderDash: r, + borderDashOffset: d, + tickWidth: u, + tickColor: g, + tickBorderDash: p, + tickBorderDashOffset: m + })); + } + return (this._ticksLength = d), (this._borderValue = x), f; + } + _computeLabelItems(t) { + const e = this.axis, + i = this.options, + { position: o, ticks: a } = i, + r = this.isHorizontal(), + l = this.ticks, + { align: h, crossAlign: c, padding: d, mirror: u } = a, + f = Us(i.grid), + g = f + d, + p = u ? -d : g, + m = -j(this.labelRotation), + b = []; + let x, + _, + y, + v, + M, + w, + k, + S, + P, + D, + C, + O, + A = "middle"; + if ("top" === o) + (w = this.bottom - p), (k = this._getXAxisLabelAlignment()); + else if ("bottom" === o) + (w = this.top + p), (k = this._getXAxisLabelAlignment()); + else if ("left" === o) { + const t = this._getYAxisLabelAlignment(f); + (k = t.textAlign), (M = t.x); + } else if ("right" === o) { + const t = this._getYAxisLabelAlignment(f); + (k = t.textAlign), (M = t.x); + } else if ("x" === e) { + if ("center" === o) w = (t.top + t.bottom) / 2 + g; + else if (n(o)) { + const t = Object.keys(o)[0], + e = o[t]; + w = this.chart.scales[t].getPixelForValue(e) + g; + } + k = this._getXAxisLabelAlignment(); + } else if ("y" === e) { + if ("center" === o) M = (t.left + t.right) / 2 - g; + else if (n(o)) { + const t = Object.keys(o)[0], + e = o[t]; + M = this.chart.scales[t].getPixelForValue(e); + } + k = this._getYAxisLabelAlignment(f).textAlign; + } + "y" === e && + ("start" === h ? (A = "top") : "end" === h && (A = "bottom")); + const T = this._getLabelSizes(); + for (x = 0, _ = l.length; x < _; ++x) { + (y = l[x]), (v = y.label); + const t = a.setContext(this.getContext(x)); + (S = this.getPixelForTick(x) + a.labelOffset), + (P = this._resolveTickFontOptions(x)), + (D = P.lineHeight), + (C = s(v) ? v.length : 1); + const e = C / 2, + i = t.color, + n = t.textStrokeColor, + h = t.textStrokeWidth; + let d, + f = k; + if ( + (r + ? ((M = S), + "inner" === k && + (f = + x === _ - 1 + ? this.options.reverse + ? "left" + : "right" + : 0 === x + ? this.options.reverse + ? "right" + : "left" + : "center"), + (O = + "top" === o + ? "near" === c || 0 !== m + ? -C * D + D / 2 + : "center" === c + ? -T.highest.height / 2 - e * D + D + : -T.highest.height + D / 2 + : "near" === c || 0 !== m + ? D / 2 + : "center" === c + ? T.highest.height / 2 - e * D + : T.highest.height - C * D), + u && (O *= -1), + 0 === m || t.showLabelBackdrop || (M += (D / 2) * Math.sin(m))) + : ((w = S), (O = ((1 - C) * D) / 2)), + t.showLabelBackdrop) + ) { + const e = wi(t.backdropPadding), + i = T.heights[x], + s = T.widths[x]; + let n = O - e.top, + o = 0 - e.left; + switch (A) { + case "middle": + n -= i / 2; + break; + case "bottom": + n -= i; + } + switch (k) { + case "center": + o -= s / 2; + break; + case "right": + o -= s; + } + d = { + left: o, + top: n, + width: s + e.width, + height: i + e.height, + color: t.backdropColor + }; + } + b.push({ + rotation: m, + label: v, + font: P, + color: i, + strokeColor: n, + strokeWidth: h, + textOffset: O, + textAlign: f, + textBaseline: A, + translation: [M, w], + backdrop: d + }); + } + return b; + } + _getXAxisLabelAlignment() { + const { position: t, ticks: e } = this.options; + if (-j(this.labelRotation)) return "top" === t ? "left" : "right"; + let i = "center"; + return ( + "start" === e.align + ? (i = "left") + : "end" === e.align + ? (i = "right") + : "inner" === e.align && (i = "inner"), + i + ); + } + _getYAxisLabelAlignment(t) { + const { + position: e, + ticks: { crossAlign: i, mirror: s, padding: n } + } = this.options, + o = t + n, + a = this._getLabelSizes().widest.width; + let r, l; + return ( + "left" === e + ? s + ? ((l = this.right + n), + "near" === i + ? (r = "left") + : "center" === i + ? ((r = "center"), (l += a / 2)) + : ((r = "right"), (l += a))) + : ((l = this.right - o), + "near" === i + ? (r = "right") + : "center" === i + ? ((r = "center"), (l -= a / 2)) + : ((r = "left"), (l = this.left))) + : "right" === e + ? s + ? ((l = this.left + n), + "near" === i + ? (r = "right") + : "center" === i + ? ((r = "center"), (l -= a / 2)) + : ((r = "left"), (l -= a))) + : ((l = this.left + o), + "near" === i + ? (r = "left") + : "center" === i + ? ((r = "center"), (l += a / 2)) + : ((r = "right"), (l = this.right))) + : (r = "right"), + { textAlign: r, x: l } + ); + } + _computeLabelArea() { + if (this.options.ticks.mirror) return; + const t = this.chart, + e = this.options.position; + return "left" === e || "right" === e + ? { top: 0, left: this.left, bottom: t.height, right: this.right } + : "top" === e || "bottom" === e + ? { top: this.top, left: 0, bottom: this.bottom, right: t.width } + : void 0; + } + drawBackground() { + const { + ctx: t, + options: { backgroundColor: e }, + left: i, + top: s, + width: n, + height: o + } = this; + e && (t.save(), (t.fillStyle = e), t.fillRect(i, s, n, o), t.restore()); + } + getLineWidthForValue(t) { + const e = this.options.grid; + if (!this._isVisible() || !e.display) return 0; + const i = this.ticks.findIndex(e => e.value === t); + if (i >= 0) { + return e.setContext(this.getContext(i)).lineWidth; + } + return 0; + } + drawGrid(t) { + const e = this.options.grid, + i = this.ctx, + s = + this._gridLineItems || + (this._gridLineItems = this._computeGridLineItems(t)); + let n, o; + const a = (t, e, s) => { + s.width && + s.color && + (i.save(), + (i.lineWidth = s.width), + (i.strokeStyle = s.color), + i.setLineDash(s.borderDash || []), + (i.lineDashOffset = s.borderDashOffset), + i.beginPath(), + i.moveTo(t.x, t.y), + i.lineTo(e.x, e.y), + i.stroke(), + i.restore()); + }; + if (e.display) + for (n = 0, o = s.length; n < o; ++n) { + const t = s[n]; + e.drawOnChartArea && a({ x: t.x1, y: t.y1 }, { x: t.x2, y: t.y2 }, t), + e.drawTicks && + a( + { x: t.tx1, y: t.ty1 }, + { x: t.tx2, y: t.ty2 }, + { + color: t.tickColor, + width: t.tickWidth, + borderDash: t.tickBorderDash, + borderDashOffset: t.tickBorderDashOffset + } + ); + } + } + drawBorder() { + const { + chart: t, + ctx: e, + options: { border: i, grid: s } + } = this, + n = i.setContext(this.getContext()), + o = i.display ? n.width : 0; + if (!o) return; + const a = s.setContext(this.getContext(0)).lineWidth, + r = this._borderValue; + let l, h, c, d; + this.isHorizontal() + ? ((l = Oe(t, this.left, o) - o / 2), + (h = Oe(t, this.right, a) + a / 2), + (c = d = r)) + : ((c = Oe(t, this.top, o) - o / 2), + (d = Oe(t, this.bottom, a) + a / 2), + (l = h = r)), + e.save(), + (e.lineWidth = n.width), + (e.strokeStyle = n.color), + e.beginPath(), + e.moveTo(l, c), + e.lineTo(h, d), + e.stroke(), + e.restore(); + } + drawLabels(t) { + if (!this.options.ticks.display) return; + const e = this.ctx, + i = this._computeLabelArea(); + i && Re(e, i); + const s = + this._labelItems || (this._labelItems = this._computeLabelItems(t)); + let n, o; + for (n = 0, o = s.length; n < o; ++n) { + const t = s[n], + i = t.font; + Ve(e, t.label, 0, t.textOffset, i, t); + } + i && Ie(e); + } + drawTitle() { + const { + ctx: t, + options: { position: e, title: i, reverse: o } + } = this; + if (!i.display) return; + const a = ki(i.font), + r = wi(i.padding), + l = i.align; + let h = a.lineHeight / 2; + "bottom" === e || "center" === e || n(e) + ? ((h += r.bottom), + s(i.text) && (h += a.lineHeight * (i.text.length - 1))) + : (h += r.top); + const { titleX: c, titleY: d, maxWidth: u, rotation: f } = (function( + t, + e, + i, + s + ) { + const { top: o, left: a, bottom: r, right: l, chart: h } = t, + { chartArea: c, scales: d } = h; + let u, + f, + g, + p = 0; + const m = r - o, + b = l - a; + if (t.isHorizontal()) { + if (((f = ut(s, a, l)), n(i))) { + const t = Object.keys(i)[0], + s = i[t]; + g = d[t].getPixelForValue(s) + m - e; + } else + g = "center" === i ? (c.bottom + c.top) / 2 + m - e : js(t, i, e); + u = l - a; + } else { + if (n(i)) { + const t = Object.keys(i)[0], + s = i[t]; + f = d[t].getPixelForValue(s) - b + e; + } else + f = "center" === i ? (c.left + c.right) / 2 - b + e : js(t, i, e); + (g = ut(s, r, o)), (p = "left" === i ? -L : L); + } + return { titleX: f, titleY: g, maxWidth: u, rotation: p }; + })(this, h, e, l); + Ve(t, i.text, 0, 0, a, { + color: i.color, + maxWidth: u, + rotation: f, + textAlign: qs(l, e, o), + textBaseline: "middle", + translation: [c, d] + }); + } + draw(t) { + this._isVisible() && + (this.drawBackground(), + this.drawGrid(t), + this.drawBorder(), + this.drawTitle(), + this.drawLabels(t)); + } + _layers() { + const t = this.options, + e = (t.ticks && t.ticks.z) || 0, + i = r(t.grid && t.grid.z, -1), + s = r(t.border && t.border.z, 0); + return this._isVisible() && this.draw === Ks.prototype.draw + ? [ + { + z: i, + draw: t => { + this.drawBackground(), this.drawGrid(t), this.drawTitle(); + } + }, + { + z: s, + draw: () => { + this.drawBorder(); + } + }, + { + z: e, + draw: t => { + this.drawLabels(t); + } + } + ] + : [ + { + z: e, + draw: t => { + this.draw(t); + } + } + ]; + } + getMatchingVisibleMetas(t) { + const e = this.chart.getSortedVisibleDatasetMetas(), + i = this.axis + "AxisID", + s = []; + let n, o; + for (n = 0, o = e.length; n < o; ++n) { + const o = e[n]; + o[i] !== this.id || (t && o.type !== t) || s.push(o); + } + return s; + } + _resolveTickFontOptions(t) { + return ki(this.options.ticks.setContext(this.getContext(t)).font); + } + _maxDigits() { + const t = this._resolveTickFontOptions(0).lineHeight; + return (this.isHorizontal() ? this.width : this.height) / t; + } + } + class Gs { + constructor(t, e, i) { + (this.type = t), + (this.scope = e), + (this.override = i), + (this.items = Object.create(null)); + } + isForType(t) { + return Object.prototype.isPrototypeOf.call( + this.type.prototype, + t.prototype + ); + } + register(t) { + const e = Object.getPrototypeOf(t); + let i; + (function(t) { + return "id" in t && "defaults" in t; + })(e) && (i = this.register(e)); + const s = this.items, + n = t.id, + o = this.scope + "." + n; + if (!n) throw new Error("class does not have id: " + t); + return ( + n in s || + ((s[n] = t), + (function(t, e, i) { + const s = m(Object.create(null), [ + i ? ue.get(i) : {}, + ue.get(e), + t.defaults + ]); + ue.set(e, s), + t.defaultRoutes && + (function(t, e) { + Object.keys(e).forEach(i => { + const s = i.split("."), + n = s.pop(), + o = [t].concat(s).join("."), + a = e[i].split("."), + r = a.pop(), + l = a.join("."); + ue.route(o, n, l, r); + }); + })(e, t.defaultRoutes); + t.descriptors && ue.describe(e, t.descriptors); + })(t, o, i), + this.override && ue.override(t.id, t.overrides)), + o + ); + } + get(t) { + return this.items[t]; + } + unregister(t) { + const e = this.items, + i = t.id, + s = this.scope; + i in e && delete e[i], + s && i in ue[s] && (delete ue[s][i], this.override && delete re[i]); + } + } + class Zs { + constructor() { + (this.controllers = new Gs(Bs, "datasets", !0)), + (this.elements = new Gs(Ns, "elements")), + (this.plugins = new Gs(Object, "plugins")), + (this.scales = new Gs(Ks, "scales")), + (this._typedRegistries = [ + this.controllers, + this.scales, + this.elements + ]); + } + add(...t) { + this._each("register", t); + } + remove(...t) { + this._each("unregister", t); + } + addControllers(...t) { + this._each("register", t, this.controllers); + } + addElements(...t) { + this._each("register", t, this.elements); + } + addPlugins(...t) { + this._each("register", t, this.plugins); + } + addScales(...t) { + this._each("register", t, this.scales); + } + getController(t) { + return this._get(t, this.controllers, "controller"); + } + getElement(t) { + return this._get(t, this.elements, "element"); + } + getPlugin(t) { + return this._get(t, this.plugins, "plugin"); + } + getScale(t) { + return this._get(t, this.scales, "scale"); + } + removeControllers(...t) { + this._each("unregister", t, this.controllers); + } + removeElements(...t) { + this._each("unregister", t, this.elements); + } + removePlugins(...t) { + this._each("unregister", t, this.plugins); + } + removeScales(...t) { + this._each("unregister", t, this.scales); + } + _each(t, e, i) { + [...e].forEach(e => { + const s = i || this._getRegistryForType(e); + i || s.isForType(e) || (s === this.plugins && e.id) + ? this._exec(t, s, e) + : d(e, e => { + const s = i || this._getRegistryForType(e); + this._exec(t, s, e); + }); + }); + } + _exec(t, e, i) { + const s = M(t); + c(i["before" + s], [], i), e[t](i), c(i["after" + s], [], i); + } + _getRegistryForType(t) { + for (let e = 0; e < this._typedRegistries.length; e++) { + const i = this._typedRegistries[e]; + if (i.isForType(t)) return i; + } + return this.plugins; + } + _get(t, e, i) { + const s = e.get(t); + if (void 0 === s) + throw new Error('"' + t + '" is not a registered ' + i + "."); + return s; + } + } + var Js = new Zs(); + class Qs { + constructor() { + this._init = []; + } + notify(t, e, i, s) { + "beforeInit" === e && + ((this._init = this._createDescriptors(t, !0)), + this._notify(this._init, t, "install")); + const n = s ? this._descriptors(t).filter(s) : this._descriptors(t), + o = this._notify(n, t, e, i); + return ( + "afterDestroy" === e && + (this._notify(n, t, "stop"), + this._notify(this._init, t, "uninstall")), + o + ); + } + _notify(t, e, i, s) { + s = s || {}; + for (const n of t) { + const t = n.plugin; + if (!1 === c(t[i], [e, s, n.options], t) && s.cancelable) return !1; + } + return !0; + } + invalidate() { + i(this._cache) || + ((this._oldCache = this._cache), (this._cache = void 0)); + } + _descriptors(t) { + if (this._cache) return this._cache; + const e = (this._cache = this._createDescriptors(t)); + return this._notifyStateChanges(t), e; + } + _createDescriptors(t, e) { + const i = t && t.config, + s = r(i.options && i.options.plugins, {}), + n = (function(t) { + const e = {}, + i = [], + s = Object.keys(Js.plugins.items); + for (let t = 0; t < s.length; t++) i.push(Js.getPlugin(s[t])); + const n = t.plugins || []; + for (let t = 0; t < n.length; t++) { + const s = n[t]; + -1 === i.indexOf(s) && (i.push(s), (e[s.id] = !0)); + } + return { plugins: i, localIds: e }; + })(i); + return !1 !== s || e + ? (function(t, { plugins: e, localIds: i }, s, n) { + const o = [], + a = t.getContext(); + for (const r of e) { + const e = r.id, + l = tn(s[e], n); + null !== l && + o.push({ + plugin: r, + options: en(t.config, { plugin: r, local: i[e] }, l, a) + }); + } + return o; + })(t, n, s, e) + : []; + } + _notifyStateChanges(t) { + const e = this._oldCache || [], + i = this._cache, + s = (t, e) => t.filter(t => !e.some(e => t.plugin.id === e.plugin.id)); + this._notify(s(e, i), t, "stop"), this._notify(s(i, e), t, "start"); + } + } + function tn(t, e) { + return e || !1 !== t ? (!0 === t ? {} : t) : null; + } + function en(t, { plugin: e, local: i }, s, n) { + const o = t.pluginScopeKeys(e), + a = t.getOptionScopes(s, o); + return ( + i && e.defaults && a.push(e.defaults), + t.createResolver(a, n, [""], { + scriptable: !1, + indexable: !1, + allKeys: !0 + }) + ); + } + function sn(t, e) { + const i = ue.datasets[t] || {}; + return ( + ((e.datasets || {})[t] || {}).indexAxis || + e.indexAxis || + i.indexAxis || + "x" + ); + } + function nn(t, e) { + if ("x" === t || "y" === t || "r" === t) return t; + var i; + if ( + (t = + e.axis || + ("top" === (i = e.position) || "bottom" === i + ? "x" + : "left" === i || "right" === i + ? "y" + : void 0) || + (t.length > 1 && nn(t[0].toLowerCase(), e))) + ) + return t; + throw new Error( + `Cannot determine type of '${name}' axis. Please provide 'axis' or 'position' option.` + ); + } + function on(t) { + const e = t.options || (t.options = {}); + (e.plugins = r(e.plugins, {})), + (e.scales = (function(t, e) { + const i = re[t.type] || { scales: {} }, + s = e.scales || {}, + o = sn(t.type, e), + a = Object.create(null); + return ( + Object.keys(s).forEach(t => { + const e = s[t]; + if (!n(e)) + return console.error( + `Invalid scale configuration for scale: ${t}` + ); + if (e._proxy) + return console.warn( + `Ignoring resolver passed as options for scale: ${t}` + ); + const r = nn(t, e), + l = (function(t, e) { + return t === e ? "_index_" : "_value_"; + })(r, o), + h = i.scales || {}; + a[t] = b(Object.create(null), [{ axis: r }, e, h[r], h[l]]); + }), + t.data.datasets.forEach(i => { + const n = i.type || t.type, + o = i.indexAxis || sn(n, e), + r = (re[n] || {}).scales || {}; + Object.keys(r).forEach(t => { + const e = (function(t, e) { + let i = t; + return ( + "_index_" === t + ? (i = e) + : "_value_" === t && (i = "x" === e ? "y" : "x"), + i + ); + })(t, o), + n = i[e + "AxisID"] || e; + (a[n] = a[n] || Object.create(null)), + b(a[n], [{ axis: e }, s[n], r[t]]); + }); + }), + Object.keys(a).forEach(t => { + const e = a[t]; + b(e, [ue.scales[e.type], ue.scale]); + }), + a + ); + })(t, e)); + } + function an(t) { + return ( + ((t = t || {}).datasets = t.datasets || []), + (t.labels = t.labels || []), + t + ); + } + const rn = new Map(), + ln = new Set(); + function hn(t, e) { + let i = rn.get(t); + return i || ((i = e()), rn.set(t, i), ln.add(i)), i; + } + const cn = (t, e, i) => { + const s = v(e, i); + void 0 !== s && t.add(s); + }; + class dn { + constructor(t) { + (this._config = (function(t) { + return ((t = t || {}).data = an(t.data)), on(t), t; + })(t)), + (this._scopeCache = new Map()), + (this._resolverCache = new Map()); + } + get platform() { + return this._config.platform; + } + get type() { + return this._config.type; + } + set type(t) { + this._config.type = t; + } + get data() { + return this._config.data; + } + set data(t) { + this._config.data = an(t); + } + get options() { + return this._config.options; + } + set options(t) { + this._config.options = t; + } + get plugins() { + return this._config.plugins; + } + update() { + const t = this._config; + this.clearCache(), on(t); + } + clearCache() { + this._scopeCache.clear(), this._resolverCache.clear(); + } + datasetScopeKeys(t) { + return hn(t, () => [[`datasets.${t}`, ""]]); + } + datasetAnimationScopeKeys(t, e) { + return hn(`${t}.transition.${e}`, () => [ + [`datasets.${t}.transitions.${e}`, `transitions.${e}`], + [`datasets.${t}`, ""] + ]); + } + datasetElementScopeKeys(t, e) { + return hn(`${t}-${e}`, () => [ + [`datasets.${t}.elements.${e}`, `datasets.${t}`, `elements.${e}`, ""] + ]); + } + pluginScopeKeys(t) { + const e = t.id; + return hn(`${this.type}-plugin-${e}`, () => [ + [`plugins.${e}`, ...(t.additionalOptionScopes || [])] + ]); + } + _cachedScopes(t, e) { + const i = this._scopeCache; + let s = i.get(t); + return (s && !e) || ((s = new Map()), i.set(t, s)), s; + } + getOptionScopes(t, e, i) { + const { options: s, type: n } = this, + o = this._cachedScopes(t, i), + a = o.get(e); + if (a) return a; + const r = new Set(); + e.forEach(e => { + t && (r.add(t), e.forEach(e => cn(r, t, e))), + e.forEach(t => cn(r, s, t)), + e.forEach(t => cn(r, re[n] || {}, t)), + e.forEach(t => cn(r, ue, t)), + e.forEach(t => cn(r, le, t)); + }); + const l = Array.from(r); + return ( + 0 === l.length && l.push(Object.create(null)), + ln.has(e) && o.set(e, l), + l + ); + } + chartOptionScopes() { + const { options: t, type: e } = this; + return [t, re[e] || {}, ue.datasets[e] || {}, { type: e }, ue, le]; + } + resolveNamedOptions(t, e, i, n = [""]) { + const o = { $shared: !0 }, + { resolver: a, subPrefixes: r } = un(this._resolverCache, t, n); + let l = a; + if ( + (function(t, e) { + const { isScriptable: i, isIndexable: n } = $e(t); + for (const o of e) { + const e = i(o), + a = n(o), + r = (a || e) && t[o]; + if ((e && (k(r) || fn(r))) || (a && s(r))) return !0; + } + return !1; + })(a, e) + ) { + o.$shared = !1; + l = je(a, (i = k(i) ? i() : i), this.createResolver(t, i, r)); + } + for (const t of e) o[t] = l[t]; + return o; + } + createResolver(t, e, i = [""], s) { + const { resolver: o } = un(this._resolverCache, t, i); + return n(e) ? je(o, e, void 0, s) : o; + } + } + function un(t, e, i) { + let s = t.get(e); + s || ((s = new Map()), t.set(e, s)); + const n = i.join(); + let o = s.get(n); + if (!o) { + (o = { + resolver: He(e, i), + subPrefixes: i.filter(t => !t.toLowerCase().includes("hover")) + }), + s.set(n, o); + } + return o; + } + const fn = t => + n(t) && Object.getOwnPropertyNames(t).reduce((e, i) => e || k(t[i]), !1); + const gn = ["top", "bottom", "left", "right", "chartArea"]; + function pn(t, e) { + return "top" === t || "bottom" === t || (-1 === gn.indexOf(t) && "x" === e); + } + function mn(t, e) { + return function(i, s) { + return i[t] === s[t] ? i[e] - s[e] : i[t] - s[t]; + }; + } + function bn(t) { + const e = t.chart, + i = e.options.animation; + e.notifyPlugins("afterRender"), c(i && i.onComplete, [t], e); + } + function xn(t) { + const e = t.chart, + i = e.options.animation; + c(i && i.onProgress, [t], e); + } + function _n(t) { + return ( + fe() && "string" == typeof t + ? (t = document.getElementById(t)) + : t && t.length && (t = t[0]), + t && t.canvas && (t = t.canvas), + t + ); + } + const yn = {}, + vn = t => { + const e = _n(t); + return Object.values(yn) + .filter(t => t.canvas === e) + .pop(); + }; + function Mn(t, e, i) { + const s = Object.keys(t); + for (const n of s) { + const s = +n; + if (s >= e) { + const o = t[n]; + delete t[n], (i > 0 || s > e) && (t[s + i] = o); + } + } + } + class wn { + static defaults = ue; + static instances = yn; + static overrides = re; + static registry = Js; + static version = "4.0.1"; + static getChart = vn; + static register(...t) { + Js.add(...t), kn(); + } + static unregister(...t) { + Js.remove(...t), kn(); + } + constructor(t, i) { + const s = (this.config = new dn(i)), + n = _n(t), + o = vn(n); + if (o) + throw new Error( + "Canvas is already in use. Chart with ID '" + + o.id + + "' must be destroyed before the canvas with ID '" + + o.canvas.id + + "' can be reused." + ); + const a = s.createResolver(s.chartOptionScopes(), this.getContext()); + (this.platform = new (s.platform || Ms(n))()), + this.platform.updateConfig(s); + const r = this.platform.acquireContext(n, a.aspectRatio), + l = r && r.canvas, + h = l && l.height, + c = l && l.width; + (this.id = e()), + (this.ctx = r), + (this.canvas = l), + (this.width = c), + (this.height = h), + (this._options = a), + (this._aspectRatio = this.aspectRatio), + (this._layers = []), + (this._metasets = []), + (this._stacks = void 0), + (this.boxes = []), + (this.currentDevicePixelRatio = void 0), + (this.chartArea = void 0), + (this._active = []), + (this._lastEvent = void 0), + (this._listeners = {}), + (this._responsiveListeners = void 0), + (this._sortedMetasets = []), + (this.scales = {}), + (this._plugins = new Qs()), + (this.$proxies = {}), + (this._hiddenIndices = {}), + (this.attached = !1), + (this._animationsDisabled = void 0), + (this.$context = void 0), + (this._doResize = ct(t => this.update(t), a.resizeDelay || 0)), + (this._dataChanges = []), + (yn[this.id] = this), + r && l + ? (bt.listen(this, "complete", bn), + bt.listen(this, "progress", xn), + this._initialize(), + this.attached && this.update()) + : console.error( + "Failed to create chart: can't acquire context from the given item" + ); + } + get aspectRatio() { + const { + options: { aspectRatio: t, maintainAspectRatio: e }, + width: s, + height: n, + _aspectRatio: o + } = this; + return i(t) ? (e && o ? o : n ? s / n : null) : t; + } + get data() { + return this.config.data; + } + set data(t) { + this.config.data = t; + } + get options() { + return this._options; + } + set options(t) { + this.config.options = t; + } + get registry() { + return Js; + } + _initialize() { + return ( + this.notifyPlugins("beforeInit"), + this.options.responsive + ? this.resize() + : we(this, this.options.devicePixelRatio), + this.bindEvents(), + this.notifyPlugins("afterInit"), + this + ); + } + clear() { + return Ae(this.canvas, this.ctx), this; + } + stop() { + return bt.stop(this), this; + } + resize(t, e) { + bt.running(this) + ? (this._resizeBeforeDraw = { width: t, height: e }) + : this._resize(t, e); + } + _resize(t, e) { + const i = this.options, + s = this.canvas, + n = i.maintainAspectRatio && this.aspectRatio, + o = this.platform.getMaximumSize(s, t, e, n), + a = i.devicePixelRatio || this.platform.getDevicePixelRatio(), + r = this.width ? "resize" : "attach"; + (this.width = o.width), + (this.height = o.height), + (this._aspectRatio = this.aspectRatio), + we(this, a, !0) && + (this.notifyPlugins("resize", { size: o }), + c(i.onResize, [this, o], this), + this.attached && this._doResize(r) && this.render()); + } + ensureScalesHaveIDs() { + d(this.options.scales || {}, (t, e) => { + t.id = e; + }); + } + buildOrUpdateScales() { + const t = this.options, + e = t.scales, + i = this.scales, + s = Object.keys(i).reduce((t, e) => ((t[e] = !1), t), {}); + let n = []; + e && + (n = n.concat( + Object.keys(e).map(t => { + const i = e[t], + s = nn(t, i), + n = "r" === s, + o = "x" === s; + return { + options: i, + dposition: n ? "chartArea" : o ? "bottom" : "left", + dtype: n ? "radialLinear" : o ? "category" : "linear" + }; + }) + )), + d(n, e => { + const n = e.options, + o = n.id, + a = nn(o, n), + l = r(n.type, e.dtype); + (void 0 !== n.position && pn(n.position, a) === pn(e.dposition)) || + (n.position = e.dposition), + (s[o] = !0); + let h = null; + if (o in i && i[o].type === l) h = i[o]; + else { + (h = new (Js.getScale(l))({ + id: o, + type: l, + ctx: this.ctx, + chart: this + })), + (i[h.id] = h); + } + h.init(n, t); + }), + d(s, (t, e) => { + t || delete i[e]; + }), + d(i, t => { + os.configure(this, t, t.options), os.addBox(this, t); + }); + } + _updateMetasets() { + const t = this._metasets, + e = this.data.datasets.length, + i = t.length; + if ((t.sort((t, e) => t.index - e.index), i > e)) { + for (let t = e; t < i; ++t) this._destroyDatasetMeta(t); + t.splice(e, i - e); + } + this._sortedMetasets = t.slice(0).sort(mn("order", "index")); + } + _removeUnreferencedMetasets() { + const { + _metasets: t, + data: { datasets: e } + } = this; + t.length > e.length && delete this._stacks, + t.forEach((t, i) => { + 0 === e.filter(e => e === t._dataset).length && + this._destroyDatasetMeta(i); + }); + } + buildOrUpdateControllers() { + const t = [], + e = this.data.datasets; + let i, s; + for ( + this._removeUnreferencedMetasets(), i = 0, s = e.length; + i < s; + i++ + ) { + const s = e[i]; + let n = this.getDatasetMeta(i); + const o = s.type || this.config.type; + if ( + (n.type && + n.type !== o && + (this._destroyDatasetMeta(i), (n = this.getDatasetMeta(i))), + (n.type = o), + (n.indexAxis = s.indexAxis || sn(o, this.options)), + (n.order = s.order || 0), + (n.index = i), + (n.label = "" + s.label), + (n.visible = this.isDatasetVisible(i)), + n.controller) + ) + n.controller.updateIndex(i), n.controller.linkScales(); + else { + const e = Js.getController(o), + { datasetElementType: s, dataElementType: a } = ue.datasets[o]; + Object.assign(e, { + dataElementType: Js.getElement(a), + datasetElementType: s && Js.getElement(s) + }), + (n.controller = new e(this, i)), + t.push(n.controller); + } + } + return this._updateMetasets(), t; + } + _resetElements() { + d( + this.data.datasets, + (t, e) => { + this.getDatasetMeta(e).controller.reset(); + }, + this + ); + } + reset() { + this._resetElements(), this.notifyPlugins("reset"); + } + update(t) { + const e = this.config; + e.update(); + const i = (this._options = e.createResolver( + e.chartOptionScopes(), + this.getContext() + )), + s = (this._animationsDisabled = !i.animation); + if ( + (this._updateScales(), + this._checkEventBindings(), + this._updateHiddenIndices(), + this._plugins.invalidate(), + !1 === this.notifyPlugins("beforeUpdate", { mode: t, cancelable: !0 })) + ) + return; + const n = this.buildOrUpdateControllers(); + this.notifyPlugins("beforeElementsUpdate"); + let o = 0; + for (let t = 0, e = this.data.datasets.length; t < e; t++) { + const { controller: e } = this.getDatasetMeta(t), + i = !s && -1 === n.indexOf(e); + e.buildOrUpdateElements(i), (o = Math.max(+e.getMaxOverflow(), o)); + } + (o = this._minPadding = i.layout.autoPadding ? o : 0), + this._updateLayout(o), + s || + d(n, t => { + t.reset(); + }), + this._updateDatasets(t), + this.notifyPlugins("afterUpdate", { mode: t }), + this._layers.sort(mn("z", "_idx")); + const { _active: a, _lastEvent: r } = this; + r + ? this._eventHandler(r, !0) + : a.length && this._updateHoverStyles(a, a, !0), + this.render(); + } + _updateScales() { + d(this.scales, t => { + os.removeBox(this, t); + }), + this.ensureScalesHaveIDs(), + this.buildOrUpdateScales(); + } + _checkEventBindings() { + const t = this.options, + e = new Set(Object.keys(this._listeners)), + i = new Set(t.events); + (S(e, i) && !!this._responsiveListeners === t.responsive) || + (this.unbindEvents(), this.bindEvents()); + } + _updateHiddenIndices() { + const { _hiddenIndices: t } = this, + e = this._getUniformDataChanges() || []; + for (const { method: i, start: s, count: n } of e) { + Mn(t, s, "_removeElements" === i ? -n : n); + } + } + _getUniformDataChanges() { + const t = this._dataChanges; + if (!t || !t.length) return; + this._dataChanges = []; + const e = this.data.datasets.length, + i = e => + new Set( + t + .filter(t => t[0] === e) + .map((t, e) => e + "," + t.splice(1).join(",")) + ), + s = i(0); + for (let t = 1; t < e; t++) if (!S(s, i(t))) return; + return Array.from(s) + .map(t => t.split(",")) + .map(t => ({ method: t[1], start: +t[2], count: +t[3] })); + } + _updateLayout(t) { + if (!1 === this.notifyPlugins("beforeLayout", { cancelable: !0 })) return; + os.update(this, this.width, this.height, t); + const e = this.chartArea, + i = e.width <= 0 || e.height <= 0; + (this._layers = []), + d( + this.boxes, + t => { + (i && "chartArea" === t.position) || + (t.configure && t.configure(), this._layers.push(...t._layers())); + }, + this + ), + this._layers.forEach((t, e) => { + t._idx = e; + }), + this.notifyPlugins("afterLayout"); + } + _updateDatasets(t) { + if ( + !1 !== + this.notifyPlugins("beforeDatasetsUpdate", { mode: t, cancelable: !0 }) + ) { + for (let t = 0, e = this.data.datasets.length; t < e; ++t) + this.getDatasetMeta(t).controller.configure(); + for (let e = 0, i = this.data.datasets.length; e < i; ++e) + this._updateDataset(e, k(t) ? t({ datasetIndex: e }) : t); + this.notifyPlugins("afterDatasetsUpdate", { mode: t }); + } + } + _updateDataset(t, e) { + const i = this.getDatasetMeta(t), + s = { meta: i, index: t, mode: e, cancelable: !0 }; + !1 !== this.notifyPlugins("beforeDatasetUpdate", s) && + (i.controller._update(e), + (s.cancelable = !1), + this.notifyPlugins("afterDatasetUpdate", s)); + } + render() { + !1 !== this.notifyPlugins("beforeRender", { cancelable: !0 }) && + (bt.has(this) + ? this.attached && !bt.running(this) && bt.start(this) + : (this.draw(), bn({ chart: this }))); + } + draw() { + let t; + if (this._resizeBeforeDraw) { + const { width: t, height: e } = this._resizeBeforeDraw; + this._resize(t, e), (this._resizeBeforeDraw = null); + } + if ((this.clear(), this.width <= 0 || this.height <= 0)) return; + if (!1 === this.notifyPlugins("beforeDraw", { cancelable: !0 })) return; + const e = this._layers; + for (t = 0; t < e.length && e[t].z <= 0; ++t) e[t].draw(this.chartArea); + for (this._drawDatasets(); t < e.length; ++t) e[t].draw(this.chartArea); + this.notifyPlugins("afterDraw"); + } + _getSortedDatasetMetas(t) { + const e = this._sortedMetasets, + i = []; + let s, n; + for (s = 0, n = e.length; s < n; ++s) { + const n = e[s]; + (t && !n.visible) || i.push(n); + } + return i; + } + getSortedVisibleDatasetMetas() { + return this._getSortedDatasetMetas(!0); + } + _drawDatasets() { + if (!1 === this.notifyPlugins("beforeDatasetsDraw", { cancelable: !0 })) + return; + const t = this.getSortedVisibleDatasetMetas(); + for (let e = t.length - 1; e >= 0; --e) this._drawDataset(t[e]); + this.notifyPlugins("afterDatasetsDraw"); + } + _drawDataset(t) { + const e = this.ctx, + i = t._clip, + s = !i.disabled, + n = + (function(t) { + const { xScale: e, yScale: i } = t; + if (e && i) + return { + left: e.left, + right: e.right, + top: i.top, + bottom: i.bottom + }; + })(t) || this.chartArea, + o = { meta: t, index: t.index, cancelable: !0 }; + !1 !== this.notifyPlugins("beforeDatasetDraw", o) && + (s && + Re(e, { + left: !1 === i.left ? 0 : n.left - i.left, + right: !1 === i.right ? this.width : n.right + i.right, + top: !1 === i.top ? 0 : n.top - i.top, + bottom: !1 === i.bottom ? this.height : n.bottom + i.bottom + }), + t.controller.draw(), + s && Ie(e), + (o.cancelable = !1), + this.notifyPlugins("afterDatasetDraw", o)); + } + isPointInArea(t) { + return Ee(t, this.chartArea, this._minPadding); + } + getElementsAtEventForMode(t, e, i, s) { + const n = Ui.modes[e]; + return "function" == typeof n ? n(this, t, i, s) : []; + } + getDatasetMeta(t) { + const e = this.data.datasets[t], + i = this._metasets; + let s = i.filter(t => t && t._dataset === e).pop(); + return ( + s || + ((s = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, + xAxisID: null, + yAxisID: null, + order: (e && e.order) || 0, + index: t, + _dataset: e, + _parsed: [], + _sorted: !1 + }), + i.push(s)), + s + ); + } + getContext() { + return ( + this.$context || + (this.$context = Di(null, { chart: this, type: "chart" })) + ); + } + getVisibleDatasetCount() { + return this.getSortedVisibleDatasetMetas().length; + } + isDatasetVisible(t) { + const e = this.data.datasets[t]; + if (!e) return !1; + const i = this.getDatasetMeta(t); + return "boolean" == typeof i.hidden ? !i.hidden : !e.hidden; + } + setDatasetVisibility(t, e) { + this.getDatasetMeta(t).hidden = !e; + } + toggleDataVisibility(t) { + this._hiddenIndices[t] = !this._hiddenIndices[t]; + } + getDataVisibility(t) { + return !this._hiddenIndices[t]; + } + _updateVisibility(t, e, i) { + const s = i ? "show" : "hide", + n = this.getDatasetMeta(t), + o = n.controller._resolveAnimations(void 0, s); + w(e) + ? ((n.data[e].hidden = !i), this.update()) + : (this.setDatasetVisibility(t, i), + o.update(n, { visible: i }), + this.update(e => (e.datasetIndex === t ? s : void 0))); + } + hide(t, e) { + this._updateVisibility(t, e, !1); + } + show(t, e) { + this._updateVisibility(t, e, !0); + } + _destroyDatasetMeta(t) { + const e = this._metasets[t]; + e && e.controller && e.controller._destroy(), delete this._metasets[t]; + } + _stop() { + let t, e; + for ( + this.stop(), bt.remove(this), t = 0, e = this.data.datasets.length; + t < e; + ++t + ) + this._destroyDatasetMeta(t); + } + destroy() { + this.notifyPlugins("beforeDestroy"); + const { canvas: t, ctx: e } = this; + this._stop(), + this.config.clearCache(), + t && + (this.unbindEvents(), + Ae(t, e), + this.platform.releaseContext(e), + (this.canvas = null), + (this.ctx = null)), + delete yn[this.id], + this.notifyPlugins("afterDestroy"); + } + toBase64Image(...t) { + return this.canvas.toDataURL(...t); + } + bindEvents() { + this.bindUserEvents(), + this.options.responsive + ? this.bindResponsiveEvents() + : (this.attached = !0); + } + bindUserEvents() { + const t = this._listeners, + e = this.platform, + i = (i, s) => { + e.addEventListener(this, i, s), (t[i] = s); + }, + s = (t, e, i) => { + (t.offsetX = e), (t.offsetY = i), this._eventHandler(t); + }; + d(this.options.events, t => i(t, s)); + } + bindResponsiveEvents() { + this._responsiveListeners || (this._responsiveListeners = {}); + const t = this._responsiveListeners, + e = this.platform, + i = (i, s) => { + e.addEventListener(this, i, s), (t[i] = s); + }, + s = (i, s) => { + t[i] && (e.removeEventListener(this, i, s), delete t[i]); + }, + n = (t, e) => { + this.canvas && this.resize(t, e); + }; + let o; + const a = () => { + s("attach", a), + (this.attached = !0), + this.resize(), + i("resize", n), + i("detach", o); + }; + (o = () => { + (this.attached = !1), + s("resize", n), + this._stop(), + this._resize(0, 0), + i("attach", a); + }), + e.isAttached(this.canvas) ? a() : o(); + } + unbindEvents() { + d(this._listeners, (t, e) => { + this.platform.removeEventListener(this, e, t); + }), + (this._listeners = {}), + d(this._responsiveListeners, (t, e) => { + this.platform.removeEventListener(this, e, t); + }), + (this._responsiveListeners = void 0); + } + updateHoverStyle(t, e, i) { + const s = i ? "set" : "remove"; + let n, o, a, r; + for ( + "dataset" === e && + ((n = this.getDatasetMeta(t[0].datasetIndex)), + n.controller["_" + s + "DatasetHoverStyle"]()), + a = 0, + r = t.length; + a < r; + ++a + ) { + o = t[a]; + const e = o && this.getDatasetMeta(o.datasetIndex).controller; + e && e[s + "HoverStyle"](o.element, o.datasetIndex, o.index); + } + } + getActiveElements() { + return this._active || []; + } + setActiveElements(t) { + const e = this._active || [], + i = t.map(({ datasetIndex: t, index: e }) => { + const i = this.getDatasetMeta(t); + if (!i) throw new Error("No dataset found at index " + t); + return { datasetIndex: t, element: i.data[e], index: e }; + }); + !u(i, e) && + ((this._active = i), + (this._lastEvent = null), + this._updateHoverStyles(i, e)); + } + notifyPlugins(t, e, i) { + return this._plugins.notify(this, t, e, i); + } + isPluginEnabled(t) { + return 1 === this._plugins._cache.filter(e => e.plugin.id === t).length; + } + _updateHoverStyles(t, e, i) { + const s = this.options.hover, + n = (t, e) => + t.filter( + t => + !e.some( + e => t.datasetIndex === e.datasetIndex && t.index === e.index + ) + ), + o = n(e, t), + a = i ? t : n(t, e); + o.length && this.updateHoverStyle(o, s.mode, !1), + a.length && s.mode && this.updateHoverStyle(a, s.mode, !0); + } + _eventHandler(t, e) { + const i = { + event: t, + replay: e, + cancelable: !0, + inChartArea: this.isPointInArea(t) + }, + s = e => + (e.options.events || this.options.events).includes(t.native.type); + if (!1 === this.notifyPlugins("beforeEvent", i, s)) return; + const n = this._handleEvent(t, e, i.inChartArea); + return ( + (i.cancelable = !1), + this.notifyPlugins("afterEvent", i, s), + (n || i.changed) && this.render(), + this + ); + } + _handleEvent(t, e, i) { + const { _active: s = [], options: n } = this, + o = e, + a = this._getActiveElements(t, s, i, o), + r = P(t), + l = (function(t, e, i, s) { + return i && "mouseout" !== t.type ? (s ? e : t) : null; + })(t, this._lastEvent, i, r); + i && + ((this._lastEvent = null), + c(n.onHover, [t, a, this], this), + r && c(n.onClick, [t, a, this], this)); + const h = !u(a, s); + return ( + (h || e) && ((this._active = a), this._updateHoverStyles(a, s, e)), + (this._lastEvent = l), + h + ); + } + _getActiveElements(t, e, i, s) { + if ("mouseout" === t.type) return []; + if (!i) return e; + const n = this.options.hover; + return this.getElementsAtEventForMode(t, n.mode, n, s); + } + } + function kn() { + return d(wn.instances, t => t._plugins.invalidate()); + } + var Sn = wn; + function Pn() { + throw new Error( + "This method is not implemented: Check that a complete date adapter is provided." + ); + } + class Dn { + static override(t) { + Object.assign(Dn.prototype, t); + } + constructor(t) { + this.options = t || {}; + } + init() {} + formats() { + return Pn(); + } + parse() { + return Pn(); + } + format() { + return Pn(); + } + add() { + return Pn(); + } + diff() { + return Pn(); + } + startOf() { + return Pn(); + } + endOf() { + return Pn(); + } + } + var Cn = { _date: Dn }; + function On(t) { + const e = t.iScale, + i = (function(t, e) { + if (!t._cache.$bar) { + const i = t.getMatchingVisibleMetas(e); + let s = []; + for (let e = 0, n = i.length; e < n; e++) + s = s.concat(i[e].controller.getAllParsedValues(t)); + t._cache.$bar = rt(s.sort((t, e) => t - e)); + } + return t._cache.$bar; + })(e, t.type); + let s, + n, + o, + a, + r = e._length; + const l = () => { + 32767 !== o && + -32768 !== o && + (w(a) && (r = Math.min(r, Math.abs(o - a) || r)), (a = o)); + }; + for (s = 0, n = i.length; s < n; ++s) (o = e.getPixelForValue(i[s])), l(); + for (a = void 0, s = 0, n = e.ticks.length; s < n; ++s) + (o = e.getPixelForTick(s)), l(); + return r; + } + function An(t, e, i, n) { + return ( + s(t) + ? (function(t, e, i, s) { + const n = i.parse(t[0], s), + o = i.parse(t[1], s), + a = Math.min(n, o), + r = Math.max(n, o); + let l = a, + h = r; + Math.abs(a) > Math.abs(r) && ((l = r), (h = a)), + (e[i.axis] = h), + (e._custom = { + barStart: l, + barEnd: h, + start: n, + end: o, + min: a, + max: r + }); + })(t, e, i, n) + : (e[i.axis] = i.parse(t, n)), + e + ); + } + function Tn(t, e, i, s) { + const n = t.iScale, + o = t.vScale, + a = n.getLabels(), + r = n === o, + l = []; + let h, c, d, u; + for (h = i, c = i + s; h < c; ++h) + (u = e[h]), + (d = {}), + (d[n.axis] = r || n.parse(a[h], h)), + l.push(An(u, d, o, h)); + return l; + } + function Ln(t) { + return t && void 0 !== t.barStart && void 0 !== t.barEnd; + } + function En(t, e, i, s) { + let n = e.borderSkipped; + const o = {}; + if (!n) return void (t.borderSkipped = o); + if (!0 === n) + return void (t.borderSkipped = { + top: !0, + right: !0, + bottom: !0, + left: !0 + }); + const { start: a, end: r, reverse: l, top: h, bottom: c } = (function(t) { + let e, i, s, n, o; + return ( + t.horizontal + ? ((e = t.base > t.x), (i = "left"), (s = "right")) + : ((e = t.base < t.y), (i = "bottom"), (s = "top")), + e ? ((n = "end"), (o = "start")) : ((n = "start"), (o = "end")), + { start: i, end: s, reverse: e, top: n, bottom: o } + ); + })(t); + "middle" === n && + i && + ((t.enableBorderRadius = !0), + (i._top || 0) === s + ? (n = h) + : (i._bottom || 0) === s + ? (n = c) + : ((o[Rn(c, a, r, l)] = !0), (n = h))), + (o[Rn(n, a, r, l)] = !0), + (t.borderSkipped = o); + } + function Rn(t, e, i, s) { + var n, o, a; + return ( + s + ? ((a = i), + (t = In((t = (n = t) === (o = e) ? a : n === a ? o : n), i, e))) + : (t = In(t, e, i)), + t + ); + } + function In(t, e, i) { + return "start" === t ? e : "end" === t ? i : t; + } + function zn(t, { inflateAmount: e }, i) { + t.inflateAmount = "auto" === e ? (1 === i ? 0.33 : 0) : e; + } + class Fn extends Bs { + static id = "doughnut"; + static defaults = { + datasetElementType: !1, + dataElementType: "arc", + animation: { animateRotate: !0, animateScale: !1 }, + animations: { + numbers: { + type: "number", + properties: [ + "circumference", + "endAngle", + "innerRadius", + "outerRadius", + "startAngle", + "x", + "y", + "offset", + "borderWidth", + "spacing" + ] + } + }, + cutout: "50%", + rotation: 0, + circumference: 360, + radius: "100%", + spacing: 0, + indexAxis: "r" + }; + static descriptors = { + _scriptable: t => "spacing" !== t, + _indexable: t => "spacing" !== t + }; + static overrides = { + aspectRatio: 1, + plugins: { + legend: { + labels: { + generateLabels(t) { + const e = t.data; + if (e.labels.length && e.datasets.length) { + const { + labels: { pointStyle: i, color: s } + } = t.legend.options; + return e.labels.map((e, n) => { + const o = t.getDatasetMeta(0).controller.getStyle(n); + return { + text: e, + fillStyle: o.backgroundColor, + strokeStyle: o.borderColor, + fontColor: s, + lineWidth: o.borderWidth, + pointStyle: i, + hidden: !t.getDataVisibility(n), + index: n + }; + }); + } + return []; + } + }, + onClick(t, e, i) { + i.chart.toggleDataVisibility(e.index), i.chart.update(); + } + } + } + }; + constructor(t, e) { + super(t, e), + (this.enableOptionSharing = !0), + (this.innerRadius = void 0), + (this.outerRadius = void 0), + (this.offsetX = void 0), + (this.offsetY = void 0); + } + linkScales() {} + parse(t, e) { + const i = this.getDataset().data, + s = this._cachedMeta; + if (!1 === this._parsing) s._parsed = i; + else { + let o, + a, + r = t => +i[t]; + if (n(i[t])) { + const { key: t = "value" } = this._parsing; + r = e => +v(i[e], t); + } + for (o = t, a = t + e; o < a; ++o) s._parsed[o] = r(o); + } + } + _getRotation() { + return j(this.options.rotation - 90); + } + _getCircumference() { + return j(this.options.circumference); + } + _getRotationExtents() { + let t = C, + e = -C; + for (let i = 0; i < this.chart.data.datasets.length; ++i) + if ( + this.chart.isDatasetVisible(i) && + this.chart.getDatasetMeta(i).type === this._type + ) { + const s = this.chart.getDatasetMeta(i).controller, + n = s._getRotation(), + o = s._getCircumference(); + (t = Math.min(t, n)), (e = Math.max(e, n + o)); + } + return { rotation: t, circumference: e - t }; + } + update(t) { + const e = this.chart, + { chartArea: i } = e, + s = this._cachedMeta, + n = s.data, + o = + this.getMaxBorderWidth() + + this.getMaxOffset(n) + + this.options.spacing, + a = Math.max((Math.min(i.width, i.height) - o) / 2, 0), + r = Math.min(l(this.options.cutout, a), 1), + c = this._getRingWeight(this.index), + { circumference: d, rotation: u } = this._getRotationExtents(), + { ratioX: f, ratioY: g, offsetX: p, offsetY: m } = (function(t, e, i) { + let s = 1, + n = 1, + o = 0, + a = 0; + if (e < C) { + const r = t, + l = r + e, + h = Math.cos(r), + c = Math.sin(r), + d = Math.cos(l), + u = Math.sin(l), + f = (t, e, s) => + G(t, r, l, !0) ? 1 : Math.max(e, e * i, s, s * i), + g = (t, e, s) => + G(t, r, l, !0) ? -1 : Math.min(e, e * i, s, s * i), + p = f(0, h, d), + m = f(L, c, u), + b = g(D, h, d), + x = g(D + L, c, u); + (s = (p - b) / 2), + (n = (m - x) / 2), + (o = -(p + b) / 2), + (a = -(m + x) / 2); + } + return { ratioX: s, ratioY: n, offsetX: o, offsetY: a }; + })(u, d, r), + b = (i.width - o) / f, + x = (i.height - o) / g, + _ = Math.max(Math.min(b, x) / 2, 0), + y = h(this.options.radius, _), + v = (y - Math.max(y * r, 0)) / this._getVisibleDatasetWeightTotal(); + (this.offsetX = p * y), + (this.offsetY = m * y), + (s.total = this.calculateTotal()), + (this.outerRadius = y - v * this._getRingWeightOffset(this.index)), + (this.innerRadius = Math.max(this.outerRadius - v * c, 0)), + this.updateElements(n, 0, n.length, t); + } + _circumference(t, e) { + const i = this.options, + s = this._cachedMeta, + n = this._getCircumference(); + return (e && i.animation.animateRotate) || + !this.chart.getDataVisibility(t) || + null === s._parsed[t] || + s.data[t].hidden + ? 0 + : this.calculateCircumference((s._parsed[t] * n) / C); + } + updateElements(t, e, i, s) { + const n = "reset" === s, + o = this.chart, + a = o.chartArea, + r = o.options.animation, + l = (a.left + a.right) / 2, + h = (a.top + a.bottom) / 2, + c = n && r.animateScale, + d = c ? 0 : this.innerRadius, + u = c ? 0 : this.outerRadius, + { sharedOptions: f, includeOptions: g } = this._getSharedOptions(e, s); + let p, + m = this._getRotation(); + for (p = 0; p < e; ++p) m += this._circumference(p, n); + for (p = e; p < e + i; ++p) { + const e = this._circumference(p, n), + i = t[p], + o = { + x: l + this.offsetX, + y: h + this.offsetY, + startAngle: m, + endAngle: m + e, + circumference: e, + outerRadius: u, + innerRadius: d + }; + g && + (o.options = + f || this.resolveDataElementOptions(p, i.active ? "active" : s)), + (m += e), + this.updateElement(i, p, o, s); + } + } + calculateTotal() { + const t = this._cachedMeta, + e = t.data; + let i, + s = 0; + for (i = 0; i < e.length; i++) { + const n = t._parsed[i]; + null === n || + isNaN(n) || + !this.chart.getDataVisibility(i) || + e[i].hidden || + (s += Math.abs(n)); + } + return s; + } + calculateCircumference(t) { + const e = this._cachedMeta.total; + return e > 0 && !isNaN(t) ? C * (Math.abs(t) / e) : 0; + } + getLabelAndValue(t) { + const e = this._cachedMeta, + i = this.chart, + s = i.data.labels || [], + n = ne(e._parsed[t], i.options.locale); + return { label: s[t] || "", value: n }; + } + getMaxBorderWidth(t) { + let e = 0; + const i = this.chart; + let s, n, o, a, r; + if (!t) + for (s = 0, n = i.data.datasets.length; s < n; ++s) + if (i.isDatasetVisible(s)) { + (o = i.getDatasetMeta(s)), (t = o.data), (a = o.controller); + break; + } + if (!t) return 0; + for (s = 0, n = t.length; s < n; ++s) + (r = a.resolveDataElementOptions(s)), + "inner" !== r.borderAlign && + (e = Math.max(e, r.borderWidth || 0, r.hoverBorderWidth || 0)); + return e; + } + getMaxOffset(t) { + let e = 0; + for (let i = 0, s = t.length; i < s; ++i) { + const t = this.resolveDataElementOptions(i); + e = Math.max(e, t.offset || 0, t.hoverOffset || 0); + } + return e; + } + _getRingWeightOffset(t) { + let e = 0; + for (let i = 0; i < t; ++i) + this.chart.isDatasetVisible(i) && (e += this._getRingWeight(i)); + return e; + } + _getRingWeight(t) { + return Math.max(r(this.chart.data.datasets[t].weight, 1), 0); + } + _getVisibleDatasetWeightTotal() { + return this._getRingWeightOffset(this.chart.data.datasets.length) || 1; + } + } + var Vn = Object.freeze({ + __proto__: null, + BarController: class extends Bs { + static id = "bar"; + static defaults = { + datasetElementType: !1, + dataElementType: "bar", + categoryPercentage: 0.8, + barPercentage: 0.9, + grouped: !0, + animations: { + numbers: { + type: "number", + properties: ["x", "y", "base", "width", "height"] + } + } + }; + static overrides = { + scales: { + _index_: { type: "category", offset: !0, grid: { offset: !0 } }, + _value_: { type: "linear", beginAtZero: !0 } + } + }; + parsePrimitiveData(t, e, i, s) { + return Tn(t, e, i, s); + } + parseArrayData(t, e, i, s) { + return Tn(t, e, i, s); + } + parseObjectData(t, e, i, s) { + const { iScale: n, vScale: o } = t, + { xAxisKey: a = "x", yAxisKey: r = "y" } = this._parsing, + l = "x" === n.axis ? a : r, + h = "x" === o.axis ? a : r, + c = []; + let d, u, f, g; + for (d = i, u = i + s; d < u; ++d) + (g = e[d]), + (f = {}), + (f[n.axis] = n.parse(v(g, l), d)), + c.push(An(v(g, h), f, o, d)); + return c; + } + updateRangeFromParsed(t, e, i, s) { + super.updateRangeFromParsed(t, e, i, s); + const n = i._custom; + n && + e === this._cachedMeta.vScale && + ((t.min = Math.min(t.min, n.min)), (t.max = Math.max(t.max, n.max))); + } + getMaxOverflow() { + return 0; + } + getLabelAndValue(t) { + const e = this._cachedMeta, + { iScale: i, vScale: s } = e, + n = this.getParsed(t), + o = n._custom, + a = Ln(o) + ? "[" + o.start + ", " + o.end + "]" + : "" + s.getLabelForValue(n[s.axis]); + return { label: "" + i.getLabelForValue(n[i.axis]), value: a }; + } + initialize() { + (this.enableOptionSharing = !0), super.initialize(); + this._cachedMeta.stack = this.getDataset().stack; + } + update(t) { + const e = this._cachedMeta; + this.updateElements(e.data, 0, e.data.length, t); + } + updateElements(t, e, s, n) { + const o = "reset" === n, + { + index: a, + _cachedMeta: { vScale: r } + } = this, + l = r.getBasePixel(), + h = r.isHorizontal(), + c = this._getRuler(), + { sharedOptions: d, includeOptions: u } = this._getSharedOptions( + e, + n + ); + for (let f = e; f < e + s; f++) { + const e = this.getParsed(f), + s = + o || i(e[r.axis]) + ? { base: l, head: l } + : this._calculateBarValuePixels(f), + g = this._calculateBarIndexPixels(f, c), + p = (e._stacks || {})[r.axis], + m = { + horizontal: h, + base: s.base, + enableBorderRadius: + !p || Ln(e._custom) || a === p._top || a === p._bottom, + x: h ? s.head : g.center, + y: h ? g.center : s.head, + height: h ? g.size : Math.abs(s.size), + width: h ? Math.abs(s.size) : g.size + }; + u && + (m.options = + d || + this.resolveDataElementOptions(f, t[f].active ? "active" : n)); + const b = m.options || t[f].options; + En(m, b, p, a), zn(m, b, c.ratio), this.updateElement(t[f], f, m, n); + } + } + _getStacks(t, e) { + const { iScale: s } = this._cachedMeta, + n = s + .getMatchingVisibleMetas(this._type) + .filter(t => t.controller.options.grouped), + o = s.options.stacked, + a = [], + r = t => { + const s = t.controller.getParsed(e), + n = s && s[t.vScale.axis]; + if (i(n) || isNaN(n)) return !0; + }; + for (const i of n) + if ( + (void 0 === e || !r(i)) && + ((!1 === o || + -1 === a.indexOf(i.stack) || + (void 0 === o && void 0 === i.stack)) && + a.push(i.stack), + i.index === t) + ) + break; + return a.length || a.push(void 0), a; + } + _getStackCount(t) { + return this._getStacks(void 0, t).length; + } + _getStackIndex(t, e, i) { + const s = this._getStacks(t, i), + n = void 0 !== e ? s.indexOf(e) : -1; + return -1 === n ? s.length - 1 : n; + } + _getRuler() { + const t = this.options, + e = this._cachedMeta, + i = e.iScale, + s = []; + let n, o; + for (n = 0, o = e.data.length; n < o; ++n) + s.push(i.getPixelForValue(this.getParsed(n)[i.axis], n)); + const a = t.barThickness; + return { + min: a || On(e), + pixels: s, + start: i._startPixel, + end: i._endPixel, + stackCount: this._getStackCount(), + scale: i, + grouped: t.grouped, + ratio: a ? 1 : t.categoryPercentage * t.barPercentage + }; + } + _calculateBarValuePixels(t) { + const { + _cachedMeta: { vScale: e, _stacked: s }, + options: { base: n, minBarLength: o } + } = this, + a = n || 0, + r = this.getParsed(t), + l = r._custom, + h = Ln(l); + let c, + d, + u = r[e.axis], + f = 0, + g = s ? this.applyStack(e, r, s) : u; + g !== u && ((f = g - u), (g = u)), + h && + ((u = l.barStart), + (g = l.barEnd - l.barStart), + 0 !== u && z(u) !== z(l.barEnd) && (f = 0), + (f += u)); + const p = i(n) || h ? f : n; + let m = e.getPixelForValue(p); + if ( + ((c = this.chart.getDataVisibility(t) + ? e.getPixelForValue(f + g) + : m), + (d = c - m), + Math.abs(d) < o) + ) { + (d = + (function(t, e, i) { + return 0 !== t + ? z(t) + : (e.isHorizontal() ? 1 : -1) * (e.min >= i ? 1 : -1); + })(d, e, a) * o), + u === a && (m -= d / 2); + const t = e.getPixelForDecimal(0), + i = e.getPixelForDecimal(1), + s = Math.min(t, i), + n = Math.max(t, i); + (m = Math.max(Math.min(m, n), s)), (c = m + d); + } + if (m === e.getPixelForValue(a)) { + const t = (z(d) * e.getLineWidthForValue(a)) / 2; + (m += t), (d -= t); + } + return { size: d, base: m, head: c, center: c + d / 2 }; + } + _calculateBarIndexPixels(t, e) { + const s = e.scale, + n = this.options, + o = n.skipNull, + a = r(n.maxBarThickness, 1 / 0); + let l, h; + if (e.grouped) { + const s = o ? this._getStackCount(t) : e.stackCount, + r = + "flex" === n.barThickness + ? (function(t, e, i, s) { + const n = e.pixels, + o = n[t]; + let a = t > 0 ? n[t - 1] : null, + r = t < n.length - 1 ? n[t + 1] : null; + const l = i.categoryPercentage; + null === a && + (a = o - (null === r ? e.end - e.start : r - o)), + null === r && (r = o + o - a); + const h = o - ((o - Math.min(a, r)) / 2) * l; + return { + chunk: ((Math.abs(r - a) / 2) * l) / s, + ratio: i.barPercentage, + start: h + }; + })(t, e, n, s) + : (function(t, e, s, n) { + const o = s.barThickness; + let a, r; + return ( + i(o) + ? ((a = e.min * s.categoryPercentage), + (r = s.barPercentage)) + : ((a = o * n), (r = 1)), + { chunk: a / n, ratio: r, start: e.pixels[t] - a / 2 } + ); + })(t, e, n, s), + c = this._getStackIndex( + this.index, + this._cachedMeta.stack, + o ? t : void 0 + ); + (l = r.start + r.chunk * c + r.chunk / 2), + (h = Math.min(a, r.chunk * r.ratio)); + } else + (l = s.getPixelForValue(this.getParsed(t)[s.axis], t)), + (h = Math.min(a, e.min * e.ratio)); + return { base: l - h / 2, head: l + h / 2, center: l, size: h }; + } + draw() { + const t = this._cachedMeta, + e = t.vScale, + i = t.data, + s = i.length; + let n = 0; + for (; n < s; ++n) + null !== this.getParsed(n)[e.axis] && i[n].draw(this._ctx); + } + }, + BubbleController: class extends Bs { + static id = "bubble"; + static defaults = { + datasetElementType: !1, + dataElementType: "point", + animations: { + numbers: { + type: "number", + properties: ["x", "y", "borderWidth", "radius"] + } + } + }; + static overrides = { + scales: { x: { type: "linear" }, y: { type: "linear" } } + }; + initialize() { + (this.enableOptionSharing = !0), super.initialize(); + } + parsePrimitiveData(t, e, i, s) { + const n = super.parsePrimitiveData(t, e, i, s); + for (let t = 0; t < n.length; t++) + n[t]._custom = this.resolveDataElementOptions(t + i).radius; + return n; + } + parseArrayData(t, e, i, s) { + const n = super.parseArrayData(t, e, i, s); + for (let t = 0; t < n.length; t++) { + const s = e[i + t]; + n[t]._custom = r(s[2], this.resolveDataElementOptions(t + i).radius); + } + return n; + } + parseObjectData(t, e, i, s) { + const n = super.parseObjectData(t, e, i, s); + for (let t = 0; t < n.length; t++) { + const s = e[i + t]; + n[t]._custom = r( + s && s.r && +s.r, + this.resolveDataElementOptions(t + i).radius + ); + } + return n; + } + getMaxOverflow() { + const t = this._cachedMeta.data; + let e = 0; + for (let i = t.length - 1; i >= 0; --i) + e = Math.max(e, t[i].size(this.resolveDataElementOptions(i)) / 2); + return e > 0 && e; + } + getLabelAndValue(t) { + const e = this._cachedMeta, + i = this.chart.data.labels || [], + { xScale: s, yScale: n } = e, + o = this.getParsed(t), + a = s.getLabelForValue(o.x), + r = n.getLabelForValue(o.y), + l = o._custom; + return { + label: i[t] || "", + value: "(" + a + ", " + r + (l ? ", " + l : "") + ")" + }; + } + update(t) { + const e = this._cachedMeta.data; + this.updateElements(e, 0, e.length, t); + } + updateElements(t, e, i, s) { + const n = "reset" === s, + { iScale: o, vScale: a } = this._cachedMeta, + { sharedOptions: r, includeOptions: l } = this._getSharedOptions( + e, + s + ), + h = o.axis, + c = a.axis; + for (let d = e; d < e + i; d++) { + const e = t[d], + i = !n && this.getParsed(d), + u = {}, + f = (u[h] = n + ? o.getPixelForDecimal(0.5) + : o.getPixelForValue(i[h])), + g = (u[c] = n ? a.getBasePixel() : a.getPixelForValue(i[c])); + (u.skip = isNaN(f) || isNaN(g)), + l && + ((u.options = + r || + this.resolveDataElementOptions(d, e.active ? "active" : s)), + n && (u.options.radius = 0)), + this.updateElement(e, d, u, s); + } + } + resolveDataElementOptions(t, e) { + const i = this.getParsed(t); + let s = super.resolveDataElementOptions(t, e); + s.$shared && (s = Object.assign({}, s, { $shared: !1 })); + const n = s.radius; + return ( + "active" !== e && (s.radius = 0), + (s.radius += r(i && i._custom, n)), + s + ); + } + }, + DoughnutController: Fn, + LineController: class extends Bs { + static id = "line"; + static defaults = { + datasetElementType: "line", + dataElementType: "point", + showLine: !0, + spanGaps: !1 + }; + static overrides = { + scales: { _index_: { type: "category" }, _value_: { type: "linear" } } + }; + initialize() { + (this.enableOptionSharing = !0), + (this.supportsDecimation = !0), + super.initialize(); + } + update(t) { + const e = this._cachedMeta, + { dataset: i, data: s = [], _dataset: n } = e, + o = this.chart._animationsDisabled; + let { start: a, count: r } = gt(e, s, o); + (this._drawStart = a), + (this._drawCount = r), + pt(e) && ((a = 0), (r = s.length)), + (i._chart = this.chart), + (i._datasetIndex = this.index), + (i._decimated = !!n._decimated), + (i.points = s); + const l = this.resolveDatasetElementOptions(t); + this.options.showLine || (l.borderWidth = 0), + (l.segment = this.options.segment), + this.updateElement(i, void 0, { animated: !o, options: l }, t), + this.updateElements(s, a, r, t); + } + updateElements(t, e, s, n) { + const o = "reset" === n, + { iScale: a, vScale: r, _stacked: l, _dataset: h } = this._cachedMeta, + { sharedOptions: c, includeOptions: d } = this._getSharedOptions( + e, + n + ), + u = a.axis, + f = r.axis, + { spanGaps: g, segment: p } = this.options, + m = N(g) ? g : Number.POSITIVE_INFINITY, + b = this.chart._animationsDisabled || o || "none" === n, + x = e + s, + _ = t.length; + let y = e > 0 && this.getParsed(e - 1); + for (let s = 0; s < _; ++s) { + const g = t[s], + _ = b ? g : {}; + if (s < e || s >= x) { + _.skip = !0; + continue; + } + const v = this.getParsed(s), + M = i(v[f]), + w = (_[u] = a.getPixelForValue(v[u], s)), + k = (_[f] = + o || M + ? r.getBasePixel() + : r.getPixelForValue(l ? this.applyStack(r, v, l) : v[f], s)); + (_.skip = isNaN(w) || isNaN(k) || M), + (_.stop = s > 0 && Math.abs(v[u] - y[u]) > m), + p && ((_.parsed = v), (_.raw = h.data[s])), + d && + (_.options = + c || + this.resolveDataElementOptions(s, g.active ? "active" : n)), + b || this.updateElement(g, s, _, n), + (y = v); + } + } + getMaxOverflow() { + const t = this._cachedMeta, + e = t.dataset, + i = (e.options && e.options.borderWidth) || 0, + s = t.data || []; + if (!s.length) return i; + const n = s[0].size(this.resolveDataElementOptions(0)), + o = s[s.length - 1].size( + this.resolveDataElementOptions(s.length - 1) + ); + return Math.max(i, n, o) / 2; + } + draw() { + const t = this._cachedMeta; + t.dataset.updateControlPoints(this.chart.chartArea, t.iScale.axis), + super.draw(); + } + }, + PolarAreaController: class extends Bs { + static id = "polarArea"; + static defaults = { + dataElementType: "arc", + animation: { animateRotate: !0, animateScale: !0 }, + animations: { + numbers: { + type: "number", + properties: [ + "x", + "y", + "startAngle", + "endAngle", + "innerRadius", + "outerRadius" + ] + } + }, + indexAxis: "r", + startAngle: 0 + }; + static overrides = { + aspectRatio: 1, + plugins: { + legend: { + labels: { + generateLabels(t) { + const e = t.data; + if (e.labels.length && e.datasets.length) { + const { + labels: { pointStyle: i, color: s } + } = t.legend.options; + return e.labels.map((e, n) => { + const o = t.getDatasetMeta(0).controller.getStyle(n); + return { + text: e, + fillStyle: o.backgroundColor, + strokeStyle: o.borderColor, + fontColor: s, + lineWidth: o.borderWidth, + pointStyle: i, + hidden: !t.getDataVisibility(n), + index: n + }; + }); + } + return []; + } + }, + onClick(t, e, i) { + i.chart.toggleDataVisibility(e.index), i.chart.update(); + } + } + }, + scales: { + r: { + type: "radialLinear", + angleLines: { display: !1 }, + beginAtZero: !0, + grid: { circular: !0 }, + pointLabels: { display: !1 }, + startAngle: 0 + } + } + }; + constructor(t, e) { + super(t, e), (this.innerRadius = void 0), (this.outerRadius = void 0); + } + getLabelAndValue(t) { + const e = this._cachedMeta, + i = this.chart, + s = i.data.labels || [], + n = ne(e._parsed[t].r, i.options.locale); + return { label: s[t] || "", value: n }; + } + parseObjectData(t, e, i, s) { + return ei.bind(this)(t, e, i, s); + } + update(t) { + const e = this._cachedMeta.data; + this._updateRadius(), this.updateElements(e, 0, e.length, t); + } + getMinMax() { + const t = this._cachedMeta, + e = { min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY }; + return ( + t.data.forEach((t, i) => { + const s = this.getParsed(i).r; + !isNaN(s) && + this.chart.getDataVisibility(i) && + (s < e.min && (e.min = s), s > e.max && (e.max = s)); + }), + e + ); + } + _updateRadius() { + const t = this.chart, + e = t.chartArea, + i = t.options, + s = Math.min(e.right - e.left, e.bottom - e.top), + n = Math.max(s / 2, 0), + o = + (n - + Math.max( + i.cutoutPercentage ? (n / 100) * i.cutoutPercentage : 1, + 0 + )) / + t.getVisibleDatasetCount(); + (this.outerRadius = n - o * this.index), + (this.innerRadius = this.outerRadius - o); + } + updateElements(t, e, i, s) { + const n = "reset" === s, + o = this.chart, + a = o.options.animation, + r = this._cachedMeta.rScale, + l = r.xCenter, + h = r.yCenter, + c = r.getIndexAngle(0) - 0.5 * D; + let d, + u = c; + const f = 360 / this.countVisibleElements(); + for (d = 0; d < e; ++d) u += this._computeAngle(d, s, f); + for (d = e; d < e + i; d++) { + const e = t[d]; + let i = u, + g = u + this._computeAngle(d, s, f), + p = o.getDataVisibility(d) + ? r.getDistanceFromCenterForValue(this.getParsed(d).r) + : 0; + (u = g), + n && (a.animateScale && (p = 0), a.animateRotate && (i = g = c)); + const m = { + x: l, + y: h, + innerRadius: 0, + outerRadius: p, + startAngle: i, + endAngle: g, + options: this.resolveDataElementOptions(d, e.active ? "active" : s) + }; + this.updateElement(e, d, m, s); + } + } + countVisibleElements() { + const t = this._cachedMeta; + let e = 0; + return ( + t.data.forEach((t, i) => { + !isNaN(this.getParsed(i).r) && + this.chart.getDataVisibility(i) && + e++; + }), + e + ); + } + _computeAngle(t, e, i) { + return this.chart.getDataVisibility(t) + ? j(this.resolveDataElementOptions(t, e).angle || i) + : 0; + } + }, + PieController: class extends Fn { + static id = "pie"; + static defaults = { + cutout: 0, + rotation: 0, + circumference: 360, + radius: "100%" + }; + }, + RadarController: class extends Bs { + static id = "radar"; + static defaults = { + datasetElementType: "line", + dataElementType: "point", + indexAxis: "r", + showLine: !0, + elements: { line: { fill: "start" } } + }; + static overrides = { + aspectRatio: 1, + scales: { r: { type: "radialLinear" } } + }; + getLabelAndValue(t) { + const e = this._cachedMeta.vScale, + i = this.getParsed(t); + return { + label: e.getLabels()[t], + value: "" + e.getLabelForValue(i[e.axis]) + }; + } + parseObjectData(t, e, i, s) { + return ei.bind(this)(t, e, i, s); + } + update(t) { + const e = this._cachedMeta, + i = e.dataset, + s = e.data || [], + n = e.iScale.getLabels(); + if (((i.points = s), "resize" !== t)) { + const e = this.resolveDatasetElementOptions(t); + this.options.showLine || (e.borderWidth = 0); + const o = { _loop: !0, _fullLoop: n.length === s.length, options: e }; + this.updateElement(i, void 0, o, t); + } + this.updateElements(s, 0, s.length, t); + } + updateElements(t, e, i, s) { + const n = this._cachedMeta.rScale, + o = "reset" === s; + for (let a = e; a < e + i; a++) { + const e = t[a], + i = this.resolveDataElementOptions(a, e.active ? "active" : s), + r = n.getPointPositionForValue(a, this.getParsed(a).r), + l = o ? n.xCenter : r.x, + h = o ? n.yCenter : r.y, + c = { + x: l, + y: h, + angle: r.angle, + skip: isNaN(l) || isNaN(h), + options: i + }; + this.updateElement(e, a, c, s); + } + } + }, + ScatterController: class extends Bs { + static id = "scatter"; + static defaults = { + datasetElementType: !1, + dataElementType: "point", + showLine: !1, + fill: !1 + }; + static overrides = { + interaction: { mode: "point" }, + scales: { x: { type: "linear" }, y: { type: "linear" } } + }; + getLabelAndValue(t) { + const e = this._cachedMeta, + i = this.chart.data.labels || [], + { xScale: s, yScale: n } = e, + o = this.getParsed(t), + a = s.getLabelForValue(o.x), + r = n.getLabelForValue(o.y); + return { label: i[t] || "", value: "(" + a + ", " + r + ")" }; + } + update(t) { + const e = this._cachedMeta, + { data: i = [] } = e, + s = this.chart._animationsDisabled; + let { start: n, count: o } = gt(e, i, s); + if ( + ((this._drawStart = n), + (this._drawCount = o), + pt(e) && ((n = 0), (o = i.length)), + this.options.showLine) + ) { + const { dataset: n, _dataset: o } = e; + (n._chart = this.chart), + (n._datasetIndex = this.index), + (n._decimated = !!o._decimated), + (n.points = i); + const a = this.resolveDatasetElementOptions(t); + (a.segment = this.options.segment), + this.updateElement(n, void 0, { animated: !s, options: a }, t); + } + this.updateElements(i, n, o, t); + } + addElements() { + const { showLine: t } = this.options; + !this.datasetElementType && + t && + (this.datasetElementType = this.chart.registry.getElement("line")), + super.addElements(); + } + updateElements(t, e, s, n) { + const o = "reset" === n, + { iScale: a, vScale: r, _stacked: l, _dataset: h } = this._cachedMeta, + c = this.resolveDataElementOptions(e, n), + d = this.getSharedOptions(c), + u = this.includeOptions(n, d), + f = a.axis, + g = r.axis, + { spanGaps: p, segment: m } = this.options, + b = N(p) ? p : Number.POSITIVE_INFINITY, + x = this.chart._animationsDisabled || o || "none" === n; + let _ = e > 0 && this.getParsed(e - 1); + for (let c = e; c < e + s; ++c) { + const e = t[c], + s = this.getParsed(c), + p = x ? e : {}, + y = i(s[g]), + v = (p[f] = a.getPixelForValue(s[f], c)), + M = (p[g] = + o || y + ? r.getBasePixel() + : r.getPixelForValue(l ? this.applyStack(r, s, l) : s[g], c)); + (p.skip = isNaN(v) || isNaN(M) || y), + (p.stop = c > 0 && Math.abs(s[f] - _[f]) > b), + m && ((p.parsed = s), (p.raw = h.data[c])), + u && + (p.options = + d || + this.resolveDataElementOptions(c, e.active ? "active" : n)), + x || this.updateElement(e, c, p, n), + (_ = s); + } + this.updateSharedOptions(d, n, c); + } + getMaxOverflow() { + const t = this._cachedMeta, + e = t.data || []; + if (!this.options.showLine) { + let t = 0; + for (let i = e.length - 1; i >= 0; --i) + t = Math.max(t, e[i].size(this.resolveDataElementOptions(i)) / 2); + return t > 0 && t; + } + const i = t.dataset, + s = (i.options && i.options.borderWidth) || 0; + if (!e.length) return s; + const n = e[0].size(this.resolveDataElementOptions(0)), + o = e[e.length - 1].size( + this.resolveDataElementOptions(e.length - 1) + ); + return Math.max(s, n, o) / 2; + } + } + }); + function Bn(t, e, i, s) { + const n = yi(t.options.borderRadius, [ + "outerStart", + "outerEnd", + "innerStart", + "innerEnd" + ]); + const o = (i - e) / 2, + a = Math.min(o, (s * e) / 2), + r = t => { + const e = ((i - Math.min(o, t)) * s) / 2; + return Z(t, 0, Math.min(o, e)); + }; + return { + outerStart: r(n.outerStart), + outerEnd: r(n.outerEnd), + innerStart: Z(n.innerStart, 0, a), + innerEnd: Z(n.innerEnd, 0, a) + }; + } + function Nn(t, e, i, s) { + return { x: i + t * Math.cos(e), y: s + t * Math.sin(e) }; + } + function Wn(t, e, i, s, n, o) { + const { x: a, y: r, startAngle: l, pixelMargin: h, innerRadius: c } = e, + d = Math.max(e.outerRadius + s + i - h, 0), + u = c > 0 ? c + s + i + h : 0; + let f = 0; + const g = n - l; + if (s) { + const t = ((c > 0 ? c - s : 0) + (d > 0 ? d - s : 0)) / 2; + f = (g - (0 !== t ? (g * t) / (t + s) : g)) / 2; + } + const p = (g - Math.max(0.001, g * d - i / D) / d) / 2, + m = l + p + f, + b = n - p - f, + { outerStart: x, outerEnd: _, innerStart: y, innerEnd: v } = Bn( + e, + u, + d, + b - m + ), + M = d - x, + w = d - _, + k = m + x / M, + S = b - _ / w, + P = u + y, + C = u + v, + O = m + y / P, + A = b - v / C; + if ((t.beginPath(), o)) { + const e = (k + S) / 2; + if ((t.arc(a, r, d, k, e), t.arc(a, r, d, e, S), _ > 0)) { + const e = Nn(w, S, a, r); + t.arc(e.x, e.y, _, S, b + L); + } + const i = Nn(C, b, a, r); + if ((t.lineTo(i.x, i.y), v > 0)) { + const e = Nn(C, A, a, r); + t.arc(e.x, e.y, v, b + L, A + Math.PI); + } + const s = (b - v / u + (m + y / u)) / 2; + if ( + (t.arc(a, r, u, b - v / u, s, !0), + t.arc(a, r, u, s, m + y / u, !0), + y > 0) + ) { + const e = Nn(P, O, a, r); + t.arc(e.x, e.y, y, O + Math.PI, m - L); + } + const n = Nn(M, m, a, r); + if ((t.lineTo(n.x, n.y), x > 0)) { + const e = Nn(M, k, a, r); + t.arc(e.x, e.y, x, m - L, k); + } + } else { + t.moveTo(a, r); + const e = Math.cos(k) * d + a, + i = Math.sin(k) * d + r; + t.lineTo(e, i); + const s = Math.cos(S) * d + a, + n = Math.sin(S) * d + r; + t.lineTo(s, n); + } + t.closePath(); + } + function Hn(t, e, i, s, n) { + const { fullCircles: o, startAngle: a, circumference: r, options: l } = e, + { borderWidth: h, borderJoinStyle: c } = l, + d = "inner" === l.borderAlign; + if (!h) return; + d + ? ((t.lineWidth = 2 * h), (t.lineJoin = c || "round")) + : ((t.lineWidth = h), (t.lineJoin = c || "bevel")); + let u = e.endAngle; + if (o) { + Wn(t, e, i, s, u, n); + for (let e = 0; e < o; ++e) t.stroke(); + isNaN(r) || (u = a + (r % C || C)); + } + d && + (function(t, e, i) { + const { + startAngle: s, + pixelMargin: n, + x: o, + y: a, + outerRadius: r, + innerRadius: l + } = e; + let h = n / r; + t.beginPath(), + t.arc(o, a, r, s - h, i + h), + l > n + ? ((h = n / l), t.arc(o, a, l, i + h, s - h, !0)) + : t.arc(o, a, n, i + L, s - L), + t.closePath(), + t.clip(); + })(t, e, u), + o || (Wn(t, e, i, s, u, n), t.stroke()); + } + function jn(t, e, i = e) { + (t.lineCap = r(i.borderCapStyle, e.borderCapStyle)), + t.setLineDash(r(i.borderDash, e.borderDash)), + (t.lineDashOffset = r(i.borderDashOffset, e.borderDashOffset)), + (t.lineJoin = r(i.borderJoinStyle, e.borderJoinStyle)), + (t.lineWidth = r(i.borderWidth, e.borderWidth)), + (t.strokeStyle = r(i.borderColor, e.borderColor)); + } + function $n(t, e, i) { + t.lineTo(i.x, i.y); + } + function Yn(t, e, i = {}) { + const s = t.length, + { start: n = 0, end: o = s - 1 } = i, + { start: a, end: r } = e, + l = Math.max(n, a), + h = Math.min(o, r), + c = (n < a && o < a) || (n > r && o > r); + return { + count: s, + start: l, + loop: e.loop, + ilen: h < l && !c ? s + h - l : h - l + }; + } + function Un(t, e, i, s) { + const { points: n, options: o } = e, + { count: a, start: r, loop: l, ilen: h } = Yn(n, i, s), + c = (function(t) { + return t.stepped + ? ze + : t.tension || "monotone" === t.cubicInterpolationMode + ? Fe + : $n; + })(o); + let d, + u, + f, + { move: g = !0, reverse: p } = s || {}; + for (d = 0; d <= h; ++d) + (u = n[(r + (p ? h - d : d)) % a]), + u.skip || + (g ? (t.moveTo(u.x, u.y), (g = !1)) : c(t, f, u, p, o.stepped), + (f = u)); + return l && ((u = n[(r + (p ? h : 0)) % a]), c(t, f, u, p, o.stepped)), !!l; + } + function Xn(t, e, i, s) { + const n = e.points, + { count: o, start: a, ilen: r } = Yn(n, i, s), + { move: l = !0, reverse: h } = s || {}; + let c, + d, + u, + f, + g, + p, + m = 0, + b = 0; + const x = t => (a + (h ? r - t : t)) % o, + _ = () => { + f !== g && (t.lineTo(m, g), t.lineTo(m, f), t.lineTo(m, p)); + }; + for (l && ((d = n[x(0)]), t.moveTo(d.x, d.y)), c = 0; c <= r; ++c) { + if (((d = n[x(c)]), d.skip)) continue; + const e = d.x, + i = d.y, + s = 0 | e; + s === u + ? (i < f ? (f = i) : i > g && (g = i), (m = (b * m + e) / ++b)) + : (_(), t.lineTo(e, i), (u = s), (b = 0), (f = g = i)), + (p = i); + } + _(); + } + function qn(t) { + const e = t.options, + i = e.borderDash && e.borderDash.length; + return !( + t._decimated || + t._loop || + e.tension || + "monotone" === e.cubicInterpolationMode || + e.stepped || + i + ) + ? Xn + : Un; + } + const Kn = "function" == typeof Path2D; + function Gn(t, e, i, s) { + Kn && !e.options.segment + ? (function(t, e, i, s) { + let n = e._path; + n || ((n = e._path = new Path2D()), e.path(n, i, s) && n.closePath()), + jn(t, e.options), + t.stroke(n); + })(t, e, i, s) + : (function(t, e, i, s) { + const { segments: n, options: o } = e, + a = qn(e); + for (const r of n) + jn(t, o, r.style), + t.beginPath(), + a(t, e, r, { start: i, end: i + s - 1 }) && t.closePath(), + t.stroke(); + })(t, e, i, s); + } + class Zn extends Ns { + static id = "line"; + static defaults = { + borderCapStyle: "butt", + borderDash: [], + borderDashOffset: 0, + borderJoinStyle: "miter", + borderWidth: 3, + capBezierPoints: !0, + cubicInterpolationMode: "default", + fill: !1, + spanGaps: !1, + stepped: !1, + tension: 0 + }; + static defaultRoutes = { + backgroundColor: "backgroundColor", + borderColor: "borderColor" + }; + static descriptors = { + _scriptable: !0, + _indexable: t => "borderDash" !== t && "fill" !== t + }; + constructor(t) { + super(), + (this.animated = !0), + (this.options = void 0), + (this._chart = void 0), + (this._loop = void 0), + (this._fullLoop = void 0), + (this._path = void 0), + (this._points = void 0), + (this._segments = void 0), + (this._decimated = !1), + (this._pointsUpdated = !1), + (this._datasetIndex = void 0), + t && Object.assign(this, t); + } + updateControlPoints(t, e) { + const i = this.options; + if ( + (i.tension || "monotone" === i.cubicInterpolationMode) && + !i.stepped && + !this._pointsUpdated + ) { + const s = i.spanGaps ? this._loop : this._fullLoop; + li(this._points, i, t, s, e), (this._pointsUpdated = !0); + } + } + set points(t) { + (this._points = t), + delete this._segments, + delete this._path, + (this._pointsUpdated = !1); + } + get points() { + return this._points; + } + get segments() { + return ( + this._segments || (this._segments = Ii(this, this.options.segment)) + ); + } + first() { + const t = this.segments, + e = this.points; + return t.length && e[t[0].start]; + } + last() { + const t = this.segments, + e = this.points, + i = t.length; + return i && e[t[i - 1].end]; + } + interpolate(t, e) { + const i = this.options, + s = t[e], + n = this.points, + o = Ri(this, { property: e, start: s, end: s }); + if (!o.length) return; + const a = [], + r = (function(t) { + return t.stepped + ? pi + : t.tension || "monotone" === t.cubicInterpolationMode + ? mi + : gi; + })(i); + let l, h; + for (l = 0, h = o.length; l < h; ++l) { + const { start: h, end: c } = o[l], + d = n[h], + u = n[c]; + if (d === u) { + a.push(d); + continue; + } + const f = r(d, u, Math.abs((s - d[e]) / (u[e] - d[e])), i.stepped); + (f[e] = t[e]), a.push(f); + } + return 1 === a.length ? a[0] : a; + } + pathSegment(t, e, i) { + return qn(this)(t, this, e, i); + } + path(t, e, i) { + const s = this.segments, + n = qn(this); + let o = this._loop; + (e = e || 0), (i = i || this.points.length - e); + for (const a of s) o &= n(t, this, a, { start: e, end: e + i - 1 }); + return !!o; + } + draw(t, e, i, s) { + const n = this.options || {}; + (this.points || []).length && + n.borderWidth && + (t.save(), Gn(t, this, i, s), t.restore()), + this.animated && ((this._pointsUpdated = !1), (this._path = void 0)); + } + } + function Jn(t, e, i, s) { + const n = t.options, + { [i]: o } = t.getProps([i], s); + return Math.abs(e - o) < n.radius + n.hitRadius; + } + function Qn(t, e) { + const { x: i, y: s, base: n, width: o, height: a } = t.getProps( + ["x", "y", "base", "width", "height"], + e + ); + let r, l, h, c, d; + return ( + t.horizontal + ? ((d = a / 2), + (r = Math.min(i, n)), + (l = Math.max(i, n)), + (h = s - d), + (c = s + d)) + : ((d = o / 2), + (r = i - d), + (l = i + d), + (h = Math.min(s, n)), + (c = Math.max(s, n))), + { left: r, top: h, right: l, bottom: c } + ); + } + function to(t, e, i, s) { + return t ? 0 : Z(e, i, s); + } + function eo(t) { + const e = Qn(t), + i = e.right - e.left, + s = e.bottom - e.top, + o = (function(t, e, i) { + const s = t.options.borderWidth, + n = t.borderSkipped, + o = vi(s); + return { + t: to(n.top, o.top, 0, i), + r: to(n.right, o.right, 0, e), + b: to(n.bottom, o.bottom, 0, i), + l: to(n.left, o.left, 0, e) + }; + })(t, i / 2, s / 2), + a = (function(t, e, i) { + const { enableBorderRadius: s } = t.getProps(["enableBorderRadius"]), + o = t.options.borderRadius, + a = Mi(o), + r = Math.min(e, i), + l = t.borderSkipped, + h = s || n(o); + return { + topLeft: to(!h || l.top || l.left, a.topLeft, 0, r), + topRight: to(!h || l.top || l.right, a.topRight, 0, r), + bottomLeft: to(!h || l.bottom || l.left, a.bottomLeft, 0, r), + bottomRight: to(!h || l.bottom || l.right, a.bottomRight, 0, r) + }; + })(t, i / 2, s / 2); + return { + outer: { x: e.left, y: e.top, w: i, h: s, radius: a }, + inner: { + x: e.left + o.l, + y: e.top + o.t, + w: i - o.l - o.r, + h: s - o.t - o.b, + radius: { + topLeft: Math.max(0, a.topLeft - Math.max(o.t, o.l)), + topRight: Math.max(0, a.topRight - Math.max(o.t, o.r)), + bottomLeft: Math.max(0, a.bottomLeft - Math.max(o.b, o.l)), + bottomRight: Math.max(0, a.bottomRight - Math.max(o.b, o.r)) + } + } + }; + } + function io(t, e, i, s) { + const n = null === e, + o = null === i, + a = t && !(n && o) && Qn(t, s); + return a && (n || Q(e, a.left, a.right)) && (o || Q(i, a.top, a.bottom)); + } + function so(t, e) { + t.rect(e.x, e.y, e.w, e.h); + } + function no(t, e, i = {}) { + const s = t.x !== i.x ? -e : 0, + n = t.y !== i.y ? -e : 0, + o = (t.x + t.w !== i.x + i.w ? e : 0) - s, + a = (t.y + t.h !== i.y + i.h ? e : 0) - n; + return { x: t.x + s, y: t.y + n, w: t.w + o, h: t.h + a, radius: t.radius }; + } + var oo = Object.freeze({ + __proto__: null, + ArcElement: class extends Ns { + static id = "arc"; + static defaults = { + borderAlign: "center", + borderColor: "#fff", + borderJoinStyle: void 0, + borderRadius: 0, + borderWidth: 2, + offset: 0, + spacing: 0, + angle: void 0, + circular: !0 + }; + static defaultRoutes = { backgroundColor: "backgroundColor" }; + constructor(t) { + super(), + (this.options = void 0), + (this.circumference = void 0), + (this.startAngle = void 0), + (this.endAngle = void 0), + (this.innerRadius = void 0), + (this.outerRadius = void 0), + (this.pixelMargin = 0), + (this.fullCircles = 0), + t && Object.assign(this, t); + } + inRange(t, e, i) { + const s = this.getProps(["x", "y"], i), + { angle: n, distance: o } = U(s, { x: t, y: e }), + { + startAngle: a, + endAngle: l, + innerRadius: h, + outerRadius: c, + circumference: d + } = this.getProps( + [ + "startAngle", + "endAngle", + "innerRadius", + "outerRadius", + "circumference" + ], + i + ), + u = this.options.spacing / 2, + f = r(d, l - a) >= C || G(n, a, l), + g = Q(o, h + u, c + u); + return f && g; + } + getCenterPoint(t) { + const { + x: e, + y: i, + startAngle: s, + endAngle: n, + innerRadius: o, + outerRadius: a + } = this.getProps( + [ + "x", + "y", + "startAngle", + "endAngle", + "innerRadius", + "outerRadius", + "circumference" + ], + t + ), + { offset: r, spacing: l } = this.options, + h = (s + n) / 2, + c = (o + a + l + r) / 2; + return { x: e + Math.cos(h) * c, y: i + Math.sin(h) * c }; + } + tooltipPosition(t) { + return this.getCenterPoint(t); + } + draw(t) { + const { options: e, circumference: i } = this, + s = (e.offset || 0) / 4, + n = (e.spacing || 0) / 2, + o = e.circular; + if ( + ((this.pixelMargin = "inner" === e.borderAlign ? 0.33 : 0), + (this.fullCircles = i > C ? Math.floor(i / C) : 0), + 0 === i || this.innerRadius < 0 || this.outerRadius < 0) + ) + return; + t.save(); + const a = (this.startAngle + this.endAngle) / 2; + t.translate(Math.cos(a) * s, Math.sin(a) * s); + const r = s * (1 - Math.sin(Math.min(D, i || 0))); + (t.fillStyle = e.backgroundColor), + (t.strokeStyle = e.borderColor), + (function(t, e, i, s, n) { + const { fullCircles: o, startAngle: a, circumference: r } = e; + let l = e.endAngle; + if (o) { + Wn(t, e, i, s, l, n); + for (let e = 0; e < o; ++e) t.fill(); + isNaN(r) || (l = a + (r % C || C)); + } + Wn(t, e, i, s, l, n), t.fill(); + })(t, this, r, n, o), + Hn(t, this, r, n, o), + t.restore(); + } + }, + LineElement: Zn, + PointElement: class extends Ns { + static id = "point"; + static defaults = { + borderWidth: 1, + hitRadius: 1, + hoverBorderWidth: 1, + hoverRadius: 4, + pointStyle: "circle", + radius: 3, + rotation: 0 + }; + static defaultRoutes = { + backgroundColor: "backgroundColor", + borderColor: "borderColor" + }; + constructor(t) { + super(), + (this.options = void 0), + (this.parsed = void 0), + (this.skip = void 0), + (this.stop = void 0), + t && Object.assign(this, t); + } + inRange(t, e, i) { + const s = this.options, + { x: n, y: o } = this.getProps(["x", "y"], i); + return ( + Math.pow(t - n, 2) + Math.pow(e - o, 2) < + Math.pow(s.hitRadius + s.radius, 2) + ); + } + inXRange(t, e) { + return Jn(this, t, "x", e); + } + inYRange(t, e) { + return Jn(this, t, "y", e); + } + getCenterPoint(t) { + const { x: e, y: i } = this.getProps(["x", "y"], t); + return { x: e, y: i }; + } + size(t) { + let e = (t = t || this.options || {}).radius || 0; + e = Math.max(e, (e && t.hoverRadius) || 0); + return 2 * (e + ((e && t.borderWidth) || 0)); + } + draw(t, e) { + const i = this.options; + this.skip || + i.radius < 0.1 || + !Ee(this, e, this.size(i) / 2) || + ((t.strokeStyle = i.borderColor), + (t.lineWidth = i.borderWidth), + (t.fillStyle = i.backgroundColor), + Te(t, i, this.x, this.y)); + } + getRange() { + const t = this.options || {}; + return t.radius + t.hitRadius; + } + }, + BarElement: class extends Ns { + static id = "bar"; + static defaults = { + borderSkipped: "start", + borderWidth: 0, + borderRadius: 0, + inflateAmount: "auto", + pointStyle: void 0 + }; + static defaultRoutes = { + backgroundColor: "backgroundColor", + borderColor: "borderColor" + }; + constructor(t) { + super(), + (this.options = void 0), + (this.horizontal = void 0), + (this.base = void 0), + (this.width = void 0), + (this.height = void 0), + (this.inflateAmount = void 0), + t && Object.assign(this, t); + } + draw(t) { + const { + inflateAmount: e, + options: { borderColor: i, backgroundColor: s } + } = this, + { inner: n, outer: o } = eo(this), + a = + (r = o.radius).topLeft || + r.topRight || + r.bottomLeft || + r.bottomRight + ? We + : so; + var r; + t.save(), + (o.w === n.w && o.h === n.h) || + (t.beginPath(), + a(t, no(o, e, n)), + t.clip(), + a(t, no(n, -e, o)), + (t.fillStyle = i), + t.fill("evenodd")), + t.beginPath(), + a(t, no(n, e)), + (t.fillStyle = s), + t.fill(), + t.restore(); + } + inRange(t, e, i) { + return io(this, t, e, i); + } + inXRange(t, e) { + return io(this, t, null, e); + } + inYRange(t, e) { + return io(this, null, t, e); + } + getCenterPoint(t) { + const { x: e, y: i, base: s, horizontal: n } = this.getProps( + ["x", "y", "base", "horizontal"], + t + ); + return { x: n ? (e + s) / 2 : e, y: n ? i : (i + s) / 2 }; + } + getRange(t) { + return "x" === t ? this.width / 2 : this.height / 2; + } + } + }); + const ao = [ + "rgb(54, 162, 235)", + "rgb(255, 99, 132)", + "rgb(255, 159, 64)", + "rgb(255, 205, 86)", + "rgb(75, 192, 192)", + "rgb(153, 102, 255)", + "rgb(201, 203, 207)" + ], + ro = ao.map(t => t.replace("rgb(", "rgba(").replace(")", ", 0.5)")); + function lo(t) { + return ao[t % ao.length]; + } + function ho(t) { + return ro[t % ro.length]; + } + function co(t) { + return "doughnut" === t || "pie" === t + ? (function() { + let t = 0; + return e => { + e.backgroundColor = e.data.map(() => lo(t++)); + }; + })() + : "polarArea" === t + ? (function() { + let t = 0; + return e => { + e.backgroundColor = e.data.map(() => ho(t++)); + }; + })() + : (t, e) => { + (t.borderColor = lo(e)), (t.backgroundColor = ho(e)); + }; + } + function uo(t) { + let e; + for (e in t) if (t[e].borderColor || t[e].backgroundColor) return !0; + return !1; + } + var fo = { + id: "colors", + defaults: { enabled: !0 }, + beforeLayout(t, e, i) { + if (!i.enabled) return; + const { + type: s, + options: { elements: n }, + data: { datasets: o } + } = t.config; + if (uo(o) || (n && uo(n))) return; + const a = co(s); + o.forEach(a); + } + }; + function go(t) { + if (t._decimated) { + const e = t._data; + delete t._decimated, + delete t._data, + Object.defineProperty(t, "data", { value: e }); + } + } + function po(t) { + t.data.datasets.forEach(t => { + go(t); + }); + } + var mo = { + id: "decimation", + defaults: { algorithm: "min-max", enabled: !1 }, + beforeElementsUpdate: (t, e, s) => { + if (!s.enabled) return void po(t); + const n = t.width; + t.data.datasets.forEach((e, o) => { + const { _data: a, indexAxis: r } = e, + l = t.getDatasetMeta(o), + h = a || e.data; + if ("y" === Si([r, t.options.indexAxis])) return; + if (!l.controller.supportsDecimation) return; + const c = t.scales[l.xAxisID]; + if ("linear" !== c.type && "time" !== c.type) return; + if (t.options.parsing) return; + let { start: d, count: u } = (function(t, e) { + const i = e.length; + let s, + n = 0; + const { iScale: o } = t, + { + min: a, + max: r, + minDefined: l, + maxDefined: h + } = o.getUserBounds(); + return ( + l && (n = Z(et(e, o.axis, a).lo, 0, i - 1)), + (s = h ? Z(et(e, o.axis, r).hi + 1, n, i) - n : i - n), + { start: n, count: s } + ); + })(l, h); + if (u <= (s.threshold || 4 * n)) return void go(e); + let f; + switch ( + (i(a) && + ((e._data = h), + delete e.data, + Object.defineProperty(e, "data", { + configurable: !0, + enumerable: !0, + get: function() { + return this._decimated; + }, + set: function(t) { + this._data = t; + } + })), + s.algorithm) + ) { + case "lttb": + f = (function(t, e, i, s, n) { + const o = n.samples || s; + if (o >= i) return t.slice(e, e + i); + const a = [], + r = (i - 2) / (o - 2); + let l = 0; + const h = e + i - 1; + let c, + d, + u, + f, + g, + p = e; + for (a[l++] = t[p], c = 0; c < o - 2; c++) { + let s, + n = 0, + o = 0; + const h = Math.floor((c + 1) * r) + 1 + e, + m = Math.min(Math.floor((c + 2) * r) + 1, i) + e, + b = m - h; + for (s = h; s < m; s++) (n += t[s].x), (o += t[s].y); + (n /= b), (o /= b); + const x = Math.floor(c * r) + 1 + e, + _ = Math.min(Math.floor((c + 1) * r) + 1, i) + e, + { x: y, y: v } = t[p]; + for (u = f = -1, s = x; s < _; s++) + (f = + 0.5 * + Math.abs((y - n) * (t[s].y - v) - (y - t[s].x) * (o - v))), + f > u && ((u = f), (d = t[s]), (g = s)); + (a[l++] = d), (p = g); + } + return (a[l++] = t[h]), a; + })(h, d, u, n, s); + break; + case "min-max": + f = (function(t, e, s, n) { + let o, + a, + r, + l, + h, + c, + d, + u, + f, + g, + p = 0, + m = 0; + const b = [], + x = e + s - 1, + _ = t[e].x, + y = t[x].x - _; + for (o = e; o < e + s; ++o) { + (a = t[o]), (r = ((a.x - _) / y) * n), (l = a.y); + const e = 0 | r; + if (e === h) + l < f ? ((f = l), (c = o)) : l > g && ((g = l), (d = o)), + (p = (m * p + a.x) / ++m); + else { + const s = o - 1; + if (!i(c) && !i(d)) { + const e = Math.min(c, d), + i = Math.max(c, d); + e !== u && e !== s && b.push({ ...t[e], x: p }), + i !== u && i !== s && b.push({ ...t[i], x: p }); + } + o > 0 && s !== u && b.push(t[s]), + b.push(a), + (h = e), + (m = 0), + (f = g = l), + (c = d = u = o); + } + } + return b; + })(h, d, u, n); + break; + default: + throw new Error( + `Unsupported decimation algorithm '${s.algorithm}'` + ); + } + e._decimated = f; + }); + }, + destroy(t) { + po(t); + } + }; + function bo(t, e, i, s) { + if (s) return; + let n = e[t], + o = i[t]; + return ( + "angle" === t && ((n = K(n)), (o = K(o))), + { property: t, start: n, end: o } + ); + } + function xo(t, e, i) { + for (; e > t; e--) { + const t = i[e]; + if (!isNaN(t.x) && !isNaN(t.y)) break; + } + return e; + } + function _o(t, e, i, s) { + return t && e ? s(t[i], e[i]) : t ? t[i] : e ? e[i] : 0; + } + function yo(t, e) { + let i = [], + n = !1; + return ( + s(t) + ? ((n = !0), (i = t)) + : (i = (function(t, e) { + const { x: i = null, y: s = null } = t || {}, + n = e.points, + o = []; + return ( + e.segments.forEach(({ start: t, end: e }) => { + e = xo(t, e, n); + const a = n[t], + r = n[e]; + null !== s + ? (o.push({ x: a.x, y: s }), o.push({ x: r.x, y: s })) + : null !== i && + (o.push({ x: i, y: a.y }), o.push({ x: i, y: r.y })); + }), + o + ); + })(t, e)), + i.length + ? new Zn({ points: i, options: { tension: 0 }, _loop: n, _fullLoop: n }) + : null + ); + } + function vo(t) { + return t && !1 !== t.fill; + } + function Mo(t, e, i) { + let s = t[e].fill; + const n = [e]; + let a; + if (!i) return s; + for (; !1 !== s && -1 === n.indexOf(s); ) { + if (!o(s)) return s; + if (((a = t[s]), !a)) return !1; + if (a.visible) return s; + n.push(s), (s = a.fill); + } + return !1; + } + function wo(t, e, i) { + const s = (function(t) { + const e = t.options, + i = e.fill; + let s = r(i && i.target, i); + void 0 === s && (s = !!e.backgroundColor); + if (!1 === s || null === s) return !1; + if (!0 === s) return "origin"; + return s; + })(t); + if (n(s)) return !isNaN(s.value) && s; + let a = parseFloat(s); + return o(a) && Math.floor(a) === a + ? (function(t, e, i, s) { + ("-" !== t && "+" !== t) || (i = e + i); + if (i === e || i < 0 || i >= s) return !1; + return i; + })(s[0], e, a, i) + : ["origin", "start", "end", "stack", "shape"].indexOf(s) >= 0 && s; + } + function ko(t, e, i) { + const s = []; + for (let n = 0; n < i.length; n++) { + const o = i[n], + { first: a, last: r, point: l } = So(o, e, "x"); + if (!(!l || (a && r))) + if (a) s.unshift(l); + else if ((t.push(l), !r)) break; + } + t.push(...s); + } + function So(t, e, i) { + const s = t.interpolate(e, i); + if (!s) return {}; + const n = s[i], + o = t.segments, + a = t.points; + let r = !1, + l = !1; + for (let t = 0; t < o.length; t++) { + const e = o[t], + s = a[e.start][i], + h = a[e.end][i]; + if (Q(n, s, h)) { + (r = n === s), (l = n === h); + break; + } + } + return { first: r, last: l, point: s }; + } + class Po { + constructor(t) { + (this.x = t.x), (this.y = t.y), (this.radius = t.radius); + } + pathSegment(t, e, i) { + const { x: s, y: n, radius: o } = this; + return ( + (e = e || { start: 0, end: C }), + t.arc(s, n, o, e.end, e.start, !0), + !i.bounds + ); + } + interpolate(t) { + const { x: e, y: i, radius: s } = this, + n = t.angle; + return { x: e + Math.cos(n) * s, y: i + Math.sin(n) * s, angle: n }; + } + } + function Do(t) { + const { chart: e, fill: i, line: s } = t; + if (o(i)) + return (function(t, e) { + const i = t.getDatasetMeta(e); + return i && t.isDatasetVisible(e) ? i.dataset : null; + })(e, i); + if ("stack" === i) + return (function(t) { + const { scale: e, index: i, line: s } = t, + n = [], + o = s.segments, + a = s.points, + r = (function(t, e) { + const i = [], + s = t.getMatchingVisibleMetas("line"); + for (let t = 0; t < s.length; t++) { + const n = s[t]; + if (n.index === e) break; + n.hidden || i.unshift(n.dataset); + } + return i; + })(e, i); + r.push(yo({ x: null, y: e.bottom }, s)); + for (let t = 0; t < o.length; t++) { + const e = o[t]; + for (let t = e.start; t <= e.end; t++) ko(n, a[t], r); + } + return new Zn({ points: n, options: {} }); + })(t); + if ("shape" === i) return !0; + const a = (function(t) { + if ((t.scale || {}).getPointPositionForValue) + return (function(t) { + const { scale: e, fill: i } = t, + s = e.options, + o = e.getLabels().length, + a = s.reverse ? e.max : e.min, + r = (function(t, e, i) { + let s; + return ( + (s = + "start" === t + ? i + : "end" === t + ? e.options.reverse + ? e.min + : e.max + : n(t) + ? t.value + : e.getBaseValue()), + s + ); + })(i, e, a), + l = []; + if (s.grid.circular) { + const t = e.getPointPositionForValue(0, a); + return new Po({ + x: t.x, + y: t.y, + radius: e.getDistanceFromCenterForValue(r) + }); + } + for (let t = 0; t < o; ++t) l.push(e.getPointPositionForValue(t, r)); + return l; + })(t); + return (function(t) { + const { scale: e = {}, fill: i } = t, + s = (function(t, e) { + let i = null; + return ( + "start" === t + ? (i = e.bottom) + : "end" === t + ? (i = e.top) + : n(t) + ? (i = e.getPixelForValue(t.value)) + : e.getBasePixel && (i = e.getBasePixel()), + i + ); + })(i, e); + if (o(s)) { + const t = e.isHorizontal(); + return { x: t ? s : null, y: t ? null : s }; + } + return null; + })(t); + })(t); + return a instanceof Po ? a : yo(a, s); + } + function Co(t, e, i) { + const s = Do(e), + { line: n, scale: o, axis: a } = e, + r = n.options, + l = r.fill, + h = r.backgroundColor, + { above: c = h, below: d = h } = l || {}; + s && + n.points.length && + (Re(t, i), + (function(t, e) { + const { line: i, target: s, above: n, below: o, area: a, scale: r } = e, + l = i._loop ? "angle" : e.axis; + t.save(), + "x" === l && + o !== n && + (Oo(t, s, a.top), + Ao(t, { line: i, target: s, color: n, scale: r, property: l }), + t.restore(), + t.save(), + Oo(t, s, a.bottom)); + Ao(t, { line: i, target: s, color: o, scale: r, property: l }), + t.restore(); + })(t, { + line: n, + target: s, + above: c, + below: d, + area: i, + scale: o, + axis: a + }), + Ie(t)); + } + function Oo(t, e, i) { + const { segments: s, points: n } = e; + let o = !0, + a = !1; + t.beginPath(); + for (const r of s) { + const { start: s, end: l } = r, + h = n[s], + c = n[xo(s, l, n)]; + o + ? (t.moveTo(h.x, h.y), (o = !1)) + : (t.lineTo(h.x, i), t.lineTo(h.x, h.y)), + (a = !!e.pathSegment(t, r, { move: a })), + a ? t.closePath() : t.lineTo(c.x, i); + } + t.lineTo(e.first().x, i), t.closePath(), t.clip(); + } + function Ao(t, e) { + const { line: i, target: s, property: n, color: o, scale: a } = e, + r = (function(t, e, i) { + const s = t.segments, + n = t.points, + o = e.points, + a = []; + for (const t of s) { + let { start: s, end: r } = t; + r = xo(s, r, n); + const l = bo(i, n[s], n[r], t.loop); + if (!e.segments) { + a.push({ source: t, target: l, start: n[s], end: n[r] }); + continue; + } + const h = Ri(e, l); + for (const e of h) { + const s = bo(i, o[e.start], o[e.end], e.loop), + r = Ei(t, n, s); + for (const t of r) + a.push({ + source: t, + target: e, + start: { [i]: _o(l, s, "start", Math.max) }, + end: { [i]: _o(l, s, "end", Math.min) } + }); + } + } + return a; + })(i, s, n); + for (const { source: e, target: l, start: h, end: c } of r) { + const { style: { backgroundColor: r = o } = {} } = e, + d = !0 !== s; + t.save(), (t.fillStyle = r), To(t, a, d && bo(n, h, c)), t.beginPath(); + const u = !!i.pathSegment(t, e); + let f; + if (d) { + u ? t.closePath() : Lo(t, s, c, n); + const e = !!s.pathSegment(t, l, { move: u, reverse: !0 }); + (f = u && e), f || Lo(t, s, h, n); + } + t.closePath(), t.fill(f ? "evenodd" : "nonzero"), t.restore(); + } + } + function To(t, e, i) { + const { top: s, bottom: n } = e.chart.chartArea, + { property: o, start: a, end: r } = i || {}; + "x" === o && (t.beginPath(), t.rect(a, s, r - a, n - s), t.clip()); + } + function Lo(t, e, i, s) { + const n = e.interpolate(i, s); + n && t.lineTo(n.x, n.y); + } + var Eo = { + id: "filler", + afterDatasetsUpdate(t, e, i) { + const s = (t.data.datasets || []).length, + n = []; + let o, a, r, l; + for (a = 0; a < s; ++a) + (o = t.getDatasetMeta(a)), + (r = o.dataset), + (l = null), + r && + r.options && + r instanceof Zn && + (l = { + visible: t.isDatasetVisible(a), + index: a, + fill: wo(r, a, s), + chart: t, + axis: o.controller.options.indexAxis, + scale: o.vScale, + line: r + }), + (o.$filler = l), + n.push(l); + for (a = 0; a < s; ++a) + (l = n[a]), l && !1 !== l.fill && (l.fill = Mo(n, a, i.propagate)); + }, + beforeDraw(t, e, i) { + const s = "beforeDraw" === i.drawTime, + n = t.getSortedVisibleDatasetMetas(), + o = t.chartArea; + for (let e = n.length - 1; e >= 0; --e) { + const i = n[e].$filler; + i && + (i.line.updateControlPoints(o, i.axis), + s && i.fill && Co(t.ctx, i, o)); + } + }, + beforeDatasetsDraw(t, e, i) { + if ("beforeDatasetsDraw" !== i.drawTime) return; + const s = t.getSortedVisibleDatasetMetas(); + for (let e = s.length - 1; e >= 0; --e) { + const i = s[e].$filler; + vo(i) && Co(t.ctx, i, t.chartArea); + } + }, + beforeDatasetDraw(t, e, i) { + const s = e.meta.$filler; + vo(s) && "beforeDatasetDraw" === i.drawTime && Co(t.ctx, s, t.chartArea); + }, + defaults: { propagate: !0, drawTime: "beforeDatasetDraw" } + }; + const Ro = (t, e) => { + let { boxHeight: i = e, boxWidth: s = e } = t; + return ( + t.usePointStyle && + ((i = Math.min(i, e)), (s = t.pointStyleWidth || Math.min(s, e))), + { boxWidth: s, boxHeight: i, itemHeight: Math.max(e, i) } + ); + }; + class Io extends Ns { + constructor(t) { + super(), + (this._added = !1), + (this.legendHitBoxes = []), + (this._hoveredItem = null), + (this.doughnutMode = !1), + (this.chart = t.chart), + (this.options = t.options), + (this.ctx = t.ctx), + (this.legendItems = void 0), + (this.columnSizes = void 0), + (this.lineWidths = void 0), + (this.maxHeight = void 0), + (this.maxWidth = void 0), + (this.top = void 0), + (this.bottom = void 0), + (this.left = void 0), + (this.right = void 0), + (this.height = void 0), + (this.width = void 0), + (this._margins = void 0), + (this.position = void 0), + (this.weight = void 0), + (this.fullSize = void 0); + } + update(t, e, i) { + (this.maxWidth = t), + (this.maxHeight = e), + (this._margins = i), + this.setDimensions(), + this.buildLabels(), + this.fit(); + } + setDimensions() { + this.isHorizontal() + ? ((this.width = this.maxWidth), + (this.left = this._margins.left), + (this.right = this.width)) + : ((this.height = this.maxHeight), + (this.top = this._margins.top), + (this.bottom = this.height)); + } + buildLabels() { + const t = this.options.labels || {}; + let e = c(t.generateLabels, [this.chart], this) || []; + t.filter && (e = e.filter(e => t.filter(e, this.chart.data))), + t.sort && (e = e.sort((e, i) => t.sort(e, i, this.chart.data))), + this.options.reverse && e.reverse(), + (this.legendItems = e); + } + fit() { + const { options: t, ctx: e } = this; + if (!t.display) return void (this.width = this.height = 0); + const i = t.labels, + s = ki(i.font), + n = s.size, + o = this._computeTitleHeight(), + { boxWidth: a, itemHeight: r } = Ro(i, n); + let l, h; + (e.font = s.string), + this.isHorizontal() + ? ((l = this.maxWidth), (h = this._fitRows(o, n, a, r) + 10)) + : ((h = this.maxHeight), (l = this._fitCols(o, s, a, r) + 10)), + (this.width = Math.min(l, t.maxWidth || this.maxWidth)), + (this.height = Math.min(h, t.maxHeight || this.maxHeight)); + } + _fitRows(t, e, i, s) { + const { + ctx: n, + maxWidth: o, + options: { + labels: { padding: a } + } + } = this, + r = (this.legendHitBoxes = []), + l = (this.lineWidths = [0]), + h = s + a; + let c = t; + (n.textAlign = "left"), (n.textBaseline = "middle"); + let d = -1, + u = -h; + return ( + this.legendItems.forEach((t, f) => { + const g = i + e / 2 + n.measureText(t.text).width; + (0 === f || l[l.length - 1] + g + 2 * a > o) && + ((c += h), (l[l.length - (f > 0 ? 0 : 1)] = 0), (u += h), d++), + (r[f] = { left: 0, top: u, row: d, width: g, height: s }), + (l[l.length - 1] += g + a); + }), + c + ); + } + _fitCols(t, e, i, s) { + const { + ctx: n, + maxHeight: o, + options: { + labels: { padding: a } + } + } = this, + r = (this.legendHitBoxes = []), + l = (this.columnSizes = []), + h = o - t; + let c = a, + d = 0, + u = 0, + f = 0, + g = 0; + return ( + this.legendItems.forEach((t, o) => { + const { itemWidth: p, itemHeight: m } = (function(t, e, i, s, n) { + const o = (function(t, e, i, s) { + let n = t.text; + n && + "string" != typeof n && + (n = n.reduce((t, e) => (t.length > e.length ? t : e))); + return e + i.size / 2 + s.measureText(n).width; + })(s, t, e, i), + a = (function(t, e, i) { + let s = t; + "string" != typeof e.text && (s = zo(e, i)); + return s; + })(n, s, e.lineHeight); + return { itemWidth: o, itemHeight: a }; + })(i, e, n, t, s); + o > 0 && + u + m + 2 * a > h && + ((c += d + a), + l.push({ width: d, height: u }), + (f += d + a), + g++, + (d = u = 0)), + (r[o] = { left: f, top: u, col: g, width: p, height: m }), + (d = Math.max(d, p)), + (u += m + a); + }), + (c += d), + l.push({ width: d, height: u }), + c + ); + } + adjustHitBoxes() { + if (!this.options.display) return; + const t = this._computeTitleHeight(), + { + legendHitBoxes: e, + options: { + align: i, + labels: { padding: s }, + rtl: n + } + } = this, + o = Ci(n, this.left, this.width); + if (this.isHorizontal()) { + let n = 0, + a = ut(i, this.left + s, this.right - this.lineWidths[n]); + for (const r of e) + n !== r.row && + ((n = r.row), + (a = ut(i, this.left + s, this.right - this.lineWidths[n]))), + (r.top += this.top + t + s), + (r.left = o.leftForLtr(o.x(a), r.width)), + (a += r.width + s); + } else { + let n = 0, + a = ut(i, this.top + t + s, this.bottom - this.columnSizes[n].height); + for (const r of e) + r.col !== n && + ((n = r.col), + (a = ut( + i, + this.top + t + s, + this.bottom - this.columnSizes[n].height + ))), + (r.top = a), + (r.left += this.left + s), + (r.left = o.leftForLtr(o.x(r.left), r.width)), + (a += r.height + s); + } + } + isHorizontal() { + return ( + "top" === this.options.position || "bottom" === this.options.position + ); + } + draw() { + if (this.options.display) { + const t = this.ctx; + Re(t, this), this._draw(), Ie(t); + } + } + _draw() { + const { options: t, columnSizes: e, lineWidths: i, ctx: s } = this, + { align: n, labels: o } = t, + a = ue.color, + l = Ci(t.rtl, this.left, this.width), + h = ki(o.font), + { padding: c } = o, + d = h.size, + u = d / 2; + let f; + this.drawTitle(), + (s.textAlign = l.textAlign("left")), + (s.textBaseline = "middle"), + (s.lineWidth = 0.5), + (s.font = h.string); + const { boxWidth: g, boxHeight: p, itemHeight: m } = Ro(o, d), + b = this.isHorizontal(), + x = this._computeTitleHeight(); + (f = b + ? { + x: ut(n, this.left + c, this.right - i[0]), + y: this.top + c + x, + line: 0 + } + : { + x: this.left + c, + y: ut(n, this.top + x + c, this.bottom - e[0].height), + line: 0 + }), + Oi(this.ctx, t.textDirection); + const _ = m + c; + this.legendItems.forEach((y, v) => { + (s.strokeStyle = y.fontColor), (s.fillStyle = y.fontColor); + const M = s.measureText(y.text).width, + w = l.textAlign(y.textAlign || (y.textAlign = o.textAlign)), + k = g + u + M; + let S = f.x, + P = f.y; + l.setWidth(this.width), + b + ? v > 0 && + S + k + c > this.right && + ((P = f.y += _), + f.line++, + (S = f.x = ut(n, this.left + c, this.right - i[f.line]))) + : v > 0 && + P + _ > this.bottom && + ((S = f.x = S + e[f.line].width + c), + f.line++, + (P = f.y = ut( + n, + this.top + x + c, + this.bottom - e[f.line].height + ))); + if ( + ((function(t, e, i) { + if (isNaN(g) || g <= 0 || isNaN(p) || p < 0) return; + s.save(); + const n = r(i.lineWidth, 1); + if ( + ((s.fillStyle = r(i.fillStyle, a)), + (s.lineCap = r(i.lineCap, "butt")), + (s.lineDashOffset = r(i.lineDashOffset, 0)), + (s.lineJoin = r(i.lineJoin, "miter")), + (s.lineWidth = n), + (s.strokeStyle = r(i.strokeStyle, a)), + s.setLineDash(r(i.lineDash, [])), + o.usePointStyle) + ) { + const a = { + radius: (p * Math.SQRT2) / 2, + pointStyle: i.pointStyle, + rotation: i.rotation, + borderWidth: n + }, + r = l.xPlus(t, g / 2); + Le(s, a, r, e + u, o.pointStyleWidth && g); + } else { + const o = e + Math.max((d - p) / 2, 0), + a = l.leftForLtr(t, g), + r = Mi(i.borderRadius); + s.beginPath(), + Object.values(r).some(t => 0 !== t) + ? We(s, { x: a, y: o, w: g, h: p, radius: r }) + : s.rect(a, o, g, p), + s.fill(), + 0 !== n && s.stroke(); + } + s.restore(); + })(l.x(S), P, y), + (S = ft(w, S + g + u, b ? S + k : this.right, t.rtl)), + (function(t, e, i) { + Ve(s, i.text, t, e + m / 2, h, { + strikethrough: i.hidden, + textAlign: l.textAlign(i.textAlign) + }); + })(l.x(S), P, y), + b) + ) + f.x += k + c; + else if ("string" != typeof y.text) { + const t = h.lineHeight; + f.y += zo(y, t); + } else f.y += _; + }), + Ai(this.ctx, t.textDirection); + } + drawTitle() { + const t = this.options, + e = t.title, + i = ki(e.font), + s = wi(e.padding); + if (!e.display) return; + const n = Ci(t.rtl, this.left, this.width), + o = this.ctx, + a = e.position, + r = i.size / 2, + l = s.top + r; + let h, + c = this.left, + d = this.width; + if (this.isHorizontal()) + (d = Math.max(...this.lineWidths)), + (h = this.top + l), + (c = ut(t.align, c, this.right - d)); + else { + const e = this.columnSizes.reduce((t, e) => Math.max(t, e.height), 0); + h = + l + + ut( + t.align, + this.top, + this.bottom - e - t.labels.padding - this._computeTitleHeight() + ); + } + const u = ut(a, c, c + d); + (o.textAlign = n.textAlign(dt(a))), + (o.textBaseline = "middle"), + (o.strokeStyle = e.color), + (o.fillStyle = e.color), + (o.font = i.string), + Ve(o, e.text, u, h, i); + } + _computeTitleHeight() { + const t = this.options.title, + e = ki(t.font), + i = wi(t.padding); + return t.display ? e.lineHeight + i.height : 0; + } + _getLegendItemAt(t, e) { + let i, s, n; + if (Q(t, this.left, this.right) && Q(e, this.top, this.bottom)) + for (n = this.legendHitBoxes, i = 0; i < n.length; ++i) + if ( + ((s = n[i]), + Q(t, s.left, s.left + s.width) && Q(e, s.top, s.top + s.height)) + ) + return this.legendItems[i]; + return null; + } + handleEvent(t) { + const e = this.options; + if ( + !(function(t, e) { + if ( + ("mousemove" === t || "mouseout" === t) && + (e.onHover || e.onLeave) + ) + return !0; + if (e.onClick && ("click" === t || "mouseup" === t)) return !0; + return !1; + })(t.type, e) + ) + return; + const i = this._getLegendItemAt(t.x, t.y); + if ("mousemove" === t.type || "mouseout" === t.type) { + const o = this._hoveredItem, + a = + ((n = i), + null !== (s = o) && + null !== n && + s.datasetIndex === n.datasetIndex && + s.index === n.index); + o && !a && c(e.onLeave, [t, o, this], this), + (this._hoveredItem = i), + i && !a && c(e.onHover, [t, i, this], this); + } else i && c(e.onClick, [t, i, this], this); + var s, n; + } + } + function zo(t, e) { + return e * (t.text ? t.text.length + 0.5 : 0); + } + var Fo = { + id: "legend", + _element: Io, + start(t, e, i) { + const s = (t.legend = new Io({ ctx: t.ctx, options: i, chart: t })); + os.configure(t, s, i), os.addBox(t, s); + }, + stop(t) { + os.removeBox(t, t.legend), delete t.legend; + }, + beforeUpdate(t, e, i) { + const s = t.legend; + os.configure(t, s, i), (s.options = i); + }, + afterUpdate(t) { + const e = t.legend; + e.buildLabels(), e.adjustHitBoxes(); + }, + afterEvent(t, e) { + e.replay || t.legend.handleEvent(e.event); + }, + defaults: { + display: !0, + position: "top", + align: "center", + fullSize: !0, + reverse: !1, + weight: 1e3, + onClick(t, e, i) { + const s = e.datasetIndex, + n = i.chart; + n.isDatasetVisible(s) + ? (n.hide(s), (e.hidden = !0)) + : (n.show(s), (e.hidden = !1)); + }, + onHover: null, + onLeave: null, + labels: { + color: t => t.chart.options.color, + boxWidth: 40, + padding: 10, + generateLabels(t) { + const e = t.data.datasets, + { + labels: { + usePointStyle: i, + pointStyle: s, + textAlign: n, + color: o, + useBorderRadius: a, + borderRadius: r + } + } = t.legend.options; + return t._getSortedDatasetMetas().map(t => { + const l = t.controller.getStyle(i ? 0 : void 0), + h = wi(l.borderWidth); + return { + text: e[t.index].label, + fillStyle: l.backgroundColor, + fontColor: o, + hidden: !t.visible, + lineCap: l.borderCapStyle, + lineDash: l.borderDash, + lineDashOffset: l.borderDashOffset, + lineJoin: l.borderJoinStyle, + lineWidth: (h.width + h.height) / 4, + strokeStyle: l.borderColor, + pointStyle: s || l.pointStyle, + rotation: l.rotation, + textAlign: n || l.textAlign, + borderRadius: a && (r || l.borderRadius), + datasetIndex: t.index + }; + }, this); + } + }, + title: { + color: t => t.chart.options.color, + display: !1, + position: "center", + text: "" + } + }, + descriptors: { + _scriptable: t => !t.startsWith("on"), + labels: { + _scriptable: t => !["generateLabels", "filter", "sort"].includes(t) + } + } + }; + class Vo extends Ns { + constructor(t) { + super(), + (this.chart = t.chart), + (this.options = t.options), + (this.ctx = t.ctx), + (this._padding = void 0), + (this.top = void 0), + (this.bottom = void 0), + (this.left = void 0), + (this.right = void 0), + (this.width = void 0), + (this.height = void 0), + (this.position = void 0), + (this.weight = void 0), + (this.fullSize = void 0); + } + update(t, e) { + const i = this.options; + if (((this.left = 0), (this.top = 0), !i.display)) + return void (this.width = this.height = this.right = this.bottom = 0); + (this.width = this.right = t), (this.height = this.bottom = e); + const n = s(i.text) ? i.text.length : 1; + this._padding = wi(i.padding); + const o = n * ki(i.font).lineHeight + this._padding.height; + this.isHorizontal() ? (this.height = o) : (this.width = o); + } + isHorizontal() { + const t = this.options.position; + return "top" === t || "bottom" === t; + } + _drawArgs(t) { + const { top: e, left: i, bottom: s, right: n, options: o } = this, + a = o.align; + let r, + l, + h, + c = 0; + return ( + this.isHorizontal() + ? ((l = ut(a, i, n)), (h = e + t), (r = n - i)) + : ("left" === o.position + ? ((l = i + t), (h = ut(a, s, e)), (c = -0.5 * D)) + : ((l = n - t), (h = ut(a, e, s)), (c = 0.5 * D)), + (r = s - e)), + { titleX: l, titleY: h, maxWidth: r, rotation: c } + ); + } + draw() { + const t = this.ctx, + e = this.options; + if (!e.display) return; + const i = ki(e.font), + s = i.lineHeight / 2 + this._padding.top, + { titleX: n, titleY: o, maxWidth: a, rotation: r } = this._drawArgs(s); + Ve(t, e.text, 0, 0, i, { + color: e.color, + maxWidth: a, + rotation: r, + textAlign: dt(e.align), + textBaseline: "middle", + translation: [n, o] + }); + } + } + var Bo = { + id: "title", + _element: Vo, + start(t, e, i) { + !(function(t, e) { + const i = new Vo({ ctx: t.ctx, options: e, chart: t }); + os.configure(t, i, e), os.addBox(t, i), (t.titleBlock = i); + })(t, i); + }, + stop(t) { + const e = t.titleBlock; + os.removeBox(t, e), delete t.titleBlock; + }, + beforeUpdate(t, e, i) { + const s = t.titleBlock; + os.configure(t, s, i), (s.options = i); + }, + defaults: { + align: "center", + display: !1, + font: { weight: "bold" }, + fullSize: !0, + padding: 10, + position: "top", + text: "", + weight: 2e3 + }, + defaultRoutes: { color: "color" }, + descriptors: { _scriptable: !0, _indexable: !1 } + }; + const No = new WeakMap(); + var Wo = { + id: "subtitle", + start(t, e, i) { + const s = new Vo({ ctx: t.ctx, options: i, chart: t }); + os.configure(t, s, i), os.addBox(t, s), No.set(t, s); + }, + stop(t) { + os.removeBox(t, No.get(t)), No.delete(t); + }, + beforeUpdate(t, e, i) { + const s = No.get(t); + os.configure(t, s, i), (s.options = i); + }, + defaults: { + align: "center", + display: !1, + font: { weight: "normal" }, + fullSize: !0, + padding: 0, + position: "top", + text: "", + weight: 1500 + }, + defaultRoutes: { color: "color" }, + descriptors: { _scriptable: !0, _indexable: !1 } + }; + const Ho = { + average(t) { + if (!t.length) return !1; + let e, + i, + s = 0, + n = 0, + o = 0; + for (e = 0, i = t.length; e < i; ++e) { + const i = t[e].element; + if (i && i.hasValue()) { + const t = i.tooltipPosition(); + (s += t.x), (n += t.y), ++o; + } + } + return { x: s / o, y: n / o }; + }, + nearest(t, e) { + if (!t.length) return !1; + let i, + s, + n, + o = e.x, + a = e.y, + r = Number.POSITIVE_INFINITY; + for (i = 0, s = t.length; i < s; ++i) { + const s = t[i].element; + if (s && s.hasValue()) { + const t = X(e, s.getCenterPoint()); + t < r && ((r = t), (n = s)); + } + } + if (n) { + const t = n.tooltipPosition(); + (o = t.x), (a = t.y); + } + return { x: o, y: a }; + } + }; + function jo(t, e) { + return e && (s(e) ? Array.prototype.push.apply(t, e) : t.push(e)), t; + } + function $o(t) { + return ("string" == typeof t || t instanceof String) && t.indexOf("\n") > -1 + ? t.split("\n") + : t; + } + function Yo(t, e) { + const { element: i, datasetIndex: s, index: n } = e, + o = t.getDatasetMeta(s).controller, + { label: a, value: r } = o.getLabelAndValue(n); + return { + chart: t, + label: a, + parsed: o.getParsed(n), + raw: t.data.datasets[s].data[n], + formattedValue: r, + dataset: o.getDataset(), + dataIndex: n, + datasetIndex: s, + element: i + }; + } + function Uo(t, e) { + const i = t.chart.ctx, + { body: s, footer: n, title: o } = t, + { boxWidth: a, boxHeight: r } = e, + l = ki(e.bodyFont), + h = ki(e.titleFont), + c = ki(e.footerFont), + u = o.length, + f = n.length, + g = s.length, + p = wi(e.padding); + let m = p.height, + b = 0, + x = s.reduce( + (t, e) => t + e.before.length + e.lines.length + e.after.length, + 0 + ); + if ( + ((x += t.beforeBody.length + t.afterBody.length), + u && + (m += + u * h.lineHeight + (u - 1) * e.titleSpacing + e.titleMarginBottom), + x) + ) { + m += + g * (e.displayColors ? Math.max(r, l.lineHeight) : l.lineHeight) + + (x - g) * l.lineHeight + + (x - 1) * e.bodySpacing; + } + f && + (m += e.footerMarginTop + f * c.lineHeight + (f - 1) * e.footerSpacing); + let _ = 0; + const y = function(t) { + b = Math.max(b, i.measureText(t).width + _); + }; + return ( + i.save(), + (i.font = h.string), + d(t.title, y), + (i.font = l.string), + d(t.beforeBody.concat(t.afterBody), y), + (_ = e.displayColors ? a + 2 + e.boxPadding : 0), + d(s, t => { + d(t.before, y), d(t.lines, y), d(t.after, y); + }), + (_ = 0), + (i.font = c.string), + d(t.footer, y), + i.restore(), + (b += p.width), + { width: b, height: m } + ); + } + function Xo(t, e, i, s) { + const { x: n, width: o } = i, + { + width: a, + chartArea: { left: r, right: l } + } = t; + let h = "center"; + return ( + "center" === s + ? (h = n <= (r + l) / 2 ? "left" : "right") + : n <= o / 2 + ? (h = "left") + : n >= a - o / 2 && (h = "right"), + (function(t, e, i, s) { + const { x: n, width: o } = s, + a = i.caretSize + i.caretPadding; + return ( + ("left" === t && n + o + a > e.width) || + ("right" === t && n - o - a < 0) || + void 0 + ); + })(h, t, e, i) && (h = "center"), + h + ); + } + function qo(t, e, i) { + const s = + i.yAlign || + e.yAlign || + (function(t, e) { + const { y: i, height: s } = e; + return i < s / 2 ? "top" : i > t.height - s / 2 ? "bottom" : "center"; + })(t, i); + return { xAlign: i.xAlign || e.xAlign || Xo(t, e, i, s), yAlign: s }; + } + function Ko(t, e, i, s) { + const { caretSize: n, caretPadding: o, cornerRadius: a } = t, + { xAlign: r, yAlign: l } = i, + h = n + o, + { topLeft: c, topRight: d, bottomLeft: u, bottomRight: f } = Mi(a); + let g = (function(t, e) { + let { x: i, width: s } = t; + return "right" === e ? (i -= s) : "center" === e && (i -= s / 2), i; + })(e, r); + const p = (function(t, e, i) { + let { y: s, height: n } = t; + return "top" === e ? (s += i) : (s -= "bottom" === e ? n + i : n / 2), s; + })(e, l, h); + return ( + "center" === l + ? "left" === r + ? (g += h) + : "right" === r && (g -= h) + : "left" === r + ? (g -= Math.max(c, u) + n) + : "right" === r && (g += Math.max(d, f) + n), + { x: Z(g, 0, s.width - e.width), y: Z(p, 0, s.height - e.height) } + ); + } + function Go(t, e, i) { + const s = wi(i.padding); + return "center" === e + ? t.x + t.width / 2 + : "right" === e + ? t.x + t.width - s.right + : t.x + s.left; + } + function Zo(t) { + return jo([], $o(t)); + } + function Jo(t, e) { + const i = + e && e.dataset && e.dataset.tooltip && e.dataset.tooltip.callbacks; + return i ? t.override(i) : t; + } + const Qo = { + beforeTitle: t, + title(t) { + if (t.length > 0) { + const e = t[0], + i = e.chart.data.labels, + s = i ? i.length : 0; + if (this && this.options && "dataset" === this.options.mode) + return e.dataset.label || ""; + if (e.label) return e.label; + if (s > 0 && e.dataIndex < s) return i[e.dataIndex]; + } + return ""; + }, + afterTitle: t, + beforeBody: t, + beforeLabel: t, + label(t) { + if (this && this.options && "dataset" === this.options.mode) + return t.label + ": " + t.formattedValue || t.formattedValue; + let e = t.dataset.label || ""; + e && (e += ": "); + const s = t.formattedValue; + return i(s) || (e += s), e; + }, + labelColor(t) { + const e = t.chart + .getDatasetMeta(t.datasetIndex) + .controller.getStyle(t.dataIndex); + return { + borderColor: e.borderColor, + backgroundColor: e.backgroundColor, + borderWidth: e.borderWidth, + borderDash: e.borderDash, + borderDashOffset: e.borderDashOffset, + borderRadius: 0 + }; + }, + labelTextColor() { + return this.options.bodyColor; + }, + labelPointStyle(t) { + const e = t.chart + .getDatasetMeta(t.datasetIndex) + .controller.getStyle(t.dataIndex); + return { pointStyle: e.pointStyle, rotation: e.rotation }; + }, + afterLabel: t, + afterBody: t, + beforeFooter: t, + footer: t, + afterFooter: t + }; + function ta(t, e, i, s) { + const n = t[e].call(i, s); + return void 0 === n ? Qo[e].call(i, s) : n; + } + class ea extends Ns { + static positioners = Ho; + constructor(t) { + super(), + (this.opacity = 0), + (this._active = []), + (this._eventPosition = void 0), + (this._size = void 0), + (this._cachedAnimations = void 0), + (this._tooltipItems = []), + (this.$animations = void 0), + (this.$context = void 0), + (this.chart = t.chart), + (this.options = t.options), + (this.dataPoints = void 0), + (this.title = void 0), + (this.beforeBody = void 0), + (this.body = void 0), + (this.afterBody = void 0), + (this.footer = void 0), + (this.xAlign = void 0), + (this.yAlign = void 0), + (this.x = void 0), + (this.y = void 0), + (this.height = void 0), + (this.width = void 0), + (this.caretX = void 0), + (this.caretY = void 0), + (this.labelColors = void 0), + (this.labelPointStyles = void 0), + (this.labelTextColors = void 0); + } + initialize(t) { + (this.options = t), + (this._cachedAnimations = void 0), + (this.$context = void 0); + } + _resolveAnimations() { + const t = this._cachedAnimations; + if (t) return t; + const e = this.chart, + i = this.options.setContext(this.getContext()), + s = i.enabled && e.options.animation && i.animations, + n = new Ds(this.chart, s); + return s._cacheable && (this._cachedAnimations = Object.freeze(n)), n; + } + getContext() { + return ( + this.$context || + (this.$context = + ((t = this.chart.getContext()), + (e = this), + (i = this._tooltipItems), + Di(t, { tooltip: e, tooltipItems: i, type: "tooltip" }))) + ); + var t, e, i; + } + getTitle(t, e) { + const { callbacks: i } = e, + s = ta(i, "beforeTitle", this, t), + n = ta(i, "title", this, t), + o = ta(i, "afterTitle", this, t); + let a = []; + return (a = jo(a, $o(s))), (a = jo(a, $o(n))), (a = jo(a, $o(o))), a; + } + getBeforeBody(t, e) { + return Zo(ta(e.callbacks, "beforeBody", this, t)); + } + getBody(t, e) { + const { callbacks: i } = e, + s = []; + return ( + d(t, t => { + const e = { before: [], lines: [], after: [] }, + n = Jo(i, t); + jo(e.before, $o(ta(n, "beforeLabel", this, t))), + jo(e.lines, ta(n, "label", this, t)), + jo(e.after, $o(ta(n, "afterLabel", this, t))), + s.push(e); + }), + s + ); + } + getAfterBody(t, e) { + return Zo(ta(e.callbacks, "afterBody", this, t)); + } + getFooter(t, e) { + const { callbacks: i } = e, + s = ta(i, "beforeFooter", this, t), + n = ta(i, "footer", this, t), + o = ta(i, "afterFooter", this, t); + let a = []; + return (a = jo(a, $o(s))), (a = jo(a, $o(n))), (a = jo(a, $o(o))), a; + } + _createItems(t) { + const e = this._active, + i = this.chart.data, + s = [], + n = [], + o = []; + let a, + r, + l = []; + for (a = 0, r = e.length; a < r; ++a) l.push(Yo(this.chart, e[a])); + return ( + t.filter && (l = l.filter((e, s, n) => t.filter(e, s, n, i))), + t.itemSort && (l = l.sort((e, s) => t.itemSort(e, s, i))), + d(l, e => { + const i = Jo(t.callbacks, e); + s.push(ta(i, "labelColor", this, e)), + n.push(ta(i, "labelPointStyle", this, e)), + o.push(ta(i, "labelTextColor", this, e)); + }), + (this.labelColors = s), + (this.labelPointStyles = n), + (this.labelTextColors = o), + (this.dataPoints = l), + l + ); + } + update(t, e) { + const i = this.options.setContext(this.getContext()), + s = this._active; + let n, + o = []; + if (s.length) { + const t = Ho[i.position].call(this, s, this._eventPosition); + (o = this._createItems(i)), + (this.title = this.getTitle(o, i)), + (this.beforeBody = this.getBeforeBody(o, i)), + (this.body = this.getBody(o, i)), + (this.afterBody = this.getAfterBody(o, i)), + (this.footer = this.getFooter(o, i)); + const e = (this._size = Uo(this, i)), + a = Object.assign({}, t, e), + r = qo(this.chart, i, a), + l = Ko(i, a, r, this.chart); + (this.xAlign = r.xAlign), + (this.yAlign = r.yAlign), + (n = { + opacity: 1, + x: l.x, + y: l.y, + width: e.width, + height: e.height, + caretX: t.x, + caretY: t.y + }); + } else 0 !== this.opacity && (n = { opacity: 0 }); + (this._tooltipItems = o), + (this.$context = void 0), + n && this._resolveAnimations().update(this, n), + t && + i.external && + i.external.call(this, { + chart: this.chart, + tooltip: this, + replay: e + }); + } + drawCaret(t, e, i, s) { + const n = this.getCaretPosition(t, i, s); + e.lineTo(n.x1, n.y1), e.lineTo(n.x2, n.y2), e.lineTo(n.x3, n.y3); + } + getCaretPosition(t, e, i) { + const { xAlign: s, yAlign: n } = this, + { caretSize: o, cornerRadius: a } = i, + { topLeft: r, topRight: l, bottomLeft: h, bottomRight: c } = Mi(a), + { x: d, y: u } = t, + { width: f, height: g } = e; + let p, m, b, x, _, y; + return ( + "center" === n + ? ((_ = u + g / 2), + "left" === s + ? ((p = d), (m = p - o), (x = _ + o), (y = _ - o)) + : ((p = d + f), (m = p + o), (x = _ - o), (y = _ + o)), + (b = p)) + : ((m = + "left" === s + ? d + Math.max(r, h) + o + : "right" === s + ? d + f - Math.max(l, c) - o + : this.caretX), + "top" === n + ? ((x = u), (_ = x - o), (p = m - o), (b = m + o)) + : ((x = u + g), (_ = x + o), (p = m + o), (b = m - o)), + (y = x)), + { x1: p, x2: m, x3: b, y1: x, y2: _, y3: y } + ); + } + drawTitle(t, e, i) { + const s = this.title, + n = s.length; + let o, a, r; + if (n) { + const l = Ci(i.rtl, this.x, this.width); + for ( + t.x = Go(this, i.titleAlign, i), + e.textAlign = l.textAlign(i.titleAlign), + e.textBaseline = "middle", + o = ki(i.titleFont), + a = i.titleSpacing, + e.fillStyle = i.titleColor, + e.font = o.string, + r = 0; + r < n; + ++r + ) + e.fillText(s[r], l.x(t.x), t.y + o.lineHeight / 2), + (t.y += o.lineHeight + a), + r + 1 === n && (t.y += i.titleMarginBottom - a); + } + } + _drawColorBox(t, e, i, s, o) { + const a = this.labelColors[i], + r = this.labelPointStyles[i], + { boxHeight: l, boxWidth: h, boxPadding: c } = o, + d = ki(o.bodyFont), + u = Go(this, "left", o), + f = s.x(u), + g = l < d.lineHeight ? (d.lineHeight - l) / 2 : 0, + p = e.y + g; + if (o.usePointStyle) { + const e = { + radius: Math.min(h, l) / 2, + pointStyle: r.pointStyle, + rotation: r.rotation, + borderWidth: 1 + }, + i = s.leftForLtr(f, h) + h / 2, + n = p + l / 2; + (t.strokeStyle = o.multiKeyBackground), + (t.fillStyle = o.multiKeyBackground), + Te(t, e, i, n), + (t.strokeStyle = a.borderColor), + (t.fillStyle = a.backgroundColor), + Te(t, e, i, n); + } else { + (t.lineWidth = n(a.borderWidth) + ? Math.max(...Object.values(a.borderWidth)) + : a.borderWidth || 1), + (t.strokeStyle = a.borderColor), + t.setLineDash(a.borderDash || []), + (t.lineDashOffset = a.borderDashOffset || 0); + const e = s.leftForLtr(f, h - c), + i = s.leftForLtr(s.xPlus(f, 1), h - c - 2), + r = Mi(a.borderRadius); + Object.values(r).some(t => 0 !== t) + ? (t.beginPath(), + (t.fillStyle = o.multiKeyBackground), + We(t, { x: e, y: p, w: h, h: l, radius: r }), + t.fill(), + t.stroke(), + (t.fillStyle = a.backgroundColor), + t.beginPath(), + We(t, { x: i, y: p + 1, w: h - 2, h: l - 2, radius: r }), + t.fill()) + : ((t.fillStyle = o.multiKeyBackground), + t.fillRect(e, p, h, l), + t.strokeRect(e, p, h, l), + (t.fillStyle = a.backgroundColor), + t.fillRect(i, p + 1, h - 2, l - 2)); + } + t.fillStyle = this.labelTextColors[i]; + } + drawBody(t, e, i) { + const { body: s } = this, + { + bodySpacing: n, + bodyAlign: o, + displayColors: a, + boxHeight: r, + boxWidth: l, + boxPadding: h + } = i, + c = ki(i.bodyFont); + let u = c.lineHeight, + f = 0; + const g = Ci(i.rtl, this.x, this.width), + p = function(i) { + e.fillText(i, g.x(t.x + f), t.y + u / 2), (t.y += u + n); + }, + m = g.textAlign(o); + let b, x, _, y, v, M, w; + for ( + e.textAlign = o, + e.textBaseline = "middle", + e.font = c.string, + t.x = Go(this, m, i), + e.fillStyle = i.bodyColor, + d(this.beforeBody, p), + f = a && "right" !== m ? ("center" === o ? l / 2 + h : l + 2 + h) : 0, + y = 0, + M = s.length; + y < M; + ++y + ) { + for ( + b = s[y], + x = this.labelTextColors[y], + e.fillStyle = x, + d(b.before, p), + _ = b.lines, + a && + _.length && + (this._drawColorBox(e, t, y, g, i), + (u = Math.max(c.lineHeight, r))), + v = 0, + w = _.length; + v < w; + ++v + ) + p(_[v]), (u = c.lineHeight); + d(b.after, p); + } + (f = 0), (u = c.lineHeight), d(this.afterBody, p), (t.y -= n); + } + drawFooter(t, e, i) { + const s = this.footer, + n = s.length; + let o, a; + if (n) { + const r = Ci(i.rtl, this.x, this.width); + for ( + t.x = Go(this, i.footerAlign, i), + t.y += i.footerMarginTop, + e.textAlign = r.textAlign(i.footerAlign), + e.textBaseline = "middle", + o = ki(i.footerFont), + e.fillStyle = i.footerColor, + e.font = o.string, + a = 0; + a < n; + ++a + ) + e.fillText(s[a], r.x(t.x), t.y + o.lineHeight / 2), + (t.y += o.lineHeight + i.footerSpacing); + } + } + drawBackground(t, e, i, s) { + const { xAlign: n, yAlign: o } = this, + { x: a, y: r } = t, + { width: l, height: h } = i, + { topLeft: c, topRight: d, bottomLeft: u, bottomRight: f } = Mi( + s.cornerRadius + ); + (e.fillStyle = s.backgroundColor), + (e.strokeStyle = s.borderColor), + (e.lineWidth = s.borderWidth), + e.beginPath(), + e.moveTo(a + c, r), + "top" === o && this.drawCaret(t, e, i, s), + e.lineTo(a + l - d, r), + e.quadraticCurveTo(a + l, r, a + l, r + d), + "center" === o && "right" === n && this.drawCaret(t, e, i, s), + e.lineTo(a + l, r + h - f), + e.quadraticCurveTo(a + l, r + h, a + l - f, r + h), + "bottom" === o && this.drawCaret(t, e, i, s), + e.lineTo(a + u, r + h), + e.quadraticCurveTo(a, r + h, a, r + h - u), + "center" === o && "left" === n && this.drawCaret(t, e, i, s), + e.lineTo(a, r + c), + e.quadraticCurveTo(a, r, a + c, r), + e.closePath(), + e.fill(), + s.borderWidth > 0 && e.stroke(); + } + _updateAnimationTarget(t) { + const e = this.chart, + i = this.$animations, + s = i && i.x, + n = i && i.y; + if (s || n) { + const i = Ho[t.position].call(this, this._active, this._eventPosition); + if (!i) return; + const o = (this._size = Uo(this, t)), + a = Object.assign({}, i, this._size), + r = qo(e, t, a), + l = Ko(t, a, r, e); + (s._to === l.x && n._to === l.y) || + ((this.xAlign = r.xAlign), + (this.yAlign = r.yAlign), + (this.width = o.width), + (this.height = o.height), + (this.caretX = i.x), + (this.caretY = i.y), + this._resolveAnimations().update(this, l)); + } + } + _willRender() { + return !!this.opacity; + } + draw(t) { + const e = this.options.setContext(this.getContext()); + let i = this.opacity; + if (!i) return; + this._updateAnimationTarget(e); + const s = { width: this.width, height: this.height }, + n = { x: this.x, y: this.y }; + i = Math.abs(i) < 0.001 ? 0 : i; + const o = wi(e.padding), + a = + this.title.length || + this.beforeBody.length || + this.body.length || + this.afterBody.length || + this.footer.length; + e.enabled && + a && + (t.save(), + (t.globalAlpha = i), + this.drawBackground(n, t, s, e), + Oi(t, e.textDirection), + (n.y += o.top), + this.drawTitle(n, t, e), + this.drawBody(n, t, e), + this.drawFooter(n, t, e), + Ai(t, e.textDirection), + t.restore()); + } + getActiveElements() { + return this._active || []; + } + setActiveElements(t, e) { + const i = this._active, + s = t.map(({ datasetIndex: t, index: e }) => { + const i = this.chart.getDatasetMeta(t); + if (!i) throw new Error("Cannot find a dataset at index " + t); + return { datasetIndex: t, element: i.data[e], index: e }; + }), + n = !u(i, s), + o = this._positionChanged(s, e); + (n || o) && + ((this._active = s), + (this._eventPosition = e), + (this._ignoreReplayEvents = !0), + this.update(!0)); + } + handleEvent(t, e, i = !0) { + if (e && this._ignoreReplayEvents) return !1; + this._ignoreReplayEvents = !1; + const s = this.options, + n = this._active || [], + o = this._getActiveElements(t, n, e, i), + a = this._positionChanged(o, t), + r = e || !u(o, n) || a; + return ( + r && + ((this._active = o), + (s.enabled || s.external) && + ((this._eventPosition = { x: t.x, y: t.y }), this.update(!0, e))), + r + ); + } + _getActiveElements(t, e, i, s) { + const n = this.options; + if ("mouseout" === t.type) return []; + if (!s) return e; + const o = this.chart.getElementsAtEventForMode(t, n.mode, n, i); + return n.reverse && o.reverse(), o; + } + _positionChanged(t, e) { + const { caretX: i, caretY: s, options: n } = this, + o = Ho[n.position].call(this, t, e); + return !1 !== o && (i !== o.x || s !== o.y); + } + } + var ia = { + id: "tooltip", + _element: ea, + positioners: Ho, + afterInit(t, e, i) { + i && (t.tooltip = new ea({ chart: t, options: i })); + }, + beforeUpdate(t, e, i) { + t.tooltip && t.tooltip.initialize(i); + }, + reset(t, e, i) { + t.tooltip && t.tooltip.initialize(i); + }, + afterDraw(t) { + const e = t.tooltip; + if (e && e._willRender()) { + const i = { tooltip: e }; + if ( + !1 === + t.notifyPlugins("beforeTooltipDraw", { ...i, cancelable: !0 }) + ) + return; + e.draw(t.ctx), t.notifyPlugins("afterTooltipDraw", i); + } + }, + afterEvent(t, e) { + if (t.tooltip) { + const i = e.replay; + t.tooltip.handleEvent(e.event, i, e.inChartArea) && (e.changed = !0); + } + }, + defaults: { + enabled: !0, + external: null, + position: "average", + backgroundColor: "rgba(0,0,0,0.8)", + titleColor: "#fff", + titleFont: { weight: "bold" }, + titleSpacing: 2, + titleMarginBottom: 6, + titleAlign: "left", + bodyColor: "#fff", + bodySpacing: 2, + bodyFont: {}, + bodyAlign: "left", + footerColor: "#fff", + footerSpacing: 2, + footerMarginTop: 6, + footerFont: { weight: "bold" }, + footerAlign: "left", + padding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + boxHeight: (t, e) => e.bodyFont.size, + boxWidth: (t, e) => e.bodyFont.size, + multiKeyBackground: "#fff", + displayColors: !0, + boxPadding: 0, + borderColor: "rgba(0,0,0,0)", + borderWidth: 0, + animation: { duration: 400, easing: "easeOutQuart" }, + animations: { + numbers: { + type: "number", + properties: ["x", "y", "width", "height", "caretX", "caretY"] + }, + opacity: { easing: "linear", duration: 200 } + }, + callbacks: Qo + }, + defaultRoutes: { + bodyFont: "font", + footerFont: "font", + titleFont: "font" + }, + descriptors: { + _scriptable: t => + "filter" !== t && "itemSort" !== t && "external" !== t, + _indexable: !1, + callbacks: { _scriptable: !1, _indexable: !1 }, + animation: { _fallback: !1 }, + animations: { _fallback: "animation" } + }, + additionalOptionScopes: ["interaction"] + }, + sa = Object.freeze({ + __proto__: null, + Colors: fo, + Decimation: mo, + Filler: Eo, + Legend: Fo, + SubTitle: Wo, + Title: Bo, + Tooltip: ia + }); + function na(t, e, i, s) { + const n = t.indexOf(e); + if (-1 === n) + return ((t, e, i, s) => ( + "string" == typeof e + ? ((i = t.push(e) - 1), s.unshift({ index: i, label: e })) + : isNaN(e) && (i = null), + i + ))(t, e, i, s); + return n !== t.lastIndexOf(e) ? i : n; + } + function oa(t) { + const e = this.getLabels(); + return t >= 0 && t < e.length ? e[t] : t; + } + function aa(t, e, { horizontal: i, minRotation: s }) { + const n = j(s), + o = (i ? Math.sin(n) : Math.cos(n)) || 0.001, + a = 0.75 * e * ("" + t).length; + return Math.min(e / o, a); + } + class ra extends Ks { + constructor(t) { + super(t), + (this.start = void 0), + (this.end = void 0), + (this._startValue = void 0), + (this._endValue = void 0), + (this._valueRange = 0); + } + parse(t, e) { + return i(t) || + (("number" == typeof t || t instanceof Number) && !isFinite(+t)) + ? null + : +t; + } + handleTickRangeOptions() { + const { beginAtZero: t } = this.options, + { minDefined: e, maxDefined: i } = this.getUserBounds(); + let { min: s, max: n } = this; + const o = t => (s = e ? s : t), + a = t => (n = i ? n : t); + if (t) { + const t = z(s), + e = z(n); + t < 0 && e < 0 ? a(0) : t > 0 && e > 0 && o(0); + } + if (s === n) { + let e = 0 === n ? 1 : Math.abs(0.05 * n); + a(n + e), t || o(s - e); + } + (this.min = s), (this.max = n); + } + getTickLimit() { + const t = this.options.ticks; + let e, + { maxTicksLimit: i, stepSize: s } = t; + return ( + s + ? ((e = Math.ceil(this.max / s) - Math.floor(this.min / s) + 1), + e > 1e3 && + (console.warn( + `scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.` + ), + (e = 1e3))) + : ((e = this.computeTickLimit()), (i = i || 11)), + i && (e = Math.min(i, e)), + e + ); + } + computeTickLimit() { + return Number.POSITIVE_INFINITY; + } + buildTicks() { + const t = this.options, + e = t.ticks; + let s = this.getTickLimit(); + s = Math.max(2, s); + const n = (function(t, e) { + const s = [], + { + bounds: n, + step: o, + min: a, + max: r, + precision: l, + count: h, + maxTicks: c, + maxDigits: d, + includeBounds: u + } = t, + f = o || 1, + g = c - 1, + { min: p, max: m } = e, + b = !i(a), + x = !i(r), + _ = !i(h), + y = (m - p) / (d + 1); + let v, + M, + w, + k, + S = V((m - p) / g / f) * f; + if (S < 1e-14 && !b && !x) return [{ value: p }, { value: m }]; + (k = Math.ceil(m / S) - Math.floor(p / S)), + k > g && (S = V((k * S) / g / f) * f), + i(l) || ((v = Math.pow(10, l)), (S = Math.ceil(S * v) / v)), + "ticks" === n + ? ((M = Math.floor(p / S) * S), (w = Math.ceil(m / S) * S)) + : ((M = p), (w = m)), + b && x && o && W((r - a) / o, S / 1e3) + ? ((k = Math.round(Math.min((r - a) / S, c))), + (S = (r - a) / k), + (M = a), + (w = r)) + : _ + ? ((M = b ? a : M), (w = x ? r : w), (k = h - 1), (S = (w - M) / k)) + : ((k = (w - M) / S), + (k = F(k, Math.round(k), S / 1e3) + ? Math.round(k) + : Math.ceil(k))); + const P = Math.max(Y(S), Y(M)); + (v = Math.pow(10, i(l) ? P : l)), + (M = Math.round(M * v) / v), + (w = Math.round(w * v) / v); + let D = 0; + for ( + b && + (u && M !== a + ? (s.push({ value: a }), + M < a && D++, + F(Math.round((M + D * S) * v) / v, a, aa(a, y, t)) && D++) + : M < a && D++); + D < k; + ++D + ) + s.push({ value: Math.round((M + D * S) * v) / v }); + return ( + x && u && w !== r + ? s.length && F(s[s.length - 1].value, r, aa(r, y, t)) + ? (s[s.length - 1].value = r) + : s.push({ value: r }) + : (x && w !== r) || s.push({ value: w }), + s + ); + })( + { + maxTicks: s, + bounds: t.bounds, + min: t.min, + max: t.max, + precision: e.precision, + step: e.stepSize, + count: e.count, + maxDigits: this._maxDigits(), + horizontal: this.isHorizontal(), + minRotation: e.minRotation || 0, + includeBounds: !1 !== e.includeBounds + }, + this._range || this + ); + return ( + "ticks" === t.bounds && H(n, this, "value"), + t.reverse + ? (n.reverse(), (this.start = this.max), (this.end = this.min)) + : ((this.start = this.min), (this.end = this.max)), + n + ); + } + configure() { + const t = this.ticks; + let e = this.min, + i = this.max; + if ((super.configure(), this.options.offset && t.length)) { + const s = (i - e) / Math.max(t.length - 1, 1) / 2; + (e -= s), (i += s); + } + (this._startValue = e), (this._endValue = i), (this._valueRange = i - e); + } + getLabelForValue(t) { + return ne(t, this.chart.options.locale, this.options.ticks.format); + } + } + class la extends ra { + static id = "linear"; + static defaults = { ticks: { callback: ae.formatters.numeric } }; + determineDataLimits() { + const { min: t, max: e } = this.getMinMax(!0); + (this.min = o(t) ? t : 0), + (this.max = o(e) ? e : 1), + this.handleTickRangeOptions(); + } + computeTickLimit() { + const t = this.isHorizontal(), + e = t ? this.width : this.height, + i = j(this.options.ticks.minRotation), + s = (t ? Math.sin(i) : Math.cos(i)) || 0.001, + n = this._resolveTickFontOptions(0); + return Math.ceil(e / Math.min(40, n.lineHeight / s)); + } + getPixelForValue(t) { + return null === t + ? NaN + : this.getPixelForDecimal((t - this._startValue) / this._valueRange); + } + getValueForPixel(t) { + return this._startValue + this.getDecimalForPixel(t) * this._valueRange; + } + } + const ha = t => Math.floor(I(t)), + ca = (t, e) => Math.pow(10, ha(t) + e); + function da(t) { + return 1 === t / Math.pow(10, ha(t)); + } + function ua(t, e, i) { + const s = Math.pow(10, i), + n = Math.floor(t / s); + return Math.ceil(e / s) - n; + } + function fa(t, { min: e, max: i }) { + e = a(t.min, e); + const s = [], + n = ha(e); + let o = (function(t, e) { + let i = ha(e - t); + for (; ua(t, e, i) > 10; ) i++; + for (; ua(t, e, i) < 10; ) i--; + return Math.min(i, ha(t)); + })(e, i), + r = o < 0 ? Math.pow(10, Math.abs(o)) : 1; + const l = Math.pow(10, o), + h = n > o ? Math.pow(10, n) : 0, + c = Math.round((e - h) * r) / r, + d = Math.floor((e - h) / l / 10) * l * 10; + let u = Math.floor((c - d) / Math.pow(10, o)), + f = a(t.min, Math.round((h + d + u * Math.pow(10, o)) * r) / r); + for (; f < i; ) + s.push({ value: f, major: da(f), significand: u }), + u >= 10 ? (u = u < 15 ? 15 : 20) : u++, + u >= 20 && (o++, (u = 2), (r = o >= 0 ? 1 : r)), + (f = Math.round((h + d + u * Math.pow(10, o)) * r) / r); + const g = a(t.max, f); + return s.push({ value: g, major: da(g), significand: u }), s; + } + class ga extends Ks { + static id = "logarithmic"; + static defaults = { + ticks: { callback: ae.formatters.logarithmic, major: { enabled: !0 } } + }; + constructor(t) { + super(t), + (this.start = void 0), + (this.end = void 0), + (this._startValue = void 0), + (this._valueRange = 0); + } + parse(t, e) { + const i = ra.prototype.parse.apply(this, [t, e]); + if (0 !== i) return o(i) && i > 0 ? i : null; + this._zero = !0; + } + determineDataLimits() { + const { min: t, max: e } = this.getMinMax(!0); + (this.min = o(t) ? Math.max(0, t) : null), + (this.max = o(e) ? Math.max(0, e) : null), + this.options.beginAtZero && (this._zero = !0), + this._zero && + this.min !== this._suggestedMin && + !o(this._userMin) && + (this.min = + t === ca(this.min, 0) ? ca(this.min, -1) : ca(this.min, 0)), + this.handleTickRangeOptions(); + } + handleTickRangeOptions() { + const { minDefined: t, maxDefined: e } = this.getUserBounds(); + let i = this.min, + s = this.max; + const n = e => (i = t ? i : e), + o = t => (s = e ? s : t); + i === s && (i <= 0 ? (n(1), o(10)) : (n(ca(i, -1)), o(ca(s, 1)))), + i <= 0 && n(ca(s, -1)), + s <= 0 && o(ca(i, 1)), + (this.min = i), + (this.max = s); + } + buildTicks() { + const t = this.options, + e = fa({ min: this._userMin, max: this._userMax }, this); + return ( + "ticks" === t.bounds && H(e, this, "value"), + t.reverse + ? (e.reverse(), (this.start = this.max), (this.end = this.min)) + : ((this.start = this.min), (this.end = this.max)), + e + ); + } + getLabelForValue(t) { + return void 0 === t + ? "0" + : ne(t, this.chart.options.locale, this.options.ticks.format); + } + configure() { + const t = this.min; + super.configure(), + (this._startValue = I(t)), + (this._valueRange = I(this.max) - I(t)); + } + getPixelForValue(t) { + return ( + (void 0 !== t && 0 !== t) || (t = this.min), + null === t || isNaN(t) + ? NaN + : this.getPixelForDecimal( + t === this.min ? 0 : (I(t) - this._startValue) / this._valueRange + ) + ); + } + getValueForPixel(t) { + const e = this.getDecimalForPixel(t); + return Math.pow(10, this._startValue + e * this._valueRange); + } + } + function pa(t) { + const e = t.ticks; + if (e.display && t.display) { + const t = wi(e.backdropPadding); + return r(e.font && e.font.size, ue.font.size) + t.height; + } + return 0; + } + function ma(t, e, i, s, n) { + return t === s || t === n + ? { start: e - i / 2, end: e + i / 2 } + : t < s || t > n + ? { start: e - i, end: e } + : { start: e, end: e + i }; + } + function ba(t) { + const e = { + l: t.left + t._padding.left, + r: t.right - t._padding.right, + t: t.top + t._padding.top, + b: t.bottom - t._padding.bottom + }, + i = Object.assign({}, e), + n = [], + o = [], + a = t._pointLabels.length, + r = t.options.pointLabels, + l = r.centerPointLabels ? D / a : 0; + for (let u = 0; u < a; u++) { + const a = r.setContext(t.getPointLabelContext(u)); + o[u] = a.padding; + const f = t.getPointPosition(u, t.drawingArea + o[u], l), + g = ki(a.font), + p = + ((h = t.ctx), + (c = g), + (d = s((d = t._pointLabels[u])) ? d : [d]), + { w: Ce(h, c.string, d), h: d.length * c.lineHeight }); + n[u] = p; + const m = K(t.getIndexAngle(u) + l), + b = Math.round($(m)); + xa(i, e, m, ma(b, f.x, p.w, 0, 180), ma(b, f.y, p.h, 90, 270)); + } + var h, c, d; + t.setCenterPoint(e.l - i.l, i.r - e.r, e.t - i.t, i.b - e.b), + (t._pointLabelItems = (function(t, e, i) { + const s = [], + n = t._pointLabels.length, + o = t.options, + a = pa(o) / 2, + r = t.drawingArea, + l = o.pointLabels.centerPointLabels ? D / n : 0; + for (let o = 0; o < n; o++) { + const n = t.getPointPosition(o, r + a + i[o], l), + h = Math.round($(K(n.angle + L))), + c = e[o], + d = va(n.y, c.h, h), + u = _a(h), + f = ya(n.x, c.w, u); + s.push({ + x: n.x, + y: d, + textAlign: u, + left: f, + top: d, + right: f + c.w, + bottom: d + c.h + }); + } + return s; + })(t, n, o)); + } + function xa(t, e, i, s, n) { + const o = Math.abs(Math.sin(i)), + a = Math.abs(Math.cos(i)); + let r = 0, + l = 0; + s.start < e.l + ? ((r = (e.l - s.start) / o), (t.l = Math.min(t.l, e.l - r))) + : s.end > e.r && + ((r = (s.end - e.r) / o), (t.r = Math.max(t.r, e.r + r))), + n.start < e.t + ? ((l = (e.t - n.start) / a), (t.t = Math.min(t.t, e.t - l))) + : n.end > e.b && + ((l = (n.end - e.b) / a), (t.b = Math.max(t.b, e.b + l))); + } + function _a(t) { + return 0 === t || 180 === t ? "center" : t < 180 ? "left" : "right"; + } + function ya(t, e, i) { + return "right" === i ? (t -= e) : "center" === i && (t -= e / 2), t; + } + function va(t, e, i) { + return ( + 90 === i || 270 === i ? (t -= e / 2) : (i > 270 || i < 90) && (t -= e), t + ); + } + function Ma(t, e, i, s) { + const { ctx: n } = t; + if (i) n.arc(t.xCenter, t.yCenter, e, 0, C); + else { + let i = t.getPointPosition(0, e); + n.moveTo(i.x, i.y); + for (let o = 1; o < s; o++) + (i = t.getPointPosition(o, e)), n.lineTo(i.x, i.y); + } + } + class wa extends ra { + static id = "radialLinear"; + static defaults = { + display: !0, + animate: !0, + position: "chartArea", + angleLines: { + display: !0, + lineWidth: 1, + borderDash: [], + borderDashOffset: 0 + }, + grid: { circular: !1 }, + startAngle: 0, + ticks: { showLabelBackdrop: !0, callback: ae.formatters.numeric }, + pointLabels: { + backdropColor: void 0, + backdropPadding: 2, + display: !0, + font: { size: 10 }, + callback: t => t, + padding: 5, + centerPointLabels: !1 + } + }; + static defaultRoutes = { + "angleLines.color": "borderColor", + "pointLabels.color": "color", + "ticks.color": "color" + }; + static descriptors = { angleLines: { _fallback: "grid" } }; + constructor(t) { + super(t), + (this.xCenter = void 0), + (this.yCenter = void 0), + (this.drawingArea = void 0), + (this._pointLabels = []), + (this._pointLabelItems = []); + } + setDimensions() { + const t = (this._padding = wi(pa(this.options) / 2)), + e = (this.width = this.maxWidth - t.width), + i = (this.height = this.maxHeight - t.height); + (this.xCenter = Math.floor(this.left + e / 2 + t.left)), + (this.yCenter = Math.floor(this.top + i / 2 + t.top)), + (this.drawingArea = Math.floor(Math.min(e, i) / 2)); + } + determineDataLimits() { + const { min: t, max: e } = this.getMinMax(!1); + (this.min = o(t) && !isNaN(t) ? t : 0), + (this.max = o(e) && !isNaN(e) ? e : 0), + this.handleTickRangeOptions(); + } + computeTickLimit() { + return Math.ceil(this.drawingArea / pa(this.options)); + } + generateTickLabels(t) { + ra.prototype.generateTickLabels.call(this, t), + (this._pointLabels = this.getLabels() + .map((t, e) => { + const i = c(this.options.pointLabels.callback, [t, e], this); + return i || 0 === i ? i : ""; + }) + .filter((t, e) => this.chart.getDataVisibility(e))); + } + fit() { + const t = this.options; + t.display && t.pointLabels.display + ? ba(this) + : this.setCenterPoint(0, 0, 0, 0); + } + setCenterPoint(t, e, i, s) { + (this.xCenter += Math.floor((t - e) / 2)), + (this.yCenter += Math.floor((i - s) / 2)), + (this.drawingArea -= Math.min( + this.drawingArea / 2, + Math.max(t, e, i, s) + )); + } + getIndexAngle(t) { + return K( + t * (C / (this._pointLabels.length || 1)) + + j(this.options.startAngle || 0) + ); + } + getDistanceFromCenterForValue(t) { + if (i(t)) return NaN; + const e = this.drawingArea / (this.max - this.min); + return this.options.reverse ? (this.max - t) * e : (t - this.min) * e; + } + getValueForDistanceFromCenter(t) { + if (i(t)) return NaN; + const e = t / (this.drawingArea / (this.max - this.min)); + return this.options.reverse ? this.max - e : this.min + e; + } + getPointLabelContext(t) { + const e = this._pointLabels || []; + if (t >= 0 && t < e.length) { + const i = e[t]; + return (function(t, e, i) { + return Di(t, { label: i, index: e, type: "pointLabel" }); + })(this.getContext(), t, i); + } + } + getPointPosition(t, e, i = 0) { + const s = this.getIndexAngle(t) - L + i; + return { + x: Math.cos(s) * e + this.xCenter, + y: Math.sin(s) * e + this.yCenter, + angle: s + }; + } + getPointPositionForValue(t, e) { + return this.getPointPosition(t, this.getDistanceFromCenterForValue(e)); + } + getBasePosition(t) { + return this.getPointPositionForValue(t || 0, this.getBaseValue()); + } + getPointLabelPosition(t) { + const { left: e, top: i, right: s, bottom: n } = this._pointLabelItems[t]; + return { left: e, top: i, right: s, bottom: n }; + } + drawBackground() { + const { + backgroundColor: t, + grid: { circular: e } + } = this.options; + if (t) { + const i = this.ctx; + i.save(), + i.beginPath(), + Ma( + this, + this.getDistanceFromCenterForValue(this._endValue), + e, + this._pointLabels.length + ), + i.closePath(), + (i.fillStyle = t), + i.fill(), + i.restore(); + } + } + drawGrid() { + const t = this.ctx, + e = this.options, + { angleLines: s, grid: n, border: o } = e, + a = this._pointLabels.length; + let r, l, h; + if ( + (e.pointLabels.display && + (function(t, e) { + const { + ctx: s, + options: { pointLabels: n } + } = t; + for (let o = e - 1; o >= 0; o--) { + const e = n.setContext(t.getPointLabelContext(o)), + a = ki(e.font), + { + x: r, + y: l, + textAlign: h, + left: c, + top: d, + right: u, + bottom: f + } = t._pointLabelItems[o], + { backdropColor: g } = e; + if (!i(g)) { + const t = Mi(e.borderRadius), + i = wi(e.backdropPadding); + s.fillStyle = g; + const n = c - i.left, + o = d - i.top, + a = u - c + i.width, + r = f - d + i.height; + Object.values(t).some(t => 0 !== t) + ? (s.beginPath(), + We(s, { x: n, y: o, w: a, h: r, radius: t }), + s.fill()) + : s.fillRect(n, o, a, r); + } + Ve(s, t._pointLabels[o], r, l + a.lineHeight / 2, a, { + color: e.color, + textAlign: h, + textBaseline: "middle" + }); + } + })(this, a), + n.display && + this.ticks.forEach((t, e) => { + if (0 !== e) { + l = this.getDistanceFromCenterForValue(t.value); + const i = this.getContext(e), + s = n.setContext(i), + r = o.setContext(i); + !(function(t, e, i, s, n) { + const o = t.ctx, + a = e.circular, + { color: r, lineWidth: l } = e; + (!a && !s) || + !r || + !l || + i < 0 || + (o.save(), + (o.strokeStyle = r), + (o.lineWidth = l), + o.setLineDash(n.dash), + (o.lineDashOffset = n.dashOffset), + o.beginPath(), + Ma(t, i, a, s), + o.closePath(), + o.stroke(), + o.restore()); + })(this, s, l, a, r); + } + }), + s.display) + ) { + for (t.save(), r = a - 1; r >= 0; r--) { + const i = s.setContext(this.getPointLabelContext(r)), + { color: n, lineWidth: o } = i; + o && + n && + ((t.lineWidth = o), + (t.strokeStyle = n), + t.setLineDash(i.borderDash), + (t.lineDashOffset = i.borderDashOffset), + (l = this.getDistanceFromCenterForValue( + e.ticks.reverse ? this.min : this.max + )), + (h = this.getPointPosition(r, l)), + t.beginPath(), + t.moveTo(this.xCenter, this.yCenter), + t.lineTo(h.x, h.y), + t.stroke()); + } + t.restore(); + } + } + drawBorder() {} + drawLabels() { + const t = this.ctx, + e = this.options, + i = e.ticks; + if (!i.display) return; + const s = this.getIndexAngle(0); + let n, o; + t.save(), + t.translate(this.xCenter, this.yCenter), + t.rotate(s), + (t.textAlign = "center"), + (t.textBaseline = "middle"), + this.ticks.forEach((s, a) => { + if (0 === a && !e.reverse) return; + const r = i.setContext(this.getContext(a)), + l = ki(r.font); + if ( + ((n = this.getDistanceFromCenterForValue(this.ticks[a].value)), + r.showLabelBackdrop) + ) { + (t.font = l.string), + (o = t.measureText(s.label).width), + (t.fillStyle = r.backdropColor); + const e = wi(r.backdropPadding); + t.fillRect( + -o / 2 - e.left, + -n - l.size / 2 - e.top, + o + e.width, + l.size + e.height + ); + } + Ve(t, s.label, 0, -n, l, { color: r.color }); + }), + t.restore(); + } + drawTitle() {} + } + const ka = { + millisecond: { common: !0, size: 1, steps: 1e3 }, + second: { common: !0, size: 1e3, steps: 60 }, + minute: { common: !0, size: 6e4, steps: 60 }, + hour: { common: !0, size: 36e5, steps: 24 }, + day: { common: !0, size: 864e5, steps: 30 }, + week: { common: !1, size: 6048e5, steps: 4 }, + month: { common: !0, size: 2628e6, steps: 12 }, + quarter: { common: !1, size: 7884e6, steps: 4 }, + year: { common: !0, size: 3154e7 } + }, + Sa = Object.keys(ka); + function Pa(t, e) { + return t - e; + } + function Da(t, e) { + if (i(e)) return null; + const s = t._adapter, + { parser: n, round: a, isoWeekday: r } = t._parseOpts; + let l = e; + return ( + "function" == typeof n && (l = n(l)), + o(l) || (l = "string" == typeof n ? s.parse(l, n) : s.parse(l)), + null === l + ? null + : (a && + (l = + "week" !== a || (!N(r) && !0 !== r) + ? s.startOf(l, a) + : s.startOf(l, "isoWeek", r)), + +l) + ); + } + function Ca(t, e, i, s) { + const n = Sa.length; + for (let o = Sa.indexOf(t); o < n - 1; ++o) { + const t = ka[Sa[o]], + n = t.steps ? t.steps : Number.MAX_SAFE_INTEGER; + if (t.common && Math.ceil((i - e) / (n * t.size)) <= s) return Sa[o]; + } + return Sa[n - 1]; + } + function Oa(t, e, i) { + if (i) { + if (i.length) { + const { lo: s, hi: n } = tt(i, e); + t[i[s] >= e ? i[s] : i[n]] = !0; + } + } else t[e] = !0; + } + function Aa(t, e, i) { + const s = [], + n = {}, + o = e.length; + let a, r; + for (a = 0; a < o; ++a) + (r = e[a]), (n[r] = a), s.push({ value: r, major: !1 }); + return 0 !== o && i + ? (function(t, e, i, s) { + const n = t._adapter, + o = +n.startOf(e[0].value, s), + a = e[e.length - 1].value; + let r, l; + for (r = o; r <= a; r = +n.add(r, 1, s)) + (l = i[r]), l >= 0 && (e[l].major = !0); + return e; + })(t, s, n, i) + : s; + } + class Ta extends Ks { + static id = "time"; + static defaults = { + bounds: "data", + adapters: {}, + time: { + parser: !1, + unit: !1, + round: !1, + isoWeekday: !1, + minUnit: "millisecond", + displayFormats: {} + }, + ticks: { source: "auto", callback: !1, major: { enabled: !1 } } + }; + constructor(t) { + super(t), + (this._cache = { data: [], labels: [], all: [] }), + (this._unit = "day"), + (this._majorUnit = void 0), + (this._offsets = {}), + (this._normalized = !1), + (this._parseOpts = void 0); + } + init(t, e = {}) { + const i = t.time || (t.time = {}), + s = (this._adapter = new Cn._date(t.adapters.date)); + s.init(e), + b(i.displayFormats, s.formats()), + (this._parseOpts = { + parser: i.parser, + round: i.round, + isoWeekday: i.isoWeekday + }), + super.init(t), + (this._normalized = e.normalized); + } + parse(t, e) { + return void 0 === t ? null : Da(this, t); + } + beforeLayout() { + super.beforeLayout(), (this._cache = { data: [], labels: [], all: [] }); + } + determineDataLimits() { + const t = this.options, + e = this._adapter, + i = t.time.unit || "day"; + let { + min: s, + max: n, + minDefined: a, + maxDefined: r + } = this.getUserBounds(); + function l(t) { + a || isNaN(t.min) || (s = Math.min(s, t.min)), + r || isNaN(t.max) || (n = Math.max(n, t.max)); + } + (a && r) || + (l(this._getLabelBounds()), + ("ticks" === t.bounds && "labels" === t.ticks.source) || + l(this.getMinMax(!1))), + (s = o(s) && !isNaN(s) ? s : +e.startOf(Date.now(), i)), + (n = o(n) && !isNaN(n) ? n : +e.endOf(Date.now(), i) + 1), + (this.min = Math.min(s, n - 1)), + (this.max = Math.max(s + 1, n)); + } + _getLabelBounds() { + const t = this.getLabelTimestamps(); + let e = Number.POSITIVE_INFINITY, + i = Number.NEGATIVE_INFINITY; + return ( + t.length && ((e = t[0]), (i = t[t.length - 1])), { min: e, max: i } + ); + } + buildTicks() { + const t = this.options, + e = t.time, + i = t.ticks, + s = + "labels" === i.source ? this.getLabelTimestamps() : this._generate(); + "ticks" === t.bounds && + s.length && + ((this.min = this._userMin || s[0]), + (this.max = this._userMax || s[s.length - 1])); + const n = this.min, + o = st(s, n, this.max); + return ( + (this._unit = + e.unit || + (i.autoSkip + ? Ca(e.minUnit, this.min, this.max, this._getLabelCapacity(n)) + : (function(t, e, i, s, n) { + for (let o = Sa.length - 1; o >= Sa.indexOf(i); o--) { + const i = Sa[o]; + if (ka[i].common && t._adapter.diff(n, s, i) >= e - 1) + return i; + } + return Sa[i ? Sa.indexOf(i) : 0]; + })(this, o.length, e.minUnit, this.min, this.max))), + (this._majorUnit = + i.major.enabled && "year" !== this._unit + ? (function(t) { + for (let e = Sa.indexOf(t) + 1, i = Sa.length; e < i; ++e) + if (ka[Sa[e]].common) return Sa[e]; + })(this._unit) + : void 0), + this.initOffsets(s), + t.reverse && o.reverse(), + Aa(this, o, this._majorUnit) + ); + } + afterAutoSkip() { + this.options.offsetAfterAutoskip && + this.initOffsets(this.ticks.map(t => +t.value)); + } + initOffsets(t = []) { + let e, + i, + s = 0, + n = 0; + this.options.offset && + t.length && + ((e = this.getDecimalForValue(t[0])), + (s = 1 === t.length ? 1 - e : (this.getDecimalForValue(t[1]) - e) / 2), + (i = this.getDecimalForValue(t[t.length - 1])), + (n = + 1 === t.length + ? i + : (i - this.getDecimalForValue(t[t.length - 2])) / 2)); + const o = t.length < 3 ? 0.5 : 0.25; + (s = Z(s, 0, o)), + (n = Z(n, 0, o)), + (this._offsets = { start: s, end: n, factor: 1 / (s + 1 + n) }); + } + _generate() { + const t = this._adapter, + e = this.min, + i = this.max, + s = this.options, + n = s.time, + o = n.unit || Ca(n.minUnit, e, i, this._getLabelCapacity(e)), + a = r(s.ticks.stepSize, 1), + l = "week" === o && n.isoWeekday, + h = N(l) || !0 === l, + c = {}; + let d, + u, + f = e; + if ( + (h && (f = +t.startOf(f, "isoWeek", l)), + (f = +t.startOf(f, h ? "day" : o)), + t.diff(i, e, o) > 1e5 * a) + ) + throw new Error( + e + " and " + i + " are too far apart with stepSize of " + a + " " + o + ); + const g = "data" === s.ticks.source && this.getDataTimestamps(); + for (d = f, u = 0; d < i; d = +t.add(d, a, o), u++) Oa(c, d, g); + return ( + (d !== i && "ticks" !== s.bounds && 1 !== u) || Oa(c, d, g), + Object.keys(c) + .sort((t, e) => t - e) + .map(t => +t) + ); + } + getLabelForValue(t) { + const e = this._adapter, + i = this.options.time; + return i.tooltipFormat + ? e.format(t, i.tooltipFormat) + : e.format(t, i.displayFormats.datetime); + } + _tickFormatFunction(t, e, i, s) { + const n = this.options, + o = n.ticks.callback; + if (o) return c(o, [t, e, i], this); + const a = n.time.displayFormats, + r = this._unit, + l = this._majorUnit, + h = r && a[r], + d = l && a[l], + u = i[e], + f = l && d && u && u.major; + return this._adapter.format(t, s || (f ? d : h)); + } + generateTickLabels(t) { + let e, i, s; + for (e = 0, i = t.length; e < i; ++e) + (s = t[e]), (s.label = this._tickFormatFunction(s.value, e, t)); + } + getDecimalForValue(t) { + return null === t ? NaN : (t - this.min) / (this.max - this.min); + } + getPixelForValue(t) { + const e = this._offsets, + i = this.getDecimalForValue(t); + return this.getPixelForDecimal((e.start + i) * e.factor); + } + getValueForPixel(t) { + const e = this._offsets, + i = this.getDecimalForPixel(t) / e.factor - e.end; + return this.min + i * (this.max - this.min); + } + _getLabelSize(t) { + const e = this.options.ticks, + i = this.ctx.measureText(t).width, + s = j(this.isHorizontal() ? e.maxRotation : e.minRotation), + n = Math.cos(s), + o = Math.sin(s), + a = this._resolveTickFontOptions(0).size; + return { w: i * n + a * o, h: i * o + a * n }; + } + _getLabelCapacity(t) { + const e = this.options.time, + i = e.displayFormats, + s = i[e.unit] || i.millisecond, + n = this._tickFormatFunction(t, 0, Aa(this, [t], this._majorUnit), s), + o = this._getLabelSize(n), + a = + Math.floor( + this.isHorizontal() ? this.width / o.w : this.height / o.h + ) - 1; + return a > 0 ? a : 1; + } + getDataTimestamps() { + let t, + e, + i = this._cache.data || []; + if (i.length) return i; + const s = this.getMatchingVisibleMetas(); + if (this._normalized && s.length) + return (this._cache.data = s[0].controller.getAllParsedValues(this)); + for (t = 0, e = s.length; t < e; ++t) + i = i.concat(s[t].controller.getAllParsedValues(this)); + return (this._cache.data = this.normalize(i)); + } + getLabelTimestamps() { + const t = this._cache.labels || []; + let e, i; + if (t.length) return t; + const s = this.getLabels(); + for (e = 0, i = s.length; e < i; ++e) t.push(Da(this, s[e])); + return (this._cache.labels = this._normalized ? t : this.normalize(t)); + } + normalize(t) { + return rt(t.sort(Pa)); + } + } + function La(t, e, i) { + let s, + n, + o, + a, + r = 0, + l = t.length - 1; + i + ? (e >= t[r].pos && e <= t[l].pos && ({ lo: r, hi: l } = et(t, "pos", e)), + ({ pos: s, time: o } = t[r]), + ({ pos: n, time: a } = t[l])) + : (e >= t[r].time && + e <= t[l].time && + ({ lo: r, hi: l } = et(t, "time", e)), + ({ time: s, pos: o } = t[r]), + ({ time: n, pos: a } = t[l])); + const h = n - s; + return h ? o + ((a - o) * (e - s)) / h : o; + } + var Ea = class extends Ta { + static id = "timeseries"; + static defaults = Ta.defaults; + constructor(t) { + super(t), + (this._table = []), + (this._minPos = void 0), + (this._tableRange = void 0); + } + initOffsets() { + const t = this._getTimestampsForTable(), + e = (this._table = this.buildLookupTable(t)); + (this._minPos = La(e, this.min)), + (this._tableRange = La(e, this.max) - this._minPos), + super.initOffsets(t); + } + buildLookupTable(t) { + const { min: e, max: i } = this, + s = [], + n = []; + let o, a, r, l, h; + for (o = 0, a = t.length; o < a; ++o) + (l = t[o]), l >= e && l <= i && s.push(l); + if (s.length < 2) + return [ + { time: e, pos: 0 }, + { time: i, pos: 1 } + ]; + for (o = 0, a = s.length; o < a; ++o) + (h = s[o + 1]), + (r = s[o - 1]), + (l = s[o]), + Math.round((h + r) / 2) !== l && + n.push({ time: l, pos: o / (a - 1) }); + return n; + } + _getTimestampsForTable() { + let t = this._cache.all || []; + if (t.length) return t; + const e = this.getDataTimestamps(), + i = this.getLabelTimestamps(); + return ( + (t = + e.length && i.length + ? this.normalize(e.concat(i)) + : e.length + ? e + : i), + (t = this._cache.all = t), + t + ); + } + getDecimalForValue(t) { + return (La(this._table, t) - this._minPos) / this._tableRange; + } + getValueForPixel(t) { + const e = this._offsets, + i = this.getDecimalForPixel(t) / e.factor - e.end; + return La(this._table, i * this._tableRange + this._minPos, !0); + } + }, + Ra = Object.freeze({ + __proto__: null, + CategoryScale: class extends Ks { + static id = "category"; + static defaults = { ticks: { callback: oa } }; + constructor(t) { + super(t), + (this._startValue = void 0), + (this._valueRange = 0), + (this._addedLabels = []); + } + init(t) { + const e = this._addedLabels; + if (e.length) { + const t = this.getLabels(); + for (const { index: i, label: s } of e) + t[i] === s && t.splice(i, 1); + this._addedLabels = []; + } + super.init(t); + } + parse(t, e) { + if (i(t)) return null; + const s = this.getLabels(); + return ((t, e) => (null === t ? null : Z(Math.round(t), 0, e)))( + (e = + isFinite(e) && s[e] === t + ? e + : na(s, t, r(e, t), this._addedLabels)), + s.length - 1 + ); + } + determineDataLimits() { + const { minDefined: t, maxDefined: e } = this.getUserBounds(); + let { min: i, max: s } = this.getMinMax(!0); + "ticks" === this.options.bounds && + (t || (i = 0), e || (s = this.getLabels().length - 1)), + (this.min = i), + (this.max = s); + } + buildTicks() { + const t = this.min, + e = this.max, + i = this.options.offset, + s = []; + let n = this.getLabels(); + (n = 0 === t && e === n.length - 1 ? n : n.slice(t, e + 1)), + (this._valueRange = Math.max(n.length - (i ? 0 : 1), 1)), + (this._startValue = this.min - (i ? 0.5 : 0)); + for (let i = t; i <= e; i++) s.push({ value: i }); + return s; + } + getLabelForValue(t) { + return oa.call(this, t); + } + configure() { + super.configure(), + this.isHorizontal() || (this._reversePixels = !this._reversePixels); + } + getPixelForValue(t) { + return ( + "number" != typeof t && (t = this.parse(t)), + null === t + ? NaN + : this.getPixelForDecimal( + (t - this._startValue) / this._valueRange + ) + ); + } + getPixelForTick(t) { + const e = this.ticks; + return t < 0 || t > e.length - 1 + ? null + : this.getPixelForValue(e[t].value); + } + getValueForPixel(t) { + return Math.round( + this._startValue + this.getDecimalForPixel(t) * this._valueRange + ); + } + getBasePixel() { + return this.bottom; + } + }, + LinearScale: la, + LogarithmicScale: ga, + RadialLinearScale: wa, + TimeScale: Ta, + TimeSeriesScale: Ea + }); + return ( + Sn.register(Vn, Ra, oo, sa), + (Sn.helpers = { ...Bi }), + (Sn._adapters = Cn), + (Sn.Animation = Ps), + (Sn.Animations = Ds), + (Sn.animator = bt), + (Sn.controllers = Js.controllers.items), + (Sn.DatasetController = Bs), + (Sn.Element = Ns), + (Sn.elements = oo), + (Sn.Interaction = Ui), + (Sn.layouts = os), + (Sn.platforms = ws), + (Sn.Scale = Ks), + (Sn.Ticks = ae), + Object.assign(Sn, Vn, Ra, oo, sa, ws), + (Sn.Chart = Sn), + "undefined" != typeof window && (window.Chart = Sn), + Sn + ); +}); +//# sourceMappingURL=chart.umd.js.map diff --git a/pandora_console/include/graphs/chartjs/chart.umd.js.map b/pandora_console/include/graphs/chartjs/chart.umd.js.map new file mode 100644 index 0000000000..615c48c6e5 --- /dev/null +++ b/pandora_console/include/graphs/chartjs/chart.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chart.umd.js","sources":["../src/helpers/helpers.core.ts","../src/helpers/helpers.math.ts","../src/helpers/helpers.collection.ts","../src/helpers/helpers.extras.ts","../src/core/core.animator.js","../node_modules/.pnpm/@kurkle+color@0.3.0/node_modules/@kurkle/color/dist/color.esm.js","../src/helpers/helpers.color.ts","../src/core/core.animations.defaults.js","../src/helpers/helpers.intl.ts","../src/core/core.ticks.js","../src/core/core.defaults.js","../src/core/core.layouts.defaults.js","../src/core/core.scale.defaults.js","../src/helpers/helpers.dom.ts","../src/helpers/helpers.canvas.js","../src/helpers/helpers.config.js","../src/helpers/helpers.curve.ts","../src/helpers/helpers.easing.ts","../src/helpers/helpers.interpolation.ts","../src/helpers/helpers.options.ts","../src/helpers/helpers.rtl.ts","../src/helpers/helpers.segment.js","../src/core/core.interaction.js","../src/core/core.layouts.js","../src/platform/platform.base.js","../src/platform/platform.basic.js","../src/platform/platform.dom.js","../src/platform/index.js","../src/core/core.animation.js","../src/core/core.animations.js","../src/core/core.datasetController.js","../src/core/core.element.ts","../src/core/core.scale.autoskip.js","../src/core/core.scale.js","../src/core/core.typedRegistry.js","../src/core/core.registry.js","../src/core/core.plugins.js","../src/core/core.config.js","../src/core/core.controller.js","../src/core/core.adapters.ts","../src/controllers/controller.bar.js","../src/controllers/controller.doughnut.js","../src/controllers/controller.polarArea.js","../src/controllers/controller.bubble.js","../src/controllers/controller.line.js","../src/controllers/controller.pie.js","../src/controllers/controller.radar.js","../src/controllers/controller.scatter.js","../src/elements/element.arc.ts","../src/elements/element.line.js","../src/elements/element.point.ts","../src/elements/element.bar.js","../src/scales/scale.category.js","../src/scales/scale.linearbase.js","../src/scales/scale.linear.js","../src/scales/scale.logarithmic.js","../src/scales/scale.radialLinear.js","../src/scales/scale.time.js","../src/scales/scale.timeseries.js","../src/plugins/plugin.colors.ts","../src/plugins/plugin.decimation.js","../src/plugins/plugin.filler/filler.segment.js","../src/plugins/plugin.filler/filler.helper.js","../src/plugins/plugin.filler/filler.options.js","../src/plugins/plugin.filler/filler.target.stack.js","../src/plugins/plugin.filler/simpleArc.js","../src/plugins/plugin.filler/filler.target.js","../src/plugins/plugin.filler/filler.drawing.js","../src/plugins/plugin.filler/index.js","../src/plugins/plugin.legend.js","../src/plugins/plugin.title.js","../src/plugins/plugin.subtitle.js","../src/plugins/plugin.tooltip.js","../src/index.umd.ts"],"sourcesContent":["/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || typeof value === 'undefined';\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): AnyObject {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set();\n let i: number, ilen: number;\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n set.add(items[i]);\n }\n\n if (set.size === ilen) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, _parsed} = meta;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = _limitValue(Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1),\n start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","/*!\n * @kurkle/color v0.3.0\n * https://github.com/kurkle/color#readme\n * (c) 2022 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n x: 'dark',\n Z: 'light',\n Y: 're',\n X: 'blu',\n W: 'gr',\n V: 'medium',\n U: 'slate',\n A: 'ee',\n T: 'ol',\n S: 'or',\n B: 'ra',\n C: 'lateg',\n D: 'ights',\n R: 'in',\n Q: 'turquois',\n E: 'hi',\n P: 'ro',\n O: 'al',\n N: 'le',\n M: 'de',\n L: 'yello',\n F: 'en',\n K: 'ch',\n G: 'arks',\n H: 'ea',\n I: 'ightg',\n J: 'wh'\n};\nconst names$1 = {\n OiceXe: 'f0f8ff',\n antiquewEte: 'faebd7',\n aqua: 'ffff',\n aquamarRe: '7fffd4',\n azuY: 'f0ffff',\n beige: 'f5f5dc',\n bisque: 'ffe4c4',\n black: '0',\n blanKedOmond: 'ffebcd',\n Xe: 'ff',\n XeviTet: '8a2be2',\n bPwn: 'a52a2a',\n burlywood: 'deb887',\n caMtXe: '5f9ea0',\n KartYuse: '7fff00',\n KocTate: 'd2691e',\n cSO: 'ff7f50',\n cSnflowerXe: '6495ed',\n cSnsilk: 'fff8dc',\n crimson: 'dc143c',\n cyan: 'ffff',\n xXe: '8b',\n xcyan: '8b8b',\n xgTMnPd: 'b8860b',\n xWay: 'a9a9a9',\n xgYF: '6400',\n xgYy: 'a9a9a9',\n xkhaki: 'bdb76b',\n xmagFta: '8b008b',\n xTivegYF: '556b2f',\n xSange: 'ff8c00',\n xScEd: '9932cc',\n xYd: '8b0000',\n xsOmon: 'e9967a',\n xsHgYF: '8fbc8f',\n xUXe: '483d8b',\n xUWay: '2f4f4f',\n xUgYy: '2f4f4f',\n xQe: 'ced1',\n xviTet: '9400d3',\n dAppRk: 'ff1493',\n dApskyXe: 'bfff',\n dimWay: '696969',\n dimgYy: '696969',\n dodgerXe: '1e90ff',\n fiYbrick: 'b22222',\n flSOwEte: 'fffaf0',\n foYstWAn: '228b22',\n fuKsia: 'ff00ff',\n gaRsbSo: 'dcdcdc',\n ghostwEte: 'f8f8ff',\n gTd: 'ffd700',\n gTMnPd: 'daa520',\n Way: '808080',\n gYF: '8000',\n gYFLw: 'adff2f',\n gYy: '808080',\n honeyMw: 'f0fff0',\n hotpRk: 'ff69b4',\n RdianYd: 'cd5c5c',\n Rdigo: '4b0082',\n ivSy: 'fffff0',\n khaki: 'f0e68c',\n lavFMr: 'e6e6fa',\n lavFMrXsh: 'fff0f5',\n lawngYF: '7cfc00',\n NmoncEffon: 'fffacd',\n ZXe: 'add8e6',\n ZcSO: 'f08080',\n Zcyan: 'e0ffff',\n ZgTMnPdLw: 'fafad2',\n ZWay: 'd3d3d3',\n ZgYF: '90ee90',\n ZgYy: 'd3d3d3',\n ZpRk: 'ffb6c1',\n ZsOmon: 'ffa07a',\n ZsHgYF: '20b2aa',\n ZskyXe: '87cefa',\n ZUWay: '778899',\n ZUgYy: '778899',\n ZstAlXe: 'b0c4de',\n ZLw: 'ffffe0',\n lime: 'ff00',\n limegYF: '32cd32',\n lRF: 'faf0e6',\n magFta: 'ff00ff',\n maPon: '800000',\n VaquamarRe: '66cdaa',\n VXe: 'cd',\n VScEd: 'ba55d3',\n VpurpN: '9370db',\n VsHgYF: '3cb371',\n VUXe: '7b68ee',\n VsprRggYF: 'fa9a',\n VQe: '48d1cc',\n VviTetYd: 'c71585',\n midnightXe: '191970',\n mRtcYam: 'f5fffa',\n mistyPse: 'ffe4e1',\n moccasR: 'ffe4b5',\n navajowEte: 'ffdead',\n navy: '80',\n Tdlace: 'fdf5e6',\n Tive: '808000',\n TivedBb: '6b8e23',\n Sange: 'ffa500',\n SangeYd: 'ff4500',\n ScEd: 'da70d6',\n pOegTMnPd: 'eee8aa',\n pOegYF: '98fb98',\n pOeQe: 'afeeee',\n pOeviTetYd: 'db7093',\n papayawEp: 'ffefd5',\n pHKpuff: 'ffdab9',\n peru: 'cd853f',\n pRk: 'ffc0cb',\n plum: 'dda0dd',\n powMrXe: 'b0e0e6',\n purpN: '800080',\n YbeccapurpN: '663399',\n Yd: 'ff0000',\n Psybrown: 'bc8f8f',\n PyOXe: '4169e1',\n saddNbPwn: '8b4513',\n sOmon: 'fa8072',\n sandybPwn: 'f4a460',\n sHgYF: '2e8b57',\n sHshell: 'fff5ee',\n siFna: 'a0522d',\n silver: 'c0c0c0',\n skyXe: '87ceeb',\n UXe: '6a5acd',\n UWay: '708090',\n UgYy: '708090',\n snow: 'fffafa',\n sprRggYF: 'ff7f',\n stAlXe: '4682b4',\n tan: 'd2b48c',\n teO: '8080',\n tEstN: 'd8bfd8',\n tomato: 'ff6347',\n Qe: '40e0d0',\n viTet: 'ee82ee',\n JHt: 'f5deb3',\n wEte: 'ffffff',\n wEtesmoke: 'f5f5f5',\n Lw: 'ffff00',\n LwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n const numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0); // toFixed has a max of 20 decimal places\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type Chart from '../core/core.controller.js';\nimport type {ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * Note: typedefs are auto-exported, so use a made-up `dom` namespace where\n * necessary to avoid duplicates with `export * from './helpers`; see\n * https://github.com/microsoft/TypeScript/issues/46011\n * @typedef { import('../core/core.controller.js').default } dom.Chart\n * @typedef { import('../../types').ChartEvent } ChartEvent\n */\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n\n chart.height = Math.floor(chart.height);\n chart.width = Math.floor(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Note: typedefs are auto-exported, so use a made-up `canvas` namespace where\n * necessary to avoid duplicates with `export * from './helpers`; see\n * https://github.com/microsoft/TypeScript/issues/46011\n * @typedef { import('../core/core.controller.js').default } canvas.Chart\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * @namespace Chart.helpers.canvas\n */\n\n/**\n * Converts the given font object into a CSS font string.\n * @param {object} font - A font object.\n * @return {string|null} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\n/**\n * @private\n */\nexport function _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && isArray(thing) !== true) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param {canvas.Chart} chart - The chart instance.\n * @param {number} pixel - A pixel value.\n * @param {number} width - The width of the element.\n * @returns {number} The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n * @param {HTMLCanvasElement} canvas\n * @param {CanvasRenderingContext2D} [ctx]\n */\nexport function clearCanvas(canvas, ctx) {\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport function drawPoint(ctx, options, x, y) {\n drawPointLegend(ctx, options, x, y, null);\n}\n\nexport function drawPointLegend(ctx, options, x, y, w) {\n let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param {Point} point - The point to test\n * @param {object} area - The rectangle\n * @param {number} [margin] - allowed margin\n * @returns {boolean}\n * @private\n */\nexport function _isPointInArea(point, area, margin) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += font.lineHeight;\n }\n\n ctx.restore();\n}\n\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx, opts) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nexport function addRoundedRectPath(ctx, rect) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import {defined, isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param {object[]} scopes - The option scopes to look for values, in resolution order\n * @param {string[]} [prefixes] - The prefixes for values, in resolution order.\n * @param {object[]} [rootScopes] - The root option scopes\n * @param {string|boolean} [fallback] - Parent scopes fallback\n * @param {function} [getTarget] - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver(scopes, prefixes = [''], rootScopes = scopes, fallback, getTarget = () => scopes[0]) {\n if (!defined(fallback)) {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: rootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n });\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param {object} proxy - The Proxy returned by `_createResolver`\n * @param {object} context - Context object for scriptable/indexable options\n * @param {object} [subProxy] - The proxy provided for scriptable options\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults] - Defaults for descriptors\n * @private\n */\nexport function _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n });\n}\n\n/**\n * @private\n */\nexport function _descriptors(proxy, defaults = {scriptable: true, indexable: true}) {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(target, prop, resolve) {\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(target, prop, receiver) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(prop, value, target, receiver) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n // @ts-ignore\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n value = value(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(prop, value, target, isIndexable) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (defined(_context.index) && isIndexable(prop)) {\n value = value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key, parent) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (defined(fallback) && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && defined(parentFallback) && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (defined(fallback) && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop, value));\n}\n\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (defined(value)) {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key, scopes) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (defined(value)) {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(meta, data, start, count) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\n\nexport interface SplinePoint {\n x: number;\n y: number;\n skip?: boolean;\n\n // Both Bezier and monotone interpolations have these fields\n // but they are added in different spots\n cp1x?: number;\n cp1y?: number;\n cp2x?: number;\n cp2y?: number;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import type {Point} from '../types/geometric.js';\nimport type {SplinePoint} from './helpers.curve.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {Point, toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\nexport interface CanvasFontSpec extends FontSpec {\n string: string;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n return prevStyle && JSON.stringify(style) !== JSON.stringify(prevStyle);\n}\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n return lookupMethod(data, axis, value);\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n}\n\nfunction removeListener(chart, type, listener) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n return value;\n}\n\nfunction convertObjectDataToArray(data) {\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n x: key,\n y: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (an thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal meta data accordingly.\n\n if (isObject(data)) {\n this._data = convertObjectDataToArray(data);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = this.ticks.length;\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; ++i) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = label[j];\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = [];\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, scaleOptions) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n\n id = scaleOptions.axis\n || axisFromPosition(scaleOptions.position)\n || id.length > 1 && determineAxis(id[0].toLowerCase(), scaleOptions);\n\n if (id) {\n return id;\n }\n\n throw new Error(`Cannot determine type of '${name}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).reduce((acc, key) => acc || isFunction(value[key]), false);\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {retinaScale, _isDomSupported} from '../helpers/helpers.dom.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nfunction getDatasetArea(meta) {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: xScale.left,\n right: xScale.right,\n top: yScale.top,\n bottom: yScale.bottom\n };\n }\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n this._resize(width, height);\n this._resizeBeforeDraw = null;\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = getDatasetArea(meta) || this.chartArea;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? this.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n });\n }\n\n meta.controller.draw();\n\n if (useClip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the envent inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: TimeUnit): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: TimeUnit): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek'): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase\n};\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n\n const skipNull = (meta) => {\n const parsed = meta.controller.getParsed(dataIndex);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount);\n\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outr radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing',\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outr radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = this.options.spacing / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference',\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n ticks.push({value: Math.round((niceMin + j * spacing) * factor) / factor});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const extra = getTickBackdropHeight(opts) / 2;\n const outerDistance = scale.drawingArea;\n const additionalAngle = opts.pointLabels.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i], additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const size = labelSizes[i];\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n\n items.push({\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n });\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign, left, top, right, bottom} = scale._pointLabelItems[i];\n const {backdropColor} = optsAtIndex;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(optsAtIndex.borderRadius);\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if (index === 0 && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if its not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, /** @type {Unit} */ (parser))\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @private\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort((a, b) => a - b).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guestimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import {DoughnutController, PolarAreaController} from '../index.js';\nimport type {Chart, ChartDataset} from '../types.js';\n\nexport interface ColorsPluginOptions {\n enabled?: boolean;\n forceOverride?: boolean;\n}\n\ninterface ColorsDescriptor {\n backgroundColor?: unknown;\n borderColor?: unknown;\n}\n\nconst BORDER_COLORS = [\n 'rgb(54, 162, 235)', // blue\n 'rgb(255, 99, 132)', // red\n 'rgb(255, 159, 64)', // orange\n 'rgb(255, 205, 86)', // yellow\n 'rgb(75, 192, 192)', // green\n 'rgb(153, 102, 255)', // purple\n 'rgb(201, 203, 207)' // grey\n];\n\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map(color => color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\n\nfunction getBorderColor(i: number) {\n return BORDER_COLORS[i % BORDER_COLORS.length];\n}\n\nfunction getBackgroundColor(i: number) {\n return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\n\nfunction colorizeDefaultDataset(dataset: ChartDataset, i: number) {\n dataset.borderColor = getBorderColor(i);\n dataset.backgroundColor = getBackgroundColor(i);\n\n return ++i;\n}\n\nfunction colorizeDoughnutDataset(dataset: ChartDataset, i: number) {\n dataset.backgroundColor = dataset.data.map(() => getBorderColor(i++));\n\n return i;\n}\n\nfunction colorizePolarAreaDataset(dataset: ChartDataset, i: number) {\n dataset.backgroundColor = dataset.data.map(() => getBackgroundColor(i++));\n\n return i;\n}\n\nfunction getColorizer(chart: Chart) {\n let i = 0;\n\n return (dataset: ChartDataset, datasetIndex: number) => {\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n\n if (controller instanceof DoughnutController) {\n i = colorizeDoughnutDataset(dataset, i);\n } else if (controller instanceof PolarAreaController) {\n i = colorizePolarAreaDataset(dataset, i);\n } else if (controller) {\n i = colorizeDefaultDataset(dataset, i);\n }\n };\n}\n\nfunction containsColorsDefinitions(\n descriptors: ColorsDescriptor[] | Record\n) {\n let k: number | string;\n\n for (k in descriptors) {\n if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n return true;\n }\n }\n\n return false;\n}\n\nexport default {\n id: 'colors',\n\n defaults: {\n enabled: true,\n forceOverride: false\n } as ColorsPluginOptions,\n\n beforeLayout(chart: Chart, _args, options: ColorsPluginOptions) {\n if (!options.enabled) {\n return;\n }\n\n const {\n options: {elements},\n data: {datasets}\n } = chart.config;\n\n if (!options.forceOverride && (containsColorsDefinitions(datasets) || elements && containsColorsDefinitions(elements))) {\n return;\n }\n\n const colorizer = getColorizer(chart);\n\n datasets.forEach(colorizer);\n }\n};\n","import {_limitValue, _lookupByKey, isNullOrUndef, resolve} from '../helpers/index.js';\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n /**\n * Implementation of the Largest Triangle Three Buckets algorithm.\n *\n * This implementation is based on the original implementation by Sveinn Steinarsson\n * in https://github.com/sveinn-steinarsson/flot-downsample/blob/master/jquery.flot.downsample.js\n *\n * The original implementation is MIT licensed.\n */\n const samples = options.samples || availableWidth;\n // There are less points than the threshold, returning the whole array\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n\n const decimated = [];\n\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n // Starting from offset\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n\n decimated[sampledIndex++] = data[a];\n\n for (i = 0; i < samples - 2; i++) {\n let avgX = 0;\n let avgY = 0;\n let j;\n\n // Adding offset\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n\n for (j = avgRangeStart; j < avgRangeEnd; j++) {\n avgX += data[j].x;\n avgY += data[j].y;\n }\n\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n\n // Adding offset\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const {x: pointAx, y: pointAy} = data[a];\n\n // Note that this is changed from the original algorithm which initializes these\n // values to 1. The reason for this change is that if the area is small, nextA\n // would never be set and thus a crash would occur in the next loop as `a` would become\n // `undefined`. Since the area is always positive, but could be 0 in the case of a flat trace,\n // initializing with a negative number is the correct solution.\n maxArea = area = -1;\n\n for (j = rangeOffs; j < rangeTo; j++) {\n area = 0.5 * Math.abs(\n (pointAx - avgX) * (data[j].y - pointAy) -\n (pointAx - data[j].x) * (avgY - pointAy)\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n\n // Include the last point\n decimated[sampledIndex++] = data[endIndex];\n\n return decimated;\n}\n\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n\n for (i = start; i < start + count; ++i) {\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n // Use point.x here because we're computing the average data `x` value\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n // Push up to 4 points, 3 for the last interval and the first point for this interval\n const lastIndex = i - 1;\n\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n // The interval is defined by 4 points: start, min, max, end.\n // The starting point is already considered at this point, so we need to determine which\n // of the other points to add. We need to sort these points to ensure the decimated data\n // is still sorted and then ensure there are no duplicates.\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX,\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n\n // lastIndex === startIndex will occur when a range has only 1 point which could\n // happen with very uneven data\n if (i > 0 && lastIndex !== startIndex) {\n // Last point in the previous interval\n decimated.push(data[lastIndex]);\n }\n\n // Start of the new interval\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n\n return decimated;\n}\n\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {value: data});\n }\n}\n\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset) => {\n cleanDecimatedDataset(dataset);\n });\n}\n\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n\n let start = 0;\n let count;\n\n const {iScale} = meta;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n\n return {start, count};\n}\n\nexport default {\n id: 'decimation',\n\n defaults: {\n algorithm: 'min-max',\n enabled: false,\n },\n\n beforeElementsUpdate: (chart, args, options) => {\n if (!options.enabled) {\n // The decimation plugin may have been previously enabled. Need to remove old `dataset._data` handlers\n cleanDecimatedData(chart);\n return;\n }\n\n // Assume the entire chart is available to show a few more points than needed\n const availableWidth = chart.width;\n\n chart.data.datasets.forEach((dataset, datasetIndex) => {\n const {_data, indexAxis} = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n\n if (resolve([indexAxis, chart.options.indexAxis]) === 'y') {\n // Decimation is only supported for lines that have an X indexAxis\n return;\n }\n\n if (!meta.controller.supportsDecimation) {\n // Only line datasets are supported\n return;\n }\n\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n // Only linear interpolation is supported\n return;\n }\n\n if (chart.options.parsing) {\n // Plugin only supports data that does not need parsing\n return;\n }\n\n let {start, count} = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n // No decimation is required until we are above this threshold\n cleanDecimatedDataset(dataset);\n return;\n }\n\n if (isNullOrUndef(_data)) {\n // First time we are seeing this dataset\n // We override the 'data' property with a setter that stores the\n // raw data in _data, but reads the decimated data from _decimated\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n\n // Point the chart to the decimated data\n let decimated;\n switch (options.algorithm) {\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n\n dataset._decimated = decimated;\n });\n },\n\n destroy(chart) {\n cleanDecimatedData(chart);\n }\n};\n","import {_boundSegment, _boundSegments, _normalizeAngle} from '../../helpers/index.js';\n\nexport function _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n\n for (const segment of segments) {\n let {start, end} = segment;\n end = _findSegmentEnd(start, end, points);\n\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n\n if (!target.segments) {\n // Special case for boundary not supporting `segments` (simpleArc)\n // Bounds are provided as `target` for partial circle, or undefined for full circle\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n\n // Get all segments from `target` that intersect the bounds of current segment of `line`\n const targetSegments = _boundSegments(target, bounds);\n\n for (const tgt of targetSegments) {\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\n\nexport function _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\n\nexport function _pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\n\nexport function _findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\n\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {isArray} from '../../helpers/index.js';\nimport {_pointsFromSegments} from './filler.segment.js';\n\n/**\n * @param {PointElement[] | { x: number; y: number; }} boundary\n * @param {LineElement} line\n * @return {LineElement?}\n */\nexport function _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n\n if (isArray(boundary)) {\n _loop = true;\n // @ts-ignore\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\n\nexport function _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n","import {isObject, isFinite, valueOrDefault} from '../../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.line.js').default } LineElement\n * @typedef { import('../../types/index.js').FillTarget } FillTarget\n * @typedef { import('../../types/index.js').ComplexFillTarget } ComplexFillTarget\n */\n\nexport function _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n}\n\n/**\n * @param {LineElement} line\n * @param {number} index\n * @param {number} count\n */\nexport function _decodeFill(line, index, count) {\n /** @type {string | {value: number}} */\n const fill = parseFillOption(line);\n\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n\n let target = parseFloat(fill);\n\n if (isFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\n\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @returns {number | null}\n */\nexport function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n // @ts-ignore\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @param {number} startValue\n * @returns {number | undefined}\n */\nexport function _getTargetValue(fill, scale, startValue) {\n let value;\n\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n // @ts-ignore\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n\n/**\n * @param {LineElement} line\n */\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {_isBetween} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\n\n/**\n * @param {{ chart: Chart; scale: Scale; index: number; line: LineElement; }} source\n * @return {LineElement}\n */\nexport function _buildStackLine(source) {\n const {scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @return {LineElement[]}\n */\nfunction getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n\n/**\n * @param {PointElement[]} points\n * @param {PointElement} sourcePoint\n * @param {LineElement[]} linesBelow\n */\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n // First point of an segment -> need to add another point before this,\n // from next line below.\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n // In the middle of an segment, no need to add more points.\n break;\n }\n }\n }\n points.push(...postponed);\n}\n\n/**\n * @param {LineElement} line\n * @param {PointElement} sourcePoint\n * @param {string} property\n * @returns {{point?: PointElement, first?: boolean, last?: boolean}}\n */\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\n","import {TAU} from '../../helpers/index.js';\n\n// TODO: use elements.ArcElement instead\nexport class simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n","import {isFinite} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\nimport {_getTargetPixel, _getTargetValue} from './filler.options.js';\nimport {_buildStackLine} from './filler.target.stack.js';\nimport {simpleArc} from './simpleArc.js';\n\n/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nexport function _getTarget(source) {\n const {chart, fill, line} = source;\n\n if (isFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n\n if (fill === 'shape') {\n return true;\n }\n\n const boundary = computeBoundary(source);\n\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n\n return _createBoundaryLine(boundary, line);\n}\n\n/**\n * @param {Chart} chart\n * @param {number} index\n */\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\n\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\n\n\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n const pixel = _getTargetPixel(fill, scale);\n\n if (isFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n\n return null;\n}\n\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n\n for (let i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\n","import {clipArea, unclipArea} from '../../helpers/index.js';\nimport {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js';\nimport {_getTarget} from './filler.target.js';\n\nexport function _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const {line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis});\n unclipArea(ctx);\n }\n}\n\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n\n ctx.save();\n\n if (property === 'x' && below !== above) {\n clipVertical(ctx, target, area.top);\n fill(ctx, {line, target, color: above, scale, property});\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n }\n fill(ctx, {line, target, color: below, scale, property});\n\n ctx.restore();\n}\n\nfunction clipVertical(ctx, target, clipY) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction fill(ctx, cfg) {\n const {line, target, property, color, scale} = cfg;\n const segments = _segments(line, target, property);\n\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n\n ctx.save();\n ctx.fillStyle = backgroundColor;\n\n clipBounds(ctx, scale, notShape && _getBounds(property, start, end));\n\n ctx.beginPath();\n\n const lineLoop = !!line.pathSegment(ctx, src);\n\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n\n ctx.restore();\n }\n}\n\nfunction clipBounds(ctx, scale, bounds) {\n const {top, bottom} = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n if (property === 'x') {\n ctx.beginPath();\n ctx.rect(start, top, end - start, bottom - top);\n ctx.clip();\n }\n}\n\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight);\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length + 0.5 : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {PI, isArray, toPadding, toFont} from '../helpers/index.js';\nimport {_toLeftRightCenter, _alignStartEnd} from '../helpers/helpers.extras.js';\nimport {renderText} from '../helpers/helpers.canvas.js';\n\nexport class Title extends Element {\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight) {\n const opts = this.options;\n\n this.left = 0;\n this.top = 0;\n\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n\n _drawArgs(offset) {\n const {top, left, bottom, right, options} = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {titleX, titleY, maxWidth, rotation};\n }\n\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n\n if (!opts.display) {\n return;\n }\n\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const {titleX, titleY, maxWidth, rotation} = this._drawArgs(offset);\n\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n}\n\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\n\nexport default {\n id: 'title',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Title,\n\n start(chart, _args, options) {\n createTitle(chart, options);\n },\n\n stop(chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n\n beforeUpdate(chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold',\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000 // by default greater than legend (1000) to be above\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let x = 0;\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n\n return {\n x: x / count,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColors = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColors.borderColor;\n ctx.fillStyle = labelColors.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColors.borderWidth) ? Math.max(...Object.values(labelColors.borderWidth)) : (labelColors.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColors.borderColor;\n ctx.setLineDash(labelColors.borderDash || []);\n ctx.lineDashOffset = labelColors.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth - boxPadding);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - boxPadding - 2);\n const borderRadius = toTRBLCorners(labelColors.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColors.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColors.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\n\n/**\n * @namespace Chart\n */\nimport Chart from './core/core.controller.js';\n\nimport * as helpers from './helpers/index.js';\nimport _adapters from './core/core.adapters.js';\nimport Animation from './core/core.animation.js';\nimport animator from './core/core.animator.js';\nimport Animations from './core/core.animations.js';\nimport * as controllers from './controllers/index.js';\nimport DatasetController from './core/core.datasetController.js';\nimport Element from './core/core.element.js';\nimport * as elements from './elements/index.js';\nimport Interaction from './core/core.interaction.js';\nimport layouts from './core/core.layouts.js';\nimport * as platforms from './platform/index.js';\nimport * as plugins from './plugins/index.js';\nimport registry from './core/core.registry.js';\nimport Scale from './core/core.scale.js';\nimport * as scales from './scales/index.js';\nimport Ticks from './core/core.ticks.js';\n\n// Register built-ins\nChart.register(controllers, scales, elements, plugins);\n\nChart.helpers = {...helpers};\nChart._adapters = _adapters;\nChart.Animation = Animation;\nChart.Animations = Animations;\nChart.animator = animator;\nChart.controllers = registry.controllers.items;\nChart.DatasetController = DatasetController;\nChart.Element = Element;\nChart.elements = elements;\nChart.Interaction = Interaction;\nChart.layouts = layouts;\nChart.platforms = platforms;\nChart.Scale = Scale;\nChart.Ticks = Ticks;\n\n// Compatibility with ESM extensions\nObject.assign(Chart, controllers, scales, elements, plugins, platforms);\nChart.Chart = Chart;\n\nif (typeof window !== 'undefined') {\n window.Chart = Chart;\n}\n\nexport default Chart;\n\n"],"names":["noop","uid","id","isNullOrUndef","value","isArray","Array","type","Object","prototype","toString","call","slice","isObject","isNumberFinite","Number","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","args","thisArg","apply","each","loopable","reverse","i","len","keys","length","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","index","clone","source","map","target","create","klen","k","isValidKey","key","indexOf","_merger","options","tval","sval","merge","sources","merger","current","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","v","x","o","y","_splitKey","parts","split","tmp","part","push","resolveObjectKey","obj","resolver","_getKeyResolver","_capitalize","str","charAt","toUpperCase","defined","isFunction","setsEqual","a","b","size","item","has","_isClickEvent","e","PI","Math","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","range","roundedRange","round","niceRange","pow","floor","fraction","_factorize","result","sqrt","sort","pop","isNumber","n","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","min","max","toRadians","degrees","toDegrees","radians","_decimalPlaces","isFiniteNumber","p","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","start","end","sameAngleIsFullCircle","s","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","defineProperty","configurable","enumerable","forEach","method","base","res","this","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","add","from","requestAnimFrame","window","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","count","_sorted","iScale","_parsed","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","assign","Animator","constructor","_request","_charts","Map","_running","_lastDate","undefined","_notify","chart","anims","date","callbacks","numSteps","duration","initial","currentStep","_refresh","_update","Date","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","get","complete","progress","listen","event","cb","reduce","acc","cur","_duration","stop","cancel","remove","delete","animator","lim","l","h","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","c","d","f","hex","h1","h2","eq","hexString","r","g","isShort","alpha","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","w","rgb","rgb2hsl","hueValue","calln","hsl2rgb","hue","hueParse","m","exec","p1","p2","hwb2rgb","hsv2rgb","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","names","nameParse","unpacked","tkeys","j","ok","nk","replace","parseInt","unpack","transparent","toLowerCase","RGB_RE","to","modHSL","ratio","proto","fromObject","input","functionParse","rgbParse","Color","ret","_rgb","_valid","valid","rgbString","hslString","mix","color","weight","c1","c2","w2","w1","interpolate","t","rgb1","rgb2","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","rotate","deg","isPatternOrGradient","getHoverColor","numbers","colors","intlCache","formatNumber","num","locale","cacheKey","JSON","stringify","formatter","Intl","NumberFormat","getNumberFormat","format","formatters","numeric","tickValue","ticks","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","overrides","descriptors","getScope","node","root","scope","Defaults","_descriptors","_appliers","animation","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","style","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","onClick","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","describe","override","route","name","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","writable","local","appliers","defaults","_scriptable","startsWith","_indexable","_fallback","easing","loop","properties","active","resize","show","animations","visible","hide","autoPadding","padding","top","bottom","display","offset","beginAtZero","bounds","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","_ctx","tickColor","border","dash","dashOffset","width","title","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","_isDomSupported","document","_getParentNode","domNode","parent","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","el","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","height","getRelativePosition","canvas","currentDevicePixelRatio","borderBox","boxSizing","paddings","borders","box","touches","offsetX","offsetY","shadowRoot","useOffsetPos","rect","getBoundingClientRect","clientX","clientY","getCanvasPosition","xOffset","yOffset","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","maxWidth","maxHeight","containerSize","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","getContainerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","addEventListener","removeEventListener","readUsedSize","matches","match","toFontString","_measureText","data","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","halfWidth","clearCanvas","getContext","resetTransform","clearRect","drawPoint","drawPointLegend","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","sin","cos","lineTo","SQRT1_2","fill","borderWidth","stroke","_isPointInArea","point","area","margin","clipArea","clip","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","renderText","opts","lines","strokeWidth","strokeColor","line","translation","fillStyle","textAlign","textBaseline","setRenderOpts","backdrop","drawBackdrop","strokeStyle","strokeText","fillText","decorateText","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","decorationWidth","oldColor","fillRect","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","_createResolver","scopes","prefixes","rootScopes","fallback","getTarget","_resolve","Symbol","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","prop","_keys","_cached","proxy","prefix","readKey","needsSubResolver","createSubResolver","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","isScriptable","Error","join","_resolveScriptable","isIndexable","arr","filter","_resolveArray","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","resolve","resolveFallback","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","splineCurveMonotone","valueAxis","pointsLen","deltaK","mK","pointBefore","pointCurrent","pointAfter","slopeDelta","alphaK","betaK","tauK","squaredMagnitude","monotoneAdjust","iPixel","vPixel","monotoneCompute","capControlPoint","pt","_updateBezierControlPoints","controlPoints","spanGaps","cubicInterpolationMode","prev","tension","capBezierPoints","inArea","inAreaPrev","inAreaNext","atEdge","elasticIn","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","LINE_HEIGHT","FONT_STYLE","toLineHeight","_readValueToProps","props","objProps","read","toTRBL","toTRBLCorners","toPadding","toFont","console","warn","inputs","info","cacheable","_addGrace","minmax","change","keepZero","createContext","parentContext","getRtlAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getRightToLeftAdapter","_itemWidth","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","_boundSegment","segment","startBound","endBound","getSegment","prevValue","inside","subStart","shouldStart","shouldStop","_boundSegments","segments","sub","_computeSegments","segmentOptions","_loop","findStartAndEnd","splitByStyles","solidSegments","_fullLoop","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","doSplitByStyles","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","pixelSize","fontStyle","fontFamily","binarySearch","metaset","controller","_cachedMeta","lookupMethod","_reversePixels","_sharedOptions","getRange","evaluateInteractionItems","position","handler","metasets","getSortedVisibleDatasetMetas","getIntersectItems","useFinalPosition","isPointInArea","chartArea","inRange","getNearestCartesianItems","distanceMetric","useX","useY","deltaX","deltaY","getDistanceMetricForAxis","minDistance","center","getCenterPoint","getNearestItems","startAngle","endAngle","getProps","getNearestRadialItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","dataset","getDatasetMeta","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","setLayoutDims","layouts","params","stacks","wrap","stack","stackWeight","placed","buildStacks","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","factor","horizontal","availableWidth","availableHeight","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","getMargins","marginForPositions","fitBoxes","boxes","refitBoxes","refit","update","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","configure","minPadding","layoutBoxes","isHorizontal","wrapBoxes","centerHorizontal","centerVertical","leftAndTop","concat","rightAndBottom","vertical","buildLayoutBoxes","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","total","freeze","updatePos","handleMaxPadding","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","config","BasicPlatform","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","eventListenerOptions","removeListener","nodeListContains","nodeList","contains","createAttachObserver","observer","MutationObserver","entries","trigger","entry","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","createResizeObserver","ResizeObserver","contentRect","listenDevicePixelRatioChanges","releaseObserver","disconnect","unlistenDevicePixelRatioChanges","createProxyAndListen","native","fromNativeEvent","addListener","DomPlatform","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","initCanvas","EXPANDO_KEY","removeAttribute","setAttribute","proxies","$proxies","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","interpolators","boolean","c0","helpersColor","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","elapsed","wait","promises","Promise","rej","resolved","Animations","_properties","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","$shared","$animations","resolveTargetOptions","_createAnimations","anim","all","awaitAll","then","scaleClip","allowedOverflow","getSortedDatasetIndices","filterVisible","_getSortedDatasetMetas","applyStack","dsIndex","singleMode","otherValue","isStacked","stacked","getOrCreateStack","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","getMatchingVisibleMetas","updateStacks","_stacks","iAxis","vAxis","indexScale","valueScale","getStackKey","_top","_bottom","_visualValues","getFirstScaleId","shift","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","static","_cachedDataOpts","getMeta","_type","_data","_objectData","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","_stacked","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","scaleID","_getOtherScale","reset","_destroy","_dataCheck","adata","convertObjectDataToArray","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","canStack","otherScale","hidden","createStack","NEGATIVE_INFINITY","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","label","getLabelForValue","_clip","disabled","toClip","defaultClip","resolveDatasetElementOptions","resolveDataElementOptions","dataIndex","raw","createDataContext","createDatasetContext","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","_tickSize","maxScale","_length","maxChart","_maxLength","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","spacing","ceil","skipMajors","evenMajorSpacing","diff","getEvenSpacing","factors","calculateSpacing","avgMajorSpacing","majorStart","majorEnd","offsetFromEdge","edge","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","_startPixel","_endPixel","lineValue","getPixelForTick","getTickMarkLength","getTitleHeight","titleAlign","reverseAlign","Scale","super","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_cache","_dataLimitsCached","init","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","fit","afterFit","afterUpdate","startPixel","endPixel","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","minSize","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","caches","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","getValueForPixel","getPixelForDecimal","decimal","getDecimalForPixel","getBasePixel","getBaseValue","createTickContext","optionTicks","rot","_computeGridLineItems","ticksLength","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","positionAxisID","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","getLineWidthForValue","findIndex","drawGrid","drawLine","setLineDash","lineDashOffset","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","titleX","titleY","titleArgs","tz","gz","bz","axisID","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","itemDefaults","defaultRoutes","routes","propertyParts","sourceName","sourceScope","routeDefaults","registerDefaults","unregister","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getElement","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","registry","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","callCallback","cancelable","invalidate","_oldCache","_notifyStateChanges","localIds","allPlugins","getOpts","pluginOpts","createDescriptors","previousDescriptors","some","pluginScopeKeys","getIndexAxis","datasetDefaults","determineAxis","scaleOptions","initOptions","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","defaultID","getAxisFromDefaultScaleID","mergeScaleConfig","initData","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","initConfig","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","hasFunction","needContext","resolverCache","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","render","ensureScalesHaveIDs","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","_dataset","buildOrUpdateControllers","newControllers","order","isDatasetVisible","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","getDatasetArea","getElementsAtEventForMode","getVisibleDatasetCount","setDatasetVisibility","toggleDataVisibility","getDataVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","inChartArea","eventFilter","_handleEvent","_getActiveElements","isClick","lastEvent","determineLastEvent","abstract","DateAdapterBase","members","formats","startOf","endOf","_adapters","_date","computeMinSampleSize","$bar","visibleMetas","getAllScaleValues","curr","updateMinAndPrev","parseValue","startValue","endValue","barStart","barEnd","_custom","parseFloatBar","parseArrayOrPrimitive","isFloatBar","custom","setBorderSkipped","borderSkipped","borderProps","enableBorderRadius","parseEdge","orig","v2","startEnd","setInflateAmount","inflateAmount","DoughnutController","animateRotate","animateScale","cutout","circumference","legend","generateLabels","fontColor","legendItem","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","arcs","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","ratioX","ratioY","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","getRatioAndOffset","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","calculateTotal","_getRingWeightOffset","_circumference","calculateCircumference","animationOpts","centerX","centerY","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","PolarAreaController","angleLines","circular","pointLabels","bind","_updateRadius","cutoutPercentage","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","categoryPercentage","barPercentage","grouped","_index_","_value_","iAxisKey","vAxisKey","bars","ruler","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","_getStacks","skipNull","_getStackCount","_getStackIndex","pixels","barThickness","stackCount","baseValue","minBarLength","actualBase","floating","barSign","halfGrid","maxBarThickness","Infinity","percent","chunk","computeFlexCategoryTraits","thickness","computeFitCategoryTraits","stackIndex","rects","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","pointPosition","getPointPositionForValue","parseBorderRadius","angleDelta","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","pixelMargin","innerR","spacingOffset","avNogSpacingRadius","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","fullCircles","inner","lineJoin","angleMargin","clipArc","setStyle","lineCap","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","stepped","getLineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","usePath2D","Path2D","path","_path","strokePathWithCache","segmentMethod","strokePathDirect","LineElement","_points","_segments","_pointsUpdated","_interpolate","_getInterpolationMethod","interpolated","hitRadius","getBarBounds","bar","half","skipOrLimit","boundingRects","maxW","maxH","parseBorderWidth","maxR","enableBorder","outer","skipX","skipY","addNormalRectPath","inflateRect","amount","refRect","chartX","chartY","rAdjust","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","drawArc","hoverRadius","mouseX","mouseY","inXRange","inYRange","addRectPath","findOrAddLabel","addedLabels","unshift","addIfString","lastIndexOf","_getLabelForValue","relativeLabelSize","minSpacing","LinearScaleBase","_startValue","_endValue","_valueRange","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","maxTicks","stepSize","computeTickLimit","generationOptions","dataRange","precision","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","niceMin","niceMax","numSpaces","decimalPlaces","generateTicks","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","minExp","exp","startExp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","updateLimits","setCenterPoint","_pointLabelItems","extra","outerDistance","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","buildPointLabelItems","hLimits","vLimits","pathRadiusLine","labelCount","RadialLinearScale","animate","leftMovement","rightMovement","topMovement","bottomMovement","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","createPointLabelContext","distanceFromCenter","getBasePosition","getPointLabelPosition","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","gridLineOpts","drawRadiusLine","INTERVALS","millisecond","common","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","addTick","time","timestamps","ticksFromTimestamps","majorUnit","setMajorTicks","TimeScale","adapters","displayFormats","_unit","_majorUnit","_offsets","_normalized","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","determineUnitForFormatting","determineMajorUnit","initOffsets","offsetAfterAutoskip","getDecimalForValue","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","_addedLabels","added","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","BORDER_COLORS","BACKGROUND_COLORS","getBorderColor","getBackgroundColor","getColorizer","colorizeDoughnutDataset","colorizePolarAreaDataset","colorizeDefaultDataset","containsColorsDefinitions","plugin_colors","forceOverride","_args","colorizer","cleanDecimatedDataset","cleanDecimatedData","plugin_decimation","algorithm","beforeElementsUpdate","xAxis","getStartAndCountOfVisiblePointsSimplified","threshold","decimated","samples","bucketWidth","sampledIndex","endIndex","maxAreaPoint","maxArea","nextA","avgY","avgRangeStart","avgRangeEnd","avgRangeLength","rangeOffs","rangeTo","pointAx","pointAy","lttbDecimation","minIndex","maxIndex","startIndex","xMin","dx","lastIndex","intermediateIndex1","intermediateIndex2","minMaxDecimation","_getBounds","_findSegmentEnd","_getEdge","_createBoundaryLine","boundary","linePoints","_pointsFromSegments","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","fillOption","parseFillOption","firstCh","decodeTargetIndex","addPointsBelow","sourcePoint","linesBelow","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","sourcePoints","below","getLinesBelow","_buildStackLine","_getTargetValue","computeCircularBoundary","_getTargetPixel","computeLinearBoundary","computeBoundary","_drawfill","lineOpts","above","clipVertical","doFill","clipY","lineLoop","tpoints","targetSegments","tgt","subBounds","fillSources","fillSource","src","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","legendItemText","calculateItemWidth","fontLineHeight","calculateLegendItemHeight","calculateItemHeight","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","textDirection","lineDash","drawOptions","SQRT2","yBoxTop","xBoxLeft","drawLegendBox","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","onLeave","isListened","hoveredItem","sameItem","plugin_legend","_element","afterEvent","ci","useBorderRadius","Title","_drawArgs","fontOpts","plugin_title","titleBlock","createTitle","WeakMap","plugin_subtitle","positioners","average","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","String","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineXAlign","yAlign","chartWidth","xAlign","caret","caretSize","caretPadding","doesNotFitWithAlign","determineAlignment","determineYAlign","getBackgroundPoint","alignment","paddingAndSize","alignX","alignY","getAlignedX","getBeforeAfterBodyLines","overrideCallbacks","defaultCallbacks","beforeTitle","tooltipItems","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","helpers","platforms"],"mappings":"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"} \ No newline at end of file diff --git a/pandora_console/include/graphs/chartjs/chartjs-plugin-datalabels.min.js b/pandora_console/include/graphs/chartjs/chartjs-plugin-datalabels.min.js new file mode 100644 index 0000000000..e84e6ff057 --- /dev/null +++ b/pandora_console/include/graphs/chartjs/chartjs-plugin-datalabels.min.js @@ -0,0 +1,7 @@ +/*! + * chartjs-plugin-datalabels v2.2.0 + * https://chartjs-plugin-datalabels.netlify.app + * (c) 2017-2022 chartjs-plugin-datalabels contributors + * Released under the MIT license + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("chart.js/helpers"),require("chart.js")):"function"==typeof define&&define.amd?define(["chart.js/helpers","chart.js"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).ChartDataLabels=e(t.Chart.helpers,t.Chart)}(this,(function(t,e){"use strict";var r=function(){if("undefined"!=typeof window){if(window.devicePixelRatio)return window.devicePixelRatio;var t=window.screen;if(t)return(t.deviceXDPI||1)/(t.logicalXDPI||1)}return 1}(),a=function(e){var r,a=[];for(e=[].concat(e);e.length;)"string"==typeof(r=e.pop())?a.unshift.apply(a,r.split("\n")):Array.isArray(r)?e.push.apply(e,r):t.isNullOrUndef(e)||a.unshift(""+r);return a},o=function(t,e,r){var a,o=[].concat(e),n=o.length,i=t.font,l=0;for(t.font=r.string,a=0;ar.right&&(a|=2),er.bottom&&(a|=4),a}function u(t,e){var r,a,o=e.anchor,n=t;return e.clamp&&(n=function(t,e){for(var r,a,o,n=t.x0,i=t.y0,l=t.x1,u=t.y1,d=s(n,i,e),c=s(l,u,e);d|c&&!(d&c);)8&(r=d||c)?(a=n+(l-n)*(e.top-i)/(u-i),o=e.top):4&r?(a=n+(l-n)*(e.bottom-i)/(u-i),o=e.bottom):2&r?(o=i+(u-i)*(e.right-n)/(l-n),a=e.right):1&r&&(o=i+(u-i)*(e.left-n)/(l-n),a=e.left),r===d?d=s(n=a,i=o,e):c=s(l=a,u=o,e);return{x0:n,x1:l,y0:i,y1:u}}(n,e.area)),"start"===o?(r=n.x0,a=n.y0):"end"===o?(r=n.x1,a=n.y1):(r=(n.x0+n.x1)/2,a=(n.y0+n.y1)/2),function(t,e,r,a,o){switch(o){case"center":r=a=0;break;case"bottom":r=0,a=1;break;case"right":r=1,a=0;break;case"left":r=-1,a=0;break;case"top":r=0,a=-1;break;case"start":r=-r,a=-a;break;case"end":break;default:o*=Math.PI/180,r=Math.cos(o),a=Math.sin(o)}return{x:t,y:e,vx:r,vy:a}}(r,a,t.vx,t.vy,e.align)}var d=function(t,e){var r=(t.startAngle+t.endAngle)/2,a=Math.cos(r),o=Math.sin(r),n=t.innerRadius,i=t.outerRadius;return u({x0:t.x+a*n,y0:t.y+o*n,x1:t.x+a*i,y1:t.y+o*i,vx:a,vy:o},e)},c=function(t,e){var r=l(t,e.origin),a=r.x*t.options.radius,o=r.y*t.options.radius;return u({x0:t.x-a,y0:t.y-o,x1:t.x+a,y1:t.y+o,vx:r.x,vy:r.y},e)},h=function(t,e){var r=l(t,e.origin),a=t.x,o=t.y,n=0,i=0;return t.horizontal?(a=Math.min(t.x,t.base),n=Math.abs(t.base-t.x)):(o=Math.min(t.y,t.base),i=Math.abs(t.base-t.y)),u({x0:a,y0:o+i,x1:a+n,y1:o,vx:r.x,vy:r.y},e)},f=function(t,e){var r=l(t,e.origin);return u({x0:t.x,y0:t.y,x1:t.x+(t.width||0),y1:t.y+(t.height||0),vx:r.x,vy:r.y},e)},x=function(t){return Math.round(t*r)/r};function y(t,e){var r=e.chart.getDatasetMeta(e.datasetIndex).vScale;if(!r)return null;if(void 0!==r.xCenter&&void 0!==r.yCenter)return{x:r.xCenter,y:r.yCenter};var a=r.getBasePixel();return t.horizontal?{x:a,y:null}:{x:null,y:a}}function v(t,e,r){var a=r.backgroundColor,o=r.borderColor,n=r.borderWidth;(a||o&&n)&&(t.beginPath(),function(t,e,r,a,o,n){var i=Math.PI/2;if(n){var l=Math.min(n,o/2,a/2),s=e+l,u=r+l,d=e+a-l,c=r+o-l;t.moveTo(e,u),sr.x+r.w+2||t.y>r.y+r.h+2)},intersects:function(t){var e,r,a,o=this._points(),n=t._points(),i=[M(o[0],o[1]),M(o[0],o[3])];for(this._rotation!==t._rotation&&i.push(M(n[0],n[1]),M(n[0],n[3])),e=0;et.getProps([e],!0)[e]}),n=a.geometry(),i=$(l,a.model(),n),o._box.update(i,n,a.rotation()));(function(t,e){var r,a,o,n;for(r=t.length-1;r>=0;--r)for(o=t[r].$layout,a=r-1;a>=0&&o._visible;--a)(n=t[a].$layout)._visible&&o._box.intersects(n._box)&&e(o,n)})(t,(function(t,e){var r=t._hidable,a=e._hidable;r&&a||a?e._visible=!1:r&&(t._visible=!1)}))}(t)},lookup:function(t,e){var r,a;for(r=t.length-1;r>=0;--r)if((a=t[r].$layout)&&a._visible&&a._box.contains(e))return t[r];return null},draw:function(t,e){var r,a,o,n,i,l;for(r=0,a=e.length;r array(,,...,), diff --git a/pandora_console/include/graphs/fgraph.php b/pandora_console/include/graphs/fgraph.php index 7082439384..46436167d1 100644 --- a/pandora_console/include/graphs/fgraph.php +++ b/pandora_console/include/graphs/fgraph.php @@ -11,6 +11,8 @@ // Turn on output buffering. // The entire buffer will be discarded later so that any accidental output // does not corrupt images generated by fgraph. +use Artica\PHPChartJS\Factory; + ob_start(); global $config; @@ -152,439 +154,39 @@ function progressbar( /** * Draw vertical bars graph. * - * @param array $data Data chart. - * @param array $params Params draw chart. - * @param integer $ttl Pdf option. + * @param array|null $chart_data Data chart. + * @param array $params Params draw chart. + * @param integer $ttl Pdf option. * * @return mixed */ function vbar_graph( - array $data, - array $options, - int $ttl=1 + array|null $chart_data, + array $options ) { - global $config; - - // INFO IN: https://github.com/flot/flot/blob/master/API.md. - // Xaxes chart Title. - if (isset($options['x']['title']['title']) === false) { - $options['x']['title']['title'] = ''; - } - - if (isset($options['x']['title']['fontSize']) === false) { - $options['x']['title']['fontSize'] = ((int) $config['font_size'] + 2); - } - - if (isset($options['x']['title']['fontFamily']) === false) { - $options['x']['title']['fontFamily'] = preg_replace( - '/.ttf/', - 'Font, lato', - $config['fontpath'] - ); - } - - if (isset($options['x']['title']['padding']) === false) { - $options['x']['title']['padding'] = 10; - } - - // Xaxes font ticks. - if (isset($options['x']['font']['size']) === false) { - $options['x']['font']['size'] = ((int) $config['font_size'] + 2); - } - - if (isset($options['x']['font']['lineHeight']) === false) { - $options['x']['font']['lineHeight'] = ((int) $config['font_size'] + 2); - } - - if (isset($options['x']['font']['style']) === false) { - $options['x']['font']['style'] = 'normal'; - } - - if (isset($options['x']['font']['weight']) === false) { - $options['x']['font']['weight'] = 'normal'; - } - - if (isset($options['x']['font']['family']) === false) { - $options['x']['font']['family'] = preg_replace( - '/.ttf/', - 'Font', - $config['fontpath'] - ); - } - - if (isset($options['x']['font']['variant']) === false) { - $options['x']['font']['variant'] = 'small-caps'; - } - - if (isset($options['x']['font']['color']) === false) { - $options['x']['font']['color'] = '#545454'; - if ($options['pdf'] === true) { - $options['x']['font']['color'] = '#000'; - } else if ($config['style'] === 'pandora_black' && !is_metaconsole()) { - $options['x']['font']['color'] = '#fff'; + if (empty($chart_data) === true) { + if (isset($options['ttl']) === true + && (int) $options['ttl'] === 2 + ) { + $options['base64'] = true; } + + return graph_nodata_image($options); } - // Show ticks. - if (isset($options['x']['show']) === false) { - $options['x']['show'] = true; - } - - // Type position bottom or top or left or right. - if (isset($options['x']['position']) === false) { - $options['x']['position'] = 'bottom'; - } - - // Grid color axes x. - if (isset($options['x']['color']) === false) { - $options['x']['color'] = '#ffffff'; - if ($config['style'] === 'pandora_black' && !is_metaconsole()) { - $options['x']['color'] = '#222'; - } - } - - if (isset($options['x']['labelWidth']) === false) { - $options['x']['labelWidth'] = null; - } - - if (isset($options['x']['labelHeight']) === false) { - $options['x']['labelHeight'] = null; - } - - // Yaxes chart Title. - if (isset($options['y']['title']['title']) === false) { - $options['y']['title']['title'] = ''; - } - - if (isset($options['y']['title']['fontSize']) === false) { - $options['y']['title']['fontSize'] = ((int) $config['font_size'] + 2); - } - - if (isset($options['y']['title']['fontFamily']) === false) { - $options['y']['title']['fontFamily'] = preg_replace( - '/.ttf/', - 'Font', - $config['fontpath'] - ); - } - - if (isset($options['y']['title']['padding']) === false) { - $options['y']['title']['padding'] = 10; - } - - // Yaxes font ticks. - if (isset($options['y']['font']['size']) === false) { - $options['y']['font']['size'] = ((int) $config['font_size'] + 2); - } - - if (isset($options['y']['font']['lineHeight']) === false) { - $options['y']['font']['lineHeight'] = ((int) $config['font_size'] + 2); - } - - if (isset($options['y']['font']['style']) === false) { - $options['y']['font']['style'] = 'normal'; - } - - if (isset($options['y']['font']['weight']) === false) { - $options['y']['font']['weight'] = 'normal'; - } - - if (isset($options['y']['font']['family']) === false) { - $options['y']['font']['family'] = preg_replace( - '/.ttf/', - 'Font', - $config['fontpath'] - ); - } - - if (isset($options['y']['font']['variant']) === false) { - $options['y']['font']['variant'] = 'small-caps'; - } - - if (isset($options['y']['font']['color']) === false) { - $options['y']['font']['color'] = '#545454'; - if ($options['pdf'] === true) { - $options['y']['font']['color'] = '#000'; - } else if ($config['style'] === 'pandora_black' && !is_metaconsole()) { - $options['y']['font']['color'] = '#fff'; - } - } - - // Show ticks. - if (isset($options['y']['show']) === false) { - $options['y']['show'] = true; - } - - // Type position bottom or top or left or right. - if (isset($options['y']['position']) === false) { - $options['y']['position'] = 'left'; - } - - // Grid color axes y. - if (isset($options['y']['color']) === false) { - $options['y']['color'] = '#ffffff'; - if ($config['style'] === 'pandora_black' && !is_metaconsole()) { - $options['y']['color'] = '#222'; - } - } - - if (isset($options['y']['labelWidth']) === false) { - $options['y']['labelWidth'] = null; - } - - if (isset($options['y']['labelHeight']) === false) { - $options['y']['labelHeight'] = null; - } - - // Bars options. - // left, right or center. - if (isset($options['bars']['align']) === false) { - $options['bars']['align'] = 'center'; - } - - if (isset($options['bars']['barWidth']) === false) { - $options['bars']['barWidth'] = 0.8; - } - - if (isset($options['bars']['horizontal']) === false) { - $options['bars']['horizontal'] = false; - } - - // Grid Options. - if (isset($options['grid']['show']) === false) { - $options['grid']['show'] = true; - } - - if (isset($options['grid']['aboveData']) === false) { - $options['grid']['aboveData'] = false; - } - - if (isset($options['grid']['color']) === false) { - $options['grid']['color'] = '#ffffff'; - if ($config['style'] === 'pandora_black' && !is_metaconsole()) { - $options['grid']['color'] = '#111'; - } - } - - if (isset($options['grid']['backgroundColor']) === false) { - $options['grid']['backgroundColor'] = [ - 'colors' => [ - '#ffffff', - '#ffffff', - ], + if (isset($options['ttl']) === true && (int) $options['ttl'] === 2) { + $params = [ + 'chart_data' => $chart_data, + 'options' => $options, + 'return_img_base_64' => true, ]; - if ($config['style'] === 'pandora_black' && !is_metaconsole() && $ttl === 1) { - $options['grid']['backgroundColor'] = [ - 'colors' => [ - '#222', - '#222', - ], - ]; - } + + return generator_chart_to_pdf('vbar_graph', $params); } - if (isset($options['grid']['margin']) === false) { - $options['grid']['margin'] = 0; - } - - if (isset($options['grid']['labelMargin']) === false) { - $options['grid']['labelMargin'] = 5; - } - - if (isset($options['grid']['axisMargin']) === false) { - $options['grid']['axisMargin'] = 5; - } - - if (isset($options['grid']['markings']) === false) { - $options['grid']['markings'] = []; - } - - if (isset($options['grid']['borderWidth']) === false) { - $options['grid']['borderWidth'] = 0; - } - - if (isset($options['grid']['borderColor']) === false) { - $options['grid']['borderColor'] = '#ffffff'; - } - - if (isset($options['grid']['minBorderMargin']) === false) { - $options['grid']['minBorderMargin'] = 5; - } - - if (isset($options['grid']['clickable']) === false) { - $options['grid']['clickable'] = false; - } - - if (isset($options['grid']['hoverable']) === false) { - $options['grid']['hoverable'] = false; - } - - if (isset($options['grid']['autoHighlight']) === false) { - $options['grid']['autoHighlight'] = false; - } - - if (isset($options['grid']['mouseActiveRadius']) === false) { - $options['grid']['mouseActiveRadius'] = false; - } - - // Series bars. - if (isset($options['seriesBars']['show']) === false) { - $options['seriesBars']['show'] = true; - } - - if (isset($options['seriesBars']['lineWidth']) === false) { - $options['seriesBars']['lineWidth'] = 0.3; - } - - if (isset($options['seriesBars']['fill']) === false) { - $options['seriesBars']['fill'] = true; - } - - if (isset($options['seriesBars']['fillColor']) === false) { - $options['seriesBars']['fillColor'] = [ - 'colors' => [ - [ 'opacity' => 0.9 ], - [ 'opacity' => 0.9 ], - ], - ]; - }; - - // Generals options. - if (isset($options['generals']['unit']) === false) { - $options['generals']['unit'] = ''; - } - - if (isset($options['generals']['divisor']) === false) { - $options['generals']['divisor'] = 1000; - } - - if (isset($options['generals']['forceTicks']) === false) { - $options['generals']['forceTicks'] = false; - } - - if (isset($options['generals']['arrayColors']) === false) { - $options['generals']['arrayColors'] = false; - } - - if (isset($options['generals']['rotate']) === false) { - $options['generals']['rotate'] = false; - } - - if (isset($options['generals']['pdf']['width']) === false) { - $options['generals']['pdf']['width'] = false; - } - - if (isset($options['generals']['pdf']['height']) === false) { - $options['generals']['pdf']['height'] = false; - } - - $params = [ - 'data' => $data, - 'x' => [ - 'title' => [ - 'title' => $options['x']['title']['title'], - 'fontSize' => $options['x']['title']['fontSize'], - 'fontFamily' => $options['x']['title']['fontFamily'], - 'padding' => $options['x']['title']['padding'], - ], - 'font' => [ - 'size' => $options['x']['font']['size'], - 'lineHeight' => $options['x']['font']['lineHeight'], - 'style' => $options['x']['font']['style'], - 'weight' => $options['x']['font']['weight'], - 'family' => $options['x']['font']['family'], - 'variant' => $options['x']['font']['variant'], - 'color' => ($options['agent_view'] === true) ? 'black' : $options['x']['font']['color'], - ], - 'show' => $options['x']['show'], - 'position' => $options['x']['position'], - 'color' => $options['x']['color'], - 'labelWidth' => $options['x']['labelWidth'], - 'labelHeight' => $options['x']['labelHeight'], - ], - 'y' => [ - 'title' => [ - 'title' => $options['y']['title']['title'], - 'fontSize' => $options['y']['title']['fontSize'], - 'fontFamily' => $options['y']['title']['fontFamily'], - 'padding' => $options['y']['title']['padding'], - ], - 'font' => [ - 'size' => $options['y']['font']['size'], - 'lineHeight' => $options['y']['font']['lineHeight'], - 'style' => $options['y']['font']['style'], - 'weight' => $options['y']['font']['weight'], - 'family' => $options['y']['font']['family'], - 'variant' => $options['y']['font']['variant'], - 'color' => ($options['agent_view'] === true) ? 'black' : $options['y']['font']['color'], - ], - 'show' => $options['y']['show'], - 'position' => $options['y']['position'], - 'color' => $options['y']['color'], - 'labelWidth' => $options['y']['labelWidth'], - 'labelHeight' => $options['y']['labelHeight'], - ], - 'bars' => [ - 'align' => $options['bars']['align'], - 'barWidth' => $options['bars']['barWidth'], - 'horizontal' => $options['bars']['horizontal'], - ], - 'grid' => [ - 'show' => $options['grid']['show'], - 'aboveData' => $options['grid']['aboveData'], - 'color' => $options['grid']['color'], - 'backgroundColor' => $options['grid']['backgroundColor'], - 'margin' => ($options['agent_view'] === true) ? 6 : $options['grid']['margin'], - 'labelMargin' => ($options['agent_view'] === true) ? 12 : $options['grid']['labelMargin'], - 'axisMargin' => $options['grid']['axisMargin'], - 'markings' => $options['grid']['markings'], - 'borderWidth' => $options['grid']['borderWidth'], - 'borderColor' => $options['grid']['borderColor'], - 'minBorderMargin' => $options['grid']['minBorderMargin'], - 'clickable' => $options['grid']['clickable'], - 'hoverable' => $options['grid']['hoverable'], - 'autoHighlight' => $options['grid']['autoHighlight'], - 'mouseActiveRadius' => $options['grid']['mouseActiveRadius'], - ], - 'seriesBars' => [ - 'show' => $options['seriesBars']['show'], - 'lineWidth' => $options['seriesBars']['lineWidth'], - 'fill' => $options['seriesBars']['fill'], - 'fillColor' => $options['seriesBars']['fillColor'], - ], - 'generals' => [ - 'unit' => $options['generals']['unit'], - 'divisor' => $options['generals']['divisor'], - 'forceTicks' => $options['generals']['forceTicks'], - 'arrayColors' => $options['generals']['arrayColors'], - 'rotate' => $options['generals']['rotate'], - ], - ]; - - if ($options['agent_view'] === true) { - $params['agent_view'] = true; - } - - if (empty($params['data']) === true) { - return graph_nodata_image( - 0, - 0, - 'vbar', - '', - true, - ($ttl === 2) ? true : false - ); - } - - if ((int) $ttl === 2) { - $params['backgroundColor'] = $options['grid']['backgroundColor']; - $params['return_img_base_64'] = true; - $params['generals']['pdf']['width'] = $options['generals']['pdf']['width']; - $params['generals']['pdf']['height'] = $options['generals']['pdf']['height']; - return generator_chart_to_pdf('vbar', $params); - } - - return flot_vcolumn_chart($params); + $chart = get_build_setup_charts('BAR', $options, $chart_data); + $output = $chart->render(true); + return $output; } @@ -730,7 +332,7 @@ function hbar_graph( } if ($chart_data === false || empty($chart_data) === true) { - return graph_nodata_image($width, $height, 'hbar'); + return graph_nodata_image($options); } if ($ttl == 2) { @@ -774,158 +376,738 @@ function hbar_graph( } +/** + * Pie graph PIE. + * + * @param array $chart_data Data. + * @param array $options Options. + * + * @return string Output html charts + */ function pie_graph( $chart_data, - $width, - $height, - $others_str='other', - $homedir='', - $water_mark='', - $font='', - $font_size=8, - $ttl=1, - $legend_position=false, - $colors='', - $hide_labels=false, - $max_values=9 + $options ) { if (empty($chart_data) === true) { - return graph_nodata_image($width, $height, 'pie'); + if (isset($options['ttl']) === true + && (int) $options['ttl'] === 2 + ) { + $options['base64'] = true; + } + + return graph_nodata_image($options); } - if ($water_mark !== false) { - setup_watermark($water_mark, $water_mark_file, $water_mark_url); - } - - // This library allows only 8 colors. - // $max_values = 9; - // Remove the html_entities. - $temp = []; - foreach ($chart_data as $key => $value) { - $temp[io_safe_output($key)] = $value; - } - - $chart_data = $temp; - + // Number max elements. + $max_values = (isset($options['maxValues']) === true) ? $options['maxValues'] : 15; if (count($chart_data) > $max_values) { + $others_str = (isset($options['otherStr']) === true) ? $options['otherStr'] : __('Others'); $chart_data_trunc = []; $n = 1; foreach ($chart_data as $key => $value) { - if ($n < $max_values) { + if ($n <= $max_values) { $chart_data_trunc[$key] = $value; } else { - if (!isset($chart_data_trunc[$others_str])) { + if (isset($options['labels'][$key]) === true) { + unset($options['labels'][$key]); + } + + if (isset($chart_data_trunc[$others_str]) === false) { $chart_data_trunc[$others_str] = 0; } - $chart_data_trunc[$others_str] += $value; + if (empty($value) === false) { + $chart_data_trunc[$others_str] += (float) $value; + } } $n++; } + $options['labels'][$max_values] = $others_str; $chart_data = $chart_data_trunc; } - if ($ttl == 2) { + if (isset($options['ttl']) === true + && (int) $options['ttl'] === 2 + ) { $params = [ - 'values' => array_values($chart_data), - 'keys' => array_keys($chart_data), - 'width' => $width, - 'height' => $height, - 'water_mark_url' => $water_mark_url, - 'font' => $font, - 'font_size' => $font_size, - 'legend_position' => $legend_position, - 'colors' => $colors, - 'hide_labels' => $hide_labels, + 'chart_data' => $chart_data, + 'options' => $options, + 'return_img_base_64' => true, ]; - return generator_chart_to_pdf('pie_chart', $params); + return generator_chart_to_pdf('pie_graph', $params); } - return flot_pie_chart( - array_values($chart_data), - array_keys($chart_data), - $width, - $height, - $water_mark_url, - $font, - $font_size, - $legend_position, - $colors, - $hide_labels - ); + $chart = get_build_setup_charts('PIE', $options, $chart_data); + $output = $chart->render(true, true); + return $output; } +/** + * Rin graph DOUGHNUT. + * + * @param array $chart_data Data. + * @param array $options Options. + * + * @return string Output html charts + */ function ring_graph( $chart_data, - $width, - $height, - $others_str='other', - $homedir='', - $water_mark='', - $font='', - $font_size='', - $ttl=1, - $legend_position=false, - $colors='', - $hide_labels=false, - $background_color='white', - $pdf=false + $options ) { - if (empty($chart_data)) { - return graph_nodata_image($width, $height, 'pie'); + global $config; + + if (empty($chart_data) === true) { + if (isset($options['ttl']) === true + && (int) $options['ttl'] === 2 + ) { + $options['base64'] = true; + } + + return graph_nodata_image($options); } - setup_watermark($water_mark, $water_mark_file, $water_mark_url); - - // This library allows only 8 colors - $max_values = 18; - - if ($ttl == 2) { + if (isset($options['ttl']) === true && (int) $options['ttl'] === 2) { $params = [ - 'chart_data' => $chart_data, - 'width' => $width, - 'height' => $height, - 'colors' => $colors, - 'module_name_list' => $module_name_list, - 'long_index' => $long_index, - 'no_data' => $no_data, - 'water_mark' => $water_mark, - 'font' => $font, - 'font_size' => $font_size, - 'unit' => $unit, - 'ttl' => $ttl, - 'homeurl' => $homeurl, - 'background_color' => $background_color, - 'legend_position' => $legend_position, - 'pdf' => $pdf, + 'chart_data' => $chart_data, + 'options' => $options, + 'return_img_base_64' => true, ]; return generator_chart_to_pdf('ring_graph', $params); } - return flot_custom_pie_chart( - $chart_data, - $width, - $height, - $colors, - $module_name_list, - $long_index, - $no_data, - false, - '', - $water_mark, - $font, - $font_size, - $unit, - $ttl, - $homeurl, - $background_color, - $legend_position, - $background_color, - $pdf - ); + $chart = get_build_setup_charts('DOUGHNUT', $options, $chart_data); + $output = $chart->render(true, true); + return $output; +} + + +function get_build_setup_charts($type, $options, $data) +{ + global $config; + + $factory = new Factory(); + + switch ($type) { + case 'DOUGHNUT': + $chart = $factory->create($factory::DOUGHNUT); + break; + + case 'PIE': + $chart = $factory->create($factory::PIE); + break; + + case 'BAR': + $chart = $factory->create($factory::BAR); + break; + + default: + // code... + break; + } + + $example = [ + 'id' => null, + 'width' => null, + 'height' => null, + 'maintainAspectRatio' => false, + 'responsive' => true, + 'radius' => null, + 'rotation' => null, + 'circumference' => null, + 'axis' => 'y', + 'legend' => [ + 'display' => true, + 'position' => 'top', + 'align' => 'center', + 'font' => [ + 'family' => '', + 'size' => 12, + 'style' => 'normal', + 'weight' => null, + 'lineHeight' => 1.2, + ], + ], + 'title' => [ + 'display' => true, + 'position' => 'top', + 'color' => '', + 'align' => 'center', + 'text' => '', + 'font' => [ + 'family' => '', + 'size' => 12, + 'style' => 'normal', + 'weight' => null, + 'lineHeight' => 1.2, + ], + ], + 'dataLabel' => [ + 'display' => true, + 'color' => '', + 'clip' => true, + 'clamp' => true, + 'anchor' => 'center', + 'formatter' => 'namefunction', + 'fonts' => [ + 'family' => '', + 'size' => 12, + 'style' => 'normal', + 'weight' => null, + 'lineHeight' => 1.2, + ], + ], + 'scales' => [ + 'x' => [ + 'grid' => [ + 'display' => false, + 'color' => 'orange', + ], + 'ticks' => [ + 'fonts' => [ + 'family' => '', + 'size' => 12, + 'style' => 'normal', + 'weight' => null, + 'lineHeight' => 1.2, + ], + ], + ], + 'y' => [ + 'grid' => [ + 'display' => false, + 'color' => 'orange', + ], + 'ticks' => [ + 'fonts' => [ + 'family' => '', + 'size' => 12, + 'style' => 'normal', + 'weight' => null, + 'lineHeight' => 1.2, + ], + ], + ], + ], + ]; + + // Set Id. + $id = uniqid('graph_'); + if (isset($options['id']) === true && empty($options['id']) === false) { + $id = $options['id']; + } + + $chart->setId($id); + + // Height is null maximum possible. + if (isset($options['height']) === true + && empty($options['height']) === false + ) { + $chart->setHeight($options['height']); + } + + // Width is null maximum possible. + if (isset($options['width']) === true + && empty($options['width']) === false + ) { + $chart->setWidth($options['width']); + } + + // Fonts defaults. + $chart->defaults()->getFonts()->setFamily((empty($config['fontpath']) === true) ? 'Lato' : $config['fontpath']); + $chart->defaults()->getFonts()->setStyle('normal'); + $chart->defaults()->getFonts()->setWeight(600); + $chart->defaults()->getFonts()->setSize(((int) $config['font_size'] + 2)); + + if (isset($options['waterMark']) === true + && empty($options['waterMark']) === false + ) { + // WaterMark. + $chart->defaults()->getWaterMark()->setWidth(88); + $chart->defaults()->getWaterMark()->setHeight(16); + $chart->defaults()->getWaterMark()->setSrc($options['waterMark']['url']); + $chart->defaults()->getWaterMark()->setPosition('end'); + $chart->defaults()->getWaterMark()->setAlign('top'); + } + + if ((isset($options['pdf']) === true && $options['pdf'] === true) + || (isset($options['ttl']) === true && (int) $options['ttl'] === 2) + ) { + $chart->options()->disableAnimation(false); + } + + // Set Maintain Aspect Ratio for responsive charts. + $maintainAspectRatio = false; + if (isset($options['maintainAspectRatio']) === true + && empty($options['maintainAspectRatio']) === false + ) { + $maintainAspectRatio = $options['maintainAspectRatio']; + } + + $chart->options()->setMaintainAspectRatio($maintainAspectRatio); + + // Set Responsive for responsive charts. + $responsive = true; + if (isset($options['responsive']) === true + && empty($options['responsive']) === false + ) { + $responsive = $options['responsive']; + } + + $chart->options()->setResponsive($responsive); + + // LEGEND. + if (isset($options['legend']) === true + && empty($options['legend']) === false + && is_array($options['legend']) === true + ) { + $legend = $chart->options()->getPlugins()->getLegend(); + + // Set Display legends. + $legendDisplay = true; + if (isset($options['legend']['display']) === true) { + $legendDisplay = $options['legend']['display']; + } + + $legend->setDisplay($legendDisplay); + + // Set Position legends. + $legendPosition = 'top'; + if (isset($options['legend']['position']) === true + && empty($options['legend']['position']) === false + ) { + $legendPosition = $options['legend']['position']; + } + + $legend->setPosition($legendPosition); + + // Set Align legends. + $legendAlign = 'center'; + if (isset($options['legend']['align']) === true + && empty($options['legend']['align']) === false + ) { + $legendAlign = $options['legend']['align']; + } + + $legend->setAlign($legendAlign); + + // Defaults fonts legends. + $legend->labels()->getFonts()->setFamily((empty($config['fontpath']) === true) ? 'Lato' : $config['fontpath']); + $legend->labels()->getFonts()->setStyle('normal'); + $legend->labels()->getFonts()->setWeight(600); + $legend->labels()->getFonts()->setSize(((int) $config['font_size'] + 2)); + if (isset($options['legend']['fonts']) === true + && empty($options['legend']['fonts']) === false + && is_array($options['legend']['fonts']) === true + ) { + if (isset($options['legend']['fonts']['size']) === true) { + $legend->labels()->getFonts()->setSize($options['legend']['fonts']['size']); + } + + if (isset($options['legend']['fonts']['style']) === true) { + $legend->labels()->getFonts()->setStyle($options['legend']['fonts']['style']); + } + + if (isset($options['legend']['fonts']['weight']) === true) { + $legend->labels()->getFonts()->setWeight($options['legend']['fonts']['weight']); + } + + if (isset($options['legend']['fonts']['family']) === true) { + $legend->labels()->getFonts()->setFamily($options['legend']['fonts']['family']); + } + } + } + + if (isset($options['layout']) === true + && empty($options['layout']) === false + && is_array($options['layout']) === true + ) { + $layout = $chart->options()->getLayout(); + if (isset($options['layout']['padding']) === true + && empty($options['layout']['padding']) === false + && is_array($options['layout']['padding']) === true + ) { + if (isset($options['layout']['padding']['top']) === true) { + $layout->padding()->setTop($options['layout']['padding']['top']); + } + + if (isset($options['layout']['padding']['bottom']) === true) { + $layout->padding()->setBottom($options['layout']['padding']['bottom']); + } + + if (isset($options['layout']['padding']['left']) === true) { + $layout->padding()->setLeft($options['layout']['padding']['left']); + } + + if (isset($options['layout']['padding']['right']) === true) { + $layout->padding()->setRight($options['layout']['padding']['right']); + } + } + } + + // Display labels. + if (isset($options['dataLabel']) === true + && empty($options['dataLabel']) === false + && is_array($options['dataLabel']) === true + ) { + $dataLabel = $chart->options()->getPlugins()->getDataLabel(); + + $chart->addPlugin('ChartDataLabels'); + + $dataLabelDisplay = 'auto'; + if (isset($options['dataLabel']['display']) === true) { + $dataLabelDisplay = $options['dataLabel']['display']; + } + + $dataLabel->setDisplay($dataLabelDisplay); + + $dataLabelColor = '#343434'; + if (isset($options['dataLabel']['color']) === true) { + $dataLabelColor = $options['dataLabel']['color']; + } + + $dataLabel->setColor($dataLabelColor); + + $dataLabelClip = false; + if (isset($options['dataLabel']['clip']) === true) { + $dataLabelClip = $options['dataLabel']['clip']; + } + + $dataLabel->setClip($dataLabelClip); + + $dataLabelClamp = true; + if (isset($options['dataLabel']['clamp']) === true) { + $dataLabelClamp = $options['dataLabel']['clamp']; + } + + $dataLabel->setClamp($dataLabelClamp); + + $dataLabelAnchor = 'end'; + if (isset($options['dataLabel']['anchor']) === true) { + $dataLabelAnchor = $options['dataLabel']['anchor']; + } + + $dataLabel->setAnchor($dataLabelAnchor); + + $dataLabelAlign = 'end'; + if (isset($options['dataLabel']['align']) === true) { + $dataLabelAlign = $options['dataLabel']['align']; + } + + $dataLabel->setAlign($dataLabelAlign); + + $dataLabelOffset = 0; + if (isset($options['dataLabel']['offset']) === true) { + $dataLabelOffset = $options['dataLabel']['offset']; + } + + $dataLabel->setOffset($dataLabelOffset); + + switch ($type) { + case 'DOUGHNUT': + case 'PIE': + $dataLabelFormatter = 'formatterDataLabelPie'; + break; + + case 'BAR': + if (isset($options['axis']) === true + && empty($options['axis']) === false + ) { + $dataLabelFormatter = 'formatterDataHorizontalBar'; + } else { + $dataLabelFormatter = 'formatterDataVerticalBar'; + } + break; + + default: + // Not possible. + break; + } + + if (isset($options['dataLabel']['formatter']) === true) { + $dataLabelFormatter = $options['dataLabel']['formatter']; + } + + $dataLabel->setFormatter($dataLabelFormatter); + + // Defaults fonts datalabel. + $dataLabel->getFonts()->setFamily((empty($config['fontpath']) === true) ? 'Lato' : $config['fontpath']); + $dataLabel->getFonts()->setStyle('normal'); + $dataLabel->getFonts()->setWeight(600); + $dataLabel->getFonts()->setSize(((int) $config['font_size'] + 2)); + + if (isset($options['dataLabel']['fonts']) === true + && empty($options['dataLabel']['fonts']) === false + && is_array($options['dataLabel']['fonts']) === true + ) { + if (isset($options['dataLabel']['fonts']['size']) === true) { + $dataLabel->getFonts()->setSize($options['dataLabel']['fonts']['size']); + } + + if (isset($options['dataLabel']['fonts']['style']) === true) { + $dataLabel->getFonts()->setStyle($options['dataLabel']['fonts']['style']); + } + + if (isset($options['dataLabel']['fonts']['weight']) === true) { + $dataLabel->getFonts()->setWeight($options['dataLabel']['fonts']['weight']); + } + + if (isset($options['dataLabel']['fonts']['family']) === true) { + $dataLabel->getFonts()->setFamily($options['dataLabel']['fonts']['family']); + } + } + } + + // Title. + if (isset($options['title']) === true + && empty($options['title']) === false + && is_array($options['title']) === true + ) { + $chartTitle = $chart->options()->getPlugins()->getTitle(); + + $display = false; + if (isset($options['title']['display']) === true) { + $display = $options['title']['display']; + } + + $chartTitle->setDisplay($display); + + $text = __('Title'); + if (isset($options['title']['text']) === true) { + $text = $options['title']['text']; + } + + $chartTitle->setText($text); + + $position = 'top'; + if (isset($options['title']['position']) === true) { + $position = $options['title']['position']; + } + + $chartTitle->setPosition($position); + + $color = 'top'; + if (isset($options['title']['color']) === true) { + $color = $options['title']['color']; + } + + $chartTitle->setColor($color); + + if (isset($options['title']['fonts']) === true + && empty($options['title']['fonts']) === false + && is_array($options['title']['fonts']) === true + ) { + if (isset($options['title']['fonts']['size']) === true) { + $chartTitle->getFonts()->setSize($options['title']['fonts']['size']); + } + + if (isset($options['title']['fonts']['style']) === true) { + $chartTitle->getFonts()->setStyle($options['title']['fonts']['style']); + } + + if (isset($options['title']['fonts']['family']) === true) { + $chartTitle->getFonts()->setFamily($options['title']['fonts']['family']); + } + } + } + + // Radius is null maximum possible. + if (isset($options['radius']) === true + && empty($options['radius']) === false + ) { + $chart->setRadius($options['radius']); + } + + // Rotation is null 0º. + if (isset($options['rotation']) === true + && empty($options['rotation']) === false + ) { + $chart->setRotation($options['rotation']); + } + + // Circumferende is null 360º. + if (isset($options['circumference']) === true + && empty($options['circumference']) === false + ) { + $chart->setCircumference($options['circumference']); + } + + if (isset($options['scales']) === true + && empty($options['scales']) === false + && is_array($options['scales']) === true + ) { + $scales = $chart->options()->getScales(); + + // Defaults scalesFont X. + $scalesXFonts = $scales->getX()->ticks()->getFonts(); + $scalesXFonts->setFamily((empty($config['fontpath']) === true) ? 'Lato' : $config['fontpath']); + $scalesXFonts->setStyle('normal'); + $scalesXFonts->setWeight(600); + $scalesXFonts->setSize(((int) $config['font_size'] + 2)); + + // Defaults scalesFont Y. + $scalesYFonts = $scales->getY()->ticks()->getFonts(); + $scalesYFonts->setFamily((empty($config['fontpath']) === true) ? 'Lato' : $config['fontpath']); + $scalesYFonts->setStyle('normal'); + $scalesYFonts->setWeight(600); + $scalesYFonts->setSize(((int) $config['font_size'] + 2)); + + if (isset($options['scales']['x']) === true + && empty($options['scales']['x']) === false + && is_array($options['scales']['x']) === true + ) { + if (isset($options['scales']['x']['bounds']) === true) { + $scales->getX()->setBounds($options['scales']['x']['bounds']); + } + + if (isset($options['scales']['x']['grid']) === true + && empty($options['scales']['x']['grid']) === false + && is_array($options['scales']['x']['grid']) === true + ) { + if (isset($options['scales']['x']['grid']['display']) === true) { + $scales->getX()->grid()->setDrawOnChartArea($options['scales']['x']['grid']['display']); + } + + if (isset($options['scales']['x']['grid']['color']) === true) { + $scales->getX()->grid()->setColor($options['scales']['x']['grid']['color']); + } + } + + if (isset($options['scales']['x']['ticks']) === true + && empty($options['scales']['x']['ticks']) === false + && is_array($options['scales']['x']['ticks']) === true + ) { + if (isset($options['scales']['x']['ticks']['fonts']) === true + && empty($options['scales']['x']['ticks']['fonts']) === false + && is_array($options['scales']['x']['ticks']['fonts']) === true + ) { + $scaleXTicksFonts = $scales->getX()->ticks()->getFonts(); + if (isset($options['scales']['x']['ticks']['fonts']['size']) === true) { + $scaleXTicksFonts->setSize($options['scales']['x']['ticks']['fonts']['size']); + } + + if (isset($options['scales']['x']['ticks']['fonts']['style']) === true) { + $scaleXTicksFonts->setStyle($options['scales']['x']['ticks']['fonts']['style']); + } + + if (isset($options['scales']['x']['ticks']['fonts']['family']) === true) { + $scaleXTicksFonts->setFamily($options['scales']['x']['ticks']['fonts']['family']); + } + } + } + } + + if (isset($options['scales']['y']) === true + && empty($options['scales']['y']) === false + && is_array($options['scales']['y']) === true + ) { + if (isset($options['scales']['y']['bounds']) === true) { + $scales->getY()->setBounds($options['scales']['y']['bounds']); + } + + if (isset($options['scales']['y']['grid']) === true + && empty($options['scales']['y']['grid']) === false + && is_array($options['scales']['y']['grid']) === true + ) { + if (isset($options['scales']['y']['grid']['display']) === true) { + $scales->getY()->grid()->setDrawOnChartArea($options['scales']['y']['grid']['display']); + } + + if (isset($options['scales']['y']['grid']['color']) === true) { + $scales->getY()->grid()->setColor($options['scales']['y']['grid']['color']); + } + } + + if (isset($options['scales']['y']['ticks']) === true + && empty($options['scales']['y']['ticks']) === false + && is_array($options['scales']['y']['ticks']) === true + ) { + if (isset($options['scales']['y']['ticks']['fonts']) === true + && empty($options['scales']['y']['ticks']['fonts']) === false + && is_array($options['scales']['y']['ticks']['fonts']) === true + ) { + $scaleYTicksFonts = $scales->getY()->ticks()->getFonts(); + if (isset($options['scales']['y']['ticks']['fonts']['size']) === true) { + $scaleYTicksFonts->setSize($options['scales']['y']['ticks']['fonts']['size']); + } + + if (isset($options['scales']['y']['ticks']['fonts']['style']) === true) { + $scaleYTicksFonts->setStyle($options['scales']['y']['ticks']['fonts']['style']); + } + + if (isset($options['scales']['y']['ticks']['fonts']['family']) === true) { + $scaleYTicksFonts->setFamily($options['scales']['y']['ticks']['fonts']['family']); + } + } + } + } + } + + // Color. + if (isset($options['colors']) === true + && empty($options['colors']) === false + && is_array($options['colors']) === true + ) { + $colors = $options['colors']; + $borders = $options['colors']; + } else { + // Colors. + $defaultColor = []; + $defaultBorder = []; + $defaultColorArray = color_graph_array(); + foreach ($defaultColorArray as $key => $value) { + list($r, $g, $b) = sscanf($value['color'], '#%02x%02x%02x'); + $defaultColor[$key] = 'rgba('.$r.', '.$g.', '.$b.', 0.6)'; + $defaultBorder[$key] = $value['color']; + } + + $colors = array_values($defaultColor); + $borders = array_values($defaultBorder); + } + + // Set labels. + if (isset($options['labels']) === true + && empty($options['labels']) === false + && is_array($options['labels']) === true + ) { + $chart->labels()->exchangeArray($options['labels']); + } + + // Add Datasets. + $setData = $chart->createDataSet(); + switch ($type) { + case 'DOUGHNUT': + case 'PIE': + $setData->setLabel('data')->setBackgroundColor($borders); + $setData->setLabel('data')->data()->exchangeArray(array_values($data)); + break; + + case 'BAR': + $setData->setLabel('data')->setBackgroundColor($colors); + $setData->setLabel('data')->setBorderColor($borders); + $setData->setLabel('data')->setBorderWidth(2); + + $setData->setLabel('data')->data()->exchangeArray(array_values($data)); + + // Para las horizontales. + if (isset($options['axis']) === true + && empty($options['axis']) === false + ) { + $chart->options()->setIndexAxis($options['axis']); + $setData->setAxis($options['axis']); + } + break; + + default: + // Not possible. + break; + } + + $chart->addDataSet($setData); + + return $chart; } diff --git a/pandora_console/include/graphs/flot/pandora.flot.js b/pandora_console/include/graphs/flot/pandora.flot.js index 629e1a48f4..0b48540052 100644 --- a/pandora_console/include/graphs/flot/pandora.flot.js +++ b/pandora_console/include/graphs/flot/pandora.flot.js @@ -2716,6 +2716,7 @@ function pandoraFlotArea( $("#menu_export_csv_" + graph_id).click(function(e) { e.preventDefault(); + blockResubmit($(this)); plot.exportDataCSV(); var es_firefox = navigator.userAgent.toLowerCase().indexOf("firefox") > -1; diff --git a/pandora_console/include/graphs/functions_d3.php b/pandora_console/include/graphs/functions_d3.php index e48babd58d..acb675423a 100644 --- a/pandora_console/include/graphs/functions_d3.php +++ b/pandora_console/include/graphs/functions_d3.php @@ -756,71 +756,3 @@ function print_clock_digital_1($time_format, $timezone, $clock_animation, $width return $output; } - - -/** - * Print dougnhnut. - * - * @param array $colors Colors. - * @param integer $width Width. - * @param integer $height Height. - * @param array $data Data. - * @param mixed $data_total Data_total. - * - * @return string HTML. - */ -function print_donut_narrow_graph( - array $colors, - $width, - $height, - array $data, - $data_total -) { - global $config; - - if (empty($data)) { - return graph_nodata_image($width, $height, 'pie'); - } - - $series = count($data); - if (($series != count($colors)) || ($series == 0)) { - return ''; - } - - $data = json_encode($data); - $colors = json_encode($colors); - - $graph_id = uniqid('graph_'); - - // This is for "Style template" in visual styles. - switch ($config['style']) { - case 'pandora': - $textColor = '#000'; - $strokeColor = '#fff'; - break; - - case 'pandora_black': - $textColor = '#fff'; - $strokeColor = '#222'; - break; - - default: - $textColor = '#000'; - $strokeColor = '#fff'; - break; - } - - $textColor = json_encode($textColor); - $strokeColor = json_encode($strokeColor); - - $out = "

"; - $out .= include_javascript_d3(true); - $out .= ""; - - return $out; -} diff --git a/pandora_console/include/graphs/functions_flot.php b/pandora_console/include/graphs/functions_flot.php index 8f5256e757..b76abb634e 100644 --- a/pandora_console/include/graphs/functions_flot.php +++ b/pandora_console/include/graphs/functions_flot.php @@ -52,6 +52,11 @@ function include_javascript_dependencies_flot_graph($return=false, $mobile=false '; + + // Chartjs. + $output .= ''; + $output .= ''; + $output .= " '; + if (strlen($home_url) !== 0) { + echo ''; + } else { + $_GET['sec2'] = 'general/logon_ok'; + } break; } @@ -1434,6 +1441,16 @@ if ($searchPage) { } } +if (__PAN_XHPROF__ === 1) { + echo ""; + echo __('Page generated at').' '; + echo date('D F d, Y H:i:s', $time).''; + echo ' - ( '; + pandora_xhprof_display_result('node_index'); + echo ' )'; + echo ''; +} + if ($config['pure'] == 0) { echo '
'; echo '
'; @@ -1469,9 +1486,6 @@ if ($config['pure'] == 0) { echo ''; echo '
'; echo ''; - - echo ''; + + echo ''; + echo ''; + echo "
+ '; +// Search recursive groups. +$data .= ui_print_help_tip( + __('Search for elements NOT containing given text.'), + true +); +$data .= html_print_checkbox_switch( + 'not_search', + $not_search, + $not_search, + true, + false, + 'checked_slide_events(this);', + true +); +$in = ''; $inputs[] = $in; if (is_array($severity) === false) { @@ -1727,7 +1774,7 @@ $data = html_print_checkbox_switch( $search_recursive_groups, true, false, - 'search_in_secondary_groups(this);', + 'checked_slide_events(this);', true ); @@ -1749,7 +1796,7 @@ $data = html_print_checkbox_switch( $search_secondary_groups, true, false, - 'search_in_secondary_groups(this);', + 'checked_slide_events(this);', true ); @@ -1914,6 +1961,19 @@ $in = '
'; $in .= $data.'
'; $adv_inputs[] = $in; +$data = html_print_select( + $user_users, + 'owner_user', + $owner_user, + '', + __('Any'), + 0, + true +); +$in = '
'; +$in .= $data.'
'; +$adv_inputs[] = $in; + // Only alert events. $data = html_print_select( [ @@ -2849,7 +2909,11 @@ $(document).ready( function() { inputs = $("# :input"); values = {}; inputs.each(function() { - values[this.name] = $(this).val(); + if (this.name === 'server_id') { + values[this.name] = $(this).val().join(); + } else { + values[this.name] = $(this).val(); + } }) values['history'] = ""; @@ -2880,11 +2944,11 @@ $(document).ready( function() { $("#text-event_view_hr").on("keyup",function(){ hours = $('#text-event_view_hr').val(); if (hours == '' || hours == 0 ) { - $('#summary_hours').html(''); + $('#summary_hours').text(''); } else if (hours == 1) { - $('#summary_hours').html(''); + $('#summary_hours').text(''); } else { - $('#summary_hours').html(hours + ''); + $('#summary_hours').text(hours + ''); } }); @@ -3030,7 +3094,11 @@ $(document).ready( function() { inputs = $("#events_form :input"); values = {}; inputs.each(function() { - values[this.name] = $(this).val(); + if (this.name === 'server_id') { + values[this.name] = $(this).val().join(); + } else { + values[this.name] = $(this).val(); + } }) var newValue = btoa(JSON.stringify(values)); @@ -3048,7 +3116,7 @@ $(document).ready( function() { }); -function search_in_secondary_groups(element) { +function checked_slide_events(element) { var value = $("#checkbox-"+element.name).val(); if (value == 0) { $("#checkbox-"+element.name).val(1); diff --git a/pandora_console/operation/events/events_rss.php b/pandora_console/operation/events/events_rss.php index 613b88b423..c784206ca5 100644 --- a/pandora_console/operation/events/events_rss.php +++ b/pandora_console/operation/events/events_rss.php @@ -320,6 +320,7 @@ try { $rss .= xml_entry('link', $url.'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$row['id_agente']); } + $rss .= xml_entry('author', $row['agent_name']); $rss .= xml_entry('comments', $row['']); $rss .= xml_entry('pubDate', $row['timestamp']); $rss .= xml_entry('category', $row['source']); diff --git a/pandora_console/operation/events/export_csv.php b/pandora_console/operation/events/export_csv.php index 20856b707e..4b91f36e6d 100644 --- a/pandora_console/operation/events/export_csv.php +++ b/pandora_console/operation/events/export_csv.php @@ -150,6 +150,7 @@ $now = date('Y-m-d'); // Download header. header('Content-type: text/txt'); header('Content-Disposition: attachment; filename="export_events_'.$now.'.csv"'); +setDownloadCookieToken(); try { $fb64 = get_parameter('fb64', null); diff --git a/pandora_console/operation/incidents/incident_statistics.php b/pandora_console/operation/incidents/incident_statistics.php index b4966c1b96..333c0206db 100755 --- a/pandora_console/operation/incidents/incident_statistics.php +++ b/pandora_console/operation/incidents/incident_statistics.php @@ -26,16 +26,16 @@ if (!$config['integria_enabled']) { } echo ' -

'.__('Incidents by status').'

'; +

'.__('Incidents by status').'

'; echo graph_incidents_status(); -echo '

'.__('Incidents by priority').'

'; +echo '

'.__('Incidents by priority').'

'; echo grafico_incidente_prioridad(); -echo '

'.__('Incidents by group').'

'; +echo '

'.__('Incidents by group').'

'; echo graphic_incident_group(); -echo '

'.__('Incidents by user').'

'; +echo '

'.__('Incidents by user').'

'; echo graphic_incident_user(); echo '
'; diff --git a/pandora_console/operation/incidents/integriaims_export_csv.php b/pandora_console/operation/incidents/integriaims_export_csv.php index 04e0970ab4..6d7d4caa80 100644 --- a/pandora_console/operation/incidents/integriaims_export_csv.php +++ b/pandora_console/operation/incidents/integriaims_export_csv.php @@ -111,6 +111,9 @@ $filename = 'tickets_export-'.date('Ymd').'-'.date('His').'.csv'; ob_clean(); +// Set cookie for download control. +setDownloadCookieToken(); + header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename='.$filename); diff --git a/pandora_console/operation/incidents/list_integriaims_incidents.php b/pandora_console/operation/incidents/list_integriaims_incidents.php index 5f32cb7398..8b1e986e89 100644 --- a/pandora_console/operation/incidents/list_integriaims_incidents.php +++ b/pandora_console/operation/incidents/list_integriaims_incidents.php @@ -428,7 +428,7 @@ $integria_incidents_form .= '
'.html_print_ __('Export to CSV'), 'csv_export', false, - "location.href='operation/incidents/integriaims_export_csv.php?tickets_filters=$decode_csv'", + "blockResubmit($(this)); location.href='operation/incidents/integriaims_export_csv.php?tickets_filters=$decode_csv'", 'class="sub next"', true ).'
'; diff --git a/pandora_console/operation/inventory/inventory.php b/pandora_console/operation/inventory/inventory.php new file mode 100755 index 0000000000..0a1cd508bd --- /dev/null +++ b/pandora_console/operation/inventory/inventory.php @@ -0,0 +1,551 @@ + 0) { + $sql .= ' WHERE id_grupo = '.$inventory_id_group; + } else { + $user_groups = implode(',', array_keys(users_get_groups($config['id_user']))); + + // Avoid errors if there are no groups. + if (empty($user_groups) === true) { + $user_groups = '"0"'; + } + + $sql .= ' WHERE id_grupo IN ('.$user_groups.')'; + } + + $result = db_get_all_rows_sql($sql); + if ($result !== false) { + foreach ($result as $row) { + $agents[$row['id_agente']] = $row['nombre']; + } + } + + $agents_select = $agents; + + if (strlen($inventory_agent) == 0) { + $inventory_id_agent = -1; + $inventory_agent = __('All'); + } else if ($inventory_agent == __('All')) { + $inventory_id_agent = 0; + } else { + $sql = 'SELECT id_agente + FROM tagente + WHERE nombre LIKE "'.$inventory_agent.'"'; + + $result = db_get_all_rows_sql($sql); + $inventory_id_agent = $result[0]['id_agente']; + } + + // Single agent selected. + if ($inventory_id_agent > 0 && isset($agents[$inventory_id_agent]) === true) { + $agents = [$inventory_id_agent => $agents[$inventory_id_agent]]; + } + + $agents_ids = array_keys($agents); + if (count($agents_ids) > 0) { + $inventory_data = inventory_get_data( + $agents_ids, + $inventory_module, + $utimestamp, + $inventory_search_string, + $export, + false, + $order_by_agent + ); + + if ((int) $inventory_data === ERR_NODATA) { + $inventory_data = ''; + } + } + + return; + } + + return; +} + +global $config; + +check_login(); + + +$is_metaconsole = is_metaconsole(); + +if ($is_metaconsole === true) { + open_meta_frame(); +} + +if (! check_acl($config['id_user'], 0, 'AR') && ! check_acl($config['id_user'], 0, 'AW')) { + db_pandora_audit( + AUDIT_LOG_ACL_VIOLATION, + 'Trying to access Inventory' + ); + include 'general/noaccess.php'; + return; +} + +require_once $config['homedir'].'/include/functions_users.php'; +require_once $config['homedir'].'/include/functions_inventory.php'; + +// Header. +ui_print_standard_header( + __('Inventory'), + 'images/op_inventory.png', + false, + '', + false, + [], + [ + [ + 'link' => '', + 'label' => __('Monitoring'), + ], + ] +); + +$inventory_id_agent = (int) get_parameter('agent_id', -1); +$inventory_agent = (string) get_parameter('agent', ''); +if (strlen($inventory_agent) == 0) { + $inventory_id_agent = -1; + $inventory_agent = __('All'); +} else if ($inventory_agent == __('All')) { + $inventory_id_agent = 0; +} + +$inventory_module = get_parameter('module_inventory_general_view'); +$inventory_id_group = (int) get_parameter('id_group'); +$inventory_search_string = (string) get_parameter('search_string'); +$order_by_agent = (bool) get_parameter('order_by_agent'); +$export = (string) get_parameter('export'); +$utimestamp = (int) get_parameter('utimestamp'); +$submit_filter = (bool) get_parameter('submit_filter'); + +$pagination_url_parameters = [ + 'inventory_id_agent' => $inventory_id_agent, + 'inventory_agent' => $inventory_agent, + 'inventory_id_group' => $inventory_id_group, +]; + +$noFilterSelected = false; +// Get variables. +if ($is_metaconsole === true) { + $nodes_connection = metaconsole_get_connections(); + $id_server = (int) get_parameter('id_server', 0); + $pagination_url_parameters['id_server'] = $id_server; + + if ($inventory_id_agent > 0) { + $inventory_id_server = (int) get_parameter('id_server_agent', -1); + $pagination_url_parameters['inventory_id_server'] = $inventory_id_server; + + if ($inventory_id_server !== -1) { + $id_server = $inventory_id_server; + $pagination_url_parameters['id_server'] = $id_server; + } + } + + // No filter selected. + $noFilterSelected = $inventory_id_agent === -1 && $inventory_id_group === 0 && $id_server === 0; +} + +if ($is_metaconsole === true) { + if ($id_server > 0) { + $connection = metaconsole_get_connection_by_id($id_server); + $agents_node = metaconsole_get_agents_servers($connection['server_name'], $inventory_id_group); + $node = metaconsole_get_servers($id_server); + + if (metaconsole_connect($connection) !== NOERR) { + ui_print_error_message( + __('There was a problem connecting with the node') + ); + } + + $sql = 'SELECT DISTINCT name as indexname, name + FROM tmodule_inventory, tagent_module_inventory + WHERE tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory'; + if ($inventory_id_agent > 0) { + $sql .= ' AND id_agente = '.$inventory_id_agent; + } + + $result_module = db_get_all_rows_sql($sql); + if ($submit_filter === true) { + $inventory_data .= inventory_get_data( + array_keys($agents_node), + $inventory_module, + $utimestamp, + $inventory_search_string, + $export, + false, + $order_by_agent, + $node, + $pagination_url_parameters + ); + } + + // Restore db connection. + metaconsole_restore_db(); + } else { + $result_module = []; + foreach ($nodes_connection as $key => $server) { + $agents_node = metaconsole_get_agents_servers($server['server_name'], $inventory_id_group); + $connection = metaconsole_get_connection($server['server_name']); + if (metaconsole_connect($connection) !== NOERR) { + continue; + } + + $sql = 'SELECT DISTINCT name as indexname, name + FROM tmodule_inventory, tagent_module_inventory + WHERE tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory'; + if ($inventory_id_agent > 0) { + $sql .= ' AND id_agente = '.$inventory_id_agent; + } + + $result = db_get_all_rows_sql($sql); + + if ($result !== false) { + $result_module = array_merge($result_module, $result); + if ($submit_filter === true) { + // Get the data. + $result_data = inventory_get_data( + array_keys($agents_node), + $inventory_module, + $utimestamp, + $inventory_search_string, + $export, + false, + $order_by_agent, + $server, + $pagination_url_parameters + ); + if ($result_data !== ERR_NODATA) { + $inventory_data .= $result_data; + } + } + } + + // Restore db connection. + metaconsole_restore_db(); + } + } + + $fields = []; + foreach ($result_module as $row) { + $id = array_shift($row); + $value = array_shift($row); + $fields[$id] = $value; + } +} + +$agent_a = (bool) check_acl($config['id_user'], 0, 'AR'); +$agent_w = (bool) check_acl($config['id_user'], 0, 'AW'); +$access = ($agent_a === true) ? 'AR' : (($agent_w === true) ? 'AW' : 'AR'); + +if (is_metaconsole() === true) { + $filteringFunction = 'active_inventory_submit()'; + ui_print_info_message(['no_close' => true, 'message' => __('You must select at least one filter.'), 'force_class' => 'select_one_filter']); + ?> + + '; + +$table = new stdClass(); +$table->width = '100%'; +$table->class = 'databox filters'; +$table->size = []; +$table->size[0] = '120px'; +$table->cellpadding = 0; +$table->cellspacing = 0; +$table->data = []; +$table->rowspan[0][4] = 2; + +if ($is_metaconsole === true) { + // Node select. + $nodes = []; + foreach ($nodes_connection as $row) { + $nodes[$row['id']] = $row['server_name']; + } + + $table->data[-1][0] = ''.__('Server').''; + $table->data[-1][1] = html_print_select($nodes, 'id_server', $id_server, $filteringFunction, __('All'), 0, true, false, true, '', false, 'min-width: 250px; max-width: 300px;'); +} + +// Group select. +$table->data[0][0] = ''.__('Group').''; + +$table->data[0][1] = '
'; +$table->data[0][1] .= html_print_select_groups( + $config['id_user'], + $access, + true, + 'id_group', + $inventory_id_group, + $filteringFunction, + '', + '1', + true, + false, + true, + '', + false +); +$table->data[0][1] .= '
'; + +// Module selected. +$table->data[0][2] = ''.__('Module').''; + +if ($is_metaconsole === true) { + $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 + WHERE tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory'; + if ($inventory_id_agent > 0) { + $sql .= ' AND id_agente = '.$inventory_id_agent; + } + + $table->data[0][3] = html_print_select_from_sql($sql, 'module_inventory_general_view', $inventory_module, '', __('All'), 'all', true, false, false); +} + + +// Button of submit. +$table->data[0][4] = html_print_submit_button(__('Search'), 'submit_filter', $noFilterSelected, "class='sub search'", true); + +// Agent select. +if ($is_metaconsole === false) { + $agents = []; + $sql = 'SELECT id_agente, nombre FROM tagente'; + if ($inventory_id_group > 0) { + $sql .= ' WHERE id_grupo = '.$inventory_id_group; + } else { + $user_groups = implode(',', array_keys(users_get_groups($config['id_user']))); + + // Avoid errors if there are no groups. + if (empty($user_groups) === true) { + $user_groups = '"0"'; + } + + $sql .= ' WHERE id_grupo IN ('.$user_groups.')'; + } + + $result = db_get_all_rows_sql($sql); + if ($result) { + foreach ($result as $row) { + $agents[$row['id_agente']] = $row['nombre']; + } + } +} + +$table->data[1][0] = ''.__('Agent').''; + +$params = []; +$params['return'] = true; +$params['show_helptip'] = true; +$params['input_name'] = 'agent'; +$params['value'] = $inventory_agent; +$params['selectbox_id'] = 'module_inventory_general_view'; +$params['javascript_is_function_select'] = true; +$params['javascript_function_action_after_select'] = 'this.form.submit'; +$params['use_hidden_input_idagent'] = true; +$params['print_hidden_input_idagent'] = true; +$params['hidden_input_idagent_id'] = 'hidden-autocomplete_id_agent'; +$params['hidden_input_idagent_name'] = 'agent_id'; +$params['hidden_input_idagent_value'] = $inventory_id_agent; +if ($is_metaconsole === true) { + $params['print_input_id_server'] = true; + $params['input_id_server_id'] = 'hidden-autocomplete_id_server'; + $params['input_id_server_name'] = 'id_server_agent'; + $params['input_id_server_value'] = $inventory_id_server; + $params['metaconsole_enabled'] = true; +} + +$table->data[1][1] = ui_print_agent_autocomplete_input($params); + +// String search_string. +$table->data[1][2] = ''.__('Search').''; +$table->data[1][3] = html_print_input_text('search_string', $inventory_search_string, '', 25, 0, true, false, false, '', '', $filteringFunction, 'off', false, $filteringFunction); + +// Date filter. In Metaconsole has not reason for show. +if (is_metaconsole() === false) { + $table->data[2][0] = ''.__('Date').''; + $dates = inventory_get_dates($inventory_module, $inventory_agent, $inventory_id_group); + $table->data[2][1] = html_print_select($dates, 'utimestamp', $utimestamp, '', __('Last'), 0, true); +} + +// Order by agent filter. +$table->data[2][2] = ''.__('Order by agent').''; + +$table->data[2][3] = html_print_checkbox('order_by_agent', 1, $order_by_agent, true, false, ''); + +html_print_table($table); + +echo ''; + +// No agent selected or no search performed. +if ($inventory_id_agent < 0 || $submit_filter === false) { + echo ' '; + + return; +} + +if ($is_metaconsole === false) { + // Single agent selected. + if ($inventory_id_agent > 0 && isset($agents[$inventory_id_agent]) === true) { + $agents = [$inventory_id_agent => $agents[$inventory_id_agent]]; + } + + $agents_ids = array_keys($agents); + if (count($agents_ids) > 0) { + $inventory_data = inventory_get_data( + $agents_ids, + $inventory_module, + $utimestamp, + $inventory_search_string, + $export, + false, + $order_by_agent, + '', + $pagination_url_parameters + ); + } + + if (count($agents_ids) === 0 || (int) $inventory_data === ERR_NODATA) { + ui_print_info_message(['no_close' => true, 'message' => __('No data found.') ]); + echo ' '; + + return; + } + + echo "
'; + echo "'; + ?> + + true, 'message' => __('No data found.') ]); + } else { + echo $inventory_data; + } + + close_meta_frame(); +} + +ui_require_jquery_file('pandora.controls'); +ui_require_jquery_file('ajaxqueue'); +ui_require_jquery_file('bgiframe'); +?> + + diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index 035149d22d..762f9ed01f 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -73,7 +73,11 @@ if ($access_console_node === true) { $sub['view']['sub2'] = $sub2; - enterprise_hook('inventory_menu'); + if (check_acl($config['id_user'], 0, 'AR') || check_acl($config['id_user'], 0, 'AW')) { + $sub['operation/inventory/inventory']['text'] = __('Inventory'); + $sub['operation/inventory/inventory']['id'] = 'Inventory'; + $sub['operation/inventory/inventory']['refr'] = 0; + } if ($config['activate_netflow']) { $sub['network_traffic'] = [ @@ -147,7 +151,12 @@ if ($access_console_node === true) { $sub['snmpconsole']['subtype'] = 'nolink'; } - enterprise_hook('cluster_menu'); + if (check_acl($config['id_user'], 0, 'AR')) { + $sub['operation/cluster/cluster']['text'] = __('Cluster View'); + $sub['operation/cluster/cluster']['id'] = 'cluster'; + $sub['operation/cluster/cluster']['refr'] = 0; + } + enterprise_hook('aws_menu'); enterprise_hook('SAP_view'); @@ -166,8 +175,6 @@ if ($access_console_node === true) { $sub['operation/agentes/pandora_networkmap']['text'] = __('Network map'); $sub['operation/agentes/pandora_networkmap']['id'] = 'Network_map'; $sub['operation/agentes/pandora_networkmap']['refr'] = 0; - - enterprise_hook('transmap_console'); } enterprise_hook('services_menu'); @@ -426,10 +433,6 @@ if ($access_console_node === true) { } // Sound Events. - // $javascript = 'javascript: openSoundEventWindow();'; - // $sub[$javascript]['text'] = __('Sound Events'); - // $sub[$javascript]['id'] = 'Sound Events'; - // $sub[$javascript]['type'] = 'direct'; $data_sound = base64_encode( json_encode( [ @@ -440,6 +443,7 @@ if ($access_console_node === true) { 'silenceAlarm' => __('Silence alarm'), 'url' => ui_get_full_url('ajax.php'), 'page' => 'include/ajax/events', + 'urlSound' => 'include/sounds/', ] ) ); @@ -453,26 +457,6 @@ if ($access_console_node === true) { ui_require_javascript_file('pandora_events'); - ?> - - data['1']['2'] .= html_print_submit_button( __('Export to CSV'), 'export_csv', false, - 'class="sub next"', + 'class="sub next" onclick="blockResumit($(this))"', true ); @@ -221,6 +221,8 @@ if (get_parameter('export_csv')) { ob_end_clean(); } + // Set cookie for download control. + setDownloadCookieToken(); // Write metadata. header('Content-type: text/csv;'); header('Content-Disposition: attachment; filename="network_data.csv"'); @@ -267,6 +269,7 @@ if (!empty($main_value)) { // Print the data and build the chart. $table->data = []; $chart_data = []; +$labels = []; $hide_filter = !empty($main_value) && ($action === 'udp' || $action === 'tcp'); foreach ($data as $item) { $row = []; @@ -292,19 +295,20 @@ foreach ($data as $item) { $table->data[] = $row; + $labels[] = io_safe_output($item['host']); // Build the pie graph data structure. switch ($order_by) { case 'pkts': - $chart_data[$item['host']] = $item['sum_bytes']; + $chart_data[] = $item['sum_bytes']; break; case 'flows': - $chart_data[$item['host']] = $item['sum_flows']; + $chart_data[] = $item['sum_flows']; break; case 'bytes': default: - $chart_data[$item['host']] = $item['sum_bytes']; + $chart_data[] = $item['sum_bytes']; break; } } @@ -315,13 +319,21 @@ if (empty($data)) { echo '
'; html_print_table($table); + $options = [ + 'height' => 230, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'labels' => $labels, + ]; + // Print the graph. echo '
'; echo pie_graph( $chart_data, - 320, - 200, - __('Others') + $options ); echo '
'; echo '
'; diff --git a/pandora_console/operation/reporting/graph_viewer.php b/pandora_console/operation/reporting/graph_viewer.php index 60d1146b67..c77d02245e 100644 --- a/pandora_console/operation/reporting/graph_viewer.php +++ b/pandora_console/operation/reporting/graph_viewer.php @@ -307,34 +307,6 @@ if ($view_graph) { return; } - if ($graph_return) { - echo ""; - echo '
'; - if (!is_ajax()) { - echo ''; - } - - if ($stacked == CUSTOM_GRAPH_VBARS) { - echo '
'; - echo '
'; - } else { - echo '
'; - } - - echo $graph_return; - echo '
'; - if ($stacked == CUSTOM_GRAPH_VBARS) { - echo '
'; - } - - echo '
'; - } else { - ui_print_info_message([ 'no_close' => true, 'message' => __('No data.') ]); - } - if ($stacked == CUSTOM_GRAPH_BULLET_CHART_THRESHOLD) { $stacked = 4; } @@ -403,6 +375,31 @@ if ($view_graph) { echo ''; echo ''; + if ($graph_return) { + echo ""; + echo '
'; + if (!is_ajax()) { + echo ''; + } + + echo '
'; + + echo '
'; + echo '
'; + echo $graph_return; + echo '
'; + echo '
'; + + echo '
'; + + echo '
'; + } else { + ui_print_info_message([ 'no_close' => true, 'message' => __('No data.') ]); + } + /* We must add javascript here. Otherwise, the date picker won't work if the date is not correct because php is returning. diff --git a/pandora_console/operation/search_results.php b/pandora_console/operation/search_results.php index 9951ec528e..650bda0c36 100644 --- a/pandora_console/operation/search_results.php +++ b/pandora_console/operation/search_results.php @@ -18,7 +18,8 @@ require_once $config['homedir'].'/include/functions_reporting.php'; enterprise_include('operation/reporting/custom_reporting.php'); $searchAgents = $searchAlerts = $searchModules = check_acl($config['id_user'], 0, 'AR'); -$searchUsers = $searchPolicies = (check_acl($config['id_user'], 0, 'AR') && enterprise_installed()); +$searchUsers = (check_acl($config['id_user'], 0, 'AR')); +$searchPolicies = (check_acl($config['id_user'], 0, 'AR') && enterprise_installed()); $searchReports = $searchGraphs = check_acl($config['id_user'], 0, 'RR'); $searchMaps = check_acl($config['id_user'], 0, 'VR'); $searchMain = true; diff --git a/pandora_console/operation/snmpconsole/snmp_browser.php b/pandora_console/operation/snmpconsole/snmp_browser.php index d8e8b9e497..d7b710c7c5 100644 --- a/pandora_console/operation/snmpconsole/snmp_browser.php +++ b/pandora_console/operation/snmpconsole/snmp_browser.php @@ -252,9 +252,7 @@ function snmp_show_result_message(data) { // Stop waiting modal. waiting_modal(stop); - var dato = data.replace(/[^]+(?=\[)/, ""); - - dato = JSON.parse(dato); + var dato = JSON.parse(data); if (dato.length !== 0) { $("#error_text").text(""); @@ -678,13 +676,16 @@ function show_add_module() { //Submit form to agent module url. $("#snmp_create_module").attr( "action", - "index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente="+id_agent+"&tab=module&edit_module=1"); + "index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente=" + +id_agent+ + "&tab=module&edit_module=1" + ); $('#snmp_create_module').submit(); - - - //Close dialog. - $('#dialog_create_module').dialog("close"); + }, + onDeny: function () { + $("#dialog_create_module").dialog("close"); + return false; } }); } diff --git a/pandora_console/operation/snmpconsole/snmp_statistics.php b/pandora_console/operation/snmpconsole/snmp_statistics.php index ff041c3d5d..56109aa04c 100755 --- a/pandora_console/operation/snmpconsole/snmp_statistics.php +++ b/pandora_console/operation/snmpconsole/snmp_statistics.php @@ -184,7 +184,7 @@ $table_source_data->head['num'] = __('Number'); $table_source_data->data = []; $table_source_graph_data = []; - +$labels = []; foreach ($traps_generated_by_source as $trap) { $row = []; @@ -202,25 +202,30 @@ foreach ($traps_generated_by_source as $trap) { $table_source_data->data[] = $row; - $table_source_graph_data[$trap['source']] = (int) $trap['num']; + $labels[] = io_safe_output($trap['source']); + $table_source_graph_data[] = (int) $trap['num']; } $table_source_row['table'] = html_print_table($table_source_data, true); unset($table_source_data); if (empty($table_source_graph_data)) { - $table_source_graph = graph_nodata_image(); + $table_source_graph = graph_nodata_image([]); } else { + $options = [ + 'height' => 200, + 'waterMark' => $water_mark, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'labels' => $labels, + ]; + $table_source_graph = pie_graph( $table_source_graph_data, - 400, - 550, - __('Other'), - '', - $water_mark, - $config['fontpath'], - $config['font_size'], - 1 + $options ); } @@ -252,32 +257,36 @@ $table_oid_data->head['num'] = __('Number'); $table_oid_data->data = []; $table_oid_graph_data = []; - +$labels = []; foreach ($traps_generated_by_oid as $trap) { $table_oid_data->data[] = [ 'oid' => $trap['oid'], 'num' => (int) $trap['num'], ]; - - $table_oid_graph_data[$trap['oid']] = (int) $trap['num']; + $labels[] = io_safe_output($trap['oid']); + $table_oid_graph_data[] = (int) $trap['num']; } $table_oid_row['table'] = html_print_table($table_oid_data, true); unset($table_oid_data); if (empty($table_oid_graph_data)) { - $table_oid_graph = graph_nodata_image(); + $table_oid_graph = graph_nodata_image([]); } else { + $options = [ + 'height' => 200, + 'waterMark' => $water_mark, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'labels' => $labels, + ]; + $table_oid_graph = pie_graph( $table_oid_graph_data, - 400, - 550, - __('Other'), - '', - $water_mark, - $config['fontpath'], - $config['font_size'], - 1 + $options ); } diff --git a/pandora_console/operation/snmpconsole/snmp_view.php b/pandora_console/operation/snmpconsole/snmp_view.php index e3880e2593..9f0f9e44f8 100755 --- a/pandora_console/operation/snmpconsole/snmp_view.php +++ b/pandora_console/operation/snmpconsole/snmp_view.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 @@ -26,1340 +26,65 @@ * ============================================================================ */ +// Begin. global $config; -enterprise_include('operation/snmpconsole/snmp_view.php'); -enterprise_include('include/functions_snmp.php'); -require_once 'include/functions_agents.php'; -require_once 'include/functions_snmp.php'; -ui_require_css_file('snmp_view'); +require_once $config['homedir'].'/include/class/SnmpConsole.class.php'; -check_login(); -$agent_a = check_acl($config['id_user'], 0, 'AR'); -$agent_w = check_acl($config['id_user'], 0, 'AW'); -$access = ($agent_a == true) ? 'AR' : (($agent_w == true) ? 'AW' : 'AR'); -if (!$agent_a && !$agent_w) { - db_pandora_audit( - AUDIT_LOG_ACL_VIOLATION, - 'Trying to access SNMP Console' +$ajaxPage = $config['homedir'].'/operation/snmpconsole/snmp_view'; + +$filter_alert = get_parameter('filter_alert', -1); +$filter_severity = get_parameter('filter_severity', -1); +$filter_free_search = get_parameter('filter_free_search', ''); +$filter_status = get_parameter('filter_status', 0); +$filter_group_by = get_parameter('filter_group_by', 0); +$filter_hours_ago = get_parameter('filter_hours_ago', 8); +$filter_trap_type = get_parameter('filter_trap_type', -1); +$refr = get_parameter('refr', 300); + +// Control call flow. +try { + // User access and validation is being processed on class constructor. + $controller = new SnmpConsole( + $ajaxPage, + $filter_alert, + $filter_severity, + $filter_free_search, + $filter_status, + $filter_group_by, + $filter_hours_ago, + $filter_trap_type, + $refr ); - include 'general/noaccess.php'; - exit; -} - -// Read parameters. -$filter_severity = (int) get_parameter('filter_severity', -1); -$filter_fired = (int) get_parameter('filter_fired', -1); -$filter_status = (int) get_parameter('filter_status', 0); -$free_search_string = (string) get_parameter('free_search_string', ''); -$pagination = (int) get_parameter('pagination', $config['block_size']); -$offset = (int) get_parameter('offset', 0); -$pure = (int) get_parameter('pure', 0); -$trap_type = (int) get_parameter('trap_type', -1); -$group_by = (int) get_parameter('group_by', 0); -$refr = (int) get_parameter('refresh'); -$default_refr = !empty($refr) ? $refr : $config['vc_refr']; -$hours_ago = get_parameter('hours_ago', 8); - -// Build ranges. -$now = new DateTime(); -$ago = new DateTime(); -$interval = new DateInterval(sprintf('PT%dH', $hours_ago)); -$ago->sub($interval); - -$date_from_trap = $ago->format('Y/m/d'); -$date_to_trap = $now->format('Y/m/d'); -$time_from_trap = $ago->format('H:i:s'); -$time_to_trap = $now->format('H:i:s'); - -$user_groups = users_get_groups($config['id_user'], $access, false); - -$str_user_groups = ''; -$i = 0; -foreach ($user_groups as $id => $name) { - if ($i == 0) { - $str_user_groups .= $id; +} catch (Exception $e) { + if ((bool) is_ajax() === true) { + echo json_encode(['error' => '[SnmpConsole]'.$e->getMessage() ]); + exit; } else { - $str_user_groups .= ','.$id; - } - - $i++; -} - -$url = 'index.php?sec=estado&sec2=operation/snmpconsole/snmp_view'; -$url .= '&filter_severity='.$filter_severity.'&filter_fired='.$filter_fired; -$url .= '&free_search_string='.$free_search_string.'&pagination='.$pagination; -$url .= '&offset='.$offset.'&trap_type='.$trap_type.'&group_by='.$group_by; -$url .= '&hours_ago='.$hours_ago.'&pure='.$pure; - -$statistics['text'] = ''.html_print_image( - 'images/op_reporting.png', - true, - [ - 'title' => __('Statistics'), - 'class' => 'invert_filter', - ] -).''; -$list['text'] = ''.html_print_image( - 'images/op_snmp.png', - true, - [ - 'title' => __('List'), - 'class' => 'invert_filter', - ] -).''; -$list['active'] = true; - -if ($config['pure']) { - $fullscreen['text'] = ''.html_print_image( - 'images/normal_screen.png', - true, - [ - 'title' => __('Normal screen'), - 'class' => 'invert_filter', - ] - ).''; -} else { - // Fullscreen. - $fullscreen['text'] = ''.html_print_image( - 'images/full_screen.png', - true, - [ - 'title' => __('Full screen'), - 'class' => 'invert_filter', - ] - ).''; -} - - -// OPERATIONS -// Delete SNMP Trap entry Event. -if (isset($_GET['delete'])) { - $id_trap = (int) get_parameter_get('delete', 0); - if ($id_trap > 0) { - if ($group_by) { - $sql_ids_traps = 'SELECT id_trap, source FROM ttrap WHERE oid IN (SELECT oid FROM ttrap WHERE id_trap = '.$id_trap.') - AND source IN (SELECT source FROM ttrap WHERE id_trap = '.$id_trap.')'; - $ids_traps = db_get_all_rows_sql($sql_ids_traps); - - foreach ($ids_traps as $key => $value) { - $result = db_process_sql_delete('ttrap', ['id_trap' => $value['id_trap']]); - enterprise_hook('snmp_update_forwarded_modules', [$value]); - } - } else { - $forward_info = db_get_row('ttrap', 'id_trap', $id_trap); - $result = db_process_sql_delete('ttrap', ['id_trap' => $id_trap]); - enterprise_hook('snmp_update_forwarded_modules', [$forward_info]); - ui_print_result_message( - $result, - __('Successfully deleted'), - __('Could not be deleted') - ); - } - } -} - -// Check Event. -if (isset($_GET['check'])) { - $id_trap = (int) get_parameter_get('check', 0); - $values = [ - 'status' => 1, - 'id_usuario' => $config['id_user'], - ]; - $result = db_process_sql_update('ttrap', $values, ['id_trap' => $id_trap]); - enterprise_hook('snmp_update_forwarded_modules', [$id_trap]); - - ui_print_result_message( - $result, - __('Successfully updated'), - __('Could not be updated') - ); -} - -// Mass-process DELETE. -if (isset($_POST['deletebt'])) { - $trap_ids = get_parameter_post('snmptrapid', []); - if (is_array($trap_ids)) { - if ($group_by) { - foreach ($trap_ids as $key => $value) { - $sql_ids_traps = 'SELECT id_trap, source FROM ttrap WHERE oid IN (SELECT oid FROM ttrap WHERE id_trap = '.$value.') - AND source IN (SELECT source FROM ttrap WHERE id_trap = '.$value.')'; - $ids_traps = db_get_all_rows_sql($sql_ids_traps); - - foreach ($ids_traps as $key2 => $value2) { - $result = db_process_sql_delete('ttrap', ['id_trap' => $value2['id_trap']]); - enterprise_hook('snmp_update_forwarded_modules', [$value2]); - } - } - } else { - foreach ($trap_ids as $id_trap) { - $forward_info = db_get_row('ttrap', 'id_trap', $id_trap); - db_process_sql_delete('ttrap', ['id_trap' => $id_trap]); - enterprise_hook('snmp_update_forwarded_modules', [$forward_info]); - } - } - } -} - -// Mass-process UPDATE. -if (isset($_POST['updatebt'])) { - $trap_ids = get_parameter_post('snmptrapid', []); - if (is_array($trap_ids)) { - foreach ($trap_ids as $id_trap) { - $sql = sprintf("UPDATE ttrap SET status = 1, id_usuario = '%s' WHERE id_trap = %d", $config['id_user'], $id_trap); - db_process_sql($sql); - enterprise_hook('snmp_update_forwarded_modules', [$id_trap]); - } - } -} - -// All traps. -$all_traps = db_get_all_rows_sql('SELECT DISTINCT source FROM ttrap'); - -if (empty($all_traps)) { - $all_traps = []; -} - -// Set filters. -$agents = []; -$oids = []; -$severities = get_priorities(); -$alerted = [ - __('Not fired'), - __('Fired'), -]; -foreach ($all_traps as $trap) { - $agent = agents_get_agent_with_ip($trap['source']); - $agents[$trap['source']] = $agent !== false ? ($agent['alias'] ? $agent['alias'] : $agent['nombre']) : $trap['source']; - $oid = enterprise_hook('get_oid', [$trap]); - if ($oid === ENTERPRISE_NOT_HOOK) { - $oid = $trap['oid']; - } - - $oids[$oid] = $oid; -} - -$prea = array_keys($user_groups); -$ids = join(',', $prea); -// Cuantos usuarios hay operadores con un grupo que exista y no lo tenga ningun usuario. -$user_in_group_wo_agents = db_get_value_sql('select count(DISTINCT(id_usuario)) from tusuario_perfil where id_usuario ="'.$config['id_user'].'" and id_perfil = 1 and id_grupo in (select id_grupo from tgrupo where id_grupo in ('.$ids.') and id_grupo not in (select id_grupo from tagente))'); - -switch ($config['dbtype']) { - case 'mysql': - case 'postgresql': - if ($user_in_group_wo_agents == 0) { - $rows = db_get_all_rows_filter( - 'tagente', - ['id_grupo' => array_keys($user_groups)], - ['id_agente'] - ); - $id_agents = []; - foreach ($rows as $row) { - $id_agents[] = $row['id_agente']; - } - - if (!empty($id_agents)) { - $address_by_user_groups = agents_get_addresses($id_agents); - foreach ($address_by_user_groups as $i => $a) { - $address_by_user_groups[$i] = '"'.$a.'"'; - } - } - } else { - $rows = db_get_all_rows_filter( - 'tagente', - [], - ['id_agente'] - ); - $id_agents = []; - foreach ($rows as $row) { - $id_agents[] = $row['id_agente']; - } - - $all_address_agents = agents_get_addresses($id_agents); - foreach ($all_address_agents as $i => $a) { - $all_address_agents[$i] = '"'.$a.'"'; - } - } - break; - - default: - // Default. - break; -} - -if (empty($address_by_user_groups)) { - $address_by_user_groups = []; - array_unshift($address_by_user_groups, '""'); -} - -if (empty($all_address_agents)) { - $all_address_agents = []; - array_unshift($all_address_agents, '""'); -} - - -// Make query to extract traps of DB. -switch ($config['dbtype']) { - case 'mysql': - $sql = 'SELECT * - FROM ttrap - WHERE ( - `source` IN ('.implode(',', $address_by_user_groups).") OR - `source`='' OR - `source` NOT IN (".implode(',', $all_address_agents).') - ) - %s - ORDER BY timestamp DESC - LIMIT %d,%d'; - break; - - case 'postgresql': - $sql = 'SELECT * - FROM ttrap - WHERE ( - source IN ('.implode(',', $address_by_user_groups).") OR - source='' OR - source NOT IN (".implode(',', $all_address_agents).') - ) - %s - ORDER BY timestamp DESC - LIMIT %d OFFSET %d'; - break; - - case 'oracle': - $sql = "SELECT * - FROM ttrap - WHERE (source IN ( - SELECT direccion FROM tagente - WHERE id_grupo IN ($str_user_groups) - ) OR source='' OR source NOT IN (SELECT direccion FROM tagente WHERE direccion IS NOT NULL)) %s - ORDER BY timestamp DESC"; - break; - - default: - // Default. - break; -} - -switch ($config['dbtype']) { - case 'mysql': - case 'postgresql': - $sql_all = 'SELECT * - FROM ttrap - WHERE ( - source IN ('.implode(',', $address_by_user_groups).") OR - source='' OR - source NOT IN (".implode(',', $all_address_agents).') - ) - %s - ORDER BY timestamp DESC'; - $sql_count = 'SELECT COUNT(id_trap) - FROM ttrap - WHERE ( - source IN ('.implode(',', $address_by_user_groups).") OR - source='' OR - source NOT IN (".implode(',', $all_address_agents).') - ) - %s'; - break; - - case 'oracle': - $sql_all = "SELECT * - FROM ttrap - WHERE (source IN ( - SELECT direccion FROM tagente - WHERE id_grupo IN ($str_user_groups) - ) OR source='' OR source NOT IN (SELECT direccion FROM tagente WHERE direccion IS NOT NULL)) - %s - ORDER BY timestamp DESC"; - $sql_count = "SELECT COUNT(id_trap) - FROM ttrap - WHERE ( - source IN ( - SELECT direccion FROM tagente - WHERE id_grupo IN ($str_user_groups) - ) OR source='' OR source NOT IN (SELECT direccion FROM tagente WHERE direccion IS NOT NULL)) - %s"; - break; - - default: - // Default. - break; -} - -// $whereSubquery = 'WHERE 1=1'; -$whereSubquery = ''; - -if ($filter_fired != -1) { - $whereSubquery .= ' AND alerted = '.$filter_fired; -} - -if ($free_search_string != '') { - switch ($config['dbtype']) { - case 'mysql': - $whereSubquery .= ' - AND (source LIKE "%'.$free_search_string.'%" OR - oid LIKE "%'.$free_search_string.'%" OR - oid_custom LIKE "%'.$free_search_string.'%" OR - type_custom LIKE "%'.$free_search_string.'%" OR - value LIKE "%'.$free_search_string.'%" OR - value_custom LIKE "%'.$free_search_string.'%" OR - id_usuario LIKE "%'.$free_search_string.'%" OR - text LIKE "%'.$free_search_string.'%" OR - description LIKE "%'.$free_search_string.'%")'; - break; - - case 'postgresql': - case 'oracle': - $whereSubquery .= ' - AND (source LIKE \'%'.$free_search_string.'%\' OR - oid LIKE \'%'.$free_search_string.'%\' OR - oid_custom LIKE \'%'.$free_search_string.'%\' OR - type_custom LIKE \'%'.$free_search_string.'%\' OR - value LIKE \'%'.$free_search_string.'%\' OR - value_custom LIKE \'%'.$free_search_string.'%\' OR - id_usuario LIKE \'%'.$free_search_string.'%\' OR - text LIKE \'%'.$free_search_string.'%\' OR - description LIKE \'%'.$free_search_string.'%\')'; - break; - - default: - // Default. - break; - } -} - -if ($date_from_trap != '') { - if ($time_from_trap != '') { - $whereSubquery .= ' - AND (UNIX_TIMESTAMP(timestamp) > UNIX_TIMESTAMP("'.$date_from_trap.' '.$time_from_trap.'")) - '; - } else { - $whereSubquery .= ' - AND (UNIX_TIMESTAMP(timestamp) > UNIX_TIMESTAMP("'.$date_from_trap.' 23:59:59")) - '; - } -} - -if ($date_to_trap != '') { - if ($time_to_trap) { - $whereSubquery .= ' - AND (UNIX_TIMESTAMP(timestamp) < UNIX_TIMESTAMP("'.$date_to_trap.' '.$time_to_trap.'")) - '; - } else { - $whereSubquery .= ' - AND (UNIX_TIMESTAMP(timestamp) < UNIX_TIMESTAMP("'.$date_to_trap.' 23:59:59")) - '; - } -} - -if ($filter_severity != -1) { - // There are two special severity values aimed to match two different trap standard severities in database: warning/critical and critical/normal. - if ($filter_severity != EVENT_CRIT_OR_NORMAL && $filter_severity != EVENT_CRIT_WARNING_OR_CRITICAL) { - // Test if enterprise is installed to search oid in text or oid field in ttrap. - if ($config['enterprise_installed']) { - $whereSubquery .= ' AND ( - (alerted = 0 AND severity = '.$filter_severity.') OR - (alerted = 1 AND priority = '.$filter_severity.'))'; - } else { - $whereSubquery .= ' AND ( - (alerted = 0 AND 1 = '.$filter_severity.') OR - (alerted = 1 AND priority = '.$filter_severity.'))'; - } - } else if ($filter_severity === EVENT_CRIT_WARNING_OR_CRITICAL) { - // Test if enterprise is installed to search oid in text or oid field in ttrap. - if ($config['enterprise_installed']) { - $whereSubquery .= ' AND ( - (alerted = 0 AND (severity = '.EVENT_CRIT_WARNING.' OR severity = '.EVENT_CRIT_CRITICAL.')) OR - (alerted = 1 AND (priority = '.EVENT_CRIT_WARNING.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; - } else { - $whereSubquery .= ' AND ( - (alerted = 1 AND (priority = '.EVENT_CRIT_WARNING.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; - } - } else if ($filter_severity === EVENT_CRIT_OR_NORMAL) { - // Test if enterprise is installed to search oid in text or oid field in ttrap. - if ($config['enterprise_installed']) { - $whereSubquery .= ' AND ( - (alerted = 0 AND (severity = '.EVENT_CRIT_NORMAL.' OR severity = '.EVENT_CRIT_CRITICAL.')) OR - (alerted = 1 AND (priority = '.EVENT_CRIT_NORMAL.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; - } else { - $whereSubquery .= ' AND ( - (alerted = 1 AND (priority = '.EVENT_CRIT_NORMAL.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; - } - } -} - -if ($filter_status != -1) { - $whereSubquery .= ' AND status = '.$filter_status; -} - -if ($trap_type == 5) { - $whereSubquery .= ' AND type NOT IN (0, 1, 2, 3, 4)'; -} else if ($trap_type != -1) { - $whereSubquery .= ' AND type = '.$trap_type; -} - -// Disable this feature (time will decide if temporarily) in Oracle cause the group by is very confictive. -if ($group_by && $config['dbtype'] != 'oracle') { - $where_without_group = $whereSubquery; - $whereSubquery .= ' GROUP BY source,oid'; -} - -switch ($config['dbtype']) { - case 'mysql': - $sql = sprintf($sql, $whereSubquery, $offset, $pagination); - break; - - case 'postgresql': - $sql = sprintf($sql, $whereSubquery, $pagination, $offset); - break; - - case 'oracle': - $set = []; - $set['limit'] = $pagination; - $set['offset'] = $offset; - $sql = sprintf($sql, $whereSubquery); - $sql = oracle_recode_query($sql, $set); - break; - - default: - // Default. - break; -} - -$sql_all = sprintf($sql_all, $whereSubquery); -$sql_count = sprintf($sql_count, $whereSubquery); - -$table = new stdClass(); -$table->width = '100%'; -$table->cellpadding = 0; -$table->cellspacing = 0; -$table->class = 'databox filters'; -$table->size = []; -$table->size[0] = '120px'; -$table->data = []; - -// Alert status select. -$table->data[1][0] = ''.__('Alert').''; -$table->data[1][1] = html_print_select( - $alerted, - 'filter_fired', - $filter_fired, - '', - __('All'), - '-1', - true -); - -// Block size for pagination select. -$table->data[2][0] = ''.__('Block size for pagination').''; -$paginations[25] = 25; -$paginations[50] = 50; -$paginations[100] = 100; -$paginations[200] = 200; -$paginations[500] = 500; -$table->data[2][1] = html_print_select( - $paginations, - 'pagination', - $pagination, - '', - __('Default'), - $config['block_size'], - true -); - -// Severity select. -$table->data[1][2] = ''.__('Severity').''; -$table->data[1][3] = html_print_select( - $severities, - 'filter_severity', - $filter_severity, - '', - __('All'), - -1, - true -); - -// Status. -$table->data[3][0] = ''.__('Status').''; - -$status_array[-1] = __('All'); -$status_array[0] = __('Not validated'); -$status_array[1] = __('Validated'); -$table->data[3][1] = html_print_select( - $status_array, - 'filter_status', - $filter_status, - '', - '', - '', - true -); - -// Free search (search by all alphanumeric fields). -$table->data[2][3] = ''.__('Free search').''.ui_print_help_tip( - __( - 'Search by any alphanumeric field in the trap. - REMEMBER trap sources need to be searched by IP Address' - ), - true -); -$table->data[2][4] = html_print_input_text( - 'free_search_string', - $free_search_string, - '', - 40, - 0, - true -); - -$table->data[4][0] = ''.__('Max. hours old').''; -$table->data[4][1] = html_print_input( - [ - 'type' => 'number', - 'name' => 'hours_ago', - 'value' => $hours_ago, - 'step' => 1, - 'return' => true, - ] -); - -// Type filter (ColdStart, WarmStart, LinkDown, LinkUp, authenticationFailure, Other). -$table->data[4][3] = ''.__('Trap type').''.ui_print_help_tip(__('Search by trap type'), true); -$trap_types = [ - -1 => __('None'), - 0 => __('Cold start (0)'), - 1 => __('Warm start (1)'), - 2 => __('Link down (2)'), - 3 => __('Link up (3)'), - 4 => __('Authentication failure (4)'), - 5 => __('Other'), -]; -$table->data[4][4] = html_print_select( - $trap_types, - 'trap_type', - $trap_type, - '', - '', - '', - true, - false, - false -); - -// Disable this feature (time will decide if temporarily) in Oracle cause the group by is very confictive. -if ($config['dbtype'] != 'oracle') { - $table->data[3][3] = ''.__('Group by Enterprise String/IP').''; - $table->data[3][4] = __('Yes').' '.html_print_radio_button('group_by', 1, '', $group_by, true).'  '; - $table->data[3][4] .= __('No').' '.html_print_radio_button('group_by', 0, '', $group_by, true); -} - -$filter = '
'; -$filter .= html_print_table($table, true); -$filter .= '
'; -$filter .= html_print_submit_button(__('Update'), 'search', false, 'class="sub upd"', true); -$filter .= '
'; -$filter .= '
'; - -$filter_resume = []; -$filter_resume['filter_fired'] = $alerted[$filter_fired]; -$filter_resume['filter_severity'] = $severities[$filter_severity]; -$filter_resume['pagination'] = $paginations[$pagination]; -$filter_resume['free_search_string'] = $free_search_string; -$filter_resume['filter_status'] = $status_array[$filter_status]; -$filter_resume['group_by'] = $group_by; -$filter_resume['hours_ago'] = $hours_ago; -$filter_resume['trap_type'] = $trap_types[$trap_type]; - -$traps = db_get_all_rows_sql($sql, true); -$trapcount = (int) db_get_value_sql($sql_count, false, true); - -// Re-sort traps by timestamp if history db is enabled. -if ($config['history_db_enabled'] == 1) { - usort( - $traps, - function ($a, $b) { - return strtotime($a['timestamp']) < strtotime($b['timestamp']); - } - ); -} - -// No traps. -if (empty($traps)) { - // Header - ui_print_standard_header( - __('SNMP Console'), - 'images/op_snmp.png', - false, - 'snmp_console', - false, - [ - $list, - $statistics, - ], - [ - [ - 'link' => '', - 'label' => __('Monitoring'), - ], - [ - 'link' => '', - 'label' => __('SNMP'), - ], - ] - ); - - $sql2 = 'SELECT * - FROM ttrap - WHERE ( - `source` IN ('.implode(',', $address_by_user_groups).") OR - `source`='' OR - `source` NOT IN (".implode(',', $all_address_agents).') - ) - AND status = 0 - ORDER BY timestamp DESC'; - $traps2 = db_get_all_rows_sql($sql2); - - if (!empty($traps2)) { - ui_toggle($filter, __('Toggle filter(s)')); - - print_snmp_tags_active_filters($filter_resume); - - ui_print_info_message(['no_close' => true, 'message' => __('There are no SNMP traps in database that contains this filter') ]); - } else { - ui_print_info_message(['no_close' => true, 'message' => __('There are no SNMP traps in database') ]); + echo '[SnmpConsole]'.$e->getMessage(); } + // Stop this execution, but continue 'globally'. return; -} else { - if ($config['pure']) { - echo '
'; +} - echo ''; - - echo '
'; - - ui_require_css_file('pandora_enterprise', ENTERPRISE_DIR.'/include/styles/'); - ui_require_css_file('pandora_dashboard', ENTERPRISE_DIR.'/include/styles/'); - ui_require_css_file('cluetip', 'include/styles/js/'); - - ui_require_jquery_file('countdown'); - ui_require_javascript_file('pandora_dashboard', ENTERPRISE_DIR.'/include/javascript/'); - ui_require_javascript_file('wz_jsgraphics'); - ui_require_javascript_file('pandora_visual_console'); + if (method_exists($controller, $method) === true) { + if ($controller->ajaxMethod($method) === true) { + $controller->{$method}(); + } else { + $controller->error('Unavailable method.'); + } } else { - // Header - ui_print_standard_header( - __('SNMP Console'), - 'images/op_snmp.png', - false, - '', - false, - [ - $fullscreen, - $list, - $statistics, - ], - [ - [ - 'link' => '', - 'label' => __('Monitoring'), - ], - [ - 'link' => '', - 'label' => __('SNMP'), - ], - ] - ); + $controller->error('Method not found. ['.$method.']'); } -} -ui_toggle($filter, __('Toggle filter(s)')); -unset($table); - -print_snmp_tags_active_filters($filter_resume); - -if (($config['dbtype'] == 'oracle') && ($traps !== false)) { - $traps_size = count($traps); - for ($i = 0; $i < $traps_size; $i++) { - unset($traps[$i]['rnum']); - } -} - -$url_snmp = 'index.php?sec=snmpconsole&sec2=operation/snmpconsole/snmp_view'; -$url_snmp .= '&filter_severity='.$filter_severity.'&filter_fired='.$filter_fired; -$url_snmp .= '&filter_status='.$filter_status.'&refresh='.((int) get_parameter('refresh', 0)); -$url_snmp .= '&pure='.$config['pure'].'&trap_type='.$trap_type; -$url_snmp .= '&group_by='.$group_by.'&free_search_string='.$free_search_string; -$url_snmp .= '&hours_ago='.$hours_ago; - -$urlPagination = $url_snmp.'&pagination='.$pagination.'&offset='.$offset; - -ui_pagination($trapcount, $urlPagination, $offset, $pagination); - -echo '
'; - -$table = new StdClass(); -$table->cellpadding = 0; -$table->cellspacing = 0; -$table->width = '100%'; -$table->class = 'databox data'; -$table->head = []; -$table->size = []; -$table->data = []; -$table->align = []; -$table->headstyle = []; - -$table->head[0] = __('Status'); -$table->align[0] = 'center'; -$table->size[0] = '5%'; -$table->headstyle[0] = 'text-align: center'; - -$table->head[1] = __('SNMP Agent'); -$table->align[1] = 'center'; -$table->size[1] = '15%'; -$table->headstyle[1] = 'text-align: center'; - -$table->head[2] = __('Enterprise String'); -$table->align[2] = 'center'; -$table->size[2] = '18%'; -$table->headstyle[2] = 'text-align: center'; - -if ($group_by) { - $table->head[3] = __('Count'); - $table->align[3] = 'center'; - $table->size[3] = '5%'; - $table->headstyle[3] = 'text-align: center'; -} - -$table->head[4] = __('Trap subtype'); -$table->align[4] = 'center'; -$table->size[4] = '10%'; -$table->headstyle[4] = 'text-align: center'; - -$table->head[5] = __('User ID'); -$table->align[5] = 'center'; -$table->size[5] = '10%'; -$table->headstyle[5] = 'text-align: center'; - -$table->head[6] = __('Timestamp'); -$table->align[6] = 'center'; -$table->size[6] = '10%'; -$table->headstyle[6] = 'text-align: center'; - -$table->head[7] = __('Alert'); -$table->align[7] = 'center'; -$table->size[7] = '5%'; -$table->headstyle[7] = 'text-align: center'; - -$table->head[8] = __('Action'); -$table->align[8] = 'center'; -$table->size[8] = '10%'; -$table->headstyle[8] = 'min-width: 125px;text-align: center'; - -$table->head[9] = html_print_checkbox_extended( - 'allbox', - 1, - false, - false, - 'javascript:CheckAll();', - 'class="chk" title="'.__('All').'"', - true -); -$table->align[9] = 'center'; -$table->size[9] = '5%'; -$table->headstyle[9] = 'text-align: center'; - -$table->style[8] = 'background: #F3F3F3; color: #111 !important;'; - -// Skip offset records. -$idx = 0; -if ($traps !== false) { - foreach ($traps as $trap) { - $data = []; - if (empty($trap['description'])) { - $trap['description'] = ''; - } - - $severity = enterprise_hook('get_severity', [$trap]); - if ($severity === ENTERPRISE_NOT_HOOK) { - $severity = $trap['alerted'] == 1 ? $trap['priority'] : 1; - } - - // Status. - if ($trap['status'] == 0) { - $data[0] = html_print_image( - 'images/pixel_red.png', - true, - [ - 'title' => __('Not validated'), - 'width' => '20', - 'height' => '20', - ] - ); - } else { - $data[0] = html_print_image( - 'images/pixel_green.png', - true, - [ - 'title' => __('Validated'), - 'width' => '20', - 'height' => '20', - ] - ); - } - - // Agent matching source address. - $table->cellclass[$idx][1] = get_priority_class($severity); - $agent = agents_get_agent_with_ip($trap['source']); - if ($agent === false) { - if (! check_acl($config['id_user'], 0, 'AR')) { - continue; - } - - $data[1] = ''.$trap['source'].''; - } else { - if (! check_acl($config['id_user'], $agent['id_grupo'], 'AR')) { - continue; - } - - $data[1] = ''; - $data[1] .= ''.$agent['alias'].ui_print_help_tip($trap['source'], true, 'images/tip-blanco.png'); - ''; - } - - // OID. - $table->cellclass[$idx][2] = get_priority_class($severity); - if (! empty($trap['text'])) { - $enterprise_string = $trap['text']; - } else if (! empty($trap['oid'])) { - $enterprise_string = $trap['oid']; - } else { - $enterprise_string = __('N/A'); - } - - $data[2] = ''.$enterprise_string.''; - - // Count. - if ($group_by) { - $sql = "SELECT * FROM ttrap WHERE 1=1 - $where_without_group - AND oid='".$trap['oid']."' - AND source='".$trap['source']."'"; - $group_traps = db_get_all_rows_sql($sql); - $count_group_traps = count($group_traps); - $table->cellclass[$idx][3] = get_priority_class($severity); - $data[3] = ''.$count_group_traps.''; - } - - // Value. - $table->cellclass[$idx][4] = get_priority_class($severity); - if (empty($trap['value'])) { - $data[4] = __('N/A'); - } else { - $data[4] = ui_print_truncate_text($trap['value'], GENERIC_SIZE_TEXT, false); - } - - // User. - $table->cellclass[$idx][5] = get_priority_class($severity); - if (!empty($trap['status'])) { - $data[5] = ''.substr($trap['id_usuario'], 0, 8).''; - if (!empty($trap['id_usuario'])) { - $data[5] .= ui_print_help_tip(get_user_fullname($trap['id_usuario']), true); - } - } else { - $data[5] = '--'; - } - - // Timestamp. - $table->cellclass[$idx][6] = get_priority_class($severity); - $data[6] = ''; - $data[6] .= ui_print_timestamp($trap['timestamp'], true); - $data[6] .= ''; - - // Use alert severity if fired. - if (!empty($trap['alerted'])) { - $data[7] = html_print_image('images/pixel_yellow.png', true, ['width' => '20', 'height' => '20', 'border' => '0', 'title' => __('Alert fired')]); - } else { - $data[7] = html_print_image('images/pixel_gray.png', true, ['width' => '20', 'height' => '20', 'border' => '0', 'title' => __('Alert not fired')]); - } - - // Actions. - $data[8] = ''; - - if (empty($trap['status'])) { - $data[8] .= ''.html_print_image('images/ok.png', true, ['border' => '0', 'title' => __('Validate')]).' '; - } - - if ($trap['source'] == '') { - $is_admin = db_get_value('is_admin', 'tusuario', 'id_user', $config['id_user']); - if ($is_admin) { - $data[8] .= ''.html_print_image( - 'images/cross.png', - true, - [ - 'border' => '0', - 'title' => __('Delete'), - 'class' => 'invert_filter', - ] - ).' '; - } - } else { - $agent_trap_group = db_get_value('id_grupo', 'tagente', 'nombre', $trap['source']); - - $data[8] .= ''.html_print_image( - 'images/cross.png', - true, - [ - 'border' => '0', - 'title' => __('Delete'), - 'class' => 'invert_filter', - ] - ).' '; - } - - $data[8] .= ''.html_print_image( - 'images/eye.png', - true, - [ - 'alt' => __('Show more'), - 'title' => __('Show more'), - 'class' => 'invert_filter', - ] - ).''; - $data[8] .= enterprise_hook('editor_link', [$trap]); - - - $data[9] = html_print_checkbox_extended('snmptrapid[]', $trap['id_trap'], false, false, '', 'class="chk"', true); - - array_push($table->data, $data); - - // Hiden file for description. - $string = ' - - - - - - - - '; - - if ($trap['description'] != '') { - $string .= ' - - - '; - } - - if ($trap['type'] != '') { - $trap_types = [ - -1 => __('None'), - 0 => __('Cold start (0)'), - 1 => __('Warm start (1)'), - 2 => __('Link down (2)'), - 3 => __('Link up (3)'), - 4 => __('Authentication failure (4)'), - 5 => __('Other'), - ]; - - switch ($trap['type']) { - case -1: - $desc_trap_type = __('None'); - break; - - case 0: - $desc_trap_type = __('Cold start (0)'); - break; - - case 1: - $desc_trap_type = __('Warm start (1)'); - break; - - case 2: - $desc_trap_type = __('Link down (2)'); - break; - - case 3: - $desc_trap_type = __('Link up (3)'); - break; - - case 4: - $desc_trap_type = __('Authentication failure (4)'); - break; - - default: - $desc_trap_type = __('Other'); - break; - } - - $string .= ''; - } - - if ($group_by) { - $sql = "SELECT * FROM ttrap WHERE 1=1 - $where_without_group - AND oid='".$trap['oid']."' - AND source='".$trap['source']."'"; - $group_traps = db_get_all_rows_sql($sql); - $count_group_traps = count($group_traps); - - $sql = "SELECT timestamp FROM ttrap WHERE 1=1 - $where_without_group - AND oid='".$trap['oid']."' - AND source='".$trap['source']."' - ORDER BY `timestamp` DESC"; - $last_trap = db_get_value_sql($sql); - - $sql = "SELECT timestamp FROM ttrap WHERE 1=1 - $where_without_group - AND oid='".$trap['oid']."' - AND source='".$trap['source']."' - ORDER BY `timestamp` ASC"; - $first_trap = db_get_value_sql($sql); - - $string .= ' - - - '; - $string .= ' - - - '; - $string .= ' - - - '; - } - - $string .= '
'.''.__('Variable bindings:').''; - - if ($group_by) { - $new_url = 'index.php?sec=snmpconsole&sec2=operation/snmpconsole/snmp_view'; - $new_url .= '&filter_severity='.$filter_severity; - $new_url .= '&filter_fired='.$filter_fired; - $new_url .= '&filter_status='.$filter_status; - $new_url .= '&refresh='.((int) get_parameter('refresh', 0)); - $new_url .= '&pure='.$config['pure']; - $new_url .= '&group_by=0&free_search_string='.$free_search_string; - $new_url .= '&hours_ago='.$hours_ago; - - $string .= ''.__('See more details').''; - } else { - // Print binding vars separately. - $binding_vars = explode("\t", $trap['oid_custom']); - foreach ($binding_vars as $var) { - $string .= $var.'
'; - } - } - - $string .= '
'.''.__('Enterprise String:').' '.$trap['oid'].'
'.''.__('Description:').''.$trap['description'].'
'.__('Trap type:').''.$desc_trap_type.'
'.''.__('Count:').''.$count_group_traps.'
'.''.__('First trap:').''.$first_trap.'
'.''.__('Last trap:').''.$last_trap.'
'; - - $data = [$string]; - // $data = array($trap['description']); - $idx++; - $table->rowclass[$idx] = 'trap_info_'.$trap['id_trap']; - $table->colspan[$idx][0] = 10; - $table->rowstyle[$idx] = 'display: none;'; - array_push($table->data, $data); - - $idx++; - } -} - -// No matching traps. -if ($idx == 0) { - echo '
'.__('No matching traps found').'
'; + // Stop any execution. + exit; } else { - html_print_table($table); + // Run. + $controller->run(); } - -unset($table); - -echo '
'; - -html_print_submit_button(__('Validate'), 'updatebt', false, 'class="sub ok"'); - -echo ' '; -html_print_submit_button(__('Delete'), 'deletebt', false, 'class="sub delete" onClick="javascript:return confirm(\''.__('Are you sure?').'\')"'); - -echo '
'; - - -echo '
'; -echo '

'.__('Status').'

'; -echo html_print_image( - 'images/pixel_green.png', - true, - [ - 'width' => '20', - 'height' => '20', - ] -).' - '.__('Validated'); -echo '
'; -echo html_print_image( - 'images/pixel_red.png', - true, - [ - 'width' => '20', - 'height' => '20', - ] -).' - '.__('Not validated'); -echo '
'; -echo '
'; -echo '

'.__('Alert').'

'; -echo html_print_image( - 'images/pixel_yellow.png', - true, - [ - 'width' => '20', - 'height' => '20', - ] -).' - '.__('Fired'); -echo '
'; -echo html_print_image( - 'images/pixel_gray.png', - true, - [ - 'width' => '20', - 'height' => '20', - ] -).' - '.__('Not fired'); -echo '
'; -echo '
'; -echo '

'.__('Action').'

'; -echo html_print_image('images/ok.png', true).' - '.__('Validate'); -echo '
'; -echo html_print_image('images/cross.png', true, ['class' => 'invert_filter']).' - '.__('Delete'); -echo '
'; -echo '
'; -echo '

'.__('Legend').'

'; -foreach (get_priorities() as $num => $name) { - echo ''.$name.''; - echo '
'; -} - -echo '
'; -echo '
 
'; - -ui_include_time_picker(); -?> - - \ No newline at end of file diff --git a/pandora_console/operation/users/user_edit.php b/pandora_console/operation/users/user_edit.php index cabbea8593..78e2d3163a 100644 --- a/pandora_console/operation/users/user_edit.php +++ b/pandora_console/operation/users/user_edit.php @@ -31,6 +31,7 @@ global $config; $headerTitle = __('User detail editor'); // Load the header. require $config['homedir'].'/operation/users/user_edit_header.php'; +use PandoraFMS\Dashboard\Manager; if (is_metaconsole() === false) { include 'include/javascript/timezonepicker/includes/parser.inc'; @@ -83,9 +84,12 @@ if (isset($_GET['modified']) && !$view_mode) { $upd_info['id_skin'] = get_parameter('skin', $user_info['id_skin']); $upd_info['default_event_filter'] = get_parameter('event_filter', null); $upd_info['block_size'] = get_parameter('block_size', $config['block_size']); + // API Token information. + $apiTokenRenewed = (bool) get_parameter('renewAPIToken'); + $upd_info['api_token'] = ($apiTokenRenewed === true) ? api_token_generate() : users_get_API_token($config['id_user']); $default_block_size = get_parameter('default_block_size', 0); - if ($default_block_size) { + if ($default_block_size > 0) { $upd_info['block_size'] = 0; } @@ -161,16 +165,16 @@ if (isset($_GET['modified']) && !$view_mode) { } else if ($password_new !== 'NON-INIT') { $error_msg = __('Passwords didn\'t match or other problem encountered while updating passwords'); } - } else if (empty($password_new) && empty($password_confirm)) { + } else if (empty($password_new) === true && empty($password_confirm) === true) { $return = true; - } else if (empty($password_new) || empty($password_confirm)) { + } else if (empty($password_new) === true || empty($password_confirm) === true) { $return = false; } // No need to display "error" here, because when no update is needed // (no changes in data) SQL function returns 0 (FALSE), but is not an error, // just no change. Previous error message could be confussing to the user. - if ($return) { + if ($return !== false) { if (empty($password_new) === false && empty($password_confirm) === false) { $success_msg = __('Password successfully updated'); } @@ -184,7 +188,11 @@ if (isset($_GET['modified']) && !$view_mode) { if ($return_update_user === false) { $error_msg = __('Error updating user info'); } else if ($return_update_user == true) { - $success_msg = __('User info successfully updated'); + if ($apiTokenRenewed === true) { + $success_msg = __('You have generated a new API Token.'); + } else { + $success_msg = __('User info successfully updated'); + } } else { if (empty($password_new) === false && empty($password_confirm) === false) { $success_msg = __('Password successfully updated'); @@ -226,7 +234,7 @@ if (isset($_GET['modified']) && !$view_mode) { } // Prints action status for current message. -if ($status != -1) { +if ((int) $status !== -1) { ui_print_result_message( $status, __('User info successfully updated'), @@ -261,6 +269,73 @@ if (is_metaconsole() === false && is_management_allowed() === false) { $user_id = '

'.__('User ID').':

'; $user_id .= ''.$id.'
'; +$user_id .= '

'.__('API Token').'

'; +if (is_management_allowed()) { + $user_id .= html_print_anchor( + [ + 'onClick' => sprintf( + 'javascript:renewAPIToken(\'%s\', \'%s\', \'%s\')', + __('Warning'), + __('The API token will be renewed. After this action, the last token you were using will not work. Are you sure?'), + 'user_profile_form', + ), + 'content' => html_print_image( + 'images/icono-refrescar.png', + true, + [ + 'class' => 'renew_api_token_image clickable', + 'title' => __('Renew API Token'), + ] + ), + 'class' => 'renew_api_token_link', + ], + true + ); +} + + +// Check php conf for header auth. +$lines = file('/etc/httpd/conf.d/php.conf'); +$http_authorization = false; + +foreach ($lines as $l) { + if (preg_match('/SetEnvIfNoCase \^Authorization\$ \"\(\.\+\)\" HTTP_AUTHORIZATION=\$1/', $l)) { + $http_authorization = true; + } +} + +$user_id .= html_print_anchor( + [ + 'onClick' => sprintf( + 'javascript:showAPIToken(\'%s\', \'%s\')', + __('API Token'), + base64_encode(__('Your API Token is:').'
'.users_get_API_token($config['id_user']).'
'.__('Please, avoid share this string with others.')), + ), + 'content' => html_print_image( + 'images/eye_show.png', + true, + [ + 'class' => 'renew_api_token_image clickable', + 'title' => __('Show API Token'), + ] + ), + 'class' => 'renew_api_token_link', + ], + true +); + +if ($http_authorization === false) { + $user_id .= ui_print_help_tip( + __('Directive HTTP_AUTHORIZATION=$1 is not set. Please, add it to /etc/httpd/conf.d/php.conf'), + true, + 'images/warn.png', + false, + '', + true + ); +} + +$user_id .= '
'; $full_name = '
'.html_print_input_text_extended( 'fullname', $user_info['fullname'], @@ -278,7 +353,7 @@ $full_name = '
'.html_print_input_text_extended ).'
'; // Show "Picture" (in future versions, why not, allow users to upload it's own avatar here. -if (is_user_admin($id)) { +if (is_user_admin($id) === true) { $avatar = html_print_image('images/people_1.png', true, ['class' => 'user_avatar']); } else { $avatar = html_print_image('images/people_2.png', true, ['class' => 'user_avatar']); @@ -368,7 +443,13 @@ if (!$meta) { $home_screen .= html_print_select($values, 'section', io_safe_output($user_info['section']), 'show_data_section();', '', -1, true, false, false).'
'; - $dashboards = get_user_dashboards($config['id_user']); + $dashboards = Manager::getDashboards( + -1, + -1, + false, + false, + $config['id_user'] + ); $dashboards_aux = []; if ($dashboards === false) { @@ -401,7 +482,7 @@ if (!$meta) { // User only can change skins if has more than one group. if (function_exists('skins_print_select')) { if (count($usr_groups) > 1) { - $skin = '

'.__('Skin').':

'; + $skin = '

'.__('Theme').':

'; $skin .= skins_print_select($id_usr, 'skin', $user_info['id_skin'], '', __('None'), 0, true).'
'; } } @@ -410,7 +491,7 @@ if (!$meta) { // User only can change skins if has more than one group. if (function_exists('skins_print_select')) { if (count($usr_groups) > 1) { - $skin = '

'.__('Skin').ui_print_help_tip( + $skin = '

'.__('Theme').ui_print_help_tip( __('This change will only apply to nodes'), true ).'

'; @@ -501,7 +582,8 @@ if (!isset($autorefresh_list)) { $autorefresh_list = $aux; } } else { - if (($autorefresh_list[0] === '') || ($autorefresh_list[0] === '0')) { + if (is_array($autorefresh_list) === false || empty($autorefresh_list[0]) === true || $autorefresh_list[0] === '0') { + $autorefresh_list = []; $autorefresh_list[0] = __('None'); } else { $aux = []; @@ -653,10 +735,10 @@ foreach ($timezones as $timezone_name => $tz) { } } -if (is_metaconsole()) { - echo '
'; +if (is_metaconsole() === true) { + echo ''; } else { - echo ''; + echo ''; } html_print_input_hidden('id', $id, false, false, false, 'id'); diff --git a/pandora_console/operation/visual_console/public_view.php b/pandora_console/operation/visual_console/public_view.php index 10ea78fa3b..aa19fbdb9f 100644 --- a/pandora_console/operation/visual_console/public_view.php +++ b/pandora_console/operation/visual_console/public_view.php @@ -282,9 +282,7 @@ $visualConsoleItems = VisualConsole::getItemsFromDB( ); if(props.maintenanceMode != null) { - if(props.maintenanceMode.user !== '') { - visualConsoleManager.visualConsole.enableMaintenanceMode(); - } + visualConsoleManager.visualConsole.enableMaintenanceMode(); } var controls = document.getElementById('vc-controls'); diff --git a/pandora_console/pandora_console.redhat.spec b/pandora_console/pandora_console.redhat.spec index 941468663d..b35acf578b 100644 --- a/pandora_console/pandora_console.redhat.spec +++ b/pandora_console/pandora_console.redhat.spec @@ -2,8 +2,8 @@ # Pandora FMS Console # %define name pandorafms_console -%define version 7.0NG.766 -%define release 221122 +%define version 7.0NG.768 +%define release 230210 # User and Group under which Apache is running %define httpd_name httpd @@ -26,7 +26,7 @@ BuildRoot: %{_tmppath}/%{name} BuildArch: noarch AutoReq: 0 Requires: %{httpd_name} >= 2.0.0 -Requires: mod_php >= 7.0 +Requires: php >= 8.0 Requires: php-gd, php-ldap, php-snmp, php-session, php-gettext Requires: php-mysqlnd, php-mbstring, php-zip, php-zlib, php-curl Requires: xorg-x11-fonts-75dpi, xorg-x11-fonts-misc, php-pecl-zip @@ -77,6 +77,11 @@ echo " /etc/init.d/pandora_websocket_engine start" # if [ -f %{prefix}/pandora_console/include/config.php ] ; then mv %{prefix}/pandora_console/install.php %{prefix}/pandora_console/install.done + + # Upgrading MR. + echo "Updating the database schema." + /usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null + else echo "Please, now, point your browser to http://your_IP_address/pandora_console/install.php and follow all the steps described on it." fi diff --git a/pandora_console/pandora_console.rhel7.spec b/pandora_console/pandora_console.rhel7.spec index b8d01324ca..7ad0f41032 100644 --- a/pandora_console/pandora_console.rhel7.spec +++ b/pandora_console/pandora_console.rhel7.spec @@ -2,8 +2,8 @@ # Pandora FMS Console # %define name pandorafms_console -%define version 7.0NG.766 -%define release 221122 +%define version 7.0NG.768 +%define release 230210 # User and Group under which Apache is running %define httpd_name httpd @@ -57,11 +57,6 @@ install -m 0644 pandora_console_logrotate_centos $RPM_BUILD_ROOT%{_sysconfdir}/l rm -rf $RPM_BUILD_ROOT %post -# Upgrading. -if [ "$1" -eq "1" ]; then - echo "Updating the database schema." - /usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null -fi # Install pandora_websocket_engine service. cp -pf %{prefix}/pandora_console/pandora_websocket_engine /etc/init.d/ @@ -76,6 +71,11 @@ echo " /etc/init.d/pandora_websocket_engine start" # if [ -f %{prefix}/pandora_console/include/config.php ] ; then mv %{prefix}/pandora_console/install.php %{prefix}/pandora_console/install.done + + # Upgrading MR. + echo "Updating the database schema." + /usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null + else echo "Please, now, point your browser to http://your_IP_address/pandora_console/install.php and follow all the steps described on it." fi diff --git a/pandora_console/pandora_console.spec b/pandora_console/pandora_console.spec index f50eeda3e4..e9edd77b06 100644 --- a/pandora_console/pandora_console.spec +++ b/pandora_console/pandora_console.spec @@ -2,8 +2,8 @@ # Pandora FMS Console # %define name pandorafms_console -%define version 7.0NG.766 -%define release 221122 +%define version 7.0NG.768 +%define release 230210 %define httpd_name httpd # User and Group under which Apache is running %define httpd_name apache2 @@ -29,7 +29,7 @@ BuildArch: noarch AutoReq: 0 Requires: apache2 Requires: apache2-mod_php7 -Requires: php >= 7.0 +Requires: php >= 8.0 Requires: php-gd, php-snmp, php-json, php-gettext Requires: php-mysqlnd, php-ldap, php-mbstring, php Requires: graphviz, xorg-x11-fonts-core, graphviz-gd @@ -58,11 +58,6 @@ fi rm -rf $RPM_BUILD_ROOT %post -# Upgrading. -if [ "$1" -eq "1" ]; then - echo "Updating the database schema." - /usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null -fi # Install pandora_websocket_engine service. cp -pf %{prefix}/pandora_console/pandora_websocket_engine /etc/init.d/ @@ -77,6 +72,11 @@ echo " /etc/init.d/pandora_websocket_engine start" # if [ -f %{prefix}/pandora_console/include/config.php ] ; then mv %{prefix}/pandora_console/install.php %{prefix}/pandora_console/install.done + + # Upgrading MR. + echo "Updating the database schema." + /usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null + else echo "Please, now, point your browser to http://your_IP_address/pandora_console/install.php and follow all the steps described on it." fi diff --git a/pandora_console/pandora_console_install b/pandora_console/pandora_console_install index a7bff47b26..00621813bd 100755 --- a/pandora_console/pandora_console_install +++ b/pandora_console/pandora_console_install @@ -9,7 +9,7 @@ # This code is licensed under GPL 2.0 license. # ********************************************************************** -PI_VERSION="7.0NG.766" +PI_VERSION="7.0NG.768" FORCE=0 DESTDIR="" LOG_TIMESTAMP=`date +"%Y/%m/%d %H:%M:%S"` diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 89fa418389..57a1d5e122 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -42,7 +42,8 @@ CREATE TABLE IF NOT EXISTS `taddress_agent` ( `id_ag` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `id_a` BIGINT UNSIGNED NOT NULL DEFAULT 0, `id_agent` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, - PRIMARY KEY (`id_ag`) + PRIMARY KEY (`id_ag`), + INDEX `taddress_agent_agent` (`id_agent`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -- --------------------------------------------------------------------- @@ -1157,6 +1158,7 @@ CREATE TABLE IF NOT EXISTS `tserver` ( `stat_utimestamp` BIGINT NOT NULL DEFAULT 0, `exec_proxy` TINYINT UNSIGNED NOT NULL DEFAULT 0, `port` INT UNSIGNED NOT NULL DEFAULT 0, + `server_keepalive_utimestamp` BIGINT NOT NULL DEFAULT 0, PRIMARY KEY (`id_server`), KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; @@ -1238,6 +1240,7 @@ CREATE TABLE IF NOT EXISTS `tevent_filter` ( `severity` TEXT, `status` INT NOT NULL DEFAULT -1, `search` TEXT, + `not_search` INT NOT NULL DEFAULT 0, `text_agent` TEXT, `id_agent` INT DEFAULT 0, `id_agent_module` INT DEFAULT 0, @@ -1256,11 +1259,12 @@ CREATE TABLE IF NOT EXISTS `tevent_filter` ( `id_extra` TINYTEXT, `user_comment` TEXT, `id_source_event` INT NULL DEFAULT 0, - `server_id` INT NOT NULL DEFAULT 0, + `server_id` TEXT, `time_from` TIME NULL, `time_to` TIME NULL, `custom_data` VARCHAR(500) DEFAULT '', `custom_data_filter_type` TINYINT UNSIGNED DEFAULT 0, + `owner_user` TEXT, PRIMARY KEY (`id_filter`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; @@ -1273,7 +1277,7 @@ CREATE TABLE IF NOT EXISTS `tusuario` ( `firstname` VARCHAR(255) NOT NULL, `lastname` VARCHAR(255) NOT NULL, `middlename` VARCHAR(255) NOT NULL, - `password` VARCHAR(45) DEFAULT NULL, + `password` VARCHAR(60) DEFAULT NULL, `comments` VARCHAR(200) DEFAULT NULL, `last_connect` BIGINT NOT NULL DEFAULT 0, `registered` BIGINT NOT NULL DEFAULT 0, @@ -1311,6 +1315,7 @@ CREATE TABLE IF NOT EXISTS `tusuario` ( `ehorus_user_level_enabled` TINYINT, `integria_user_level_user` VARCHAR(60), `integria_user_level_pass` VARCHAR(45), + `api_token` VARCHAR(255) NOT NULL DEFAULT '', `allowed_ip_active` TINYINT UNSIGNED DEFAULT 0, `allowed_ip_list` TEXT, `auth_token_secret` VARCHAR(45) DEFAULT NULL, @@ -1330,7 +1335,10 @@ CREATE TABLE IF NOT EXISTS `tusuario_perfil` ( `assigned_by` VARCHAR(100) NOT NULL DEFAULT '', `id_policy` INT UNSIGNED NOT NULL DEFAULT 0, `tags` TEXT, - PRIMARY KEY (`id_up`) + PRIMARY KEY (`id_up`), + INDEX `tusuario_perfil_user` (`id_usuario`), + INDEX `tusuario_perfil_group` (`id_grupo`), + INDEX `tusuario_perfil_profile` (`id_perfil`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -- ---------------------------------------------------------------------- @@ -1622,6 +1630,7 @@ CREATE TABLE IF NOT EXISTS `treport_content` ( `ipam_ip_not_assigned_to_agent` TINYINT UNSIGNED NOT NULL DEFAULT 0, `macros_definition` TEXT, `render_definition` TEXT, + `use_prefix_notation` TINYINT UNSIGNED NOT NULL DEFAULT 1, PRIMARY KEY(`id_rc`), FOREIGN KEY (`id_report`) REFERENCES treport(`id_report`) ON UPDATE CASCADE ON DELETE CASCADE @@ -1727,7 +1736,8 @@ CREATE TABLE IF NOT EXISTS `tlayout_data` ( `show_last_value` TINYINT UNSIGNED NULL DEFAULT 0, `cache_expiration` INT UNSIGNED NOT NULL DEFAULT 0, `title` TEXT , - PRIMARY KEY(`id`) + PRIMARY KEY(`id`), + INDEX `tlayout_data_layout` (`id_layout`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -- --------------------------------------------------------------------- @@ -2103,6 +2113,7 @@ CREATE TABLE IF NOT EXISTS `tagent_custom_fields` ( `display_on_front` TINYINT NOT NULL DEFAULT 0, `is_password_type` TINYINT NOT NULL DEFAULT 0, `combo_values` TEXT , + `is_link_enabled` TINYINT(1) NOT NULL DEFAULT 0, PRIMARY KEY (`id_field`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; @@ -2131,7 +2142,8 @@ CREATE TABLE IF NOT EXISTS `ttag` ( `email` TEXT NULL, `phone` TEXT NULL, `previous_name` TEXT NULL, - PRIMARY KEY (`id_tag`) + PRIMARY KEY (`id_tag`), + INDEX `ttag_name` (name(15)) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -- ----------------------------------------------------- @@ -2862,7 +2874,10 @@ CREATE TABLE IF NOT EXISTS `tservice_element` ( `id_server_meta` INT unsigned NOT NULL DEFAULT 0, `rules` TEXT, PRIMARY KEY (`id`), - INDEX `IDX_tservice_element` (`id_service`,`id_agente_modulo`) + INDEX `IDX_tservice_element` (`id_service`,`id_agente_modulo`), + INDEX `tservice_element_service` (`id_service`), + INDEX `tservice_element_agent` (`id_agent`), + INDEX `tservice_element_am` (`id_agente_modulo`) ) ENGINE=InnoDB COMMENT = 'Table to define the modules and the weights of the modules that define a service' DEFAULT CHARSET=UTF8MB4; @@ -3252,6 +3267,7 @@ CREATE TABLE IF NOT EXISTS `treport_content_template` ( `ipam_ip_not_assigned_to_agent` TINYINT UNSIGNED NOT NULL DEFAULT 0, `macros_definition` TEXT, `render_definition` TEXT, + `use_prefix_notation` TINYINT UNSIGNED NOT NULL DEFAULT 1, PRIMARY KEY(`id_rc`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; @@ -3339,7 +3355,8 @@ CREATE TABLE IF NOT EXISTS `tagent_module_log` ( `source` TEXT, `timestamp` DATETIME DEFAULT '1970-01-01 00:00:00', `utimestamp` BIGINT DEFAULT 0, - PRIMARY KEY (`id_agent_module_log`) + PRIMARY KEY (`id_agent_module_log`), + INDEX `tagent_module_log_agent` (`id_agent`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -- --------------------------------------------------------------------- @@ -3410,37 +3427,8 @@ CREATE TABLE IF NOT EXISTS `tmetaconsole_agent` ( ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -- --------------------------------------------------------------------- --- Table `ttransaction` +-- Table `treset_pass` -- --------------------------------------------------------------------- -CREATE TABLE IF NOT EXISTS `ttransaction` ( - `transaction_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `agent_id` INT UNSIGNED NOT NULL, - `group_id` INT UNSIGNED NOT NULL DEFAULT 0, - `description` TEXT, - `name` VARCHAR(250) NOT NULL, - `loop_interval` INT UNSIGNED NOT NULL DEFAULT 40, - `ready` INT UNSIGNED NOT NULL DEFAULT 0, - `running` INT UNSIGNED NOT NULL DEFAULT 0, - PRIMARY KEY (`transaction_id`) -) engine=InnoDB DEFAULT CHARSET=UTF8MB4; - --- --------------------------------------------------------------------- --- Table `tphase` --- --------------------------------------------------------------------- -CREATE TABLE IF NOT EXISTS `tphase`( - `phase_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `transaction_id` INT UNSIGNED NOT NULL, - `agent_id` INT UNSIGNED NOT NULL, - `name` VARCHAR(250) NOT NULL, - `idx` INT UNSIGNED NOT NULL, - `dependencies` TEXT, - `enables` TEXT, - `launch` TEXT, - `retries` INT UNSIGNED DEFAULT null, - `timeout` INT UNSIGNED DEFAULT null, - PRIMARY KEY (`phase_id`,`transaction_id`) -) engine=InnoDB DEFAULT CHARSET=UTF8MB4; - CREATE TABLE IF NOT EXISTS `treset_pass` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `id_user` VARCHAR(255) NOT NULL DEFAULT '', @@ -3654,6 +3642,7 @@ CREATE TABLE IF NOT EXISTS `tlayout_template` ( `background_color` VARCHAR(50) NOT NULL DEFAULT '#FFF', `is_favourite` INT UNSIGNED NOT NULL DEFAULT 0, `auto_adjust` INT UNSIGNED NOT NULL DEFAULT 0, + `maintenance_mode` TEXT, PRIMARY KEY(`id`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; @@ -4165,3 +4154,26 @@ CREATE TABLE IF NOT EXISTS `tbackup` ( `filepath` VARCHAR(512) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + +-- --------------------------------------------------------------------- +-- Table `tmonitor_filter` +-- --------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `tmonitor_filter` ( + `id_filter` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_name` VARCHAR(600) NOT NULL, + `id_group_filter` INT NOT NULL DEFAULT 0, + `ag_group` INT NOT NULL DEFAULT 0, + `recursion` TEXT, + `status` INT NOT NULL DEFAULT -1, + `ag_modulename` TEXT, + `ag_freestring` TEXT, + `tag_filter` TEXT, + `moduletype` TEXT, + `module_option` INT DEFAULT 1, + `modulegroup` INT NOT NULL DEFAULT -1, + `min_hours_status` TEXT, + `datatype` TEXT, + `not_condition` TEXT, + `ag_custom_fields` TEXT, + PRIMARY KEY (`id_filter`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 369fab0092..9a0baba05e 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -112,10 +112,10 @@ INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_report_front_logo', 'images/pandora_logo_white.jpg'), ('custom_report_front_header', ''), ('custom_report_front_footer', ''), -('MR', 58), +('MR', 60), ('identification_reminder', 1), ('identification_reminder_timestamp', 0), -('current_package', 766), +('current_package', 768), ('post_process_custom_values', '{"0.00000038580247":"Seconds to months","0.00000165343915":"Seconds to weeks","0.00001157407407":"Seconds to days","0.01666666666667":"Seconds to minutes","0.00000000093132":"Bytes to Gigabytes","0.00000095367432":"Bytes to Megabytes","0.00097656250000":"Bytes to Kilobytes","0.00000001653439":"Timeticks to weeks","0.00000011574074":"Timeticks to days"}'), ('custom_docs_logo', 'default_docs.png'), ('custom_support_logo', 'default_support.png'), @@ -301,28 +301,28 @@ INSERT INTO `ttipo_modulo` VALUES -- INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (1,1,'CPU','CPU','/usr/bin/perl','Model;Company;Speed','IyEvdXNyL2Jpbi9wZXJsDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBwYW5kb3JhX2NwdS5wbA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQ29weXJpZ2h0IChjKSAyMDA4IFJhbW9uIE5vdm9hLCBybm92b2FAYXJ0aWNhLmVzDQojICAgICAgICAgICAoYykgMjAwOCBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KdXNlIHN0cmljdDsNCnVzZSB3YXJuaW5nczsNCg0KIyBDaGVjayBmb3Igc3NoDQpteSAkc3NoX2NsaWVudCA9ICJzc2giOw0KaWYgKHN5c3RlbSgiJHNzaF9jbGllbnQgLXYgPiAvZGV2L251bGwgMj4mMSIpID4+IDggIT0gMjU1KSB7DQoJcHJpbnQgIltlcnJvcl0gJHNzaF9jbGllbnQgbm90IGZvdW5kLlxuIjsNCglleGl0IDE7DQp9DQoNCmlmICgkI0FSR1YgPCAxKSB7DQoJcHJpbnQgIlVzYWdlOiAkMCA8dGFyZ2V0IGlwPiA8dXNlcm5hbWU+XG4iOw0KCWV4aXQgMTsNCn0NCg0KbXkgJHRhcmdldF9pcCA9ICRBUkdWWzBdOw0KbXkgJHVzZXJuYW1lID0gJEFSR1ZbMV07DQoNCiMgUmV0cmlldmUgQ1BVIGRhdGENCm15ICgkbW9kZWwsICR2ZW5kb3IsICRzcGVlZCk7DQpteSBAY3B1X2luZm8gPSBgJHNzaF9jbGllbnQgJHVzZXJuYW1lXEAkdGFyZ2V0X2lwICJjYXQgL3Byb2MvY3B1aW5mbyJgOw0KZm9yZWFjaCBteSAkbGluZSAoQGNwdV9pbmZvKSB7DQoJaWYgKCRsaW5lID1+IC9tb2RlbCBuYW1lXHMrOlxzKyguKikvKSB7DQoJCSRtb2RlbCA9ICQxOw0KCX0gZWxzaWYgKCRsaW5lID1+IC92ZW5kb3JfaWRccys6XHMrKC4qKS8pIHsNCgkJJHZlbmRvciA9ICQxOw0KCX0gZWxzaWYgKCRsaW5lID1+IC9jcHUgTUh6XHMrOlxzKyguKikvKSB7DQoJCSRzcGVlZCA9ICQxOw0KCX0NCn0NCiANCnJldHVybiAxIGlmICgkbW9kZWwgZXEgJycgfHwgJHZlbmRvciBlcSAnJyB8fCAkc3BlZWQgZXEgJycpOw0KcHJpbnQgIiRtb2RlbDskdmVuZG9yOyIgLiBzcHJpbnRmICgiJS4wZiIsICRzcGVlZCkgLiAiIE1IelxuIjsNCg0KZXhpdCAwOw0K',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (2,9,'CPU','CPU','/usr/bin/perl','Name;Speed;Description','IyEvdXNyL2Jpbi9wZXJsDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBwYW5kb3JhX2NwdS5wbA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQ29weXJpZ2h0IChjKSAyMDA4IFJhbW9uIE5vdm9hLCBybm92b2FAYXJ0aWNhLmVzDQojICAgICAgICAgICAoYykgMjAwOCBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KdXNlIHN0cmljdDsNCnVzZSB3YXJuaW5nczsNCg0KdXNlIEZpbGU6OkJhc2VuYW1lOw0KdXNlIEhUTUw6OkVudGl0aWVzICgpOw0KDQojIENoZWNrIGZvciB3bWljDQpteSAkd21pX2NsaWVudCA9ICJ3bWljIjsNCmlmIChzeXN0ZW0oIiR3bWlfY2xpZW50ID4gL2Rldi9udWxsIDI+JjEiKSAhPSAyNTYpIHsNCglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOw0KCWV4aXQgMTsNCn0NCg0KaWYgKCQjQVJHViAhPSAyKSB7DQoJcHJpbnQgIlVzYWdlOiAkMCA8dGFyZ2V0IGlwPiA8dXNlcm5hbWU+IDxwYXNzd29yZD5cbiI7DQoJZXhpdCAxOw0KfQ0KDQpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07DQpteSAkdXNlcm5hbWUgPSAkQVJHVlsxXTsNCm15ICRwYXNzd29yZCA9ICRBUkdWWzJdOw0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBTVUIgcnVuX3F1ZXJ5ICgkd3FsX3F1ZXJ5KQ0KIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0Kc3ViIHJ1bl9xdWVyeSB7DQoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOw0KCW15IEByZXN1bHQgPSB7fTsNCg0KCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsNCg0KCSMgUnVuIHRoZSBEQ09NL1dNSSBjbGllbnQNCglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7DQoNCglteSBAbGluZXMgPSBzcGxpdCgvXG4vLCAkb3V0cHV0KTsNCgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMNCglpZiAoJCNsaW5lcyA8IDIpIHsNCgkJZXhpdCAxOw0KCX0NCg0KCSMgRHJvcCB0aGUgaGVhZGVyDQoJc2hpZnQgKEBsaW5lcyk7DQoJDQoJIyBHZXQgY29sdW1uIG5hbWVzDQoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsNCg0KCSMgR2V0IHJvdyBkYXRhDQoJbXkgJGlkeCA9IDA7DQoJZm9yIChteSAkaSA9IDA7ICRpIDw9ICQjbGluZXM7ICRpKyspIHsNCg0KCQkjIENoZWNrIGZvciBlcnJvcnMNCgkJaWYgKCRsaW5lc1skaV0gPX4gbS9eRVJST1IvKSB7DQoJCQlleGl0IDE7DQoJCX0NCg0KCQkjIEJsYWNrIGxpc3QNCgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7DQoJCQluZXh0Ow0KCQl9DQoNCgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOw0KCQlmb3IgKG15ICRqID0gMDsgJGogPD0gJCNjb2x1bW5fbmFtZXM7ICRqKyspIHsNCgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7DQoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOw0KCQkJfQ0KCQl9DQoJCQ0KCQkkaWR4Kys7DQoJfQ0KCQ0KCXJldHVybiBAcmVzdWx0Ow0KfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsIA0KIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkNCiMgUHJpbnRzIGEgbW9kdWxlZGF0YSBYTUwgdGFnLiAkbW9kdWxlX2l0ZW0sICRtb2R1bGVfZGF0YSBhbmQNCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24NCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5Lg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnN1YiBwcmludF9tb2R1bGVkYXRhIHsNCglteSAkbW9kdWxlX2l0ZW0gPSAkX1swXTsNCglteSAkbW9kdWxlX2RhdGEgPSAkX1sxXTsNCglteSAkbW9kdWxlX2Rlc2NyaXB0aW9uID0gJF9bMl07DQoJbXkgQGRhdGEgPSBAeyRfWzNdfTsNCglteSAkcmVzdWx0Ow0KDQoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsNCgkJDQoJCSRyZXN1bHQgPSAnJzsNCg0KCQkjIEl0ZW0NCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19KSkgew0KCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0gLiAiOyI7DQoJCX0NCg0KCQkjIERhdGENCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9KSkgew0KCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0gLiAiIE1oejsiOw0KCQl9DQoNCgkJIyBEZXNjcmlwdGlvbg0KCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGVzY3JpcHRpb259KSkgew0KCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGVzY3JpcHRpb259IC4gIjsiOw0KCQl9DQoNCgkJcHJpbnQgJHJlc3VsdCAuICJcbiI7CQ0KCX0NCn0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgTWFpbg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KbXkgQHJlc3VsdCA9IHJ1bl9xdWVyeSgiU0VMRUNUIE5hbWUsIE1heENsb2NrU3BlZWQsIERlc2NyaXB0aW9uIEZST00gV2luMzJfUHJvY2Vzc29yIik7DQpwcmludF9tb2R1bGVkYXRhICgiTmFtZSIsICJNYXhDbG9ja1NwZWVkIiwgIkRlc2NyaXB0aW9uIiwgXEByZXN1bHQpOw0KZXhpdCAwOw0K',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (2,9,'CPU','CPU','/usr/bin/perl','Name;Speed;Description','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9jcHUucGwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDb3B5cmlnaHQgKGMpIDIwMDggUmFtb24gTm92b2EsIHJub3ZvYUBhcnRpY2EuZXMKIyAgICAgICAgICAgKGMpIDIwMDgtMjAyMSBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIi91c3IvYmluL3BhbmRvcmF3bWljIjsKCnVubGVzcygtZSAkd21pX2NsaWVudCkgewoJcHJpbnQgIltlcnJvcl0gJHdtaV9jbGllbnQgbm90IGZvdW5kLlxuIjsKCWV4aXQgMTsKfQoKaWYgKCQjQVJHViAhPSAyKSB7CglwcmludCAiVXNhZ2U6ICQwIDx0YXJnZXQgaXA+IDx1c2VybmFtZT4gPHBhc3N3b3JkPlxuIjsKCWV4aXQgMTsKfQoKbXkgJHRhcmdldF9pcCA9ICRBUkdWWzBdOwpteSAkdXNlcm5hbWUgPSAkQVJHVlsxXTsKbXkgJHBhc3N3b3JkID0gJEFSR1ZbMl07CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFNVQiBydW5fcXVlcnkgKCR3cWxfcXVlcnkpCiMgUnVucyB0aGUgZ2l2ZW4gV1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gYXJyYXkgb2YgaGFzaGVzLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcnVuX3F1ZXJ5IHsKCW15ICR3cWxfcXVlcnkgPSAkX1swXTsKCW15IEByZXN1bHQgPSB7fTsKCgkkd3FsX3F1ZXJ5ID1+ICdzLyIvXCcvZyc7CgoJIyBSdW4gdGhlIERDT00vV01JIGNsaWVudAoJbXkgJG91dHB1dCA9IGAkd21pX2NsaWVudCAtVSAnJHVzZXJuYW1lJyUnJHBhc3N3b3JkJyAvLyR0YXJnZXRfaXAgXCIkd3FsX3F1ZXJ5XCIgMj4vZGV2L251bGxgOwoKCW15IEBsaW5lcyA9IHNwbGl0KC9cbi8sICRvdXRwdXQpOwoJIyBIZWFkZXIsIGRlc2NyaXB0aW9uLCByZXN1bHRzCglpZiAoJCNsaW5lcyA8IDIpIHsKCQlleGl0IDE7Cgl9CgoJIyBEcm9wIHRoZSBoZWFkZXIKCXNoaWZ0IChAbGluZXMpOwoJCgkjIEdldCBjb2x1bW4gbmFtZXMKCW15IEBjb2x1bW5fbmFtZXMgPSBzcGxpdCgvXHwvLCBzaGlmdCAoQGxpbmVzKSk7CgoJIyBHZXQgcm93IGRhdGEKCW15ICRpZHggPSAwOwoJZm9yIChteSAkaSA9IDA7ICRpIDw9ICQjbGluZXM7ICRpKyspIHsKCgkJIyBDaGVjayBmb3IgZXJyb3JzCgkJaWYgKCRsaW5lc1skaV0gPX4gbS9eRVJST1IvKSB7CgkJCWV4aXQgMTsKCQl9CgoJCSMgQmxhY2sgbGlzdAoJCWlmICgkbGluZXNbJGldID1+IG0vRmlsZSAxLykgewoJCQluZXh0OwoJCX0KCgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSAkbW9kdWxlX2l0ZW0gPSAkX1swXTsKCW15ICRtb2R1bGVfZGF0YSA9ICRfWzFdOwoJbXkgJG1vZHVsZV9kZXNjcmlwdGlvbiA9ICRfWzJdOwoJbXkgQGRhdGEgPSBAeyRfWzNdfTsKCW15ICRyZXN1bHQ7CgoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkKCQkkcmVzdWx0ID0gJyc7CgoJCSMgSXRlbQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0gLiAiOyI7CgkJfQoKCQkjIERhdGEKCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0pKSB7CgkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9IC4gIiBNaHo7IjsKCQl9CgoJCSMgRGVzY3JpcHRpb24KCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGVzY3JpcHRpb259KSkgewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn0gLiAiOyI7CgkJfQoKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCA9IHJ1bl9xdWVyeSgiU0VMRUNUIE5hbWUsIE1heENsb2NrU3BlZWQsIERlc2NyaXB0aW9uIEZST00gV2luMzJfUHJvY2Vzc29yIik7CnByaW50X21vZHVsZWRhdGEgKCJOYW1lIiwgIk1heENsb2NrU3BlZWQiLCAiRGVzY3JpcHRpb24iLCBcQHJlc3VsdCk7CmV4aXQgMDsK',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (3,1,'RAM','Memory modules','','Model;Size','',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (4,9,'RAM','Memory modules','/usr/bin/perl','Slot;Size;Speed','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9yYW0ucGwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDb3B5cmlnaHQgKGMpIDIwMDggUmFtb24gTm92b2EsIHJub3ZvYUBhcnRpY2EuZXMKIyAgICAgICAgICAgKGMpIDIwMDggQXJ0aWNhIFNvbHVjaW9uZXMgVGVjbm9sb2dpY2FzIFMuTAojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEhUTUw6OkVudGl0aWVzICgpOwoKIyBDaGVjayBmb3Igd21pYwpteSAkd21pX2NsaWVudCA9ICJ3bWljIjsKaWYgKHN5c3RlbSgiJHdtaV9jbGllbnQgPiAvZGV2L251bGwgMj4mMSIpICE9IDI1NikgewoJcHJpbnQgIltlcnJvcl0gJHdtaV9jbGllbnQgbm90IGZvdW5kLlxuIjsKCWV4aXQgMTsKfQoKaWYgKCQjQVJHViAhPSAyKSB7CglwcmludCAiVXNhZ2U6ICQwIDx0YXJnZXQgaXA+IDx1c2VybmFtZT4gPHBhc3N3b3JkPlxuIjsKCWV4aXQgMTsKfQoKbXkgJHRhcmdldF9pcCA9ICRBUkdWWzBdOwpteSAkdXNlcm5hbWUgPSAkQVJHVlsxXTsKbXkgJHBhc3N3b3JkID0gJEFSR1ZbMl07CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFNVQiBydW5fcXVlcnkgKCR3cWxfcXVlcnkpCiMgUnVucyB0aGUgZ2l2ZW4gV1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gYXJyYXkgb2YgaGFzaGVzLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcnVuX3F1ZXJ5IHsKCW15ICR3cWxfcXVlcnkgPSAkX1swXTsKCW15IEByZXN1bHQgPSB7fTsKCgkkd3FsX3F1ZXJ5ID1+ICdzLyIvXCcvZyc7CgoJIyBSdW4gdGhlIERDT00vV01JIGNsaWVudAoJbXkgJG91dHB1dCA9IGAkd21pX2NsaWVudCAtVSAnJHVzZXJuYW1lJyUnJHBhc3N3b3JkJyAvLyR0YXJnZXRfaXAgXCIkd3FsX3F1ZXJ5XCIgMj4vZGV2L251bGxgOwoKCW15IEBsaW5lcyA9IHNwbGl0KC9cbi8sICRvdXRwdXQpOwoJIyBIZWFkZXIsIGRlc2NyaXB0aW9uLCByZXN1bHRzCglpZiAoJCNsaW5lcyA8IDIpIHsKCQlleGl0IDE7Cgl9CgoJIyBEcm9wIHRoZSBoZWFkZXIKCXNoaWZ0IChAbGluZXMpOwoJCgkjIEdldCBjb2x1bW4gbmFtZXMKCW15IEBjb2x1bW5fbmFtZXMgPSBzcGxpdCgvXHwvLCBzaGlmdCAoQGxpbmVzKSk7CgoJIyBHZXQgcm93IGRhdGEKCW15ICRpZHggPSAwOwoJZm9yIChteSAkaSA9IDA7ICRpIDw9ICQjbGluZXM7ICRpKyspIHsKCgkJIyBDaGVjayBmb3IgZXJyb3JzCgkJaWYgKCRsaW5lc1skaV0gPX4gbS9eRVJST1IvKSB7CgkJCWV4aXQgMTsKCQl9CgoJCSMgQmxhY2sgbGlzdAoJCWlmICgkbGluZXNbJGldID1+IG0vRmlsZSAxLykgewoJCQluZXh0OwoJCX0KCgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSAkbW9kdWxlX2l0ZW0gPSAkX1swXTsKCW15ICRtb2R1bGVfZGF0YSA9ICRfWzFdOwoJbXkgJG1vZHVsZV9kZXNjcmlwdGlvbiA9ICRfWzJdOwoJbXkgQGRhdGEgPSBAeyRfWzNdfTsKCW15ICRyZXN1bHQ7CgoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkKCQkkcmVzdWx0ID0gJyc7CgoJCSMgSXRlbQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0gLiAnOyc7CgkJfQoKCQkjIERhdGEKCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0pKSB7CgkJCSRyZXN1bHQgLj0gJyAnIC4gc3ByaW50ZigiJS4xZiIsICRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSAvIDEwNDg1NzYpIC4gIiBNQnl0ZXM7IjsKCQl9CgoJCSMgRGVzY3JpcHRpb24KCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGVzY3JpcHRpb259KSkgewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn07CgkJfQoKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCA9IHJ1bl9xdWVyeSgiU0VMRUNUIERldmljZUxvY2F0b3IsIENhcGFjaXR5LCBTcGVlZCBGUk9NIFdpbjMyX1BoeXNpY2FsTWVtb3J5Iik7CnByaW50X21vZHVsZWRhdGEgKCJEZXZpY2VMb2NhdG9yIiwgIkNhcGFjaXR5IiwgIlNwZWVkIiwgXEByZXN1bHQpOwpleGl0IDA7Cg==',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (4,9,'RAM','Memory modules','/usr/bin/perl','Slot;Size;Speed','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9yYW0ucGwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDb3B5cmlnaHQgKGMpIDIwMDggUmFtb24gTm92b2EsIHJub3ZvYUBhcnRpY2EuZXMKIyAgICAgICAgICAgKGMpIDIwMDgtMjAyMSBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIi91c3IvYmluL3BhbmRvcmF3bWljIjsKCnVubGVzcygtZSAkd21pX2NsaWVudCkgewoJcHJpbnQgIltlcnJvcl0gJHdtaV9jbGllbnQgbm90IGZvdW5kLlxuIjsKCWV4aXQgMTsKfQoKaWYgKCQjQVJHViAhPSAyKSB7CglwcmludCAiVXNhZ2U6ICQwIDx0YXJnZXQgaXA+IDx1c2VybmFtZT4gPHBhc3N3b3JkPlxuIjsKCWV4aXQgMTsKfQoKbXkgJHRhcmdldF9pcCA9ICRBUkdWWzBdOwpteSAkdXNlcm5hbWUgPSAkQVJHVlsxXTsKbXkgJHBhc3N3b3JkID0gJEFSR1ZbMl07CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFNVQiBydW5fcXVlcnkgKCR3cWxfcXVlcnkpCiMgUnVucyB0aGUgZ2l2ZW4gV1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gYXJyYXkgb2YgaGFzaGVzLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcnVuX3F1ZXJ5IHsKCW15ICR3cWxfcXVlcnkgPSAkX1swXTsKCW15IEByZXN1bHQgPSB7fTsKCgkkd3FsX3F1ZXJ5ID1+ICdzLyIvXCcvZyc7CgoJIyBSdW4gdGhlIERDT00vV01JIGNsaWVudAoJbXkgJG91dHB1dCA9IGAkd21pX2NsaWVudCAtVSAnJHVzZXJuYW1lJyUnJHBhc3N3b3JkJyAvLyR0YXJnZXRfaXAgXCIkd3FsX3F1ZXJ5XCIgMj4vZGV2L251bGxgOwoKCW15IEBsaW5lcyA9IHNwbGl0KC9cbi8sICRvdXRwdXQpOwoJIyBIZWFkZXIsIGRlc2NyaXB0aW9uLCByZXN1bHRzCglpZiAoJCNsaW5lcyA8IDIpIHsKCQlleGl0IDE7Cgl9CgoJIyBEcm9wIHRoZSBoZWFkZXIKCXNoaWZ0IChAbGluZXMpOwoJCgkjIEdldCBjb2x1bW4gbmFtZXMKCW15IEBjb2x1bW5fbmFtZXMgPSBzcGxpdCgvXHwvLCBzaGlmdCAoQGxpbmVzKSk7CgoJIyBHZXQgcm93IGRhdGEKCW15ICRpZHggPSAwOwoJZm9yIChteSAkaSA9IDA7ICRpIDw9ICQjbGluZXM7ICRpKyspIHsKCgkJIyBDaGVjayBmb3IgZXJyb3JzCgkJaWYgKCRsaW5lc1skaV0gPX4gbS9eRVJST1IvKSB7CgkJCWV4aXQgMTsKCQl9CgoJCSMgQmxhY2sgbGlzdAoJCWlmICgkbGluZXNbJGldID1+IG0vRmlsZSAxLykgewoJCQluZXh0OwoJCX0KCgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSAkbW9kdWxlX2l0ZW0gPSAkX1swXTsKCW15ICRtb2R1bGVfZGF0YSA9ICRfWzFdOwoJbXkgJG1vZHVsZV9kZXNjcmlwdGlvbiA9ICRfWzJdOwoJbXkgQGRhdGEgPSBAeyRfWzNdfTsKCW15ICRyZXN1bHQ7CgoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkKCQkkcmVzdWx0ID0gJyc7CgoJCSMgSXRlbQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0gLiAnOyc7CgkJfQoKCQkjIERhdGEKCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0pKSB7CgkJCSRyZXN1bHQgLj0gJyAnIC4gc3ByaW50ZigiJS4xZiIsICRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSAvIDEwNDg1NzYpIC4gIiBNQnl0ZXM7IjsKCQl9CgoJCSMgRGVzY3JpcHRpb24KCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGVzY3JpcHRpb259KSkgewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn07CgkJfQoKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCA9IHJ1bl9xdWVyeSgiU0VMRUNUIFRhZywgQ2FwYWNpdHksIE5hbWUgRlJPTSBXaW4zMl9QaHlzaWNhbE1lbW9yeSIpOwpwcmludF9tb2R1bGVkYXRhICgiVGFnIiwgIkNhcGFjaXR5IiwgIk5hbWUiLCBcQHJlc3VsdCk7CmV4aXQgMDsK',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (5,1,'Video','Video cards','','Controller;Model;Company','',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (6,9,'Video','Video cards','/usr/bin/perl','Name;vRAM;ID','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV92aWRlby5wbAojIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFy dGljYS5lcwojICAgICAgICAgICAoYykgMjAwOCBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2lj YXMgUy5MCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJB TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJ VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25n IHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMg Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9u LCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXNlIHN0cmljdDsKdXNl IHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7Cgoj IENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIndtaWMiOwppZiAoc3lzdGVtKCIkd21p X2NsaWVudCA+IC9kZXYvbnVsbCAyPiYxIikgIT0gMjU2KSB7CglwcmludCAiW2Vycm9yXSAkd21p X2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXBy aW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhp dCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFd OwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9x dWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMg dGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBy dW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3 cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAk b3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdl dF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xu LywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVz IDwgMikgewoJCWV4aXQgMTsKCX0KCgkjIERyb3AgdGhlIGhlYWRlcgoJc2hpZnQgKEBsaW5lcyk7 CgkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNo aWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRp ID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoKCQkjIENoZWNrIGZvciBlcnJvcnMKCQlpZiAo JGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKCQkJZXhpdCAxOwoJCX0KCgkJIyBCbGFjayBsaXN0 CgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CgkJCW5leHQ7CgkJfQoKCQlteSBAY29s dW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQj Y29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJ CQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7 CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJ CX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEs IAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1M IHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlv biBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwg dGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRh IHsKCW15ICRtb2R1bGVfaXRlbSA9ICRfWzBdOwoJbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07Cglt eSAkbW9kdWxlX2Rlc2NyaXB0aW9uID0gJF9bMl07CglteSBAZGF0YSA9IEB7JF9bM119OwoJbXkg JHJlc3VsdDsKCglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCQoJCSRyZXN1bHQgPSAn JzsKCgkJIyBJdGVtCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19KSkgewoJ CQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSAuICc7JzsKCQl9CgoJCSMgRGF0 YQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSkpIHsKCQkJJHJlc3VsdCAu PSAnICcgLiBzcHJpbnRmKCIlLjFmIiwgJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9IC8gMTA0ODU3 NikgLiAiIE1CeXRlczsiOwoJCX0KCgkJIyBEZXNjcmlwdGlvbgoJCWlmIChkZWZpbmVkKCRlbGVt ZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn0pKSB7CgkJCSRyZXN1bHQgLj0gJyAnIC4gJGVsZW1l bnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufTsKCQl9CgoJCXByaW50ICRyZXN1bHQgLiAiXG4iOwkK CX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSBAcmVz dWx0ID0gcnVuX3F1ZXJ5KCJTRUxFQ1QgQ2FwdGlvbiwgQWRhcHRlclJBTSwgVmlkZW9Qcm9jZXNz b3IgRlJPTSBXaW4zMl9WaWRlb0NvbnRyb2xsZXIiKTsKcHJpbnRfbW9kdWxlZGF0YSAoIkNhcHRp b24iLCAiQWRhcHRlclJBTSIsICJWaWRlb1Byb2Nlc3NvciIsIFxAcmVzdWx0KTsKZXhpdCAwOwo=',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (6,9,'Video','Video cards','/usr/bin/perl','Name;vRAM;ID','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV92aWRlby5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOC0yMDIxIEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBIVE1MOjpFbnRpdGllcyAoKTsKCiMgQ2hlY2sgZm9yIHdtaWMKbXkgJHdtaV9jbGllbnQgPSAiL3Vzci9iaW4vcGFuZG9yYXdtaWMiOwoKdW5sZXNzKC1lICR3bWlfY2xpZW50KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCgkjIERyb3AgdGhlIGhlYWRlcgoJc2hpZnQgKEBsaW5lcyk7CgkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoKCQkjIENoZWNrIGZvciBlcnJvcnMKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKCQkJZXhpdCAxOwoJCX0KCgkJIyBCbGFjayBsaXN0CgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CgkJCW5leHQ7CgkJfQoKCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsIAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKCW15ICRtb2R1bGVfaXRlbSA9ICRfWzBdOwoJbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07CglteSAkbW9kdWxlX2Rlc2NyaXB0aW9uID0gJF9bMl07CglteSBAZGF0YSA9IEB7JF9bM119OwoJbXkgJHJlc3VsdDsKCglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCQoJCSRyZXN1bHQgPSAnJzsKCgkJIyBJdGVtCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19KSkgewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSAuICc7JzsKCQl9CgoJCSMgRGF0YQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSkpIHsKCQkJJHJlc3VsdCAuPSAnICcgLiBzcHJpbnRmKCIlLjFmIiwgJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9IC8gMTA0ODU3NikgLiAiIE1CeXRlczsiOwoJCX0KCgkJIyBEZXNjcmlwdGlvbgoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn0pKSB7CgkJCSRyZXN1bHQgLj0gJyAnIC4gJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufTsKCQl9CgoJCXByaW50ICRyZXN1bHQgLiAiXG4iOwkKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSBAcmVzdWx0ID0gcnVuX3F1ZXJ5KCJTRUxFQ1QgQ2FwdGlvbiwgQWRhcHRlclJBTSwgVmlkZW9Qcm9jZXNzb3IgRlJPTSBXaW4zMl9WaWRlb0NvbnRyb2xsZXIiKTsKcHJpbnRfbW9kdWxlZGF0YSAoIkNhcHRpb24iLCAiQWRhcHRlclJBTSIsICJWaWRlb1Byb2Nlc3NvciIsIFxAcmVzdWx0KTsKZXhpdCAwOwo=',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (7,1,'NIC','Network Interface Cards','','Device;Model;Company;MACAddress','',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (8,9,'NIC','Network Interface Cards','/usr/bin/perl','Caption;MACAddress;IPAddress','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9uaWMucGwKIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMKIyBDb3B5cmlnaHQgKGMpIDIwMDggUmFtb24gTm92b2EsIHJub3ZvYUBhcnRp Y2EuZXMKIyAgICAgICAgICAgKGMpIDIwMDggQXJ0aWNhIFNvbHVjaW9uZXMgVGVjbm9sb2dpY2Fz IFMuTAojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlCiMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb247IHZlcnNpb24gMi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3 aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZv dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3Rvbiwg TUEgIDAyMTEwLTEzMDEsIFVTQS4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnVzZSBzdHJpY3Q7CnVzZSB3 YXJuaW5nczsKCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEhUTUw6OkVudGl0aWVzICgpOwoKIyBD aGVjayBmb3Igd21pYwpteSAkd21pX2NsaWVudCA9ICJ3bWljIjsKaWYgKHN5c3RlbSgiJHdtaV9j bGllbnQgPiAvZGV2L251bGwgMj4mMSIpICE9IDI1NikgewoJcHJpbnQgIltlcnJvcl0gJHdtaV9j bGllbnQgbm90IGZvdW5kLlxuIjsKCWV4aXQgMTsKfQoKaWYgKCQjQVJHViAhPSAyKSB7Cglwcmlu dCAiVXNhZ2U6ICQwIDx0YXJnZXQgaXA+IDx1c2VybmFtZT4gPHBhc3N3b3JkPlxuIjsKCWV4aXQg MTsKfQoKbXkgJHRhcmdldF9pcCA9ICRBUkdWWzBdOwpteSAkdXNlcm5hbWUgPSAkQVJHVlsxXTsK bXkgJHBhc3N3b3JkID0gJEFSR1ZbMl07CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFNVQiBydW5fcXVl cnkgKCR3cWxfcXVlcnkpCiMgUnVucyB0aGUgZ2l2ZW4gV1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRo ZSByZXN1bHQgYXMgYW4gYXJyYXkgb2YgaGFzaGVzLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcnVu X3F1ZXJ5IHsKCW15ICR3cWxfcXVlcnkgPSAkX1swXTsKCW15IEByZXN1bHQgPSB7fTsKCgkkd3Fs X3F1ZXJ5ID1+ICdzLyIvXCcvZyc7CgoJIyBSdW4gdGhlIERDT00vV01JIGNsaWVudAoJbXkgJG91 dHB1dCA9IGAkd21pX2NsaWVudCAtVSAnJHVzZXJuYW1lJyUnJHBhc3N3b3JkJyAvLyR0YXJnZXRf aXAgXCIkd3FsX3F1ZXJ5XCIgMj4vZGV2L251bGxgOwoKCW15IEBsaW5lcyA9IHNwbGl0KC9cbi8s ICRvdXRwdXQpOwoJIyBIZWFkZXIsIGRlc2NyaXB0aW9uLCByZXN1bHRzCglpZiAoJCNsaW5lcyA8 IDIpIHsKCQlleGl0IDE7Cgl9CgoJIyBEcm9wIHRoZSBoZWFkZXIKCXNoaWZ0IChAbGluZXMpOwoJ CgkjIEdldCBjb2x1bW4gbmFtZXMKCW15IEBjb2x1bW5fbmFtZXMgPSBzcGxpdCgvXHwvLCBzaGlm dCAoQGxpbmVzKSk7CgoJIyBHZXQgcm93IGRhdGEKCW15ICRpZHggPSAwOwoJZm9yIChteSAkaSA9 IDA7ICRpIDw9ICQjbGluZXM7ICRpKyspIHsKCgkJIyBDaGVjayBmb3IgZXJyb3JzCgkJaWYgKCRs aW5lc1skaV0gPX4gbS9eRVJST1IvKSB7CgkJCWV4aXQgMTsKCQl9CgoJCSMgQmxhY2sgbGlzdAoJ CWlmICgkbGluZXNbJGldID1+IG0vRmlsZSAxLykgewoJCQluZXh0OwoJCX0KCgkJbXkgQGNvbHVt biA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2Nv bHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJ JHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJ CQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9 CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAK IyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0 YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24g YXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRh Z3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7 CglteSAkbW9kdWxlX2l0ZW0gPSAkX1swXTsKCW15ICRtb2R1bGVfZGF0YSA9ICRfWzFdOwoJbXkg JG1vZHVsZV9kZXNjcmlwdGlvbiA9ICRfWzJdOwoJbXkgQGRhdGEgPSBAeyRfWzNdfTsKCW15ICRy ZXN1bHQ7CgoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkKCQkkcmVzdWx0ID0gJyc7 CgoJCSMgSXRlbQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSkpIHsKCQkJ JHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0gLiAnOyc7CgkJfQoKCQkjIERhdGEK CQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0pKSB7CgkJCSRyZXN1bHQgLj0g JGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9IC4gJzsnOwoJCX0KCgkJIyBEZXNjcmlwdGlvbgoJCWlm IChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn0pKSB7CgkJCSRyZXN1bHQg Lj0gJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufTsKCQl9CgoJCXByaW50ICRyZXN1bHQg LiAiXG4iOwkKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj CgpteSBAcmVzdWx0ID0gcnVuX3F1ZXJ5KCJTRUxFQ1QgQ2FwdGlvbiwgTUFDQWRkcmVzcywgSVBB ZGRyZXNzIEZST00gV2luMzJfTmV0d29ya0FkYXB0ZXJDb25maWd1cmF0aW9uIik7CnByaW50X21v ZHVsZWRhdGEgKCJDYXB0aW9uIiwgIk1BQ0FkZHJlc3MiLCAiSVBBZGRyZXNzIiwgXEByZXN1bHQp OwpleGl0IDA7Cg==',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (8,9,'NIC','Network Interface Cards','/usr/bin/perl','Caption;MACAddress;IPAddress','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9uaWMucGwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDb3B5cmlnaHQgKGMpIDIwMDggUmFtb24gTm92b2EsIHJub3ZvYUBhcnRpY2EuZXMKIyAgICAgICAgICAgKGMpIDIwMDgtMjAyMSBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIi91c3IvYmluL3BhbmRvcmF3bWljIjsKCnVubGVzcygtZSAkd21pX2NsaWVudCkgewoJcHJpbnQgIltlcnJvcl0gJHdtaV9jbGllbnQgbm90IGZvdW5kLlxuIjsKCWV4aXQgMTsKfQoKaWYgKCQjQVJHViAhPSAyKSB7CglwcmludCAiVXNhZ2U6ICQwIDx0YXJnZXQgaXA+IDx1c2VybmFtZT4gPHBhc3N3b3JkPlxuIjsKCWV4aXQgMTsKfQoKbXkgJHRhcmdldF9pcCA9ICRBUkdWWzBdOwpteSAkdXNlcm5hbWUgPSAkQVJHVlsxXTsKbXkgJHBhc3N3b3JkID0gJEFSR1ZbMl07CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFNVQiBydW5fcXVlcnkgKCR3cWxfcXVlcnkpCiMgUnVucyB0aGUgZ2l2ZW4gV1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gYXJyYXkgb2YgaGFzaGVzLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcnVuX3F1ZXJ5IHsKCW15ICR3cWxfcXVlcnkgPSAkX1swXTsKCW15IEByZXN1bHQgPSB7fTsKCgkkd3FsX3F1ZXJ5ID1+ICdzLyIvXCcvZyc7CgoJIyBSdW4gdGhlIERDT00vV01JIGNsaWVudAoJbXkgJG91dHB1dCA9IGAkd21pX2NsaWVudCAtVSAnJHVzZXJuYW1lJyUnJHBhc3N3b3JkJyAvLyR0YXJnZXRfaXAgXCIkd3FsX3F1ZXJ5XCIgMj4vZGV2L251bGxgOwoKCW15IEBsaW5lcyA9IHNwbGl0KC9cbi8sICRvdXRwdXQpOwoJIyBIZWFkZXIsIGRlc2NyaXB0aW9uLCByZXN1bHRzCglpZiAoJCNsaW5lcyA8IDIpIHsKCQlleGl0IDE7Cgl9CgoJIyBEcm9wIHRoZSBoZWFkZXIKCXNoaWZ0IChAbGluZXMpOwoJCgkjIEdldCBjb2x1bW4gbmFtZXMKCW15IEBjb2x1bW5fbmFtZXMgPSBzcGxpdCgvXHwvLCBzaGlmdCAoQGxpbmVzKSk7CgoJIyBHZXQgcm93IGRhdGEKCW15ICRpZHggPSAwOwoJZm9yIChteSAkaSA9IDA7ICRpIDw9ICQjbGluZXM7ICRpKyspIHsKCgkJIyBDaGVjayBmb3IgZXJyb3JzCgkJaWYgKCRsaW5lc1skaV0gPX4gbS9eRVJST1IvKSB7CgkJCWV4aXQgMTsKCQl9CgoJCSMgQmxhY2sgbGlzdAoJCWlmICgkbGluZXNbJGldID1+IG0vRmlsZSAxLykgewoJCQluZXh0OwoJCX0KCgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSAkbW9kdWxlX2l0ZW0gPSAkX1swXTsKCW15ICRtb2R1bGVfZGF0YSA9ICRfWzFdOwoJbXkgJG1vZHVsZV9kZXNjcmlwdGlvbiA9ICRfWzJdOwoJbXkgQGRhdGEgPSBAeyRfWzNdfTsKCW15ICRyZXN1bHQ7CgoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkKCQkkcmVzdWx0ID0gJyc7CgoJCSMgSXRlbQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0gLiAnOyc7CgkJfQoKCQkjIERhdGEKCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0pKSB7CgkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9IC4gJzsnOwoJCX0KCgkJIyBEZXNjcmlwdGlvbgoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn0pKSB7CgkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufTsKCQl9CgoJCXByaW50ICRyZXN1bHQgLiAiXG4iOwkKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSBAcmVzdWx0ID0gcnVuX3F1ZXJ5KCJTRUxFQ1QgQ2FwdGlvbiwgTUFDQWRkcmVzcywgSVBBZGRyZXNzIEZST00gV2luMzJfTmV0d29ya0FkYXB0ZXJDb25maWd1cmF0aW9uIik7CnByaW50X21vZHVsZWRhdGEgKCJDYXB0aW9uIiwgIk1BQ0FkZHJlc3MiLCAiSVBBZGRyZXNzIiwgXEByZXN1bHQpOwpleGl0IDA7Cg==',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (9,1,'HD','Hard drives','','Type;Model;Size','',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (10,9,'HD','Hard drives','/usr/bin/perl','Model;Size;ID','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9oZC5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOCBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIndtaWMiOwppZiAoc3lzdGVtKCIkd21pX2NsaWVudCA+IC9kZXYvbnVsbCAyPiYxIikgIT0gMjU2KSB7CiAgICAgICAgcHJpbnQgIltlcnJvcl0gJHdtaV9jbGllbnQgbm90IGZvdW5kLlxuIjsKICAgICAgICBleGl0IDE7Cn0KCmlmICgkI0FSR1YgIT0gMikgewogICAgICAgIHByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwogICAgICAgIGV4aXQgMTsKfQoKbXkgJHRhcmdldF9pcCA9ICRBUkdWWzBdOwpteSAkdXNlcm5hbWUgPSAkQVJHVlsxXTsKbXkgJHBhc3N3b3JkID0gJEFSR1ZbMl07CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFNVQiBydW5fcXVlcnkgKCR3cWxfcXVlcnkpCiMgUnVucyB0aGUgZ2l2ZW4gV1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gYXJyYXkgb2YgaGFzaGVzLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcnVuX3F1ZXJ5IHsKICAgICAgICBteSAkd3FsX3F1ZXJ5ID0gJF9bMF07CiAgICAgICAgbXkgQHJlc3VsdCA9IHt9OwogICAgICAgICR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCiAgICAgICAgIyBSdW4gdGhlIERDT00vV01JIGNsaWVudAogICAgICAgIG15ICRvdXRwdXQgPSBgJHdtaV9jbGllbnQgLVUgJyR1c2VybmFtZSclJyRwYXNzd29yZCcgLy8kdGFyZ2V0X2lwIFwiJHdxbF9xdWVyeVwiIDI+L2Rldi9udWxsYDsKCiAgICAgICAgbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CiAgICAgICAgIyBIZWFkZXIsIGRlc2NyaXB0aW9uLCByZXN1bHRzCiAgICAgICAgaWYgKCQjbGluZXMgPCAyKSB7CiAgICAgICAgICAgICAgICBleGl0IDE7CiAgICAgICAgfQoKICAgICAgICAjIERyb3AgdGhlIGhlYWRlcgogICAgICAgIHNoaWZ0IChAbGluZXMpOwoKICAgICAgICAjIEdldCBjb2x1bW4gbmFtZXMKICAgICAgICBteSBAY29sdW1uX25hbWVzID0gc3BsaXQoL1x8Lywgc2hpZnQgKEBsaW5lcykpOwoKICAgICAgICAjIEdldCByb3cgZGF0YQogICAgICAgIG15ICRpZHggPSAwOwogICAgICAgIGZvciAobXkgJGkgPSAwOyAkaSA8PSAkI2xpbmVzOyAkaSsrKSB7CgogICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICBpZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgQmxhY2sgbGlzdAogICAgICAgICAgICAgICAgaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwogICAgICAgICAgICAgICAgZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJGlkeF0tPnskY29sdW1uX25hbWVzWyRqXX0gPSAkY29sdW1uWyRqXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRpZHgrKzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBAcmVzdWx0Owp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFNVQiBwcmludF9tb2R1bGVkYXRhICgkbW9kdWxlX2l0ZW0sICRtb2R1bGVfZGF0YSwKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CiAgICAgICAgbXkgJG1vZHVsZV9pdGVtID0gJF9bMF07CiAgICAgICAgbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07CiAgICAgICAgbXkgJG1vZHVsZV9kZXNjcmlwdGlvbiA9ICRfWzJdOwogICAgICAgIG15ICRtb2R1bGVfZXh0cmFfZGVzY3JpcHRpb24gPSAkX1szXTsKICAgICAgICBteSBAZGF0YSA9IEB7JF9bNF19OwogICAgICAgIG15ICRyZXN1bHQ7CgogICAgICAgIGZvcmVhY2ggbXkgJGVsZW1lbnQgKEBkYXRhKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJyc7CgogICAgICAgICAgICAgICAgIyBJdGVtCiAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19IC4gJzsnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgRGF0YQogICAgICAgICAgICAgICAgaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICcgJyAuIHNwcmludGYoIiUuMWYiLCAkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0gLyAxMDczNzQxODI0KSAuICIgR0J5dGVzOyI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBEZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAgJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9leHRyYV9kZXNjcmlwdGlvbn0pKXsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAgJGVsZW1lbnQtPnskbW9kdWxlX2V4dHJhX2Rlc2NyaXB0aW9ufTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwcmludCAkcmVzdWx0IC4gIlxuIjsKICAgICAgICB9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCA9IHJ1bl9xdWVyeSgiU0VMRUNUICogRlJPTSBXaW4zMl9EaXNrRHJpdmUiKTsKcHJpbnRfbW9kdWxlZGF0YSAoIkNhcHRpb24iLCAiU2l6ZSIsICJTZXJpYWxOdW1iZXIiLCAiU2lnbmF0dXJlIiwgXEByZXN1bHQpOwpleGl0IDA7Cg==',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (10,9,'HD','Hard drives','/usr/bin/perl','Model;Size;ID','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9oZC5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOC0yMDIxIEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBIVE1MOjpFbnRpdGllcyAoKTsKCiMgQ2hlY2sgZm9yIHdtaWMKbXkgJHdtaV9jbGllbnQgPSAiL3Vzci9iaW4vcGFuZG9yYXdtaWMiOwoKdW5sZXNzKC1lICR3bWlfY2xpZW50KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCgkjIERyb3AgdGhlIGhlYWRlcgoJc2hpZnQgKEBsaW5lcyk7CgkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoKCQkjIENoZWNrIGZvciBlcnJvcnMKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKCQkJZXhpdCAxOwoJCX0KCgkJIyBCbGFjayBsaXN0CgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CgkJCW5leHQ7CgkJfQoKCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsIAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKCW15ICRtb2R1bGVfaXRlbSA9ICRfWzBdOwoJbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07CglteSAkbW9kdWxlX2Rlc2NyaXB0aW9uID0gJF9bMl07CglteSBAZGF0YSA9IEB7JF9bM119OwoJbXkgJHJlc3VsdDsKCglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCQoJCSRyZXN1bHQgPSAnJzsKCgkJIyBJdGVtCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19KSkgewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSAuICc7JzsKCQl9CgoJCSMgRGF0YQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSkpIHsKCQkJJHJlc3VsdCAuPSAnICcgLiBzcHJpbnRmKCIlLjFmIiwgJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9IC8gMTA3Mzc0MTgyNCkgLiAiIEdCeXRlczsiOwoJCX0KCgkJIyBEZXNjcmlwdGlvbgoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn0pKSB7CgkJCSRyZXN1bHQgLj0gJyAoJyAuICRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn0gLiAiKSI7CgkJfQoKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCA9IHJ1bl9xdWVyeSgiU0VMRUNUIE1vZGVsLCBTaXplLCBTeXN0ZW1OYW1lIEZST00gV2luMzJfRGlza0RyaXZlIik7CnByaW50X21vZHVsZWRhdGEgKCJNb2RlbCIsICJTaXplIiwgIlN5c3RlbU5hbWUiLCBcQHJlc3VsdCk7CQpleGl0IDA7Cg==',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (11,1,'CDROM','CD-ROM drives','','Type;Model;Features','',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (12,9,'CDROM','CD-ROM drives','/usr/bin/perl','Name;Description;Drive;ID','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9jZHJvbS5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOCBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKI3VzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEhUTUw6OkVudGl0aWVzICgpOwoKIyBDaGVjayBmb3Igd21pYwpteSAkd21pX2NsaWVudCA9ICJ3bWljIjsKaWYgKHN5c3RlbSgiJHdtaV9jbGllbnQgPiAvZGV2L251bGwgMj4mMSIpICE9IDI1NikgewogICAgICAgIHByaW50ICJbZXJyb3JdICR3bWlfY2xpZW50IG5vdCBmb3VuZC5cbiI7CiAgICAgICAgZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKICAgICAgICBwcmludCAiVXNhZ2U6ICQwIDx0YXJnZXQgaXA+IDx1c2VybmFtZT4gPHBhc3N3b3JkPlxuIjsKICAgICAgICBleGl0IDE7Cn0KCm15ICR0YXJnZXRfaXAgPSAkQVJHVlswXTsKbXkgJHVzZXJuYW1lID0gJEFSR1ZbMV07Cm15ICRwYXNzd29yZCA9ICRBUkdWWzJdOwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcnVuX3F1ZXJ5ICgkd3FsX3F1ZXJ5KQojIFJ1bnMgdGhlIGdpdmVuIFdRTCBxdWVyeSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuIGFycmF5IG9mIGhhc2hlcy4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIHJ1bl9xdWVyeSB7CiAgICAgICAgbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwogICAgICAgIG15IEByZXN1bHQgPSB7fTsKCiAgICAgICAgJHdxbF9xdWVyeSA9fiAncy8iL1wnL2cnOwoKICAgICAgICAjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CiAgICAgICAgbXkgJG91dHB1dCA9IGAkd21pX2NsaWVudCAtVSAnJHVzZXJuYW1lJyUnJHBhc3N3b3JkJyAvLyR0YXJnZXRfaXAgXCIkd3FsX3F1ZXJ5XCIgMj4vZGV2L251bGxgOwoKICAgICAgICBteSBAbGluZXMgPSBzcGxpdCgvXG4vLCAkb3V0cHV0KTsKICAgICAgICAjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKICAgICAgICBpZiAoJCNsaW5lcyA8IDIpIHsKICAgICAgICAgICAgICAgIGV4aXQgMTsKICAgICAgICB9CgogICAgICAgICMgRHJvcCB0aGUgaGVhZGVyCiAgICAgICAgc2hpZnQgKEBsaW5lcyk7CgogICAgICAgICMgR2V0IGNvbHVtbiBuYW1lcwogICAgICAgIG15IEBjb2x1bW5fbmFtZXMgPSBzcGxpdCgvXHwvLCBzaGlmdCAoQGxpbmVzKSk7CgogICAgICAgICMgR2V0IHJvdyBkYXRhCiAgICAgICAgbXkgJGlkeCA9IDA7CiAgICAgICAgZm9yIChteSAkaSA9IDA7ICRpIDw9ICQjbGluZXM7ICRpKyspIHsKCiAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgIGlmICgkbGluZXNbJGldID1+IG0vXkVSUk9SLykgewogICAgICAgICAgICAgICAgICAgICAgICBleGl0IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBCbGFjayBsaXN0CiAgICAgICAgICAgICAgICBpZiAoJGxpbmVzWyRpXSA9fiBtL0ZpbGUgMS8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CiAgICAgICAgICAgICAgICBmb3IgKG15ICRqID0gMDsgJGogPD0gJCNjb2x1bW5fbmFtZXM7ICRqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgZGVmaW5lZCgkY29sdW1uWyRqXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGlkeCsrOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKICAgICAgICBteSBAbW9kdWxlX2hlYWRlcnMgPSBAeyRfWzBdfTsKICAgICAgICBteSBAZGF0YSA9IEB7JF9bMV19OwogICAgICAgIG15ICRyZXN1bHQ7CgogICAgICAgICRyZXN1bHQgPSAnJzsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiwgQGRhdGEpCiMgUHJpbnRzIGEgbW9kdWxlZGF0YSBYTUwgdGFnLiAkbW9kdWxlX2l0ZW0sICRtb2R1bGVfZGF0YSBhbmQKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uIGFyZSB1c2VkIHRvIGluZGV4IHRoZSBpdGVtLCBkYXRhIGFuZCBkZXNjcmlwdGlvbgojIFhNTCB0YWdzIHJlc3BlY3RpdmVseS4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIHByaW50X21vZHVsZWRhdGEgewogICAgICAgIG15IEBtb2R1bGVfaGVhZGVycyA9IEB7JF9bMF19OwogICAgICAgIG15IEBkYXRhID0gQHskX1sxXX07CiAgICAgICAgbXkgJHJlc3VsdDsKCiAgICAgICAgZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAnJzsKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJG1oZWFkZXIgKEBtb2R1bGVfaGVhZGVycykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCAoJGVsZW1lbnQtPnskbWhlYWRlcn0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtaGVhZGVyfSAuICc7JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0IC49ICc7JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2hvcCgkcmVzdWx0KTsKICAgICAgICAgICAgICAgIHByaW50ICRyZXN1bHQgLiAiXG4iOwogICAgICAgIH0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSBAcmVzdWx0ICA9IHJ1bl9xdWVyeSgiU0VMRUNUICogRlJPTSBXaW4zMl9DRFJPTURyaXZlIik7Cm15IEBoZWFkZXJzID0gKCJOYW1lIiwgIkRlc2NyaXB0aW9uIiwgIkRyaXZlIiwgIkRldmljZUlkIik7CnByaW50X21vZHVsZWRhdGEgKFxAaGVhZGVycywgXEByZXN1bHQpOwpleGl0IDA7Cgo=',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (12,9,'CDROM','CD-ROM drives','/usr/bin/perl','Name;Description;Drive;ID','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9jZHJvbS5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOC0yMDIxIEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBIVE1MOjpFbnRpdGllcyAoKTsKCiMgQ2hlY2sgZm9yIHdtaWMKbXkgJHdtaV9jbGllbnQgPSAiL3Vzci9iaW4vcGFuZG9yYXdtaWMiOwoKdW5sZXNzKC1lICR3bWlfY2xpZW50KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCgkjIERyb3AgdGhlIGhlYWRlcgoJc2hpZnQgKEBsaW5lcyk7CgkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoKCQkjIENoZWNrIGZvciBlcnJvcnMKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKCQkJZXhpdCAxOwoJCX0KCgkJIyBCbGFjayBsaXN0CgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CgkJCW5leHQ7CgkJfQoKCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsIAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKCW15ICRtb2R1bGVfaXRlbSA9ICRfWzBdOwoJbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07CglteSAkbW9kdWxlX2Rlc2NyaXB0aW9uID0gJF9bMl07CglteSBAZGF0YSA9IEB7JF9bM119OwoJbXkgJHJlc3VsdDsKCglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCQoJCSRyZXN1bHQgPSAnJzsKCgkJIyBJdGVtCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19KSkgewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSAuICc7JzsKCQl9CgoJCSMgRGF0YQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0gLiAnOyc7CgkJfQoKCQkjIERlc2NyaXB0aW9uCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGVzY3JpcHRpb259OwoJCX0KCgkJcHJpbnQgJHJlc3VsdCAuICJcbiI7CQoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIE1haW4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15IEByZXN1bHQgPSBydW5fcXVlcnkoIlNFTEVDVCBOYW1lLCBEZXNjcmlwdGlvbiwgRHJpdmUgRlJPTSBXaW4zMl9DRFJPTURyaXZlIik7CnByaW50X21vZHVsZWRhdGEgKCJOYW1lIiwgIkRlc2NyaXB0aW9uIiwgIkRyaXZlIiwgXEByZXN1bHQpOwpleGl0IDA7Cg==',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (13,1,'Software','Installed software packages','','Name;Version;Description','',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (14,9,'Software','Installed software packages','/usr/bin/perl','Name;Version','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9zb2Z0d2FyZS5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOCBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIndtaWMiOwppZiAoc3lzdGVtKCIkd21pX2NsaWVudCA+IC9kZXYvbnVsbCAyPiYxIikgIT0gMjU2KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCgkjIERyb3AgdGhlIGhlYWRlcgoJc2hpZnQgKEBsaW5lcyk7CgkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoKCQkjIENoZWNrIGZvciBlcnJvcnMKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKCQkJZXhpdCAxOwoJCX0KCgkJIyBCbGFjayBsaXN0CgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CgkJCW5leHQ7CgkJfQoKCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKICAgICAgICBteSAkbW9kdWxlX2l0ZW0gPSAkX1swXTsKICAgICAgICBteSAkbW9kdWxlX2RhdGEgPSAkX1sxXTsKICAgICAgICBteSBAZGF0YSA9IEB7JF9bMl19OwogICAgICAgIG15ICRyZXN1bHQ7CgogICAgICAgIGZvcmVhY2ggbXkgJGVsZW1lbnQgKEBkYXRhKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJyc7CiAgICAgICAgICAgICAgICAjIEl0ZW0KICAgICAgICAgICAgICAgIGlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0gLiAnOyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBEYXRhCiAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHByaW50ICRyZXN1bHQgLiAiXG4iOwogICAgICAgIH0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSBAcmVzdWx0ID0gcnVuX3F1ZXJ5KCJTRUxFQ1QgTmFtZSwgVmVyc2lvbiBGUk9NIFdpbjMyX1Byb2R1Y3QiKTsKcHJpbnRfbW9kdWxlZGF0YSAoIk5hbWUiLCAiVmVyc2lvbiIsIFxAcmVzdWx0KTsKZXhpdCAwOwoK',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (15,9,'Patches','Installed patches','/usr/bin/perl','HotFixID;Description;FixComments;ServicePackInEffect','IyEvdXNyL2Jpbi9wZXJsDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBwYW5kb3JhX3BhdGNoLnBsDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBDb3B5cmlnaHQgKGMpIDIwMDggUmFtb24gTm92b2EsIHJub3ZvYUBhcnRpY2EuZXMNCiMgICAgICAgICAgIChjKSAyMDA4IEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwNCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQp1c2Ugc3RyaWN0Ow0KdXNlIHdhcm5pbmdzOw0KDQp1c2UgRmlsZTo6QmFzZW5hbWU7DQp1c2UgSFRNTDo6RW50aXRpZXMgKCk7DQoNCiMgQ2hlY2sgZm9yIHdtaWMNCm15ICR3bWlfY2xpZW50ID0gIndtaWMiOw0KaWYgKHN5c3RlbSgiJHdtaV9jbGllbnQgPiAvZGV2L251bGwgMj4mMSIpICE9IDI1Nikgew0KCXByaW50ICJbZXJyb3JdICR3bWlfY2xpZW50IG5vdCBmb3VuZC5cbiI7DQoJZXhpdCAxOw0KfQ0KDQppZiAoJCNBUkdWICE9IDIpIHsNCglwcmludCAiVXNhZ2U6ICQwIDx0YXJnZXQgaXA+IDx1c2VybmFtZT4gPHBhc3N3b3JkPlxuIjsNCglleGl0IDE7DQp9DQoNCm15ICR0YXJnZXRfaXAgPSAkQVJHVlswXTsNCm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOw0KbXkgJHBhc3N3b3JkID0gJEFSR1ZbMl07DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIFNVQiBydW5fcXVlcnkgKCR3cWxfcXVlcnkpDQojIFJ1bnMgdGhlIGdpdmVuIFdRTCBxdWVyeSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuIGFycmF5IG9mIGhhc2hlcy4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpzdWIgcnVuX3F1ZXJ5IHsNCglteSAkd3FsX3F1ZXJ5ID0gJF9bMF07DQoJbXkgQHJlc3VsdCA9IHt9Ow0KDQoJJHdxbF9xdWVyeSA9fiAncy8iL1wnL2cnOw0KDQoJIyBSdW4gdGhlIERDT00vV01JIGNsaWVudA0KCW15ICRvdXRwdXQgPSBgJHdtaV9jbGllbnQgLVUgJyR1c2VybmFtZSclJyRwYXNzd29yZCcgLy8kdGFyZ2V0X2lwIFwiJHdxbF9xdWVyeVwiIDI+L2Rldi9udWxsYDsNCg0KCW15IEBsaW5lcyA9IHNwbGl0KC9cbi8sICRvdXRwdXQpOw0KCSMgSGVhZGVyLCBkZXNjcmlwdGlvbiwgcmVzdWx0cw0KCWlmICgkI2xpbmVzIDwgMikgew0KCQlleGl0IDE7DQoJfQ0KDQoJIyBEcm9wIHRoZSBoZWFkZXINCglzaGlmdCAoQGxpbmVzKTsNCgkNCgkjIEdldCBjb2x1bW4gbmFtZXMNCglteSBAY29sdW1uX25hbWVzID0gc3BsaXQoL1x8Lywgc2hpZnQgKEBsaW5lcykpOw0KDQoJIyBHZXQgcm93IGRhdGENCglteSAkaWR4ID0gMDsNCglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgew0KDQoJCSMgQ2hlY2sgZm9yIGVycm9ycw0KCQlpZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsNCgkJCWV4aXQgMTsNCgkJfQ0KDQoJCSMgQmxhY2sgbGlzdA0KCQlpZiAoJGxpbmVzWyRpXSA9fiBtL0ZpbGUgMS8pIHsNCgkJCW5leHQ7DQoJCX0NCg0KCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7DQoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgew0KCQkJaWYgKCEgZGVmaW5lZCgkY29sdW1uWyRqXSkpIHsNCgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07DQoJCQl9DQoJCX0NCgkJDQoJCSRpZHgrKzsNCgl9DQoJDQoJcmV0dXJuIEByZXN1bHQ7DQp9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIFNVQiBwcmludF9tb2R1bGVkYXRhICgkbW9kdWxlX2l0ZW0sICRtb2R1bGVfZGF0YSwgDQojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQ0KIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCANCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhbmQgJG1vZHVsZV9zZXJ2aWNlcGFjayBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSwgZGVzY3JpcHRpb24gYW5kIHNlcnZpY2VwYWNrDQojIFhNTCB0YWdzIHJlc3BlY3RpdmVseS4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7DQoJbXkgJG1vZHVsZV9pdGVtID0gJF9bMF07DQoJbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07DQoJbXkgJG1vZHVsZV9kZXNjcmlwdGlvbiA9ICRfWzJdOw0KCW15ICRtb2R1bGVfc2VydmljZXBhY2sgPSAkX1szXTsNCglteSBAZGF0YSA9IEB7JF9bNF19Ow0KCW15ICRyZXN1bHQ7DQoNCglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgew0KCQkNCgkJJHJlc3VsdCA9ICcnOw0KDQoJCSMgSXRlbQ0KCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0pKSB7DQoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSAuICc7JzsNCgkJfQ0KDQoJCSMgRGF0YQ0KCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0pKSB7DQoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSAuICc7JzsNCgkJfQ0KDQoJCSMgRGVzY3JpcHRpb24NCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufSkpIHsNCgkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufSAuICc7JzsNCgkJfQ0KDQoJCSMgU2VydmljZSBwYWNrDQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9zZXJ2aWNlcGFja30pKSB7DQoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9zZXJ2aWNlcGFja307DQoJCX0NCg0KCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJDQoJfQ0KfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBNYWluDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpteSBAcmVzdWx0ID0gcnVuX3F1ZXJ5KCJTRUxFQ1QgSG90Rml4SUQsIERlc2NyaXB0aW9uLCBGaXhDb21tZW50cywgU2VydmljZVBhY2tJbkVmZmVjdCBGUk9NIFdpbjMyX1F1aWNrRml4RW5naW5lZXJpbmciKTsNCnByaW50X21vZHVsZWRhdGEgKCJIb3RGaXhJRCIsICJEZXNjcmlwdGlvbiIsICJGaXhDb21tZW50cyIsICJTZXJ2aWNlUGFja0luRWZmZWN0IiwgXEByZXN1bHQpOw0KZXhpdCAwOw0K',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (14,9,'Software','Installed software packages','/usr/bin/perl','Name;Version','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9zb2Z0d2FyZS5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOC0yMDIxIEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBIVE1MOjpFbnRpdGllcyAoKTsKCiMgQ2hlY2sgZm9yIHdtaWMKbXkgJHdtaV9jbGllbnQgPSAiL3Vzci9iaW4vcGFuZG9yYXdtaWMiOwoKdW5sZXNzKC1lICR3bWlfY2xpZW50KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCgkjIERyb3AgdGhlIGhlYWRlcgoJc2hpZnQgKEBsaW5lcyk7CgkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoKCQkjIENoZWNrIGZvciBlcnJvcnMKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKCQkJZXhpdCAxOwoJCX0KCgkJIyBCbGFjayBsaXN0CgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CgkJCW5leHQ7CgkJfQoKCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsIAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKCW15ICRtb2R1bGVfaXRlbSA9ICRfWzBdOwoJbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07CglteSAkbW9kdWxlX2Rlc2NyaXB0aW9uID0gJF9bMl07CglteSBAZGF0YSA9IEB7JF9bM119OwoJbXkgJHJlc3VsdDsKCglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCQoJCSRyZXN1bHQgPSAnJzsKCgkJIyBJdGVtCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19KSkgewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSAuICc7JzsKCQl9CgoJCSMgRGF0YQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX07CgkJfQoKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCA9IHJ1bl9xdWVyeSgiU0VMRUNUIE5hbWUsIFZlcnNpb24gRlJPTSBXaW4zMl9Qcm9kdWN0Iik7CnByaW50X21vZHVsZWRhdGEgKCJOYW1lIiwgIlZlcnNpb24iLCAiIiwgXEByZXN1bHQpOwpleGl0IDA7Cg==',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (15,9,'Patches','Installed patches','/usr/bin/perl','HotFixID;Description;FixComments;ServicePackInEffect','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9wYXRjaC5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOC0yMDIxIEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBIVE1MOjpFbnRpdGllcyAoKTsKCiMgQ2hlY2sgZm9yIHdtaWMKbXkgJHdtaV9jbGllbnQgPSAiL3Vzci9iaW4vcGFuZG9yYXdtaWMiOwoKdW5sZXNzKC1lICR3bWlfY2xpZW50KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCgkjIERyb3AgdGhlIGhlYWRlcgoJc2hpZnQgKEBsaW5lcyk7CgkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoKCQkjIENoZWNrIGZvciBlcnJvcnMKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKCQkJZXhpdCAxOwoJCX0KCgkJIyBCbGFjayBsaXN0CgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CgkJCW5leHQ7CgkJfQoKCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsIAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKCW15ICRtb2R1bGVfaXRlbSA9ICRfWzBdOwoJbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07CglteSAkbW9kdWxlX2Rlc2NyaXB0aW9uID0gJF9bMl07CglteSBAZGF0YSA9IEB7JF9bM119OwoJbXkgJHJlc3VsdDsKCglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCQoJCSRyZXN1bHQgPSAnJzsKCgkJIyBJdGVtCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19KSkgewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSAuICc7JzsKCQl9CgoJCSMgRGF0YQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0gLiAnOyc7CgkJfQoKCQkjIERlc2NyaXB0aW9uCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGVzY3JpcHRpb259OwoJCX0KCgkJcHJpbnQgJHJlc3VsdCAuICJcbiI7CQoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIE1haW4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15IEByZXN1bHQgPSBydW5fcXVlcnkoIlNFTEVDVCBIb3RGaXhJRCwgRGVzY3JpcHRpb24sIEZpeENvbW1lbnRzIEZST00gV2luMzJfUXVpY2tGaXhFbmdpbmVlcmluZyIpOwpwcmludF9tb2R1bGVkYXRhICgiSG90Rml4SUQiLCAiRGVzY3JpcHRpb24iLCAiRml4Q29tbWVudHMiLCBcQHJlc3VsdCk7CmV4aXQgMDsK',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (16,1,'Init services','Services programmed to lauch in Unix','','Service','',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (17,9,'Init services','Windows services','/usr/bin/perl','Name;PathName;State','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9zZXJ2aWNlcy5wbAoj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9h QGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOCBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xv Z2ljYXMgUy5MCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVk IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl CiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9z dG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXNlIHN0cmljdDsK dXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7 CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIndtaWMiOwppZiAoc3lzdGVtKCIk d21pX2NsaWVudCA+IC9kZXYvbnVsbCAyPiYxIikgIT0gMjU2KSB7CglwcmludCAiW2Vycm9yXSAk d21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsK CXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJ ZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdW WzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1 bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVy bnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1 YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoK CSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50Cglt eSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRh cmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQo L1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xp bmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCgkjIERyb3AgdGhlIGhlYWRlcgoJc2hpZnQgKEBsaW5l cyk7CgkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8s IHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15 ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoKCQkjIENoZWNrIGZvciBlcnJvcnMKCQlp ZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKCQkJZXhpdCAxOwoJCX0KCgkJIyBCbGFjayBs aXN0CgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CgkJCW5leHQ7CgkJfQoKCQlteSBA Y29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9 ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7 CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxz ZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07 CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2Rh dGEsIAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEg WE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlw dGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBY TUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVk YXRhIHsKCW15ICRtb2R1bGVfaXRlbSA9ICRfWzBdOwoJbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07 CglteSAkbW9kdWxlX2Rlc2NyaXB0aW9uID0gJF9bMl07CglteSBAZGF0YSA9IEB7JF9bM119OwoJ bXkgJHJlc3VsdDsKCglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCQoJCSRyZXN1bHQg PSAnJzsKCgkJIyBJdGVtCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19KSkg ewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSAuICc7JzsKCQl9CgoJCSMg RGF0YQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSkpIHsKCQkJJHJlc3Vs dCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0gLiAnOyc7CgkJfQoKCQkjIERlc2NyaXB0aW9u CgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufSkpIHsKCQkJJHJl c3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGVzY3JpcHRpb259OwoJCX0KCgkJcHJpbnQgJHJl c3VsdCAuICJcbiI7CQoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIE1haW4KIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKCm15IEByZXN1bHQgPSBydW5fcXVlcnkoIlNFTEVDVCBOYW1lLCBQYXRoTmFtZSwgU3Rh dGUgRlJPTSBXaW4zMl9TZXJ2aWNlIik7CnByaW50X21vZHVsZWRhdGEgKCJOYW1lIiwgIlBhdGhO YW1lIiwgIlN0YXRlIiwgXEByZXN1bHQpOwpleGl0IDA7Cg==',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (17,9,'Init services','Windows services','/usr/bin/perl','Name;PathName;State','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9zZXJ2aWNlcy5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOC0yMDIxIEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBIVE1MOjpFbnRpdGllcyAoKTsKCiMgQ2hlY2sgZm9yIHdtaWMKbXkgJHdtaV9jbGllbnQgPSAiL3Vzci9iaW4vcGFuZG9yYXdtaWMiOwoKdW5sZXNzKC1lICR3bWlfY2xpZW50KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCgkjIERyb3AgdGhlIGhlYWRlcgoJc2hpZnQgKEBsaW5lcyk7CgkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoKCQkjIENoZWNrIGZvciBlcnJvcnMKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKCQkJZXhpdCAxOwoJCX0KCgkJIyBCbGFjayBsaXN0CgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CgkJCW5leHQ7CgkJfQoKCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsIAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKCW15ICRtb2R1bGVfaXRlbSA9ICRfWzBdOwoJbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07CglteSAkbW9kdWxlX2Rlc2NyaXB0aW9uID0gJF9bMl07CglteSBAZGF0YSA9IEB7JF9bM119OwoJbXkgJHJlc3VsdDsKCglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCQoJCSRyZXN1bHQgPSAnJzsKCgkJIyBJdGVtCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19KSkgewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSAuICc7JzsKCQl9CgoJCSMgRGF0YQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0gLiAnOyc7CgkJfQoKCQkjIERlc2NyaXB0aW9uCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGVzY3JpcHRpb259OwoJCX0KCgkJcHJpbnQgJHJlc3VsdCAuICJcbiI7CQoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIE1haW4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15IEByZXN1bHQgPSBydW5fcXVlcnkoIlNFTEVDVCBOYW1lLCBQYXRoTmFtZSwgU3RhdGUgRlJPTSBXaW4zMl9TZXJ2aWNlIik7CnByaW50X21vZHVsZWRhdGEgKCJOYW1lIiwgIlBhdGhOYW1lIiwgIlN0YXRlIiwgXEByZXN1bHQpOwpleGl0IDA7Cg==',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (18,1,'File system','UNIX filesystem mounted on system','','Device;Free size;Total size;Mount point','',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (19,9,'File system','Disk drives','','Device;Total size;Free size;Mount point','',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (20,1,'Process','Process running on system','','Process output from ps','',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (21,9,'Process','Process running on system','/usr/bin/perl','Name;PathName;State','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9wcm9jZXNzZXMucGwK IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMKIyBDb3B5cmlnaHQgKGMpIDIwMDggUmFtb24gTm92b2EsIHJub3Zv YUBhcnRpY2EuZXMKIyAgICAgICAgICAgKGMpIDIwMDggQXJ0aWNhIFNvbHVjaW9uZXMgVGVjbm9s b2dpY2FzIFMuTAojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRl ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy ZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJv c3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnVzZSBzdHJpY3Q7 CnVzZSB3YXJuaW5nczsKCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEhUTUw6OkVudGl0aWVzICgp OwoKIyBDaGVjayBmb3Igd21pYwpteSAkd21pX2NsaWVudCA9ICJ3bWljIjsKaWYgKHN5c3RlbSgi JHdtaV9jbGllbnQgPiAvZGV2L251bGwgMj4mMSIpICE9IDI1NikgewoJcHJpbnQgIltlcnJvcl0g JHdtaV9jbGllbnQgbm90IGZvdW5kLlxuIjsKCWV4aXQgMTsKfQoKaWYgKCQjQVJHViAhPSAyKSB7 CglwcmludCAiVXNhZ2U6ICQwIDx0YXJnZXQgaXA+IDx1c2VybmFtZT4gPHBhc3N3b3JkPlxuIjsK CWV4aXQgMTsKfQoKbXkgJHRhcmdldF9pcCA9ICRBUkdWWzBdOwpteSAkdXNlcm5hbWUgPSAkQVJH VlsxXTsKbXkgJHBhc3N3b3JkID0gJEFSR1ZbMl07CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFNVQiBy dW5fcXVlcnkgKCR3cWxfcXVlcnkpCiMgUnVucyB0aGUgZ2l2ZW4gV1FMIHF1ZXJ5IGFuZCByZXR1 cm5zIHRoZSByZXN1bHQgYXMgYW4gYXJyYXkgb2YgaGFzaGVzLgojIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpz dWIgcnVuX3F1ZXJ5IHsKCW15ICR3cWxfcXVlcnkgPSAkX1swXTsKCW15IEByZXN1bHQgPSB7fTsK Cgkkd3FsX3F1ZXJ5ID1+ICdzLyIvXCcvZyc7CgoJIyBSdW4gdGhlIERDT00vV01JIGNsaWVudAoJ bXkgJG91dHB1dCA9IGAkd21pX2NsaWVudCAtVSAnJHVzZXJuYW1lJyUnJHBhc3N3b3JkJyAvLyR0 YXJnZXRfaXAgXCIkd3FsX3F1ZXJ5XCIgMj4vZGV2L251bGxgOwoKCW15IEBsaW5lcyA9IHNwbGl0 KC9cbi8sICRvdXRwdXQpOwoJIyBIZWFkZXIsIGRlc2NyaXB0aW9uLCByZXN1bHRzCglpZiAoJCNs aW5lcyA8IDIpIHsKCQlleGl0IDE7Cgl9CgoJIyBEcm9wIHRoZSBoZWFkZXIKCXNoaWZ0IChAbGlu ZXMpOwoJCgkjIEdldCBjb2x1bW4gbmFtZXMKCW15IEBjb2x1bW5fbmFtZXMgPSBzcGxpdCgvXHwv LCBzaGlmdCAoQGxpbmVzKSk7CgoJIyBHZXQgcm93IGRhdGEKCW15ICRpZHggPSAwOwoJZm9yICht eSAkaSA9IDA7ICRpIDw9ICQjbGluZXM7ICRpKyspIHsKCgkJIyBDaGVjayBmb3IgZXJyb3JzCgkJ aWYgKCRsaW5lc1skaV0gPX4gbS9eRVJST1IvKSB7CgkJCWV4aXQgMTsKCQl9CgoJCSMgQmxhY2sg bGlzdAoJCWlmICgkbGluZXNbJGldID1+IG0vRmlsZSAxLykgewoJCQluZXh0OwoJCX0KCgkJbXkg QGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8 PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkg ewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVs c2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpd OwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9k YXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRh IFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3Jp cHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMg WE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxl ZGF0YSB7CglteSAkbW9kdWxlX2l0ZW0gPSAkX1swXTsKCW15ICRtb2R1bGVfZGF0YSA9ICRfWzFd OwoJbXkgJG1vZHVsZV9kZXNjcmlwdGlvbiA9ICRfWzJdOwoJbXkgQGRhdGEgPSBAeyRfWzNdfTsK CW15ICRyZXN1bHQ7CgoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkKCQkkcmVzdWx0 ID0gJyc7CgoJCSMgSXRlbQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSkp IHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0gLiAnOyc7CgkJfQoKCQkj IERhdGEKCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0pKSB7CgkJCSRyZXN1 bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9IC4gJzsnOwoJCX0KCgkJIyBEZXNjcmlwdGlv bgoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn0pKSB7CgkJCSRy ZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufTsKCQl9CgoJCXByaW50ICRy ZXN1bHQgLiAiXG4iOwkKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjCgpteSBAcmVzdWx0ID0gcnVuX3F1ZXJ5KCJTRUxFQ1QgTmFtZSwgUGF0aE5hbWUsIFN0 YXRlIEZST00gV2luMzJfU2VydmljZSIpOwpwcmludF9tb2R1bGVkYXRhICgiTmFtZSIsICJQYXRo TmFtZSIsICJTdGF0ZSIsIFxAcmVzdWx0KTsJCmV4aXQgMDsK',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (21,9,'Process','Process running on system','/usr/bin/perl','Name;PathName;State','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9wcm9jZXNzZXMucGwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDb3B5cmlnaHQgKGMpIDIwMDggUmFtb24gTm92b2EsIHJub3ZvYUBhcnRpY2EuZXMKIyAgICAgICAgICAgKGMpIDIwMDgtMjAyMSBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIi91c3IvYmluL3BhbmRvcmF3bWljIjsKCnVubGVzcygtZSAkd21pX2NsaWVudCkgewoJcHJpbnQgIltlcnJvcl0gJHdtaV9jbGllbnQgbm90IGZvdW5kLlxuIjsKCWV4aXQgMTsKfQoKaWYgKCQjQVJHViAhPSAyKSB7CglwcmludCAiVXNhZ2U6ICQwIDx0YXJnZXQgaXA+IDx1c2VybmFtZT4gPHBhc3N3b3JkPlxuIjsKCWV4aXQgMTsKfQoKbXkgJHRhcmdldF9pcCA9ICRBUkdWWzBdOwpteSAkdXNlcm5hbWUgPSAkQVJHVlsxXTsKbXkgJHBhc3N3b3JkID0gJEFSR1ZbMl07CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFNVQiBydW5fcXVlcnkgKCR3cWxfcXVlcnkpCiMgUnVucyB0aGUgZ2l2ZW4gV1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gYXJyYXkgb2YgaGFzaGVzLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcnVuX3F1ZXJ5IHsKCW15ICR3cWxfcXVlcnkgPSAkX1swXTsKCW15IEByZXN1bHQgPSB7fTsKCgkkd3FsX3F1ZXJ5ID1+ICdzLyIvXCcvZyc7CgoJIyBSdW4gdGhlIERDT00vV01JIGNsaWVudAoJbXkgJG91dHB1dCA9IGAkd21pX2NsaWVudCAtVSAnJHVzZXJuYW1lJyUnJHBhc3N3b3JkJyAvLyR0YXJnZXRfaXAgXCIkd3FsX3F1ZXJ5XCIgMj4vZGV2L251bGxgOwoKCW15IEBsaW5lcyA9IHNwbGl0KC9cbi8sICRvdXRwdXQpOwoJIyBIZWFkZXIsIGRlc2NyaXB0aW9uLCByZXN1bHRzCglpZiAoJCNsaW5lcyA8IDIpIHsKCQlleGl0IDE7Cgl9CgoJIyBEcm9wIHRoZSBoZWFkZXIKCXNoaWZ0IChAbGluZXMpOwoJCgkjIEdldCBjb2x1bW4gbmFtZXMKCW15IEBjb2x1bW5fbmFtZXMgPSBzcGxpdCgvXHwvLCBzaGlmdCAoQGxpbmVzKSk7CgoJIyBHZXQgcm93IGRhdGEKCW15ICRpZHggPSAwOwoJZm9yIChteSAkaSA9IDA7ICRpIDw9ICQjbGluZXM7ICRpKyspIHsKCgkJIyBDaGVjayBmb3IgZXJyb3JzCgkJaWYgKCRsaW5lc1skaV0gPX4gbS9eRVJST1IvKSB7CgkJCWV4aXQgMTsKCQl9CgoJCSMgQmxhY2sgbGlzdAoJCWlmICgkbGluZXNbJGldID1+IG0vRmlsZSAxLykgewoJCQluZXh0OwoJCX0KCgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSAkbW9kdWxlX2l0ZW0gPSAkX1swXTsKCW15ICRtb2R1bGVfZGF0YSA9ICRfWzFdOwoJbXkgJG1vZHVsZV9kZXNjcmlwdGlvbiA9ICRfWzJdOwoJbXkgQGRhdGEgPSBAeyRfWzNdfTsKCW15ICRyZXN1bHQ7CgoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkKCQkkcmVzdWx0ID0gJyc7CgoJCSMgSXRlbQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0gLiAnOyc7CgkJfQoKCQkjIERhdGEKCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0pKSB7CgkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9IC4gJzsnOwoJCX0KCgkJIyBEZXNjcmlwdGlvbgoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn0pKSB7CgkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufTsKCQl9CgoJCXByaW50ICRyZXN1bHQgLiAiXG4iOwkKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSBAcmVzdWx0ID0gcnVuX3F1ZXJ5KCJTRUxFQ1QgTmFtZSwgUGF0aE5hbWUsIFN0YXRlIEZST00gV2luMzJfU2VydmljZSIpOwpwcmludF9tb2R1bGVkYXRhICgiTmFtZSIsICJQYXRoTmFtZSIsICJTdGF0ZSIsIFxAcmVzdWx0KTsJCmV4aXQgMDsK',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (22,1,'Users','User list','','Username','',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (23,9,'Users','User list','/usr/bin/perl','Domain;User','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV91c2Vycy5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAwOCBSYW1vbiBOb3ZvYSwgcm5vdm9hQGFydGljYS5lcwojICAgICAgICAgICAoYykgMjAwOCBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MCiMgICAgICAgICAgIChjKSAyMDE1IEJvcmphIFNhbmNoZXogPGZib3JqYS5zYW5jaGV6QGFydGljYS5lcz4KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIndtaWMiOwppZiAoc3lzdGVtKCIkd21pX2NsaWVudCA+IC9kZXYvbnVsbCAyPiYxIikgIT0gMjU2KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCgkjIERyb3AgdGhlIGhlYWRlcgoJc2hpZnQgKEBsaW5lcyk7CgkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoKCQkjIENoZWNrIGZvciBlcnJvcnMKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL15FUlJPUi8pIHsKCQkJZXhpdCAxOwoJCX0KCgkJIyBCbGFjayBsaXN0CgkJaWYgKCRsaW5lc1skaV0gPX4gbS9GaWxlIDEvKSB7CgkJCW5leHQ7CgkJfQoKCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsIAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKCW15ICRtb2R1bGVfaXRlbSA9ICRfWzBdOwoJbXkgJG1vZHVsZV9kYXRhID0gJF9bMV07CglteSAkbW9kdWxlX2Rlc2NyaXB0aW9uID0gJF9bMl07CglteSBAZGF0YSA9IEB7JF9bM119OwoJbXkgJHJlc3VsdDsKCglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCQoJCSRyZXN1bHQgPSAnJzsKCgkJIyBJdGVtCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2l0ZW19KSkgewoJCQkkcmVzdWx0IC49ICRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSAuICc7JzsKCQl9CgoJCSMgRGF0YQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kYXRhfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0gLiAnOyc7CgkJfQoKCQkjIERlc2NyaXB0aW9uCgkJaWYgKGRlZmluZWQoJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfZGVzY3JpcHRpb259OwoJCX0KCgkJcHJpbnQgJHJlc3VsdCAuICJcbiI7CQoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIE1haW4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15IEByZXN1bHQgPSBydW5fcXVlcnkoIlNFTEVDVCBOYW1lLCBGdWxsTmFtZSwgU3RhdHVzIEZST00gV2luMzJfVXNlckFjY291bnQiKTsKcHJpbnRfbW9kdWxlZGF0YSAoIk5hbWUiLCAiRnVsbE5hbWUiLCAiU3RhdHVzIiwgXEByZXN1bHQpOwpleGl0IDA7Cg==',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (23,9,'Users','User list','/usr/bin/perl','Domain;User','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9wcm9jZXNzZXMucGwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDb3B5cmlnaHQgKGMpIDIwMDggUmFtb24gTm92b2EsIHJub3ZvYUBhcnRpY2EuZXMKIyAgICAgICAgICAgKGMpIDIwMDgtMjAyMSBBcnRpY2EgU29sdWNpb25lcyBUZWNub2xvZ2ljYXMgUy5MCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIi91c3IvYmluL3BhbmRvcmF3bWljIjsKCnVubGVzcygtZSAkd21pX2NsaWVudCkgewoJcHJpbnQgIltlcnJvcl0gJHdtaV9jbGllbnQgbm90IGZvdW5kLlxuIjsKCWV4aXQgMTsKfQoKaWYgKCQjQVJHViAhPSAyKSB7CglwcmludCAiVXNhZ2U6ICQwIDx0YXJnZXQgaXA+IDx1c2VybmFtZT4gPHBhc3N3b3JkPlxuIjsKCWV4aXQgMTsKfQoKbXkgJHRhcmdldF9pcCA9ICRBUkdWWzBdOwpteSAkdXNlcm5hbWUgPSAkQVJHVlsxXTsKbXkgJHBhc3N3b3JkID0gJEFSR1ZbMl07CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFNVQiBydW5fcXVlcnkgKCR3cWxfcXVlcnkpCiMgUnVucyB0aGUgZ2l2ZW4gV1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gYXJyYXkgb2YgaGFzaGVzLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcnVuX3F1ZXJ5IHsKCW15ICR3cWxfcXVlcnkgPSAkX1swXTsKCW15IEByZXN1bHQgPSB7fTsKCgkkd3FsX3F1ZXJ5ID1+ICdzLyIvXCcvZyc7CgoJIyBSdW4gdGhlIERDT00vV01JIGNsaWVudAoJbXkgJG91dHB1dCA9IGAkd21pX2NsaWVudCAtVSAnJHVzZXJuYW1lJyUnJHBhc3N3b3JkJyAvLyR0YXJnZXRfaXAgXCIkd3FsX3F1ZXJ5XCIgMj4vZGV2L251bGxgOwoKCW15IEBsaW5lcyA9IHNwbGl0KC9cbi8sICRvdXRwdXQpOwoJIyBIZWFkZXIsIGRlc2NyaXB0aW9uLCByZXN1bHRzCglpZiAoJCNsaW5lcyA8IDIpIHsKCQlleGl0IDE7Cgl9CgoJIyBEcm9wIHRoZSBoZWFkZXIKCXNoaWZ0IChAbGluZXMpOwoJCgkjIEdldCBjb2x1bW4gbmFtZXMKCW15IEBjb2x1bW5fbmFtZXMgPSBzcGxpdCgvXHwvLCBzaGlmdCAoQGxpbmVzKSk7CgoJIyBHZXQgcm93IGRhdGEKCW15ICRpZHggPSAwOwoJZm9yIChteSAkaSA9IDA7ICRpIDw9ICQjbGluZXM7ICRpKyspIHsKCgkJIyBDaGVjayBmb3IgZXJyb3JzCgkJaWYgKCRsaW5lc1skaV0gPX4gbS9eRVJST1IvKSB7CgkJCWV4aXQgMTsKCQl9CgoJCSMgQmxhY2sgbGlzdAoJCWlmICgkbGluZXNbJGldID1+IG0vRmlsZSAxLykgewoJCQluZXh0OwoJCX0KCgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSAkbW9kdWxlX2l0ZW0gPSAkX1swXTsKCW15ICRtb2R1bGVfZGF0YSA9ICRfWzFdOwoJbXkgJG1vZHVsZV9kZXNjcmlwdGlvbiA9ICRfWzJdOwoJbXkgQGRhdGEgPSBAeyRfWzNdfTsKCW15ICRyZXN1bHQ7CgoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkKCQkkcmVzdWx0ID0gJyc7CgoJCSMgSXRlbQoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9pdGVtfSkpIHsKCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaXRlbX0gLiAnOyc7CgkJfQoKCQkjIERhdGEKCQlpZiAoZGVmaW5lZCgkZWxlbWVudC0+eyRtb2R1bGVfZGF0YX0pKSB7CgkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2RhdGF9IC4gJzsnOwoJCX0KCgkJIyBEZXNjcmlwdGlvbgoJCWlmIChkZWZpbmVkKCRlbGVtZW50LT57JG1vZHVsZV9kZXNjcmlwdGlvbn0pKSB7CgkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2Rlc2NyaXB0aW9ufTsKCQl9CgoJCXByaW50ICRyZXN1bHQgLiAiXG4iOwkKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSBAcmVzdWx0ID0gcnVuX3F1ZXJ5KCJTRUxFQ1QgTmFtZSwgUGF0aE5hbWUsIFN0YXRlIEZST00gV2luMzJfU2VydmljZSIpOwpwcmludF9tb2R1bGVkYXRhICgiTmFtZSIsICJQYXRoTmFtZSIsICJTdGF0ZSIsIFxAcmVzdWx0KTsJCmV4aXQgMDsK',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (24,9,'Services','Services installed','','Name;Command;Status','',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (25,15,'Software','Installed software applications','','Name;Version;Description','',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (26,7,'Cisco Interface Remote Inventory','Remote inventory module to get all cards in a Cisco','/usr/bin/perl','Name;Card Name;ID/Serial','IyEvdXNyL2Jpbi9wZXJsDQojSW52ZW50YXJpbyBkZSBUYXJqZXRhcw0KI1Nsb3Q7UGFydE51bWJlcjtTZXJpYWxOdW1iZXINCg0KIyEvdXNyL2Jpbi9wZXJsIC13DQoNCm15ICR0YXJnZXRfaXAgPSAkQVJHVlswXTsNCm15ICRjb21tdW5pdHkgPSAkQVJHVlsxXTsNCg0KI34gRXhlY3V0ZSBjb21tYW5kDQokY29tbWFuZCA9IGBzbm1wd2FsayAtdjJjIC1jICRjb21tdW5pdHkgJHRhcmdldF9pcCBtaWItMi40Ny4xLjEuMS4xLjJgOw0KDQojfiBTcGxpdCB0aGUgb3V0cHV0IGluIGxpbmVzDQpAdGVtcCA9IHNwbGl0ICgiXG4iLCAkY29tbWFuZCk7DQpteSBAdmFsdWVzOw0KDQojfiBFYWNoIGxpbmUNCmZvcmVhY2ggKEB0ZW1wKSB7DQoJI34gc3dhcCBkb3RzIGJ5IHNwYWNlcw0KCSRfID1+IHMvXC4vIC9nOw0KCSN+IHNwbGl0IHRoZSBsaW5lIGJ5IHNwYWNlcw0KCUBsaW5lID0gc3BsaXQgKC8gLywgJF8pOw0KCSN+IHNhdmUgdGhlIDd0aCB2YWx1ZQ0KCXB1c2ggKEB2YWx1ZXMsICRsaW5lWzddKTsNCn0NCg0KZm9yZWFjaCAoQHZhbHVlcykgew0KCSN+IHByaW50ICIkXyI7DQoJJFBJRCA9ICcnOw0KCSRQSUQgLj0gYHNubXBnZXQgLXYyYyAtYyAkY29tbXVuaXR5IC1PdnEgJHRhcmdldF9pcCBtaWItMi40Ny4xLjEuMS4xLjEzLiRfYDsNCgkkUElEIC49IGBzbm1wZ2V0IC12MmMgLWMgJGNvbW11bml0eSAtT3ZxICR0YXJnZXRfaXAgbWliLTIuNDcuMS4xLjEuMS4xMS4kX2A7DQoJJFBJRCA9fiBzL1wifFxufFw8fFw+fFwmfFxbfFxdLy9nOw0KDQoJaWYgKCRQSUQgbmUgIiIgKSB7DQoJCSRyZXN1bHQgPSAnJzsNCgkJIyRyZXN1bHQgLj0gYHNubXBnZXQgLXYyYyAtYyAkY29tbXVuaXR5IC1PdnEgJHRhcmdldF9pcCBzeXNOYW1lLjBgIC4gJzsnOw0KCQkkcmVzdWx0IC49IGBzbm1wZ2V0IC12MmMgLWMgJGNvbW11bml0eSAtT3ZxICR0YXJnZXRfaXAgbWliLTIuNDcuMS4xLjEuMS43LiRfYCAuICc7JzsNCgkJIyRyZXN1bHQgLj0gYHNubXBnZXQgLXYyYyAtYyAkY29tbXVuaXR5IC1PdnEgJHRhcmdldF9pcCBtaWItMi40Ny4xLjEuMS4xLjIuJF9gIC4gJzsnOw0KCQkkcmVzdWx0IC49IGBzbm1wZ2V0IC12MmMgLWMgJGNvbW11bml0eSAtT3ZxICR0YXJnZXRfaXAgbWliLTIuNDcuMS4xLjEuMS4xMy4kX2AgLiAnOyc7DQoJCSRyZXN1bHQgLj0gYHNubXBnZXQgLXYyYyAtYyAkY29tbXVuaXR5IC1PdnEgJHRhcmdldF9pcCBtaWItMi40Ny4xLjEuMS4xLjExLiRfYDsNCgkJDQoJCSRyZXN1bHQgPX4gcy9cInxcbnxcPHxcPnxcJnxcW3xcXS8vZzsNCgkJcHJpbnQgJHJlc3VsdCAuICJcbiI7DQoJfQ0KfQ0KZXhpdCAwOw0K',0,2); @@ -331,11 +331,11 @@ INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `descri INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (29,1,'IP','IP address','','Interface;Address','',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (30,1,'Routes','Routes table','','Destination;Gateway;Mask;Flags;Metric;Use;Interface','',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (31,7,'Cisco Configuration','This script will collect a remote CISCO configuration','/usr/bin/perl','Configuration dump','IyEvdXNyL2Jpbi9wZXJsIAojCiMgKGMpIEFydGljYSAyMDE0CiMgVGhpcyBpcyBhbiBFbnRlcnByaXNlIGludmVudG9yeSBzY3JpcHQgZm9yIFBhbmRvcmEgRk1TIDUKIyBUaGlzIHNjcmlwdCB3aWxsIGNvbGxlY3QgYSByZW1vdGUgQ0lTQ08gY29uZmlndXJhdGlvbgojIFJFTUVNQkVSIFRPIEFDVElWQVRFIElUIEFTIEJMT0NLIE1PREUgISEhCgp1c2Ugd2FybmluZ3M7CnVzZSBzdHJpY3Q7CnVzZSBOZXQ6OlRlbG5ldDsKCm15ICR0YXJnZXQgPSAiIjsKbXkgJGxvZ2luX3Bhc3MgPSAiIjsKbXkgJGVuYWJsZV9wYXNzID0gIiI7Cm15ICRvdXRwdXRfZmlsZSA9ICIvdG1wL2Npc2NvIi4kJDsKbXkgJFRJTUVPVVQ9NTsKCiMgTG9hZCBjb25maWcgZmlsZSBmcm9tIGNvbW1hbmQgbGluZQppZiAoJCNBUkdWIDwgMiAgKXsKICAgICAgICBwcmludCAiSSBuZWVkIHNldmVyYWwgcGFyYW1ldGVycyBpbiB0aGlzIGZvcm1hdDogXG5cbiI7CglwcmludCAiICAgICAgZ2V0X2NvbmZpZy5wbCA8aXBfYWRkcmVzcz4gPGxvZ2luX3Bhc3M+IDxlbmFibGVfcGFzcz4gXG5cbiI7CiAgICAgICAgZXhpdDsKfQoKJHRhcmdldCA9ICRBUkdWWzBdOwokbG9naW5fcGFzcyA9ICRBUkdWWzFdOwokZW5hYmxlX3Bhc3MgPSAkQVJHVlsyXTsKCm15ICR0ZWxuZXQgPSBuZXcgTmV0OjpUZWxuZXQgKCBUaW1lb3V0PT4kVElNRU9VVCwgRXJybW9kZT0+J3JldHVybicpOyAKJHRlbG5ldC0+b3BlbigkdGFyZ2V0KTsgCiR0ZWxuZXQtPndhaXRmb3IoJy9QYXNzd29yZDovaScpOyAKJHRlbG5ldC0+cHJpbnQoJGxvZ2luX3Bhc3MpOyAKCiR0ZWxuZXQtPndhaXRmb3IoJy9cPiQvaScpOyAKJHRlbG5ldC0+cHJpbnQoJ2VuJyk7CiR0ZWxuZXQtPndhaXRmb3IoJy9QYXNzd29yZDovaScpOwokdGVsbmV0LT5wcmludCgkZW5hYmxlX3Bhc3MpOwokdGVsbmV0LT53YWl0Zm9yKCcvXCMvJyk7CiR0ZWxuZXQtPmNtZF9yZW1vdmVfbW9kZSgxKTsKCiR0ZWxuZXQtPnByaW50KCdzaG93IHJ1bm5pbmctY29uZmlnJyk7CgpteSAkZmggPSAkdGVsbmV0LT5pbnB1dF9sb2coJG91dHB1dF9maWxlKTsKbXkgJG91dHB1dCA9IDE7Cgp3aGlsZSAoZGVmaW5lZCgkb3V0cHV0KSl7Cgkkb3V0cHV0ID0gJHRlbG5ldC0+d2FpdGZvcignL01vcmUvaScpOyAKCSR0ZWxuZXQtPnByaW50KCIiKTsgCn0KCm15ICRidWZmZXIgPSAiIjsKCm9wZW4gT1VURiwgJG91dHB1dF9maWxlOwp3aGlsZSAoPE9VVEY+KSB7CgkkXyA9fiBzL1x4MDgvL2c7CgkkXyA9fiBzL1wtXC1Nb3JlXC1cLVtcdFxzXSovL2c7CgkkXyA9fiBzL1w7Ly9nOwoJJGJ1ZmZlciA9ICRidWZmZXIgLiAkXzsKfQpjbG9zZSAoT1VURik7Cgp1bmxpbmsgKCRvdXRwdXRfZmlsZSk7CnByaW50ICRidWZmZXI7Cg==',1,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (32,9,'Motherboard','This script retrieves the manufacturer,model and ID from the motherboard of a Windows system','/usr/bin/perl','Manufacturer;Model;ID','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9tb3RoZXJib2FyZC5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAxNSBCb3JqYSBTYW5jaGV6IDxmYm9yamEuc2FuY2hlekBhcnRpY2EuZXM+CiMgICAgICAgICAgIChjKSAyMDE1IEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIndtaWMiOwppZiAoc3lzdGVtKCIkd21pX2NsaWVudCA+IC9kZXYvbnVsbCAyPiYxIikgIT0gMjU2KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCSMgRHJvcCB0aGUgaGVhZGVyCglzaGlmdCAoQGxpbmVzKTsKCQkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoJCSMgQ2hlY2sgZm9yIGVycm9ycwoJCWlmICgkbGluZXNbJGldID1+IG0vXkVSUk9SLykgewoJCQlleGl0IDE7CgkJfQoKCQkjIEJsYWNrIGxpc3QKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL0ZpbGUgMS8pIHsKCQkJbmV4dDsKCQl9CgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSBAbW9kdWxlX2hlYWRlcnMgPSBAeyRfWzBdfTsKCW15IEBtb2R1bGVfdW5pdHMgICA9IEB7JF9bMV19OwoJbXkgQGRhdGEgICAgICAgICAgID0gQHskX1syXX07CglteSAkcmVzdWx0OwoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkkcmVzdWx0ID0gJyc7CgkJZm9yICgkaT0wOyAkaTxAbW9kdWxlX2hlYWRlcnM7JGkrKykgewoJCQlpZiAoZGVmaW5lZCAoJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSkpIHsKCQkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSAuICRtb2R1bGVfdW5pdHNbJGldIC4gJzsnOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdCAuPSAnOyc7CgkJCX0KCQl9CgkJY2hvcCgkcmVzdWx0KTsKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCAgPSBydW5fcXVlcnkoIlNFTEVDVCAqIEZST00gV2luMzJfY29tcHV0ZXJzeXN0ZW0iKTsKIyBSZW1lbWJlciB0byBtYXRjaCBsZW5naHQgb2YgYm90aCBhcnJheXMgaGVhZGVycyAmIHVuaXRzCm15IEBoZWFkZXJzID0gKCJNYW51ZmFjdHVyZXIiLCJNb2RlbCIsIk9FTVN0cmluZ0FycmF5Iik7Cm15IEB1bml0cyAgID0gKCIiLCIiLCIiKTsKcHJpbnRfbW9kdWxlZGF0YSAoXEBoZWFkZXJzLFxAdW5pdHMsIFxAcmVzdWx0KTsKZXhpdCAwOwo=',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (33,9,'Monitors','Retrieve all monitor info from a Windows system.','/usr/bin/perl','Model;ID','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9tb25pdG9ycy5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAxNSBCb3JqYSBTYW5jaGV6IDxmYm9yamEuc2FuY2hlekBhcnRpY2EuZXM+CiMgICAgICAgICAgIChjKSAyMDE1IEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIndtaWMiOwppZiAoc3lzdGVtKCIkd21pX2NsaWVudCA+IC9kZXYvbnVsbCAyPiYxIikgIT0gMjU2KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCSMgRHJvcCB0aGUgaGVhZGVyCglzaGlmdCAoQGxpbmVzKTsKCQkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoJCSMgQ2hlY2sgZm9yIGVycm9ycwoJCWlmICgkbGluZXNbJGldID1+IG0vXkVSUk9SLykgewoJCQlleGl0IDE7CgkJfQoKCQkjIEJsYWNrIGxpc3QKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL0ZpbGUgMS8pIHsKCQkJbmV4dDsKCQl9CgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSBAbW9kdWxlX2hlYWRlcnMgPSBAeyRfWzBdfTsKCW15IEBtb2R1bGVfdW5pdHMgICA9IEB7JF9bMV19OwoJbXkgQGRhdGEgICAgICAgICAgID0gQHskX1syXX07CglteSAkcmVzdWx0OwoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkkcmVzdWx0ID0gJyc7CgkJZm9yICgkaT0wOyAkaTxAbW9kdWxlX2hlYWRlcnM7JGkrKykgewoJCQlpZiAoZGVmaW5lZCAoJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSkpIHsKCQkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSAuICRtb2R1bGVfdW5pdHNbJGldIC4gJzsnOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdCAuPSAnOyc7CgkJCX0KCQl9CgkJY2hvcCgkcmVzdWx0KTsKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCAgPSBydW5fcXVlcnkoIlNFTEVDVCBOYW1lLFBOUERldmljZUlEIEZST00gV2luMzJfRGVza3RvcE1vbml0b3IiKTsKIyBSZW1lbWJlciB0byBtYXRjaCBsZW5naHQgb2YgYm90aCBhcnJheXMgaGVhZGVycyAmIHVuaXRzCm15IEBoZWFkZXJzID0gKCJOYW1lIiwiUE5QRGV2aWNlSUQiKTsKbXkgQHVuaXRzICAgPSAoIiIsIiIpOwpwcmludF9tb2R1bGVkYXRhIChcQGhlYWRlcnMsXEB1bml0cywgXEByZXN1bHQpOwpleGl0IDA7Cgo=',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (34,9,'Printers','Retrieve all printers of a Windows system','/usr/bin/perl','Name;Driver;Port','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9wcmludGVycy5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAxNSBCb3JqYSBTYW5jaGV6IDxmYm9yamEuc2FuY2hlekBhcnRpY2EuZXM+CiMgICAgICAgICAgIChjKSAyMDA4IEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIndtaWMiOwppZiAoc3lzdGVtKCIkd21pX2NsaWVudCA+IC9kZXYvbnVsbCAyPiYxIikgIT0gMjU2KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCSMgRHJvcCB0aGUgaGVhZGVyCglzaGlmdCAoQGxpbmVzKTsKCQkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoJCSMgQ2hlY2sgZm9yIGVycm9ycwoJCWlmICgkbGluZXNbJGldID1+IG0vXkVSUk9SLykgewoJCQlleGl0IDE7CgkJfQoKCQkjIEJsYWNrIGxpc3QKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL0ZpbGUgMS8pIHsKCQkJbmV4dDsKCQl9CgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSBAbW9kdWxlX2hlYWRlcnMgPSBAeyRfWzBdfTsKCW15IEBtb2R1bGVfdW5pdHMgICA9IEB7JF9bMV19OwoJbXkgQGRhdGEgICAgICAgICAgID0gQHskX1syXX07CglteSAkcmVzdWx0OwoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkkcmVzdWx0ID0gJyc7CgkJZm9yICgkaT0wOyAkaTxAbW9kdWxlX2hlYWRlcnM7JGkrKykgewoJCQlpZiAoZGVmaW5lZCAoJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSkpIHsKCQkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSAuICRtb2R1bGVfdW5pdHNbJGldIC4gJzsnOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdCAuPSAnOyc7CgkJCX0KCQl9CgkJY2hvcCgkcmVzdWx0KTsKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCAgPSBydW5fcXVlcnkoIlNFTEVDVCBDYXB0aW9uLERyaXZlck5hbWUsUG9ydE5hbWUgRlJPTSBXaW4zMl9wcmludGVyIik7CiMgUmVtZW1iZXIgdG8gbWF0Y2ggbGVuZ2h0IG9mIGJvdGggYXJyYXlzIGhlYWRlcnMgJiB1bml0cwpteSBAaGVhZGVycyA9ICgiQ2FwdGlvbiIsIkRyaXZlck5hbWUiLCJQb3J0TmFtZSIpOwpteSBAdW5pdHMgICA9ICgiIiwiIiwiIik7CnByaW50X21vZHVsZWRhdGEgKFxAaGVhZGVycyxcQHVuaXRzLCBcQHJlc3VsdCk7CmV4aXQgMDsK',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (35,9,'product_key','Retrieve the Windows product key','/usr/bin/perl','Key','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9wcm9kdWN0a2V5LnBsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQ29weXJpZ2h0IChjKSAyMDE1IEJvcmphIFNhbmNoZXosIDxmYm9yamEuc2FuY2hlekBhcnRpY2EuZXM+CiMgICAgICAgICAgIChjKSAyMDE1IEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIndtaWMiOwppZiAoc3lzdGVtKCIkd21pX2NsaWVudCA+IC9kZXYvbnVsbCAyPiYxIikgIT0gMjU2KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCSMgRHJvcCB0aGUgaGVhZGVyCglzaGlmdCAoQGxpbmVzKTsKCQkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoJCSMgQ2hlY2sgZm9yIGVycm9ycwoJCWlmICgkbGluZXNbJGldID1+IG0vXkVSUk9SLykgewoJCQlleGl0IDE7CgkJfQoKCQkjIEJsYWNrIGxpc3QKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL0ZpbGUgMS8pIHsKCQkJbmV4dDsKCQl9CgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSBAbW9kdWxlX2hlYWRlcnMgPSBAeyRfWzBdfTsKCW15IEBtb2R1bGVfdW5pdHMgICA9IEB7JF9bMV19OwoJbXkgQGRhdGEgICAgICAgICAgID0gQHskX1syXX07CglteSAkcmVzdWx0OwoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkkcmVzdWx0ID0gJyc7CgkJZm9yICgkaT0wOyAkaTxAbW9kdWxlX2hlYWRlcnM7JGkrKykgewoJCQlpZiAoZGVmaW5lZCAoJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSkpIHsKCQkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSAuICRtb2R1bGVfdW5pdHNbJGldIC4gJzsnOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdCAuPSAnOyc7CgkJCX0KCQl9CgkJY2hvcCgkcmVzdWx0KTsKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCAgPSBydW5fcXVlcnkoIlNlbGVjdCBPQTN4T3JpZ2luYWxQcm9kdWN0S2V5IGZyb20gU29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlIik7CiMgUmVtZW1iZXIgdG8gbWF0Y2ggbGVuZ2h0IG9mIGJvdGggYXJyYXlzIGhlYWRlcnMgJiB1bml0cwpteSBAaGVhZGVycyA9ICgiT0EzeE9yaWdpbmFsUHJvZHVjdEtleSIpOwpteSBAdW5pdHMgICA9ICgiIik7CnByaW50X21vZHVsZWRhdGEgKFxAaGVhZGVycyxcQHVuaXRzLCBcQHJlc3VsdCk7CmV4aXQgMDsK',0,2); -INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (36,9,'product_ID','Retrieve the Windows product ID','/usr/bin/perl','Key','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9wcm9kdWN0SUQucGwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDb3B5cmlnaHQgKGMpIDIwMTUgQm9yamEgU2FuY2hleiwgPGZib3JqYS5zYW5jaGV6QGFydGljYS5lcz4KIyAgICAgICAgICAgKGMpIDIwMTUgQXJ0aWNhIFNvbHVjaW9uZXMgVGVjbm9sb2dpY2FzIFMuTAojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiN1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBIVE1MOjpFbnRpdGllcyAoKTsKCiMgQ2hlY2sgZm9yIHdtaWMKbXkgJHdtaV9jbGllbnQgPSAid21pYyI7CmlmIChzeXN0ZW0oIiR3bWlfY2xpZW50ID4gL2Rldi9udWxsIDI+JjEiKSAhPSAyNTYpIHsKCXByaW50ICJbZXJyb3JdICR3bWlfY2xpZW50IG5vdCBmb3VuZC5cbiI7CglleGl0IDE7Cn0KCmlmICgkI0FSR1YgIT0gMikgewoJcHJpbnQgIlVzYWdlOiAkMCA8dGFyZ2V0IGlwPiA8dXNlcm5hbWU+IDxwYXNzd29yZD5cbiI7CglleGl0IDE7Cn0KCm15ICR0YXJnZXRfaXAgPSAkQVJHVlswXTsKbXkgJHVzZXJuYW1lID0gJEFSR1ZbMV07Cm15ICRwYXNzd29yZCA9ICRBUkdWWzJdOwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcnVuX3F1ZXJ5ICgkd3FsX3F1ZXJ5KQojIFJ1bnMgdGhlIGdpdmVuIFdRTCBxdWVyeSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuIGFycmF5IG9mIGhhc2hlcy4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIHJ1bl9xdWVyeSB7CglteSAkd3FsX3F1ZXJ5ID0gJF9bMF07CglteSBAcmVzdWx0ID0ge307CgoJJHdxbF9xdWVyeSA9fiAncy8iL1wnL2cnOwoKCSMgUnVuIHRoZSBEQ09NL1dNSSBjbGllbnQKCW15ICRvdXRwdXQgPSBgJHdtaV9jbGllbnQgLVUgJyR1c2VybmFtZSclJyRwYXNzd29yZCcgLy8kdGFyZ2V0X2lwIFwiJHdxbF9xdWVyeVwiIDI+L2Rldi9udWxsYDsKCglteSBAbGluZXMgPSBzcGxpdCgvXG4vLCAkb3V0cHV0KTsKCSMgSGVhZGVyLCBkZXNjcmlwdGlvbiwgcmVzdWx0cwoJaWYgKCQjbGluZXMgPCAyKSB7CgkJZXhpdCAxOwoJfQoJIyBEcm9wIHRoZSBoZWFkZXIKCXNoaWZ0IChAbGluZXMpOwoJCQoJIyBHZXQgY29sdW1uIG5hbWVzCglteSBAY29sdW1uX25hbWVzID0gc3BsaXQoL1x8Lywgc2hpZnQgKEBsaW5lcykpOwoKCSMgR2V0IHJvdyBkYXRhCglteSAkaWR4ID0gMDsKCWZvciAobXkgJGkgPSAwOyAkaSA8PSAkI2xpbmVzOyAkaSsrKSB7CgkJIyBDaGVjayBmb3IgZXJyb3JzCgkJaWYgKCRsaW5lc1skaV0gPX4gbS9eRVJST1IvKSB7CgkJCWV4aXQgMTsKCQl9CgoJCSMgQmxhY2sgbGlzdAoJCWlmICgkbGluZXNbJGldID1+IG0vRmlsZSAxLykgewoJCQluZXh0OwoJCX0KCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsIAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKCW15IEBtb2R1bGVfaGVhZGVycyA9IEB7JF9bMF19OwoJbXkgQG1vZHVsZV91bml0cyAgID0gQHskX1sxXX07CglteSBAZGF0YSAgICAgICAgICAgPSBAeyRfWzJdfTsKCW15ICRyZXN1bHQ7Cglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCSRyZXN1bHQgPSAnJzsKCQlmb3IgKCRpPTA7ICRpPEBtb2R1bGVfaGVhZGVyczskaSsrKSB7CgkJCWlmIChkZWZpbmVkICgkZWxlbWVudC0+eyRtb2R1bGVfaGVhZGVyc1skaV19KSkgewoJCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaGVhZGVyc1skaV19IC4gJG1vZHVsZV91bml0c1skaV0gLiAnOyc7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0IC49ICc7JzsKCQkJfQoJCX0KCQljaG9wKCRyZXN1bHQpOwoJCXByaW50ICRyZXN1bHQgLiAiXG4iOwkKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSBAcmVzdWx0ICA9IHJ1bl9xdWVyeSgiU2VsZWN0IFNlcmlhbE51bWJlciBmcm9tIFdpbjMyX09wZXJhdGluZ1N5c3RlbSIpOwojIFJlbWVtYmVyIHRvIG1hdGNoIGxlbmdodCBvZiBib3RoIGFycmF5cyBoZWFkZXJzICYgdW5pdHMKbXkgQGhlYWRlcnMgPSAoIlNlcmlhbE51bWJlciIpOwpteSBAdW5pdHMgICA9ICgiIik7CnByaW50X21vZHVsZWRhdGEgKFxAaGVhZGVycyxcQHVuaXRzLCBcQHJlc3VsdCk7CmV4aXQgMDsKCg==',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (32,9,'Motherboard','This script retrieves the manufacturer,model and ID from the motherboard of a Windows system','/usr/bin/perl','Manufacturer;Model;ID','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9tb3RoZXJib2FyZC5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAxNSBCb3JqYSBTYW5jaGV6IDxmYm9yamEuc2FuY2hlekBhcnRpY2EuZXM+CiMgICAgICAgICAgIChjKSAyMDE1IEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIi91c3IvYmluL3BhbmRvcmF3bWljIjsKdW5sZXNzKC1lICR3bWlfY2xpZW50KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCSMgRHJvcCB0aGUgaGVhZGVyCglzaGlmdCAoQGxpbmVzKTsKCQkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoJCSMgQ2hlY2sgZm9yIGVycm9ycwoJCWlmICgkbGluZXNbJGldID1+IG0vXkVSUk9SLykgewoJCQlleGl0IDE7CgkJfQoKCQkjIEJsYWNrIGxpc3QKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL0ZpbGUgMS8pIHsKCQkJbmV4dDsKCQl9CgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSBAbW9kdWxlX2hlYWRlcnMgPSBAeyRfWzBdfTsKCW15IEBtb2R1bGVfdW5pdHMgICA9IEB7JF9bMV19OwoJbXkgQGRhdGEgICAgICAgICAgID0gQHskX1syXX07CglteSAkcmVzdWx0OwoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkkcmVzdWx0ID0gJyc7CgkJZm9yICgkaT0wOyAkaTxAbW9kdWxlX2hlYWRlcnM7JGkrKykgewoJCQlpZiAoZGVmaW5lZCAoJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSkpIHsKCQkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSAuICRtb2R1bGVfdW5pdHNbJGldIC4gJzsnOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdCAuPSAnOyc7CgkJCX0KCQl9CgkJY2hvcCgkcmVzdWx0KTsKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCAgPSBydW5fcXVlcnkoIlNFTEVDVCAqIEZST00gV2luMzJfY29tcHV0ZXJzeXN0ZW0iKTsKIyBSZW1lbWJlciB0byBtYXRjaCBsZW5naHQgb2YgYm90aCBhcnJheXMgaGVhZGVycyAmIHVuaXRzCm15IEBoZWFkZXJzID0gKCJNYW51ZmFjdHVyZXIiLCJNb2RlbCIsIk9FTVN0cmluZ0FycmF5Iik7Cm15IEB1bml0cyAgID0gKCIiLCIiLCIiKTsKcHJpbnRfbW9kdWxlZGF0YSAoXEBoZWFkZXJzLFxAdW5pdHMsIFxAcmVzdWx0KTsKZXhpdCAwOwo=',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (33,9,'Monitors','Retrieve all monitor info from a Windows system.','/usr/bin/perl','Model;ID','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9tb25pdG9ycy5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAxNSBCb3JqYSBTYW5jaGV6IDxmYm9yamEuc2FuY2hlekBhcnRpY2EuZXM+CiMgICAgICAgICAgIChjKSAyMDE1IEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIi91c3IvYmluL3BhbmRvcmF3bWljIjsKdW5sZXNzKC1lICR3bWlfY2xpZW50KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCSMgRHJvcCB0aGUgaGVhZGVyCglzaGlmdCAoQGxpbmVzKTsKCQkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoJCSMgQ2hlY2sgZm9yIGVycm9ycwoJCWlmICgkbGluZXNbJGldID1+IG0vXkVSUk9SLykgewoJCQlleGl0IDE7CgkJfQoKCQkjIEJsYWNrIGxpc3QKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL0ZpbGUgMS8pIHsKCQkJbmV4dDsKCQl9CgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSBAbW9kdWxlX2hlYWRlcnMgPSBAeyRfWzBdfTsKCW15IEBtb2R1bGVfdW5pdHMgICA9IEB7JF9bMV19OwoJbXkgQGRhdGEgICAgICAgICAgID0gQHskX1syXX07CglteSAkcmVzdWx0OwoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkkcmVzdWx0ID0gJyc7CgkJZm9yICgkaT0wOyAkaTxAbW9kdWxlX2hlYWRlcnM7JGkrKykgewoJCQlpZiAoZGVmaW5lZCAoJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSkpIHsKCQkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSAuICRtb2R1bGVfdW5pdHNbJGldIC4gJzsnOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdCAuPSAnOyc7CgkJCX0KCQl9CgkJY2hvcCgkcmVzdWx0KTsKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCAgPSBydW5fcXVlcnkoIlNFTEVDVCBOYW1lLFBOUERldmljZUlEIEZST00gV2luMzJfRGVza3RvcE1vbml0b3IiKTsKIyBSZW1lbWJlciB0byBtYXRjaCBsZW5naHQgb2YgYm90aCBhcnJheXMgaGVhZGVycyAmIHVuaXRzCm15IEBoZWFkZXJzID0gKCJOYW1lIiwiUE5QRGV2aWNlSUQiKTsKbXkgQHVuaXRzICAgPSAoIiIsIiIpOwpwcmludF9tb2R1bGVkYXRhIChcQGhlYWRlcnMsXEB1bml0cywgXEByZXN1bHQpOwpleGl0IDA7',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (34,9,'Printers','Retrieve all printers of a Windows system','/usr/bin/perl','Name;Driver;Port','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9wcmludGVycy5wbAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvcHlyaWdodCAoYykgMjAxNSBCb3JqYSBTYW5jaGV6IDxmYm9yamEuc2FuY2hlekBhcnRpY2EuZXM+CiMgICAgICAgICAgIChjKSAyMDA4IEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIi91c3IvYmluL3BhbmRvcmF3bWljIjsKdW5sZXNzKC1lICR3bWlfY2xpZW50KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCSMgRHJvcCB0aGUgaGVhZGVyCglzaGlmdCAoQGxpbmVzKTsKCQkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoJCSMgQ2hlY2sgZm9yIGVycm9ycwoJCWlmICgkbGluZXNbJGldID1+IG0vXkVSUk9SLykgewoJCQlleGl0IDE7CgkJfQoKCQkjIEJsYWNrIGxpc3QKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL0ZpbGUgMS8pIHsKCQkJbmV4dDsKCQl9CgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSBAbW9kdWxlX2hlYWRlcnMgPSBAeyRfWzBdfTsKCW15IEBtb2R1bGVfdW5pdHMgICA9IEB7JF9bMV19OwoJbXkgQGRhdGEgICAgICAgICAgID0gQHskX1syXX07CglteSAkcmVzdWx0OwoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkkcmVzdWx0ID0gJyc7CgkJZm9yICgkaT0wOyAkaTxAbW9kdWxlX2hlYWRlcnM7JGkrKykgewoJCQlpZiAoZGVmaW5lZCAoJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSkpIHsKCQkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSAuICRtb2R1bGVfdW5pdHNbJGldIC4gJzsnOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdCAuPSAnOyc7CgkJCX0KCQl9CgkJY2hvcCgkcmVzdWx0KTsKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCAgPSBydW5fcXVlcnkoIlNFTEVDVCBDYXB0aW9uLERyaXZlck5hbWUsUG9ydE5hbWUgRlJPTSBXaW4zMl9wcmludGVyIik7CiMgUmVtZW1iZXIgdG8gbWF0Y2ggbGVuZ2h0IG9mIGJvdGggYXJyYXlzIGhlYWRlcnMgJiB1bml0cwpteSBAaGVhZGVycyA9ICgiQ2FwdGlvbiIsIkRyaXZlck5hbWUiLCJQb3J0TmFtZSIpOwpteSBAdW5pdHMgICA9ICgiIiwiIiwiIik7CnByaW50X21vZHVsZWRhdGEgKFxAaGVhZGVycyxcQHVuaXRzLCBcQHJlc3VsdCk7CmV4aXQgMDsK',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (35,9,'product_key','Retrieve the Windows product key','/usr/bin/perl','Key','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9wcm9kdWN0a2V5LnBsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQ29weXJpZ2h0IChjKSAyMDE1IEJvcmphIFNhbmNoZXosIDxmYm9yamEuc2FuY2hlekBhcnRpY2EuZXM+CiMgICAgICAgICAgIChjKSAyMDE1IEFydGljYSBTb2x1Y2lvbmVzIFRlY25vbG9naWNhcyBTLkwKIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgSFRNTDo6RW50aXRpZXMgKCk7CgojIENoZWNrIGZvciB3bWljCm15ICR3bWlfY2xpZW50ID0gIi91c3IvYmluL3BhbmRvcmF3bWljIjsKdW5sZXNzKC1lICR3bWlfY2xpZW50KSB7CglwcmludCAiW2Vycm9yXSAkd21pX2NsaWVudCBub3QgZm91bmQuXG4iOwoJZXhpdCAxOwp9CgppZiAoJCNBUkdWICE9IDIpIHsKCXByaW50ICJVc2FnZTogJDAgPHRhcmdldCBpcD4gPHVzZXJuYW1lPiA8cGFzc3dvcmQ+XG4iOwoJZXhpdCAxOwp9CgpteSAkdGFyZ2V0X2lwID0gJEFSR1ZbMF07Cm15ICR1c2VybmFtZSA9ICRBUkdWWzFdOwpteSAkcGFzc3dvcmQgPSAkQVJHVlsyXTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHJ1bl9xdWVyeSAoJHdxbF9xdWVyeSkKIyBSdW5zIHRoZSBnaXZlbiBXUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBhcnJheSBvZiBoYXNoZXMuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBydW5fcXVlcnkgewoJbXkgJHdxbF9xdWVyeSA9ICRfWzBdOwoJbXkgQHJlc3VsdCA9IHt9OwoKCSR3cWxfcXVlcnkgPX4gJ3MvIi9cJy9nJzsKCgkjIFJ1biB0aGUgRENPTS9XTUkgY2xpZW50CglteSAkb3V0cHV0ID0gYCR3bWlfY2xpZW50IC1VICckdXNlcm5hbWUnJSckcGFzc3dvcmQnIC8vJHRhcmdldF9pcCBcIiR3cWxfcXVlcnlcIiAyPi9kZXYvbnVsbGA7CgoJbXkgQGxpbmVzID0gc3BsaXQoL1xuLywgJG91dHB1dCk7CgkjIEhlYWRlciwgZGVzY3JpcHRpb24sIHJlc3VsdHMKCWlmICgkI2xpbmVzIDwgMikgewoJCWV4aXQgMTsKCX0KCSMgRHJvcCB0aGUgaGVhZGVyCglzaGlmdCAoQGxpbmVzKTsKCQkKCSMgR2V0IGNvbHVtbiBuYW1lcwoJbXkgQGNvbHVtbl9uYW1lcyA9IHNwbGl0KC9cfC8sIHNoaWZ0IChAbGluZXMpKTsKCgkjIEdldCByb3cgZGF0YQoJbXkgJGlkeCA9IDA7Cglmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNsaW5lczsgJGkrKykgewoJCSMgQ2hlY2sgZm9yIGVycm9ycwoJCWlmICgkbGluZXNbJGldID1+IG0vXkVSUk9SLykgewoJCQlleGl0IDE7CgkJfQoKCQkjIEJsYWNrIGxpc3QKCQlpZiAoJGxpbmVzWyRpXSA9fiBtL0ZpbGUgMS8pIHsKCQkJbmV4dDsKCQl9CgkJbXkgQGNvbHVtbiA9IHNwbGl0KC9cfC8sICRsaW5lc1skaV0pOwoJCWZvciAobXkgJGogPSAwOyAkaiA8PSAkI2NvbHVtbl9uYW1lczsgJGorKykgewoJCQlpZiAoISBkZWZpbmVkKCRjb2x1bW5bJGpdKSkgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICIiOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdFskaWR4XS0+eyRjb2x1bW5fbmFtZXNbJGpdfSA9ICRjb2x1bW5bJGpdOwoJCQl9CgkJfQoJCQoJCSRpZHgrKzsKCX0KCQoJcmV0dXJuIEByZXN1bHQ7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU1VCIHByaW50X21vZHVsZWRhdGEgKCRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhLCAKIyAkbW9kdWxlX2Rlc2NyaXB0aW9uLCBAZGF0YSkKIyBQcmludHMgYSBtb2R1bGVkYXRhIFhNTCB0YWcuICRtb2R1bGVfaXRlbSwgJG1vZHVsZV9kYXRhIGFuZAojICRtb2R1bGVfZGVzY3JpcHRpb24gYXJlIHVzZWQgdG8gaW5kZXggdGhlIGl0ZW0sIGRhdGEgYW5kIGRlc2NyaXB0aW9uCiMgWE1MIHRhZ3MgcmVzcGVjdGl2ZWx5LgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpzdWIgcHJpbnRfbW9kdWxlZGF0YSB7CglteSBAbW9kdWxlX2hlYWRlcnMgPSBAeyRfWzBdfTsKCW15IEBtb2R1bGVfdW5pdHMgICA9IEB7JF9bMV19OwoJbXkgQGRhdGEgICAgICAgICAgID0gQHskX1syXX07CglteSAkcmVzdWx0OwoJZm9yZWFjaCBteSAkZWxlbWVudCAoQGRhdGEpIHsKCQkkcmVzdWx0ID0gJyc7CgkJZm9yICgkaT0wOyAkaTxAbW9kdWxlX2hlYWRlcnM7JGkrKykgewoJCQlpZiAoZGVmaW5lZCAoJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSkpIHsKCQkJCSRyZXN1bHQgLj0gJGVsZW1lbnQtPnskbW9kdWxlX2hlYWRlcnNbJGldfSAuICRtb2R1bGVfdW5pdHNbJGldIC4gJzsnOwoJCQl9CgkJCWVsc2UgewoJCQkJJHJlc3VsdCAuPSAnOyc7CgkJCX0KCQl9CgkJY2hvcCgkcmVzdWx0KTsKCQlwcmludCAkcmVzdWx0IC4gIlxuIjsJCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgQHJlc3VsdCAgPSBydW5fcXVlcnkoIlNlbGVjdCBPQTN4T3JpZ2luYWxQcm9kdWN0S2V5IGZyb20gU29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlIik7CiMgUmVtZW1iZXIgdG8gbWF0Y2ggbGVuZ2h0IG9mIGJvdGggYXJyYXlzIGhlYWRlcnMgJiB1bml0cwpteSBAaGVhZGVycyA9ICgiT0EzeE9yaWdpbmFsUHJvZHVjdEtleSIpOwpteSBAdW5pdHMgICA9ICgiIik7CnByaW50X21vZHVsZWRhdGEgKFxAaGVhZGVycyxcQHVuaXRzLCBcQHJlc3VsdCk7CmV4aXQgMDsK',0,2); +INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (36,9,'product_ID','Retrieve the Windows product ID','/usr/bin/perl','Key','IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcGFuZG9yYV9wcm9kdWN0SUQucGwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBDb3B5cmlnaHQgKGMpIDIwMTUgQm9yamEgU2FuY2hleiwgPGZib3JqYS5zYW5jaGV6QGFydGljYS5lcz4KIyAgICAgICAgICAgKGMpIDIwMTUgQXJ0aWNhIFNvbHVjaW9uZXMgVGVjbm9sb2dpY2FzIFMuTAojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiN1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBIVE1MOjpFbnRpdGllcyAoKTsKCiMgQ2hlY2sgZm9yIHdtaWMKbXkgJHdtaV9jbGllbnQgPSAiL3Vzci9iaW4vcGFuZG9yYXdtaWMiOwp1bmxlc3MoLWUgJHdtaV9jbGllbnQpIHsKCXByaW50ICJbZXJyb3JdICR3bWlfY2xpZW50IG5vdCBmb3VuZC5cbiI7CglleGl0IDE7Cn0KCmlmICgkI0FSR1YgIT0gMikgewoJcHJpbnQgIlVzYWdlOiAkMCA8dGFyZ2V0IGlwPiA8dXNlcm5hbWU+IDxwYXNzd29yZD5cbiI7CglleGl0IDE7Cn0KCm15ICR0YXJnZXRfaXAgPSAkQVJHVlswXTsKbXkgJHVzZXJuYW1lID0gJEFSR1ZbMV07Cm15ICRwYXNzd29yZCA9ICRBUkdWWzJdOwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcnVuX3F1ZXJ5ICgkd3FsX3F1ZXJ5KQojIFJ1bnMgdGhlIGdpdmVuIFdRTCBxdWVyeSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuIGFycmF5IG9mIGhhc2hlcy4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc3ViIHJ1bl9xdWVyeSB7CglteSAkd3FsX3F1ZXJ5ID0gJF9bMF07CglteSBAcmVzdWx0ID0ge307CgoJJHdxbF9xdWVyeSA9fiAncy8iL1wnL2cnOwoKCSMgUnVuIHRoZSBEQ09NL1dNSSBjbGllbnQKCW15ICRvdXRwdXQgPSBgJHdtaV9jbGllbnQgLVUgJyR1c2VybmFtZSclJyRwYXNzd29yZCcgLy8kdGFyZ2V0X2lwIFwiJHdxbF9xdWVyeVwiIDI+L2Rldi9udWxsYDsKCglteSBAbGluZXMgPSBzcGxpdCgvXG4vLCAkb3V0cHV0KTsKCSMgSGVhZGVyLCBkZXNjcmlwdGlvbiwgcmVzdWx0cwoJaWYgKCQjbGluZXMgPCAyKSB7CgkJZXhpdCAxOwoJfQoJIyBEcm9wIHRoZSBoZWFkZXIKCXNoaWZ0IChAbGluZXMpOwoJCQoJIyBHZXQgY29sdW1uIG5hbWVzCglteSBAY29sdW1uX25hbWVzID0gc3BsaXQoL1x8Lywgc2hpZnQgKEBsaW5lcykpOwoKCSMgR2V0IHJvdyBkYXRhCglteSAkaWR4ID0gMDsKCWZvciAobXkgJGkgPSAwOyAkaSA8PSAkI2xpbmVzOyAkaSsrKSB7CgkJIyBDaGVjayBmb3IgZXJyb3JzCgkJaWYgKCRsaW5lc1skaV0gPX4gbS9eRVJST1IvKSB7CgkJCWV4aXQgMTsKCQl9CgoJCSMgQmxhY2sgbGlzdAoJCWlmICgkbGluZXNbJGldID1+IG0vRmlsZSAxLykgewoJCQluZXh0OwoJCX0KCQlteSBAY29sdW1uID0gc3BsaXQoL1x8LywgJGxpbmVzWyRpXSk7CgkJZm9yIChteSAkaiA9IDA7ICRqIDw9ICQjY29sdW1uX25hbWVzOyAkaisrKSB7CgkJCWlmICghIGRlZmluZWQoJGNvbHVtblskal0pKSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gIiI7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0WyRpZHhdLT57JGNvbHVtbl9uYW1lc1skal19ID0gJGNvbHVtblskal07CgkJCX0KCQl9CgkJCgkJJGlkeCsrOwoJfQoJCglyZXR1cm4gQHJlc3VsdDsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTVUIgcHJpbnRfbW9kdWxlZGF0YSAoJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEsIAojICRtb2R1bGVfZGVzY3JpcHRpb24sIEBkYXRhKQojIFByaW50cyBhIG1vZHVsZWRhdGEgWE1MIHRhZy4gJG1vZHVsZV9pdGVtLCAkbW9kdWxlX2RhdGEgYW5kCiMgJG1vZHVsZV9kZXNjcmlwdGlvbiBhcmUgdXNlZCB0byBpbmRleCB0aGUgaXRlbSwgZGF0YSBhbmQgZGVzY3JpcHRpb24KIyBYTUwgdGFncyByZXNwZWN0aXZlbHkuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnN1YiBwcmludF9tb2R1bGVkYXRhIHsKCW15IEBtb2R1bGVfaGVhZGVycyA9IEB7JF9bMF19OwoJbXkgQG1vZHVsZV91bml0cyAgID0gQHskX1sxXX07CglteSBAZGF0YSAgICAgICAgICAgPSBAeyRfWzJdfTsKCW15ICRyZXN1bHQ7Cglmb3JlYWNoIG15ICRlbGVtZW50IChAZGF0YSkgewoJCSRyZXN1bHQgPSAnJzsKCQlmb3IgKCRpPTA7ICRpPEBtb2R1bGVfaGVhZGVyczskaSsrKSB7CgkJCWlmIChkZWZpbmVkICgkZWxlbWVudC0+eyRtb2R1bGVfaGVhZGVyc1skaV19KSkgewoJCQkJJHJlc3VsdCAuPSAkZWxlbWVudC0+eyRtb2R1bGVfaGVhZGVyc1skaV19IC4gJG1vZHVsZV91bml0c1skaV0gLiAnOyc7CgkJCX0KCQkJZWxzZSB7CgkJCQkkcmVzdWx0IC49ICc7JzsKCQkJfQoJCX0KCQljaG9wKCRyZXN1bHQpOwoJCXByaW50ICRyZXN1bHQgLiAiXG4iOwkKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWluCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSBAcmVzdWx0ICA9IHJ1bl9xdWVyeSgiU2VsZWN0IFNlcmlhbE51bWJlciBmcm9tIFdpbjMyX09wZXJhdGluZ1N5c3RlbSIpOwojIFJlbWVtYmVyIHRvIG1hdGNoIGxlbmdodCBvZiBib3RoIGFycmF5cyBoZWFkZXJzICYgdW5pdHMKbXkgQGhlYWRlcnMgPSAoIlNlcmlhbE51bWJlciIpOwpteSBAdW5pdHMgICA9ICgiIik7CnByaW50X21vZHVsZWRhdGEgKFxAaGVhZGVycyxcQHVuaXRzLCBcQHJlc3VsdCk7CmV4aXQgMDsKCg==',0,2); -- Categoria field is used to segregate several types -- (plugin, agents, network) on their data @@ -344,8 +344,8 @@ INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `descri -- -- Dumping data for table `tusuario` -- -INSERT INTO `tusuario` (`id_user`, `fullname`, `firstname`, `lastname`, `middlename`, `password`, `comments`, `last_connect`, `registered`, `email`, `phone`, `is_admin`, `language`, `block_size`, `section`, `data_section`, `metaconsole_access`) VALUES -('admin', 'Pandora', 'Pandora', 'Admin', '', '1da7ee7d45b96d0e1f45ee4ee23da560', 'Admin Pandora', 1232642121, 0, 'admin@example.com', '555-555-5555', 1, 'default', 0, 'Default', '', 'advanced'); +INSERT INTO `tusuario` (`id_user`, `fullname`, `firstname`, `lastname`, `middlename`, `password`, `comments`, `last_connect`, `registered`, `email`, `phone`, `is_admin`, `language`, `block_size`, `section`, `data_section`, `metaconsole_access`, `local_user`, `api_token`) VALUES +('admin', 'Pandora', 'Pandora', 'Admin', '', '$2y$10$Wv/xoxjI2VAkthJhk/PzeeGIhBKYU/K.TMgUdmW7fEP2NQkdWlB9K', 'Admin Pandora', 1232642121, 0, 'admin@example.com', '555-555-5555', 1, 'default', 0, 'Default', '', 'advanced', 1, 'pandora1234'); -- -- Dumping data for table `tusuario_perfil` @@ -1189,7 +1189,7 @@ INSERT INTO `tplugin` (`id`, `name`, `description`, `max_timeout`, `execute`, `p INSERT INTO `tplugin` (`id`, `name`, `description`, `max_timeout`, `max_retries`, `execute`, `net_dst_opt`, `net_port_opt`, `user_opt`, `pass_opt`, `plugin_type`, `macros`, `parameters`, `no_delete`) VALUES (9,'Packet Loss','Checks for dropped packages after X seconds of testing. It returns % of dropped packets. It uses ping flood mode to launch 50 consecutive pings to a remote destination. On local, stable networks, value should be 0. ',30,0,'/usr/share/pandora_server/util/plugin/packet_loss.sh','','','','',0,'{\"1\":{\"macro\":\"_field1_\",\"desc\":\"Test time\",\"help\":\"\",\"value\":\"8\",\"hide\":\"\"},\"2\":{\"macro\":\"_field2_\",\"desc\":\"Target IP\",\"help\":\"\",\"value\":\"\",\"hide\":\"\"}}','_field1_ _field2_', 1); -INSERT INTO `tagent_custom_fields` VALUES (1,'Serial Number',0,0,''),(2,'Department',0,0,''),(3,'Additional ID',0,0,''),(4,'eHorusID',0,0,''); +INSERT INTO `tagent_custom_fields` VALUES (1,'Serial Number',0,0,'',0),(2,'Department',0,0,'',0),(3,'Additional ID',0,0,'',0),(4,'eHorusID',0,0,'',0); INSERT INTO `ttag` VALUES (1,'network','Network equipment','http://artica.es','','',''),(2,'critical','Critical modules','','','',''),(3,'dmz','DMZ Network Zone','','','',''),(4,'performance','Performance anda capacity modules','','','',''),(5,'configuration','','','','',''); @@ -1329,276 +1329,6 @@ INSERT INTO `tnotification_source_user` (`id_source`, `id_user`, `enabled`, `als UPDATE `tnotification_source` SET `enabled`=1 WHERE `description` = 'System status' OR `description` = 'Official communication'; - --- --- Dumping data for table `tlayout` --- -INSERT INTO `tlayout` -VALUES - (1, 'Demo visual console', 0, 'fondo.jpg', 1080, 1920, 'white', 0, 0, null), - (2,'Demo visual console 2',0,'fondo-keep-alive.jpg',1080,1920,'#FFF',0, 0, null), - (3,'Worldmap',0,'map_world.jpg',1080,1920,'white',0, 0, null), - (4,'Europe',0,'map_europe_1.jpg',1080,1920,'white',0, 0, null), - (5,'USA',0,'map_USA.jpg',1080,1920,'white',0, 0, null), - (6,'Spain',0,'map_spain.jpg',1080,1920,'white',0, 0, null), - (7,'Madrid',0,'map_madrid.jpg',1080,1920,'white',0, 0, null), - (8,'Germany',0,'map_germany_1.jpg',1080,1920,'white',0, 0, null), - (9,'France',0,'map_france.jpg',1080,1920,'white',0, 0, null), - (10,'Catalonia',0,'map_catalonia.jpg',1080,1920,'white',0, 0, null), - (11,'Basque Country',0,'map_basque-country.jpg',1080,1920,'white',0, 0, null), - (12,'Andalusia',0,'map_andalusia.jpg',1080,1920,'white',0, 0, null) -; - --- --- Dumping data for table `tlayout_data` --- -INSERT INTO `tlayout_data` VALUES - (1,1,998,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (2,1,998,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (3,1,1016,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (4,1,1016,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (5,1,1034,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (6,1,1034,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (7,1,1052,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (8,1,1052,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (9,1,1070,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (10,1,1070,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (11,1,1088,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (12,1,1088,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (13,1,1106,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (14,1,1106,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (15,1,1124,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (16,1,1124,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (17,1,1142,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (18,1,1142,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (19,1,1160,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (20,1,1160,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (21,1,1178,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (22,1,1178,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (23,1,1196,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (24,1,1196,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (25,1,1214,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (26,1,1214,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (27,1,1232,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (28,1,1232,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (29,1,1250,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (30,1,1250,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (31,1,1268,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (32,1,1268,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (33,1,1286,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (34,1,1286,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (35,1,1286,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (36,1,1304,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (37,1,1304,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (38,1,1322,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (39,1,1322,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (40,1,1340,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (41,1,1507,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (42,1,1536,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (43,1,1568,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (44,1,1599,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (45,1,1627,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (46,1,1656,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (47,1,1685,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (48,1,1714,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (49,1,1743,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (50,1,1772,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (51,1,1449,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (52,1,1800,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (53,1,1413,243,205,426,'','rack_frame',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (54,1,962,381,73,408,'','rack_firewall',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (55,1,962,454,73,408,'','rack_pdu',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (56,1,530,732,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (57,1,962,233,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (58,1,962,307,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (59,1,530,658,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (60,1,530,350,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (61,1,530,204,73,408,'','rack_psa',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (62,1,530,277,73,408,'','rack_pdu',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (63,1,530,585,73,408,'','rack_firewall',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (64,1,530,424,161,411,'','rack_double_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (65,1,1426,448,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (66,1,1495,540,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (67,1,1423,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (68,1,1463,540,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (69,1,1433,540,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (70,1,74,733,73,408,'','rack_pdu',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (71,1,1098,701,80,18,'','rack_hard_disk',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (72,1,1148,701,80,18,'','rack_hard_disk',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (73,1,1340,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (74,1,1358,783,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (75,1,1358,699,80,18,'','rack_hard_disk_2',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (76,1,1143,783,80,18,'','rack_hard_disk',0,3600,9,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (77,1,962,682,205,426,'','rack_frame',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (78,1,1522,540,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (79,1,1419,521,205,426,'','rack_frame',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (80,1,74,278,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (81,1,74,572,161,411,'','rack_double_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (82,1,1418,729,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (83,1,962,527,73,408,'','rack_switch',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (84,1,74,352,73,408,'','rack_router',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (85,1,962,600,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (86,1,530,806,73,408,'','rack_firewall',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (87,1,74,425,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (88,1,74,499,73,408,'','rack_switch',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (89,1,74,806,73,408,'','rack_psa',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (90,1,74,204,74,413,'','rack_server',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (91,1,1424,806,73,408,'','rack_firewall',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (92,1,1486,907,0,0,'<p style="text-align: center; overflow: hidden;"><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;"><strong><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;">Office 8 -&nbsp;</span></strong></span><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;">Rack 2</span></p>','white',4,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (93,1,1048,889,58,281,'<p style="text-align: center; overflow: hidden;"><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;"><strong><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;">Office 8 -&nbsp;</span></strong></span><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;">Rack 1</span></p>','white',4,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (94,1,580,904,0,0,'<p style="text-align: center; overflow: hidden;"><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;"><strong><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;">Office 7 -&nbsp;</span></strong></span><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;">Rack 2</span></p>','white',4,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (95,1,132,907,0,0,'<p style="text-align: center; overflow: hidden;"><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;"><strong><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;">Office 7 -&nbsp;</span></strong></span><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;">Rack 1</span></p>','white',4,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (96,1,733,20,0,0,'<p style="overflow: hidden;"><span class="visual_font_size_48pt"><strong><span style="color: #ffffff; font-family: opensans;">OFFICE RACKS</span></strong></span></p>','white',4,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (97,1,1479,260,174,29,'','rack_server_rack',0,3600,1,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,60,''), - (98,2,709,103,0,400,'','white',19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','timedate','Europe/Madrid',0,0,''), - (99,2,178,481,111,111,'','status',0,3600,11556,430,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (100,2,542,481,111,111,'','status',0,3600,13,2,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (101,2,905,481,111,111,'','status',0,3600,114,11,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (102,2,1276,481,111,111,'','status',0,3600,7,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (103,2,1631,482,111,111,'','status',0,3600,11547,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (104,2,157,393,0,0,'

Backups

\n

 

','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (105,2,512,382,96,172,'<p style="overflow: hidden;"><span class="visual_font_size_28pt" style="font-family: opensans; color: #ffffff;">DB Status</span></p> <p style="overflow: hidden;">&nbsp;</p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (106,2,886,382,0,0,'

Disk slave

\n

 

','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (107,2,1251,382,0,0,'

Disk /var

\n

 

','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (108,2,1547,382,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_28pt" style="color: #ffffff; font-family: opensans;">Authentification</span></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (109,2,126,820,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_36pt" style="font-family: opensans; color: #ffffff;">Processing</span></strong></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (110,2,755,820,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_36pt" style="font-family: opensans; color: #ffffff;">Network</span></strong></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (111,2,1281,820,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_36pt" style="color: #ffffff; font-family: opensans;">Storage</span></strong></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (113,3,851,932,0,0,'','white',19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','time','Europe/Madrid',0,0,''), - (114,3,946,314,60,60,'','status',0,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (115,3,604,351,60,60,'','status',0,3600,0,0,5,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (116,3,840,314,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt"><strong><span style="color: #ffffff;">EUROPE</span></strong></span></p>',NULL,4,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (117,3,664,374,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt"><strong><span style="color: #ffffff;">USA</span></strong></span></p>',NULL,4,3600,0,0,5,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (118,3,57,182,60,60,'','status',0,3600,0,0,5,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (119,3,56,258,60,60,'','status',0,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (121,3,138,183,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt"><strong><span style="color: #ffffff;">USA</span></strong></span></p>',NULL,4,3600,0,0,5,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (122,3,138,259,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt"><strong><span style="color: #ffffff;">EUROPE</span></strong></span></p>',NULL,4,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (123,4,839,525,60,60,'','status',0,3600,0,0,8,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (124,4,699,583,60,60,'','status',0,3600,0,0,9,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (125,4,585,705,60,60,'','status',0,3600,0,0,6,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (126,4,563,754,0,0,'<p style="overflow: hidden;"><span style="color: #000000;"><strong><span class="visual_font_size_18pt">SPAIN</span></strong></span></p>',NULL,4,3600,0,0,6,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (127,4,681,629,0,0,'<p style="overflow: hidden;"><span style="color: #000000;"><strong><span class="visual_font_size_18pt">FRANCE</span></strong></span></p>',NULL,4,3600,0,0,9,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (128,4,832,576,0,0,'<p style="overflow: hidden;"><span class="visual_font_size_18pt" style="color: #000000;"><strong><span style="color: #000000;">GERMANY</span></strong></span></p>',NULL,4,3600,0,0,8,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (129,4,51,177,60,60,'','status',0,3600,0,0,8,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (130,4,124,176,0,0,'<p style="overflow: hidden;"><span class="visual_font_size_18pt" style="color: #ffffff;"><strong>GERMANY</strong></span></p>',NULL,4,3600,0,0,8,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (131,4,51,255,60,60,'','status',0,3600,0,0,9,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (132,4,127,256,0,0,'<p style="overflow: hidden;"><span style="color: #ffffff;"><strong><span class="visual_font_size_18pt">FRANCE</span></strong></span></p>',NULL,4,3600,0,0,9,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (133,4,51,333,60,60,'','status',0,3600,0,0,7,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (134,4,129,333,0,0,'<p style="overflow: hidden;"><span style="color: #ffffff;"><strong><span class="visual_font_size_18pt">SPAIN</span></strong></span></p>',NULL,4,3600,0,0,6,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (136,4,816,928,0,0,'','white',19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','time','Europe/Madrid',0,0,''), - (137,4,1674,184,132,200,'','worldmap',5,3600,0,0,3,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (143,6,972,452,60,60,'','status',0,3600,0,0,7,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (144,6,1039,223,60,60,'','status',0,3600,0,0,11,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (145,6,1339,366,60,60,'','status',0,3600,0,0,10,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (146,6,841,699,60,60,'','status',0,3600,0,0,12,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (147,6,1677,183,132,200,'','worldmap',5,3600,0,0,3,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (148,6,1674,341,132,200,'','europemap',5,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (149,6,1023,288,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt" style="color: #000000;">BASQUE COUNTRY</span></strong></p>',NULL,4,3600,0,0,11,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (150,6,1324,425,0,0,'<p style="line-height: 18px; overflow: hidden;"><span style="color: #ffffff;"><strong><span class="visual_font_size_18pt">CATALONIA</span></strong></span></p>',NULL,4,3600,0,0,10,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (151,6,963,511,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt" style="color: #000000;">MADRID</span></strong></p>',NULL,4,3600,0,0,7,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (152,6,843,749,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt" style="color: #000000;">ANDALUSIA</span></strong></p>',NULL,4,3600,0,0,12,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (153,6,52,179,60,60,'','status',0,3600,0,0,11,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (154,6,125,184,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_14pt" style="color: #ffffff;"><strong>BASQUE COUNTRY</strong></span></p>',NULL,4,3600,0,0,11,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (155,6,53,260,60,60,'','status',0,3600,0,0,7,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (156,6,132,264,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_14pt" style="color: #ffffff;"><strong>MADRID</strong></span></p>',NULL,4,3600,0,0,7,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (157,6,52,339,60,60,'','status',0,3600,0,0,10,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (158,6,132,343,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_14pt" style="color: #ffffff;"><strong>CATALONIA</strong></span></p>',NULL,4,3600,0,0,10,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (159,6,52,413,60,60,'','status',0,3600,0,0,12,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (160,6,132,423,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_14pt" style="color: #ffffff;"><strong>ANDALUSIA</strong></span></p>',NULL,4,3600,0,0,12,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (161,11,761,345,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (162,11,791,401,0,0,'<p style="margin-top:"><span class="visual_font_size_18pt"><strong>BILBAO</strong></span></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (163,11,53,183,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (164,11,131,191,0,0,'<p><span class="visual_font_size_18pt" style="color: #ffffff;"><strong>BILBAO</strong></span></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (165,11,1675,184,132,200,'','worldmap',5,3600,0,0,3,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (167,11,1675,340,132,200,'','europemap',5,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (168,11,1673,507,132,200,'','spainmap',5,3600,0,0,6,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (169,10,1075,607,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (170,10,1012,539,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (171,10,57,266,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (172,10,55,183,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (173,10,131,189,0,0,'<p style="line-height: 18px; overflow: hidden;"><span style="color: #ffffff;"><strong><span class="visual_font_size_18pt">BARCELONA</span></strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (174,10,1044,670,0,0,'<p style="line-height: 18px; overflow: hidden;"><span style="color: #ffffff;"><strong><span class="visual_font_size_18pt">BARCELONA</span></strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (175,10,1000,488,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt"><strong><span style="color: #ffffff;">MANRESA</span></strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (176,10,134,265,0,0,'<p style="line-height: 18px; overflow: hidden;"><span style="color: #ffffff;"><strong><span class="visual_font_size_18pt">MANRESA</span></strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (177,10,1675,184,132,200,'','worldmap',5,3600,0,0,3,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (178,10,1675,342,132,200,'','europemap',5,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (179,10,1673,508,132,200,'','spainmap',5,3600,0,0,6,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (180,7,1675,184,132,200,'','worldmap',5,3600,0,0,3,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (181,7,1673,340,132,200,'','europemap',5,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (182,7,1675,505,132,200,'','spainmap',5,3600,0,0,6,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (183,7,960,571,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (184,7,1089,529,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (185,7,865,541,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (186,7,958,475,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (187,7,54,182,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (188,7,58,417,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (189,7,55,258,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (191,7,56,338,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (192,7,947,631,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt">MADRID</span></strong></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (193,7,790,598,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt">LAS ROZAS</span></strong></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (194,7,914,429,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt">ALCOBENDAS</span></strong></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (195,7,1065,583,0,0,'<p style="line-height: 18px; overflow: hidden; text-align: center;"><strong><span class="visual_font_size_18pt">ALCAL&Aacute; DE </span></strong></p> <p style="line-height: 18px; overflow: hidden; text-align: center;"><strong><span class="visual_font_size_18pt">HENARES</span></strong></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (196,7,134,267,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_14pt" style="color: #ffffff;"><strong>ALCOBENDAS</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (197,7,133,193,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_14pt" style="color: #ffffff;"><strong>MADRID</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (198,7,134,347,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_14pt" style="color: #ffffff;"><strong>LAS ROZAS</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (199,7,135,425,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_14pt" style="color: #ffffff;"><strong>ALCAL&Aacute; DE HENARES</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (200,12,757,537,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (201,12,1022,656,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (202,12,54,182,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (203,12,54,260,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (204,12,751,593,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt"><strong>SEVILLA</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (205,12,1047,716,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt" style="color: #ffffff;"><strong>MALAGA</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (206,12,133,266,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt" style="color: #ffffff;"><strong>MALAGA</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (207,12,132,190,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt" style="color: #ffffff;"><strong>SEVILLA</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (208,12,1675,184,132,200,'','worldmap',5,3600,0,0,3,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (209,12,1675,341,132,200,'','europemap',5,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (210,12,1674,505,132,200,'','spainmap',5,3600,0,0,6,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (211,12,842,935,0,0,'',NULL,19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','time','Europe/Madrid',0,0,''), - (212,7,848,941,0,0,'','white',19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','time','Europe/Madrid',0,0,''), - (213,10,844,940,0,0,'','white',19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','time','Europe/Madrid',0,0,''), - (214,11,847,948,0,0,'','white',19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','time','Europe/Madrid',0,0,''), - (215,5,525,608,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (216,5,1412,351,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (217,5,966,697,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (218,5,458,672,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt" style="color: #ffffff;">CALIFORNIA</span></strong></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (219,5,954,759,0,0,'<p style="line-height: 18px; overflow: hidden;"><span style="color: #000000;"><strong><span class="visual_font_size_18pt">TEXAS</span></strong></span></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (220,5,1468,389,0,0,'<p style="line-height: 18px; overflow: hidden;"><span style="color: #ffffff;"><strong><span class="visual_font_size_18pt">NEW YORK</span></strong></span></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (221,5,56,182,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (222,5,57,258,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (223,5,57,338,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (224,5,137,189,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt" style="color: #ffffff;">CALIFORNIA</span></strong></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (225,5,139,264,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt" style="color: #ffffff;">TEXAS</span></strong></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (226,5,138,342,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt" style="color: #ffffff;">NUEVA YORK</span></strong></p>','white',4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (227,5,1677,189,132,200,'','worldmap',5,3600,0,0,3,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (228,9,907,353,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (229,9,1068,599,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (230,9,60,182,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (231,9,61,258,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (232,9,138,187,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt" style="color: #ffffff;"><strong>PARIS</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (233,9,139,257,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt" style="color: #ffffff;"><strong>LYON</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (234,9,1063,660,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt" style="color: #333333;"><strong>LYON</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (235,9,905,416,0,0,'<p style="line-height: 18px; overflow: hidden;"><span class="visual_font_size_18pt" style="color: #333333;"><strong>PARIS</strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (236,9,1676,184,132,200,'','worldmap',5,3600,0,0,3,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (237,9,1673,340,132,200,'','europemap',5,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (238,8,1098,397,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (239,8,989,775,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (240,8,824,595,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (241,8,59,183,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (242,8,62,335,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (243,8,60,260,60,60,'','status',0,3600,0,1,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (244,8,1077,456,0,0,'<p style="line-height: 18px; overflow: hidden;"><span style="color: #000000;"><strong><span class="visual_font_size_18pt">BERLIN</span></strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (245,8,143,262,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt" style="color: #ffffff;">FRANCFORT</span></strong></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (246,8,144,341,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt" style="color: #ffffff;">MUNICH</span></strong></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (247,8,957,827,0,0,'<p style="line-height: 18px; overflow: hidden;"><span style="color: #000000;"><strong><span class="visual_font_size_18pt">MUNICH</span></strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (248,8,795,655,0,0,'<p style="line-height: 18px; overflow: hidden;"><span style="color: #000000;"><strong><span class="visual_font_size_18pt">FRANCFORT</span></strong></span></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (249,8,143,183,0,0,'<p style="line-height: 18px; overflow: hidden;"><strong><span class="visual_font_size_18pt" style="color: #ffffff;">BERLIN</span></strong></p>',NULL,4,3600,0,0,0,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (250,8,1676,185,132,200,'','worldmap',5,3600,0,0,3,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (251,8,1677,343,132,200,'','europemap',5,3600,0,0,4,0,1,1,0,0,0,'line','down','','',0,0,'default',0,0.000,0.000,0,0,'analogic_1','time','Europe/Madrid',0,0,''), - (252,8,846,940,0,0,'','white',19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','time','Europe/Madrid',0,0,''), - (253,9,848,944,0,0,'','white',19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','time','Europe/Madrid',0,0,''), - (254,6,848,943,0,0,'','white',19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','time','Europe/Madrid',0,0,''), - (255,5,846,941,0,0,'','white',19,3600,0,0,0,0,1,1,0,0,0,'line','down','','#FFFFFF',0,0,'default',0,0.000,0.000,0,0,'digital_1','time','Europe/Madrid',0,0,''); - -- -- Dumping data for table `tpen` -- diff --git a/pandora_console/vendor/artica/phpchartjs/.codeclimate.yml b/pandora_console/vendor/artica/phpchartjs/.codeclimate.yml new file mode 100644 index 0000000000..0a1763e5fa --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/.codeclimate.yml @@ -0,0 +1,30 @@ +--- +engines: + duplication: + enabled: true + config: + languages: + - javascript + - php + fixme: + enabled: true + phpmd: + enabled: true + checks: + Design/TooManyFields: + enabled: false + CleanCode/StaticAccess: + enabled: false + Naming/LongVariable: + enabled: false +ratings: + paths: + - "**.inc" + - "**.js" + - "**.jsx" + - "**.module" + - "**.php" + - "**.py" + - "**.rb" +exclude_paths: +- test/ diff --git a/pandora_console/vendor/artica/phpchartjs/.gitignore b/pandora_console/vendor/artica/phpchartjs/.gitignore new file mode 100644 index 0000000000..c6101292c5 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/.gitignore @@ -0,0 +1,9 @@ +# Created by .ignore support plugin (hsz.mobi) +/.idea/ +/composer.phar +composer.phar +/vendor/ +codeCoverage +build +*DS_Store +.phpunit.result.cache diff --git a/pandora_console/vendor/artica/phpchartjs/.travis.yml b/pandora_console/vendor/artica/phpchartjs/.travis.yml new file mode 100644 index 0000000000..d8bbb86d46 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/.travis.yml @@ -0,0 +1,31 @@ +language: php +php: + - '5.6' + - '7.0' + - '7.1' + - '7.2' + - '7.3' + - '7.4' + - nightly + +before_script: + - composer self-update + - composer install + - mkdir build/logs -p + +script: + - composer test + - composer cs-check + - php vendor/bin/security-checker security:check + +after_script: + - rm -rf build/logs + +matrix: + allow_failures: + - php: nightly + +branches: + only: + - master + - dev diff --git a/pandora_console/vendor/artica/phpchartjs/LICENSE.md b/pandora_console/vendor/artica/phpchartjs/LICENSE.md new file mode 100644 index 0000000000..dbbe355815 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/LICENSE.md @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/pandora_console/vendor/artica/phpchartjs/README.md b/pandora_console/vendor/artica/phpchartjs/README.md new file mode 100644 index 0000000000..7e7399642c --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/README.md @@ -0,0 +1,177 @@ +### Stable +[![Latest Stable Version](https://poser.pugx.org/Articaam/phpchartjs/v/stable)](https://packagist.org/packages/Articaam/phpchartjs) +[![Total Downloads](https://poser.pugx.org/Articaam/phpchartjs/downloads)](https://packagist.org/packages/Articaam/phpchartjs) +[![License](https://poser.pugx.org/Articaam/phpchartjs/license)](https://packagist.org/packages/Articaam/phpchartjs) +[![composer.lock](https://poser.pugx.org/Articaam/phpchartjs/composerlock)](https://packagist.org/packages/Articaam/phpchartjs) +[![Build Status](https://travis-ci.org/Articaam/PHPChartJS.svg?branch=master)](https://travis-ci.org/Articaam/PHPChartJS) +[![Code Climate](https://codeclimate.com/github/Articaam/PHPChartJS/badges/gpa.svg)](https://codeclimate.com/github/Articaam/PHPChartJS) +[![Test Coverage](https://codeclimate.com/github/Articaam/PHPChartJS/badges/coverage.svg)](https://codeclimate.com/github/Articaam/PHPChartJS/coverage) +[![Quality](https://scrutinizer-ci.com/g/Articaam/PHPChartJS/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/Articaam/PHPChartJS/) + +### Development +[![Latest Unstable Version](https://poser.pugx.org/Articaam/phpchartjs/v/unstable)](https://packagist.org/packages/Articaam/phpchartjs) +[![Build Status](https://travis-ci.org/Articaam/PHPChartJS.svg?branch=dev)](https://travis-ci.org/Articaam/PHPChartJS) + +# PHPChartJS +PHP OOP library for [ChartJS](http://www.chartjs.org/) + +PHPChartJS acts as an interface between the ChartJS library and the server side code. Set up a chart in no time and have every aspect of the graph managable from your PHP code. This interface is set up to provide code completion in every scenario so you never have to guess or lookup what options are available for the chosen chart. The library is entirely object oriented. + +This library is still in active development and aims to implement all options ChartJS has to offer. Check the [Configuration milestone](https://github.com/Articaam/PHPChartJS/milestone/1) to view the progress of implementing all existing options. + +## Example use +````php +setId("myBar"); + +// Set labels +$bar->labels()->exchangeArray(["M", "T", "W", "T", "F", "S", "S"]); + +// Add apples +$apples = $bar->createDataSet(); +$apples->setLabel("apples") + ->setBackgroundColor("rgba( 0, 150, 0, .5 )") + ->data()->exchangeArray([12, 19, 3, 17, 28, 24, 7]); +$bar->addDataSet($apples); + +// Add oranges as well +$oranges = $bar->createDataSet(); +$oranges->setLabel("oranges") + ->setBackgroundColor("rgba( 255, 153, 0, .5 )") + ->data()->exchangeArray([ 30, 29, 5, 5, 20, 3 ]); + +// Add some extra data +$oranges->data()->append(10); + +$bar->addDataSet($oranges); + +// Render the chart +echo $bar->render(); +```` +The result generated by rendering the chart will look something like this: + +````html + + +```` + +### Callbacks +You can provide javascript callbacks with ease: + +````php +$myCallback = "function(item){ console.log(item); }"; +$bar->options()->getTooltips()->callbacks()->setAfterBody($myCallback); +```` + +### Rendering + +Rendering the chart creates some HTML and some JavaScript. The JavaScript contains a JSON object providing the necessary +configuration for ChartJS. Every part of the configuration can be cast to an array or a JSON object. + +Render isolated part of the configuration: + +````php +$json = $myChart->options()->getScales()->jsonSerialize(); +```` + +Or return an array containing the set configuration: + +````php +$options = $myChart->options()->getScales()->getArrayCopy(); +```` + + +### Pretty mode +If you're not a fan of the long lines of code that are being generated you can force the rendering to be done in *pretty mode*, see the following example. + +````php +// Render in pretty mode +$bar->render(true); +```` + +Want to see more? Fork this project and take a look at the examples in the test folder to explore the different options. + +## Configuration options +Every option that is supported by ChartJS will be made available in this library. + +### Layers +ChartJS requires you to build a JSON object containing the configuration options you want to set for the current chart. +These options are spread over multiple layers inside the configuration object. Accessing these layers with PHPChartJS is + super easy. + +Let's say we wanted to access the chart's getAnimation subtree within the options subtree: +````php +$getAnimation = $myChart->options()->getAnimation(); +```` +You can now adjust any of ChartJS's getAnimation settings by using the getters and setters provided in that particular class. + +## Collections +If ChartJS requires an array with certain items as subsets in a configuration option that array will be represented by a +collection in PHPChartJS. The collection can always by accessed directly to add, remove and replace values. + +In some cases a specific object with a predetermined list of options is required in a collection. In these cases methods +will be provided to create a new instance of said object and adding it to the collection. + +Datasets are stored in a collection: + +````php +// Create new dataset +$dataset = $myChart->createDataSet(); +... (add data to the dataset) +$myChart->addDataSet($dataset); +```` + +But the actual data in a dataset is also stored inside a collection: + +````php +// Create new dataset +$dataset = $myChart->createDataSet(); + +// Add some data +$dataset->data()->append(1)->append(2); + +// Prepend some data +$dataset->data()->prepend(0); + +// Replace data at certain position +$dataset->data()->offsetSet(1, 3); + +// Retrieve data from certain position +$value = $dataset->data()->offsetGet(1); // 3 + +// Add a lot of data at once whilst returning the old values +$oldData = $dataset->data()->exchangeArray([1, 2, 3]); // array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } + +$myChart->addDataSet($dataset); +```` +For more information about the collections visit the [Articaam/collection](https://github.com/Articaam/collection) project. + +## Installation + +### Using composer + $ composer require Articaam/phpchartjs + +### Development +This project uses composer, which should be installed on your system. Most +Linux systems have composer available in their PHP packages. +Alternatively you can download composer from [getcomposer.org](http://getcomposer.org). + +If you use the PhpStorm IDE then you can simply init composer through the IDE. However, +full use requires the commandline. See PhpStorm help, search for composer. + +To start development, do `composer install` from the project directory. + +**Remark** Do not use `composer update` unless you changed the dependency requirements in composer.json. +The difference is that `composer install` will use composer.lock read-only, +while `composer update` will update your composer.lock file regardless of any change. +As the composer.lock file is committed to the repo, other developers might conclude +dependencies have changed, while they have not. diff --git a/pandora_console/vendor/artica/phpchartjs/_config.yml b/pandora_console/vendor/artica/phpchartjs/_config.yml new file mode 100644 index 0000000000..c4192631f2 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file diff --git a/pandora_console/vendor/artica/phpchartjs/composer.json b/pandora_console/vendor/artica/phpchartjs/composer.json new file mode 100644 index 0000000000..81cd50ecf5 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/composer.json @@ -0,0 +1,47 @@ +{ + "name": "artica/phpchartjs", + "description": "PHP library for ChartJS", + "keywords": [ + "chartjs", + "graph", + "php" + ], + "readme": "README.md", + "homepage": "https://artica.es/", + "type": "package", + "version": "v1.0.2", + "license": "AGPL-3.0-or-later", + "authors": [ + { + "name": "Bob Kruithof" + }, + { + "name": "Daniel Barbero" + } + ], + "require": { + "php": ">=7.2", + "ext-dom": "*", + "ext-json": "*", + "laminas/laminas-json": ">3.1.2", + "halfpastfouram/collection": "1.0.0", + "symfony/var-dumper": "^3.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "3.5.3", + "friendsofphp/php-cs-fixer": "*", + "sensiolabs/security-checker": "^5.0" + }, + "autoload": { + "psr-4": { + "Artica\\PHPChartJS\\": "src/", + "Test\\": "test/" + } + }, + "scripts": { + "test": "./vendor/bin/phpunit", + "cs-check": "./vendor/bin/phpcs", + "cs-fix": "./vendor/bin/phpcbf" + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/composer.lock b/pandora_console/vendor/artica/phpchartjs/composer.lock new file mode 100644 index 0000000000..72cd9f603a --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/composer.lock @@ -0,0 +1,3910 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "7b4943f1b24f426de0dd965e616bf88f", + "packages": [ + { + "name": "halfpastfouram/collection", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/halfpastfouram/collection.git", + "reference": "0862d0b431fef9dc2245518dc06b86ff00dcd102" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/halfpastfouram/collection/zipball/0862d0b431fef9dc2245518dc06b86ff00dcd102", + "reference": "0862d0b431fef9dc2245518dc06b86ff00dcd102", + "shasum": "" + }, + "require": { + "php": ">=5.6.0 || ^7.0" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "phpunit/phpunit": "5.2.*" + }, + "type": "package", + "autoload": { + "psr-4": { + "Test\\": "test/", + "Halfpastfour\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "AGPL 3.0" + ], + "authors": [ + { + "name": "Bob Kruithof" + } + ], + "description": "A flexible PHP Collection complete with custom Iterator.", + "homepage": "http://github.com/halfpastfouram/collection", + "keywords": [ + "collection", + "php" + ], + "support": { + "issues": "https://github.com/halfpastfouram/collection/issues", + "source": "https://github.com/halfpastfouram/collection/tree/master" + }, + "time": "2016-12-18T13:04:48+00:00" + }, + { + "name": "laminas/laminas-json", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-json.git", + "reference": "7a8a1d7bf2d05dd6c1fbd7c0868d3848cf2b57ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-json/zipball/7a8a1d7bf2d05dd6c1fbd7c0868d3848cf2b57ec", + "reference": "7a8a1d7bf2d05dd6c1fbd7c0868d3848cf2b57ec", + "shasum": "" + }, + "require": { + "php": "~8.0.0 || ~8.1.0 || ~8.2.0" + }, + "conflict": { + "zendframework/zend-json": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.4.0", + "laminas/laminas-stdlib": "^2.7.7 || ^3.1", + "phpunit/phpunit": "^9.5.25" + }, + "suggest": { + "laminas/laminas-json-server": "For implementing JSON-RPC servers", + "laminas/laminas-xml2json": "For converting XML documents to JSON" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Json\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", + "homepage": "https://laminas.dev", + "keywords": [ + "json", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-json/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-json/issues", + "rss": "https://github.com/laminas/laminas-json/releases.atom", + "source": "https://github.com/laminas/laminas-json" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-10-17T04:06:45+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "0719f6cf4633a38b2c1585140998579ce23b4b7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0719f6cf4633a38b2c1585140998579ce23b4b7d", + "reference": "0719f6cf4633a38b2c1585140998579ce23b4b7d", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, + "require-dev": { + "ext-iconv": "*", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "ext-symfony_debug": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-24T10:57:07+00:00" + } + ], + "packages-dev": [ + { + "name": "composer/ca-bundle", + "version": "1.3.4", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "69098eca243998b53eed7a48d82dedd28b447cd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/69098eca243998b53eed7a48d82dedd28b447cd5", + "reference": "69098eca243998b53eed7a48d82dedd28b447cd5", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.55", + "psr/log": "^1.0", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.3.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-10-12T12:08:29+00:00" + }, + { + "name": "composer/pcre", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/1.0.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-01-21T20:24:37+00:00" + }, + { + "name": "composer/semver", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-04-01T19:23:25+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/9e36aeed4616366d2b690bdce11f71e9178c579a", + "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a", + "shasum": "" + }, + "require": { + "composer/pcre": "^1", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/2.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-24T20:20:32+00:00" + }, + { + "name": "doctrine/annotations", + "version": "1.13.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "648b0343343565c4a056bfc8392201385e8d89f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", + "reference": "648b0343343565c4a056bfc8392201385e8d89f0", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.13.3" + }, + "time": "2022-07-02T10:48:51+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-03-03T08:28:38+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-02-28T11:07:21+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "47177af1cfb9dab5d1cc4daf91b7179c2efe7fad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/47177af1cfb9dab5d1cc4daf91b7179c2efe7fad", + "reference": "47177af1cfb9dab5d1cc4daf91b7179c2efe7fad", + "shasum": "" + }, + "require": { + "composer/semver": "^3.2", + "composer/xdebug-handler": "^2.0", + "doctrine/annotations": "^1.12", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.2.5 || ^8.0", + "php-cs-fixer/diff": "^2.0", + "symfony/console": "^4.4.20 || ^5.1.3 || ^6.0", + "symfony/event-dispatcher": "^4.4.20 || ^5.0 || ^6.0", + "symfony/filesystem": "^4.4.20 || ^5.0 || ^6.0", + "symfony/finder": "^4.4.20 || ^5.0 || ^6.0", + "symfony/options-resolver": "^4.4.20 || ^5.0 || ^6.0", + "symfony/polyfill-mbstring": "^1.23", + "symfony/polyfill-php80": "^1.23", + "symfony/polyfill-php81": "^1.23", + "symfony/process": "^4.4.20 || ^5.0 || ^6.0", + "symfony/stopwatch": "^4.4.20 || ^5.0 || ^6.0" + }, + "require-dev": { + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^1.5", + "mikey179/vfsstream": "^1.6.8", + "php-coveralls/php-coveralls": "^2.5.2", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", + "phpspec/prophecy": "^1.15", + "phpspec/prophecy-phpunit": "^1.1 || ^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5", + "phpunitgoodpractices/polyfill": "^1.5", + "phpunitgoodpractices/traits": "^1.9.1", + "symfony/phpunit-bridge": "^5.2.4 || ^6.0", + "symfony/yaml": "^4.4.20 || ^5.0 || ^6.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2021-12-11T16:25:08+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2022-03-03T13:19:32+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.15.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" + }, + "time": "2022-11-12T15:38:23+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-cs-fixer/diff", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/diff.git", + "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/29dc0d507e838c4580d018bd8b5cb412474f7ec3", + "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", + "symfony/process": "^3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "sebastian/diff v3 backport support for PHP 5.6+", + "homepage": "https://github.com/PHP-CS-Fixer", + "keywords": [ + "diff" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/diff/issues", + "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" + }, + "abandoned": true, + "time": "2020-10-14T08:32:19+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.19", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c77b56b63e3d2031bd8997fcec43c1925ae46559", + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.14", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "*", + "ext-xdebug": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.19" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-11-18T07:47:47+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.5.26", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2022-10-28T06:00:21+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-04-03T09:37:03+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:03:37+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-12T14:47:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "sensiolabs/security-checker", + "version": "v5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/security-checker.git", + "reference": "46be3f58adac13084497961e10eed9a7fb4d44d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/46be3f58adac13084497961e10eed9a7fb4d44d1", + "reference": "46be3f58adac13084497961e10eed9a7fb4d44d1", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0", + "php": ">=5.5.9", + "symfony/console": "~2.7|~3.0|~4.0" + }, + "bin": [ + "security-checker" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "SensioLabs\\Security\\": "SensioLabs/Security" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "A security checker for your composer.lock", + "support": { + "issues": "https://github.com/sensiolabs/security-checker/issues", + "source": "https://github.com/sensiolabs/security-checker/tree/master" + }, + "abandoned": "https://github.com/fabpot/local-php-security-checker", + "time": "2018-12-19T17:14:59+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.5.3", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "557a1fc7ac702c66b0bbfe16ab3d55839ef724cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/557a1fc7ac702c66b0bbfe16ab3d55839ef724cb", + "reference": "557a1fc7ac702c66b0bbfe16ab3d55839ef724cb", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2019-12-04T04:46:47+00:00" + }, + { + "name": "symfony/console", + "version": "v4.4.48", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "8e70c1cab07ac641b885ce80385b9824a293c623" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/8e70c1cab07ac641b885ce80385b9824a293c623", + "reference": "8e70c1cab07ac641b885ce80385b9824a293c623", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/lock": "<4.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v4.4.48" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-10-26T16:02:45+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-02-25T11:15:52+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a", + "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "~3.4|~4.4", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-20T09:59:04+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/1d5cd762abaa6b2a4169d3e77610193a7157129e", + "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:41:36+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "4d216a2beef096edf040a070117c39ca2abce307" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d216a2beef096edf040a070117c39ca2abce307", + "reference": "4d216a2beef096edf040a070117c39ca2abce307", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-09-21T20:29:40+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709", + "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-29T07:42:06+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4", + "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-02-25T11:15:52+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/process", + "version": "v6.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/a6506e99cfad7059b1ab5cab395854a0a0c21292", + "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-27T17:24:16+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/266636bb8f3fbdccc302491df7b3a1b9a8c238a7", + "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-09-28T16:00:52+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.2", + "ext-dom": "*", + "ext-json": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/pandora_console/vendor/artica/phpchartjs/phpcs.xml b/pandora_console/vendor/artica/phpchartjs/phpcs.xml new file mode 100644 index 0000000000..1f87d5d9ab --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/phpcs.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + 4 + + + 4 + + + + src + diff --git a/pandora_console/vendor/artica/phpchartjs/phpunit.xml b/pandora_console/vendor/artica/phpchartjs/phpunit.xml new file mode 100644 index 0000000000..f1cf17d5bb --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/phpunit.xml @@ -0,0 +1,21 @@ + + + + + test/unit + + + + + src + + test + + + + + + + + diff --git a/pandora_console/vendor/artica/phpchartjs/src/ArraySerializableInterface.php b/pandora_console/vendor/artica/phpchartjs/src/ArraySerializableInterface.php new file mode 100644 index 0000000000..206ed81bec --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/ArraySerializableInterface.php @@ -0,0 +1,17 @@ + DataSet::class, + 'options' => Options::class, + ]; + + /** + * @var string + */ + protected $id; + + /** + * @var integer + */ + protected $height; + + /** + * @var integer + */ + protected $width; + + /** + * @var string + */ + protected $title; + + /** + * @var LabelsCollection + */ + protected $labels; + + /** + * @var PluginsCollection + */ + protected $plugins; + + /** + * @var Options + */ + protected $options; + + /** + * @var Defaults + */ + protected $defaults; + + /** + * @var DataSetCollection + */ + protected $dataSets; + + + /** + * @return string + */ + public function getId() + { + if (is_null($this->id)) { + $this->id = uniqid('chart'); + } + + return $this->id; + } + + + /** + * @param string $id + * + * @return Chart + */ + public function setId($id) + { + $this->id = strval($id); + + return $this; + } + + + /** + * @return integer + */ + public function getHeight() + { + return $this->height; + } + + + /** + * @param integer $height + * + * @return Chart + */ + public function setHeight($height) + { + $this->height = intval($height); + + return $this; + } + + + /** + * @return integer + */ + public function getWidth() + { + return $this->width; + } + + + /** + * @param integer $width + * + * @return Chart + */ + public function setWidth($width) + { + $this->width = intval($width); + + return $this; + } + + + /** + * @return string + */ + public function getTitle() + { + return $this->title; + } + + + /** + * @param string $title + * + * @return Chart + */ + public function setTitle($title) + { + $this->title = strval($title); + + return $this; + } + + + /** + * @return LabelsCollection + */ + public function labels() + { + if (is_null($this->labels)) { + $this->labels = new LabelsCollection(); + } + + return $this->labels; + } + + + /** + * @param string $label + * + * @return $this + */ + public function addLabel($label) + { + $this->labels()->append($label); + + return $this; + } + + + /** + * @param $offset + * + * @return string|boolean + */ + public function getLabel($offset) + { + return $this->labels()->offsetGet($offset); + } + + + /** + * @return PluginsCollection + */ + public function plugins() + { + if (is_null($this->plugins)) { + $this->plugins = new PluginsCollection(); + } + + return $this->plugins; + } + + + /** + * @param string $plugin + * + * @return $this + */ + public function addPlugin($plugin) + { + $this->plugins()->append(new Expr(strval($plugin))); + + return $this; + } + + + /** + * @param $offset + * + * @return string|boolean + */ + public function getPlugin($offset) + { + return $this->plugins()->offsetGet($offset); + } + + + /** + * @return DataSetCollection + */ + public function dataSets() + { + if (is_null($this->dataSets)) { + $this->dataSets = new DataSetCollection(); + } + + return $this->dataSets; + } + + + /** + * @param DataSet $dataSet + * + * @return $this + */ + public function addDataSet(DataSet $dataSet) + { + $this->dataSets()->append($dataSet->setOwner($this)); + + return $this; + } + + + /** + * @param $offset + * + * @return DataSet|boolean + */ + public function getDataSet($offset) + { + return $this->dataSets()->offsetGet($offset); + } + + + /** + * @param boolean $pretty + * + * @return string + */ + public function render($pretty=false) + { + $renderer = new Html($this); + + return $renderer->render($pretty ? $renderer::RENDER_PRETTY : null); + } + + + /** + * @return DataSet + */ + public function createDataSet() + { + $datasetClass = static::MODEL['dataset']; + /* + @var \Artica\PHPChartJS\DataSet $dataSet + */ + $dataSet = new $datasetClass(); + $dataSet->setOwner($this); + + return $dataSet; + } + + + /** + * @return Options + */ + public function options() + { + if (is_null($this->options)) { + $optionsClass = static::MODEL['options']; + $this->options = new $optionsClass($this); + $this->options->setOwner($this); + } + + return $this->options; + } + + + /** + * @return Defaults + */ + public function defaults() + { + if (is_null($this->defaults)) { + $this->defaults = new Defaults($this); + } + + return $this->defaults; + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Chart/Bar.php b/pandora_console/vendor/artica/phpchartjs/src/Chart/Bar.php new file mode 100644 index 0000000000..a44cbe6126 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Chart/Bar.php @@ -0,0 +1,30 @@ + BarDataSet::class, + 'options' => BarOptions::class, + ]; +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Chart/Bubble.php b/pandora_console/vendor/artica/phpchartjs/src/Chart/Bubble.php new file mode 100644 index 0000000000..bd4fda09b9 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Chart/Bubble.php @@ -0,0 +1,30 @@ + BubbleDataSet::class, + 'options' => BubbleOptions::class, + ]; +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Chart/Doughnut.php b/pandora_console/vendor/artica/phpchartjs/src/Chart/Doughnut.php new file mode 100644 index 0000000000..58ff7d1380 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Chart/Doughnut.php @@ -0,0 +1,15 @@ + LineDataSet::class, + 'options' => LineOptions::class, + ]; +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Chart/Pie.php b/pandora_console/vendor/artica/phpchartjs/src/Chart/Pie.php new file mode 100644 index 0000000000..e593a95e15 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Chart/Pie.php @@ -0,0 +1,31 @@ + PieDataSet::class, + 'options' => PieOptions::class, + ]; +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Chart/PolarArea.php b/pandora_console/vendor/artica/phpchartjs/src/Chart/PolarArea.php new file mode 100644 index 0000000000..29a722a71c --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Chart/PolarArea.php @@ -0,0 +1,31 @@ + PolarAreaDataSet::class, + 'options' => PolarAreaOptions::class, + ]; +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Chart/Radar.php b/pandora_console/vendor/artica/phpchartjs/src/Chart/Radar.php new file mode 100644 index 0000000000..893c049e3b --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Chart/Radar.php @@ -0,0 +1,31 @@ + RadarDataSet::class, + 'options' => RadarOptions::class, + ]; +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Chart/Scatter.php b/pandora_console/vendor/artica/phpchartjs/src/Chart/Scatter.php new file mode 100644 index 0000000000..395325e508 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Chart/Scatter.php @@ -0,0 +1,31 @@ + ScatterDataSet::class, + 'options' => ScatterOptions::class, + ]; +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/ChartInterface.php b/pandora_console/vendor/artica/phpchartjs/src/ChartInterface.php new file mode 100644 index 0000000000..94c18c3b56 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/ChartInterface.php @@ -0,0 +1,51 @@ +owner = $chart; + + return $this; + } + + /** + * @return ChartInterface + */ + public function owner() + { + return $this->owner; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/ChartOwnedInterface.php b/pandora_console/vendor/artica/phpchartjs/src/ChartOwnedInterface.php new file mode 100644 index 0000000000..2dd25efc9c --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/ChartOwnedInterface.php @@ -0,0 +1,22 @@ +defaultFontColor; + } + + /** + * @param string $defaultFontColor + * + * @return $this + */ + public function setDefaultFontColor($defaultFontColor) + { + $this->defaultFontColor = strval($defaultFontColor); + + return $this; + } + + /** + * @return string + */ + public function getDefaultFontFamily() + { + return $this->defaultFontFamily; + } + + /** + * @param string $defaultFontFamily + * + * @return $this + */ + public function setDefaultFontFamily($defaultFontFamily) + { + $this->defaultFontFamily = strval($defaultFontFamily); + + return $this; + } + + /** + * @return int + */ + public function getDefaultFontSize() + { + return $this->defaultFontSize; + } + + /** + * @param int $defaultFontSize + * + * @return $this + */ + public function setDefaultFontSize($defaultFontSize) + { + $this->defaultFontSize = intval($defaultFontSize); + + return $this; + } + + /** + * @return string + */ + public function getDefaultFontStyle() + { + return $this->defaultFontStyle; + } + + /** + * @param string $defaultFontStyle + * + * @return $this + */ + public function setDefaultFontStyle($defaultFontStyle) + { + $this->defaultFontStyle = $defaultFontStyle; + + return $this; + } + + /** + * @return LayoutConfig + */ + public function layout() + { + if (is_null($this->layout)) { + $this->layout = new LayoutConfig(); + } + + return $this->layout; + } + + /** + * @return TooltipsConfig + */ + public function tooltips() + { + if (is_null($this->tooltips)) { + $this->tooltips = new TooltipsConfig(); + } + + return $this->tooltips; + } + + /** + * @return HoverConfig + */ + public function hover() + { + if (is_null($this->hover)) { + $this->hover = new HoverConfig(); + } + + return $this->hover; + } + + /** + * @return AnimationConfig + */ + public function animation() + { + if (is_null($this->animation)) { + $this->animation = new AnimationConfig(); + } + + return $this->animation; + } + + /** + * @return ElementsConfig + */ + public function elements() + { + if (is_null($this->elements)) { + $this->elements = new ElementsConfig(); + } + + return $this->elements; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/ConfigDefaults/HoverConfig.php b/pandora_console/vendor/artica/phpchartjs/src/ConfigDefaults/HoverConfig.php new file mode 100644 index 0000000000..3fadca4007 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/ConfigDefaults/HoverConfig.php @@ -0,0 +1,8 @@ +type; + } + + /** + * @param string $type + * + * @return $this + */ + public function setType($type) + { + $this->type = $type; + + return $this; + } + + /** + * @return Data + */ + public function data() + { + if (is_null($this->data)) { + $this->data = new Data(); + } + + return $this->data; + } + + /** + * @return string + */ + public function getLabel() + { + return $this->label; + } + + /** + * @param string $label + * + * @return $this + */ + public function setLabel($label) + { + $this->label = strval($label); + + return $this; + } + + /** + * @return string + */ + public function getAxis() + { + return $this->axis; + } + + /** + * @param string $axis + * + * @return $this + */ + public function setAxis($axis) + { + $this->axis = $axis; + + return $this; + } + + /** + * @return string + */ + public function getXAxisID() + { + return $this->xAxisID; + } + + /** + * @param string $xAxisID + * + * @return $this + */ + public function setXAxisID($xAxisID) + { + $this->xAxisID = strval($xAxisID); + + return $this; + } + + /** + * @return string + */ + public function getYAxisID() + { + return $this->yAxisID; + } + + /** + * @param string $yAxisID + * + * @return $this + */ + public function setYAxisID($yAxisID) + { + $this->yAxisID = strval($yAxisID); + + return $this; + } + + /** + * @return string|string[] + */ + public function getBackgroundColor() + { + return $this->backgroundColor; + } + + /** + * @param string|string[] $backgroundColor + * + * @return $this + */ + public function setBackgroundColor($backgroundColor) + { + if (is_array($backgroundColor)) { + $backgroundColor = array_map('strval', $backgroundColor); + } + if (! is_array($backgroundColor)) { + $backgroundColor = strval($backgroundColor); + } + + $this->backgroundColor = $backgroundColor; + + return $this; + } + + /** + * @return string|string[] + */ + public function getBorderColor() + { + return $this->borderColor; + } + + /** + * @param string|string[] $borderColor + * + * @return $this + */ + public function setBorderColor($borderColor) + { + if (is_array($borderColor)) { + $borderColor = array_map('strval', $borderColor); + } + if (! is_array($borderColor)) { + $borderColor = strval($borderColor); + } + + $this->borderColor = $borderColor; + + return $this; + } + + /** + * @return int|int[] + */ + public function getBorderWidth() + { + return $this->borderWidth; + } + + /** + * @param int|int[] $borderWidth + * + * @return $this + */ + public function setBorderWidth($borderWidth) + { + if (is_array($borderWidth)) { + $borderWidth = array_map('intval', $borderWidth); + } + if (! is_array($borderWidth)) { + $borderWidth = intval($borderWidth); + } + + $this->borderWidth = $borderWidth; + + return $this; + } + + /** + * @return string + */ + public function getBorderSkipped() + { + return $this->borderSkipped; + } + + /** + * @param string $borderSkipped + * + * @return $this + */ + public function setBorderSkipped($borderSkipped) + { + $this->borderSkipped = strval($borderSkipped); + + return $this; + } + + /** + * @return string|string[] + */ + public function getHoverBackgroundColor() + { + return $this->hoverBackgroundColor; + } + + /** + * @param string|string[] $hoverBackgroundColor + * + * @return $this + */ + public function setHoverBackgroundColor($hoverBackgroundColor) + { + if (is_array($hoverBackgroundColor)) { + $hoverBackgroundColor = array_map('strval', $hoverBackgroundColor); + } + if (! is_array($hoverBackgroundColor)) { + $hoverBackgroundColor = strval($hoverBackgroundColor); + } + + $this->hoverBackgroundColor = $hoverBackgroundColor; + + return $this; + } + + /** + * @return string|string[] + */ + public function getHoverBorderColor() + { + return $this->hoverBorderColor; + } + + /** + * @param string|string[] $hoverBorderColor + * + * @return $this + */ + public function setHoverBorderColor($hoverBorderColor) + { + if (is_array($hoverBorderColor)) { + $hoverBorderColor = array_map('strval', $hoverBorderColor); + } + if (! is_array($hoverBorderColor)) { + $hoverBorderColor = strval($hoverBorderColor); + } + + $this->hoverBorderColor = $hoverBorderColor; + + return $this; + } + + /** + * @return int|int[] + */ + public function getHoverBorderWidth() + { + return $this->hoverBorderWidth; + } + + /** + * @param int|int[] $hoverBorderWidth + * + * @return $this + */ + public function setHoverBorderWidth($hoverBorderWidth) + { + if (is_array($hoverBorderWidth)) { + $hoverBorderWidth = array_map('intval', $hoverBorderWidth); + } + if (! is_array($hoverBorderWidth)) { + $hoverBorderWidth = intval($hoverBorderWidth); + } + + $this->hoverBorderWidth = $hoverBorderWidth; + + return $this; + } + + /** + * @return bool|null + */ + public function isHidden() + { + if (is_null($this->hidden)) { + $this->hidden = false; + } + + return $this->hidden; + } + + /** + * @param bool|null $hidden + * + * @return $this + */ + public function setHidden($hidden) + { + $this->hidden = is_null($hidden) ? null : boolval($hidden); + + return $this; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/DataSet/BarDataSet.php b/pandora_console/vendor/artica/phpchartjs/src/DataSet/BarDataSet.php new file mode 100644 index 0000000000..18c13b87a0 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/DataSet/BarDataSet.php @@ -0,0 +1,13 @@ +pointStyle; + } + + /** + * @param string $pointStyle + * + * @return \Artica\PHPChartJS\DataSet\BubbleDataSet + */ + public function setPointStyle($pointStyle) + { + $this->pointStyle = $pointStyle; + + return $this; + } + + /** + * @return int|null + */ + public function getRadius() + { + return $this->radius; + } + + /** + * @param int $radius + * + * @return \Artica\PHPChartJS\DataSet\BubbleDataSet + */ + public function setRadius($radius) + { + $this->radius = $radius; + + return $this; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/DataSet/LineDataSet.php b/pandora_console/vendor/artica/phpchartjs/src/DataSet/LineDataSet.php new file mode 100644 index 0000000000..014f528422 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/DataSet/LineDataSet.php @@ -0,0 +1,512 @@ +fill; + } + + /** + * @param bool|string $fill + * + * @return $this + */ + public function setFill($fill) + { + $this->fill = $fill; + + return $this; + } + + /** + * @return string + */ + public function getCubicInterpolationMode() + { + return $this->cubicInterpolationMode; + } + + /** + * @param string $cubicInterpolationMode + * + * @return $this + */ + public function setCubicInterpolationMode($cubicInterpolationMode) + { + $this->cubicInterpolationMode = $cubicInterpolationMode; + + return $this; + } + + /** + * @return int + */ + public function getLineTension() + { + return $this->lineTension; + } + + /** + * @param float $lineTension + * + * @return $this + */ + public function setLineTension($lineTension) + { + $this->lineTension = floatval($lineTension); + + return $this; + } + + /** + * @return string + */ + public function getBorderCapStyle() + { + return $this->borderCapStyle; + } + + /** + * @param string $borderCapStyle + * + * @return $this + */ + public function setBorderCapStyle($borderCapStyle) + { + $this->borderCapStyle = $borderCapStyle; + + return $this; + } + + /** + * @return array + */ + public function getBorderDash() + { + return $this->borderDash; + } + + /** + * @param array $borderDash + * + * @return $this + */ + public function setBorderDash($borderDash) + { + $this->borderDash = $borderDash; + + return $this; + } + + /** + * @return int + */ + public function getBorderDashOffset() + { + return $this->borderDashOffset; + } + + /** + * @param float $borderDashOffset + * + * @return $this + */ + public function setBorderDashOffset($borderDashOffset) + { + $this->borderDashOffset = floatval($borderDashOffset); + + return $this; + } + + /** + * @return string + */ + public function getBorderJoinStyle() + { + return $this->borderJoinStyle; + } + + /** + * @param string $borderJoinStyle + * + * @return $this + */ + public function setBorderJoinStyle($borderJoinStyle) + { + $this->borderJoinStyle = $borderJoinStyle; + + return $this; + } + + /** + * @return string|string[] + */ + public function getPointBorderColor() + { + return $this->pointBorderColor; + } + + /** + * @param string|string[] $pointBorderColor + * + * @return $this + */ + public function setPointBorderColor($pointBorderColor) + { + $this->pointBorderColor = $pointBorderColor; + + return $this; + } + + /** + * @return string|string[] + */ + public function getPointBackgroundColor() + { + return $this->pointBackgroundColor; + } + + /** + * @param string|string[] $pointBackgroundColor + * + * @return $this + */ + public function setPointBackgroundColor($pointBackgroundColor) + { + $this->pointBackgroundColor = $pointBackgroundColor; + + return $this; + } + + /** + * @return int|int[] + */ + public function getPointBorderWidth() + { + return $this->pointBorderWidth; + } + + /** + * @param int|int[] $pointBorderWidth + * + * @return $this + */ + public function setPointBorderWidth($pointBorderWidth) + { + $this->pointBorderWidth = $pointBorderWidth; + + return $this; + } + + /** + * @return int|int[] + */ + public function getPointRadius() + { + return $this->pointRadius; + } + + /** + * @param int|int[] $pointRadius + * + * @return $this + */ + public function setPointRadius($pointRadius) + { + $this->pointRadius = $pointRadius; + + return $this; + } + + /** + * @return int|int[] + */ + public function getPointHoverRadius() + { + return $this->pointHoverRadius; + } + + /** + * @param int|int[] $pointHoverRadius + * + * @return $this + */ + public function setPointHoverRadius($pointHoverRadius) + { + $this->pointHoverRadius = $pointHoverRadius; + + return $this; + } + + /** + * @return int|int[] + */ + public function getPointHitRadius() + { + return $this->pointHitRadius; + } + + /** + * @param int|int[] $pointHitRadius + * + * @return $this + */ + public function setPointHitRadius($pointHitRadius) + { + $this->pointHitRadius = $pointHitRadius; + + return $this; + } + + /** + * @return string|string[] + */ + public function getPointHoverBackgroundColor() + { + return $this->pointHoverBackgroundColor; + } + + /** + * @param string|string[] $pointHoverBackgroundColor + * + * @return $this + */ + public function setPointHoverBackgroundColor($pointHoverBackgroundColor) + { + $this->pointHoverBackgroundColor = $pointHoverBackgroundColor; + + return $this; + } + + /** + * @return string|string[] + */ + public function getPointHoverBorderColor() + { + return $this->pointHoverBorderColor; + } + + /** + * @param string|string[] $pointHoverBorderColor + * + * @return $this + */ + public function setPointHoverBorderColor($pointHoverBorderColor) + { + $this->pointHoverBorderColor = $pointHoverBorderColor; + + return $this; + } + + /** + * @return int|int[] + */ + public function getPointHoverBorderWidth() + { + return $this->pointHoverBorderWidth; + } + + /** + * @param int|int[] $pointHoverBorderWidth + * + * @return $this + */ + public function setPointHoverBorderWidth($pointHoverBorderWidth) + { + $this->pointHoverBorderWidth = $pointHoverBorderWidth; + + return $this; + } + + /** + * @return mixed + */ + public function getPointStyle() + { + return $this->pointStyle; + } + + /** + * @param mixed $pointStyle + * + * @return $this + */ + public function setPointStyle($pointStyle) + { + $this->pointStyle = $pointStyle; + + return $this; + } + + /** + * @return bool + */ + public function isShowLine() + { + return $this->showLine; + } + + /** + * @param bool $showLine + * + * @return $this + */ + public function setShowLine($showLine) + { + $this->showLine = $showLine; + + return $this; + } + + /** + * @return bool + */ + public function isSpanGaps() + { + return $this->spanGaps; + } + + /** + * @param bool $spanGaps + * + * @return $this + */ + public function setSpanGaps($spanGaps) + { + $this->spanGaps = $spanGaps; + + return $this; + } + + /** + * @return bool + */ + public function isSteppedLine() + { + return $this->steppedLine; + } + + /** + * @param bool $steppedLine + * + * @return $this + */ + public function setSteppedLine($steppedLine) + { + $this->steppedLine = $steppedLine; + + return $this; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/DataSet/PieDataSet.php b/pandora_console/vendor/artica/phpchartjs/src/DataSet/PieDataSet.php new file mode 100644 index 0000000000..bacd5594cd --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/DataSet/PieDataSet.php @@ -0,0 +1,13 @@ +fill; + } + + /** + * @param bool $fill + * + * @return $this + */ + public function setFill($fill) + { + $this->fill = $fill; + + return $this; + } + + /** + * @return int + */ + public function getLineTension() + { + return $this->lineTension; + } + + /** + * @param float $lineTension + * + * @return $this + */ + public function setLineTension($lineTension) + { + $this->lineTension = $lineTension; + + return $this; + } + + /** + * @return string + */ + public function getBorderCapStyle() + { + return $this->borderCapStyle; + } + + /** + * @param string $borderCapStyle + * + * @return $this + */ + public function setBorderCapStyle($borderCapStyle) + { + $this->borderCapStyle = $borderCapStyle; + + return $this; + } + + /** + * @return int[] + */ + public function getBorderDash() + { + return $this->borderDash; + } + + /** + * @param int[] $borderDash + * + * @return $this + */ + public function setBorderDash($borderDash) + { + $this->borderDash = $borderDash; + + return $this; + } + + /** + * @return int + */ + public function getBorderDashOffset() + { + return $this->borderDashOffset; + } + + /** + * @param int $borderDashOffset + * + * @return $this + */ + public function setBorderDashOffset($borderDashOffset) + { + $this->borderDashOffset = $borderDashOffset; + + return $this; + } + + /** + * @return string + */ + public function getBorderJoinStyle() + { + return $this->borderJoinStyle; + } + + /** + * @param string $borderJoinStyle + * + * @return $this + */ + public function setBorderJoinStyle($borderJoinStyle) + { + $this->borderJoinStyle = $borderJoinStyle; + + return $this; + } + + /** + * @return string|string[] + */ + public function getPointBorderColor() + { + return $this->pointBorderColor; + } + + /** + * @param string|string[] $pointBorderColor + * + * @return $this + */ + public function setPointBorderColor($pointBorderColor) + { + $this->pointBorderColor = $pointBorderColor; + + return $this; + } + + /** + * @return string|string[] + */ + public function getPointBackgroundColor() + { + return $this->pointBackgroundColor; + } + + /** + * @param string|string[] $pointBackgroundColor + * + * @return $this + */ + public function setPointBackgroundColor($pointBackgroundColor) + { + $this->pointBackgroundColor = $pointBackgroundColor; + + return $this; + } + + /** + * @return int|int[] + */ + public function getPointBorderWidth() + { + return $this->pointBorderWidth; + } + + /** + * @param int|int[] $pointBorderWidth + * + * @return $this + */ + public function setPointBorderWidth($pointBorderWidth) + { + $this->pointBorderWidth = $pointBorderWidth; + + return $this; + } + + /** + * @return int|int[] + */ + public function getPointRadius() + { + return $this->pointRadius; + } + + /** + * @param int|int[] $pointRadius + * + * @return $this + */ + public function setPointRadius($pointRadius) + { + $this->pointRadius = $pointRadius; + + return $this; + } + + /** + * @return int|int[] + */ + public function getPointHoverRadius() + { + return $this->pointHoverRadius; + } + + /** + * @param int|int[] $pointHoverRadius + * + * @return $this + */ + public function setPointHoverRadius($pointHoverRadius) + { + $this->pointHoverRadius = $pointHoverRadius; + + return $this; + } + + /** + * @return int|int[] + */ + public function getHitRadius() + { + return $this->hitRadius; + } + + /** + * @param int|int[] $hitRadius + * + * @return $this + */ + public function setHitRadius($hitRadius) + { + $this->hitRadius = $hitRadius; + + return $this; + } + + /** + * @return string|string[] + */ + public function getPointHoverBackgroundColor() + { + return $this->pointHoverBackgroundColor; + } + + /** + * @param string|string[] $pointHoverBackgroundColor + * + * @return $this + */ + public function setPointHoverBackgroundColor($pointHoverBackgroundColor) + { + $this->pointHoverBackgroundColor = $pointHoverBackgroundColor; + + return $this; + } + + /** + * @return string|string[] + */ + public function getPointHoverBorderColor() + { + return $this->pointHoverBorderColor; + } + + /** + * @param string|string[] $pointHoverBorderColor + * + * @return $this + */ + public function setPointHoverBorderColor($pointHoverBorderColor) + { + $this->pointHoverBorderColor = $pointHoverBorderColor; + + return $this; + } + + /** + * @return int|int[] + */ + public function getPointHoverBorderWidth() + { + return $this->pointHoverBorderWidth; + } + + /** + * @param int|int[] $pointHoverBorderWidth + * + * @return $this + */ + public function setPointHoverBorderWidth($pointHoverBorderWidth) + { + $this->pointHoverBorderWidth = $pointHoverBorderWidth; + + return $this; + } + + /** + * @return string|string[] + */ + public function getPointStyle() + { + return $this->pointStyle; + } + + /** + * @param string|string[] $pointStyle + * + * @return $this + */ + public function setPointStyle($pointStyle) + { + $this->pointStyle = $pointStyle; + + return $this; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/DataSet/ScatterDataSet.php b/pandora_console/vendor/artica/phpchartjs/src/DataSet/ScatterDataSet.php new file mode 100644 index 0000000000..0301875e5e --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/DataSet/ScatterDataSet.php @@ -0,0 +1,11 @@ +data as $row) { + /** @var DataSet $row */ + $rows[] = $row->getArrayCopy(); + } + + return $rows; + } + + /** + * @return array + */ + public function jsonSerialize() + { + $rows = []; + foreach ($this->data as $row) { + /** @var DataSet $row */ + $rows[] = $row->jsonSerialize(); + } + + return $rows; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Defaults.php b/pandora_console/vendor/artica/phpchartjs/src/Defaults.php new file mode 100644 index 0000000000..972b1bfb8c --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Defaults.php @@ -0,0 +1,66 @@ +font) === false) { + $this->font = new Fonts(); + } + + return $this->font; + } + + + /** + * Return Watermark. + * + * @return Watermark + */ + public function getWatermark() + { + if (isset($this->watermark) === false) { + $this->watermark = new WaterMark(); + } + + return $this->watermark; + } + + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Delegate/ArraySerializable.php b/pandora_console/vendor/artica/phpchartjs/src/Delegate/ArraySerializable.php new file mode 100644 index 0000000000..e8ed48fd75 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Delegate/ArraySerializable.php @@ -0,0 +1,36 @@ +getArrayCopy(); + } + } + + return $value; + }, get_object_vars($this)); + + // Filter out null values and return the remaining. + return array_filter($currentValues, function ($value, $key) { + return ! is_null($value) && $key !== 'owner'; + }, ARRAY_FILTER_USE_BOTH); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Delegate/JsonSerializable.php b/pandora_console/vendor/artica/phpchartjs/src/Delegate/JsonSerializable.php new file mode 100644 index 0000000000..abf59aa9f6 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Delegate/JsonSerializable.php @@ -0,0 +1,35 @@ +jsonSerialize(); + } elseif ($value instanceof ArraySerializableInterface) { + return $value->getArrayCopy(); + } + + return $value; + }, $this->getArrayCopy()); + } + + /** + * @return array + */ + abstract public function getArrayCopy(); +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Delegate/NumberUtils.php b/pandora_console/vendor/artica/phpchartjs/src/Delegate/NumberUtils.php new file mode 100644 index 0000000000..027b004dba --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Delegate/NumberUtils.php @@ -0,0 +1,40 @@ +data; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options.php b/pandora_console/vendor/artica/phpchartjs/src/Options.php new file mode 100644 index 0000000000..c8c6c8037b --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options.php @@ -0,0 +1,335 @@ +layout)) { + $this->layout = new Layout(); + } + + return $this->layout; + } + + + /** + * @return Elements + */ + public function getElements() + { + if (is_null($this->elements)) { + $this->elements = new Elements(); + } + + return $this->elements; + } + + + /** + * @return Title + */ + public function getTitle() + { + if (is_null($this->title)) { + $this->title = new Title(); + } + + return $this->title; + } + + + /** + * @return Hover + */ + public function getHover() + { + if (is_null($this->hover)) { + $this->hover = new Hover(); + } + + return $this->hover; + } + + + /** + * @return \Laminas\Json\Expr + */ + public function getOnClick() + { + return $this->onClick; + } + + + /** + * @param string $onClick + * + * @return $this + */ + public function setOnClick($onClick) + { + $this->onClick = new Expr(strval($onClick)); + + return $this; + } + + + /** + * @return Scales + */ + public function getScales() + { + if (is_null($this->scales)) { + $this->scales = new Scales(); + } + + return $this->scales; + } + + + /** + * @return Animation + */ + public function getAnimation() + { + if (is_null($this->animation)) { + $this->animation = new Animation(); + } + + return $this->animation; + } + + + /** + * @return bool + */ + public function disableAnimation() + { + $this->animation = false; + + return $this->animation; + } + + + /** + * @return Legend + */ + public function getLegend() + { + if (is_null($this->legend)) { + $this->legend = new Legend(); + } + + return $this->legend; + } + + + /** + * Get plugin. + * + * @return Plugin + */ + public function getPlugins() + { + if ($this->plugins === null) { + $this->plugins = new Plugins(); + } + + return $this->plugins; + } + + + /** + * @return Tooltips + */ + public function getTooltips() + { + if (is_null($this->tooltips)) { + $this->tooltips = new Tooltips(); + } + + return $this->tooltips; + } + + + /** + * @return boolean + */ + public function isResponsive() + { + if (is_null($this->responsive)) { + $this->responsive = true; + } + + return $this->responsive; + } + + + /** + * @param boolean $flag + * + * @return $this + */ + public function setResponsive($flag) + { + $this->responsive = boolval($flag); + + return $this; + } + + + /** + * @return boolean + */ + public function isMaintainAspectRatio() + { + if (is_null($this->maintainAspectRatio)) { + $this->maintainAspectRatio = true; + } + + return $this->maintainAspectRatio; + } + + + /** + * @param boolean $flag + * + * @return $this + */ + public function setMaintainAspectRatio($flag) + { + $this->maintainAspectRatio = boolval($flag); + + return $this; + } + + + /** + * Get Index axis. + * + * @return string + */ + public function getIndexAxis() + { + return $this->indexAxis; + } + + + /** + * Set Index Axis. + * + * @param string $indexAxis Index Axis. + * + * @return $this + */ + public function setIndexAxis($indexAxis) + { + $this->indexAxis = $indexAxis; + + return $this; + } + + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Animation.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Animation.php new file mode 100644 index 0000000000..8293ecd1b3 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Animation.php @@ -0,0 +1,126 @@ +duration; + } + + /** + * @param int $duration + * + * @return $this + */ + public function setDuration($duration) + { + $this->duration = $duration; + + return $this; + } + + /** + * @return string + */ + public function getEasing() + { + return $this->easing; + } + + /** + * @param string $easing + * + * @return $this + */ + public function setEasing($easing) + { + $this->easing = $easing; + + return $this; + } + + /** + * @return Expr + */ + public function getOnProgress() + { + return $this->onProgress; + } + + /** + * @param string $onProgress + * + * @return $this + */ + public function setOnProgress($onProgress) + { + $this->onProgress = new Expr(strval($onProgress)); + + return $this; + } + + /** + * @return Expr + */ + public function getOnComplete() + { + return $this->onComplete; + } + + /** + * @param string $onComplete + * + * @return $this + */ + public function setOnComplete($onComplete) + { + $this->onComplete = new Expr(strval($onComplete)); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Animation/PieAnimation.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Animation/PieAnimation.php new file mode 100644 index 0000000000..fd20911ed2 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Animation/PieAnimation.php @@ -0,0 +1,62 @@ +animateRotate; + } + + /** + * @param bool $animateRotate + * + * @return PieAnimation + */ + public function setAnimateRotate($animateRotate) + { + $this->animateRotate = $animateRotate; + + return $this; + } + + /** + * @return bool + */ + public function isAnimateScale() + { + return $this->animateScale; + } + + /** + * @param bool $animateScale + * + * @return PieAnimation + */ + public function setAnimateScale($animateScale) + { + $this->animateScale = $animateScale; + + return $this; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/BarOptions.php b/pandora_console/vendor/artica/phpchartjs/src/Options/BarOptions.php new file mode 100644 index 0000000000..6d3d42cd97 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/BarOptions.php @@ -0,0 +1,14 @@ +display; + } + + + /** + * @param string $display + * + * @return $this + */ + public function setDisplay($display) + { + $this->display = strval($display); + + return $this; + } + + + /** + * @return string + */ + public function getColor() + { + return $this->color; + } + + + /** + * @param string $color + * + * @return $this + */ + public function setColor($color) + { + $this->color = strval($color); + + return $this; + } + + + /** + * @return string + */ + public function getAnchor() + { + return $this->anchor; + } + + + /** + * @param string $anchor + * + * @return $this + */ + public function setAnchor($anchor) + { + $this->anchor = strval($anchor); + + return $this; + } + + + /** + * @return integer + */ + public function getOffset() + { + return $this->offset; + } + + + /** + * @param integer $offset + * + * @return $this + */ + public function setOffset($offset) + { + $this->offset = intval($offset); + + return $this; + } + + + /** + * @return string + */ + public function getAlign() + { + return $this->align; + } + + + /** + * @param string $align + * + * @return $this + */ + public function setAlign($align) + { + $this->align = strval($align); + + return $this; + } + + + /** + * @return Expr + */ + public function getFormatter() + { + return $this->formatter; + } + + + /** + * @param string $formatter + * + * @return $this + */ + public function setFormatter($formatter) + { + $this->formatter = new Expr(strval($formatter)); + + return $this; + } + + + /** + * @return boolean + */ + public function getClamp() + { + return $this->clamp; + } + + + /** + * @param boolean $clamp + * + * @return $this + */ + public function setClamp($clamp) + { + $this->clamp = boolval($clamp); + + return $this; + } + + + /** + * @return boolean + */ + public function getClip() + { + return $this->clip; + } + + + /** + * @param boolean $clip + * + * @return $this + */ + public function setClip($clip) + { + $this->clip = boolval($clip); + + return $this; + } + + /** + * Return Font. + * + * @return Font + */ + public function getFonts() + { + if (isset($this->font) === false) { + $this->font = new Fonts(); + } + + return $this->font; + } + + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php new file mode 100644 index 0000000000..116fc46758 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php @@ -0,0 +1,129 @@ +rectangle; + } + + /** + * @return Rectangle + */ + public function rectangle() + { + if (is_null($this->rectangle)) { + $this->rectangle = new Rectangle(); + } + + return $this->rectangle; + } + + /** + * @return Line + */ + public function getLine() + { + return $this->line; + } + + /** + * @return Line + */ + public function line() + { + if (is_null($this->line)) { + $this->line = new Line(); + } + + return $this->line; + } + + /** + * @return Point + */ + public function getPoint() + { + return $this->point; + } + + /** + * @return Point + */ + public function point() + { + if (is_null($this->point)) { + $this->point = new Point(); + } + + return $this->point; + } + + /** + * @return Arc + */ + public function getArc() + { + return $this->arc; + } + + /** + * @return Arc + */ + public function arc() + { + if (is_null($this->arc)) { + $this->arc = new Arc(); + } + + return $this->arc; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Arc.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Arc.php new file mode 100644 index 0000000000..a44cb9e295 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Arc.php @@ -0,0 +1,109 @@ +backgroundColor; + } + + /** + * @param string $backgroundColor + * + * @return Arc + */ + public function setBackgroundColor($backgroundColor) + { + $this->backgroundColor = is_null($backgroundColor) ? null : strval($backgroundColor); + + return $this; + } + + /** + * @return string + */ + public function getBorderColor() + { + return $this->borderColor; + } + + /** + * @param string $borderColor + * + * @return Arc + */ + public function setBorderColor($borderColor) + { + $this->borderColor = is_null($borderColor) ? null : strval($borderColor); + + return $this; + } + + /** + * @return int + */ + public function getBorderWidth() + { + return $this->borderWidth; + } + + /** + * @param int $borderWidth + * + * @return Arc + */ + public function setBorderWidth($borderWidth) + { + $this->borderWidth = intval($borderWidth); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Line.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Line.php new file mode 100644 index 0000000000..66f9bf3cd8 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Line.php @@ -0,0 +1,323 @@ +tension; + } + + /** + * @param float $tension + * @return Line + */ + public function setTension($tension) + { + $this->tension = floatval($tension); + return $this; + } + + /** + * @return string + */ + public function getBackgroundColor() + { + return $this->backgroundColor; + } + + /** + * @param string $backgroundColor + * @return Line + */ + public function setBackgroundColor($backgroundColor) + { + $this->backgroundColor = is_null($backgroundColor) ? null : strval($backgroundColor); + return $this; + } + + /** + * @return int + */ + public function getBorderWidth() + { + return $this->borderWidth; + } + + /** + * @param int $borderWidth + * @return Line + */ + public function setBorderWidth($borderWidth) + { + $this->borderWidth = intval($borderWidth); + return $this; + } + + /** + * @return string + */ + public function getBorderColor() + { + return $this->borderColor; + } + + /** + * @param string $borderColor + * @return Line + */ + public function setBorderColor($borderColor) + { + $this->borderColor = is_null($borderColor) ? null : strval($borderColor); + return $this; + } + + /** + * @return string + */ + public function getBorderCapStyle() + { + return $this->borderCapStyle; + } + + /** + * @param string $borderCapStyle + * @return Line + */ + public function setBorderCapStyle($borderCapStyle) + { + $this->borderCapStyle = is_null($borderCapStyle) ? null : strval($borderCapStyle); + return $this; + } + + /** + * @return int[] + */ + public function getBorderDash() + { + return $this->borderDash; + } + + /** + * @param int[] $borderDash + * @return Line + */ + public function setBorderDash($borderDash) + { + if (is_array($borderDash)) { + array_walk_recursive( + $borderDash, + function (&$value) { + $value = intval($value); + } + ); + $this->borderDash = $borderDash; + } + return $this; + } + + /** + * @return float + */ + public function getBorderDashOffset() + { + return $this->borderDashOffset; + } + + /** + * @param float $borderDashOffset + * @return Line + */ + public function setBorderDashOffset($borderDashOffset) + { + $this->borderDashOffset = floatval($borderDashOffset); + return $this; + } + + /** + * @return string + */ + public function getBorderJoinStyle() + { + return $this->borderJoinStyle; + } + + /** + * @param string $borderJoinStyle + * @return Line + */ + public function setBorderJoinStyle($borderJoinStyle) + { + $this->borderJoinStyle = is_null($borderJoinStyle) ? null : strval($borderJoinStyle); + return $this; + } + + /** + * @return bool + */ + public function isCapBezierPoints() + { + return $this->capBezierPoints; + } + + /** + * @param bool $capBezierPoints + * @return Line + */ + public function setCapBezierPoints($capBezierPoints) + { + $this->capBezierPoints = boolval($capBezierPoints); + return $this; + } + + /** + * @return bool|string + */ + public function getFill() + { + return $this->fill; + } + + /** + * @param bool|string $fill + * @return Line + */ + public function setFill($fill) + { + $this->fill = is_null($fill) ? null : (is_bool($fill) ? $fill : strval($fill)); + return $this; + } + + /** + * @return bool + */ + public function isStepped() + { + return $this->stepped; + } + + /** + * @param bool $stepped + * @return Line + */ + public function setStepped($stepped) + { + $this->stepped = boolval($stepped); + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Point.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Point.php new file mode 100644 index 0000000000..3873656687 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Point.php @@ -0,0 +1,288 @@ +radius; + } + + /** + * @param int $radius + * + * @return Point + */ + public function setRadius($radius) + { + $this->radius = intval($radius); + + return $this; + } + + /** + * @return string + */ + public function getPointStyle() + { + return $this->pointStyle; + } + + /** + * @param string $pointStyle + * + * @return Point + */ + public function setPointStyle($pointStyle) + { + $this->pointStyle = is_null($pointStyle) ? null : strval($pointStyle); + + return $this; + } + + /** + * @return int + */ + public function getRotation() + { + return $this->rotation; + } + + /** + * @param int $rotation + * + * @return Point + */ + public function setRotation($rotation) + { + $this->rotation = intval($rotation); + + return $this; + } + + /** + * @return string + */ + public function getBackgroundColor() + { + return $this->backgroundColor; + } + + /** + * @param string $backgroundColor + * + * @return Point + */ + public function setBackgroundColor($backgroundColor) + { + $this->backgroundColor = is_null($backgroundColor) ? null : strval($backgroundColor); + + return $this; + } + + /** + * @return int + */ + public function getBorderWidth() + { + return $this->borderWidth; + } + + /** + * @param int $borderWidth + * + * @return Point + */ + public function setBorderWidth($borderWidth) + { + $this->borderWidth = intval($borderWidth); + + return $this; + } + + /** + * @return string + */ + public function getBorderColor() + { + return $this->borderColor; + } + + /** + * @param string $borderColor + * + * @return Point + */ + public function setBorderColor($borderColor) + { + $this->borderColor = is_null($borderColor) ? null : strval($borderColor); + + return $this; + } + + /** + * @return int + */ + public function getHitRadius() + { + return $this->hitRadius; + } + + /** + * @param int $hitRadius + * + * @return Point + */ + public function setHitRadius($hitRadius) + { + $this->hitRadius = intval($hitRadius); + + return $this; + } + + /** + * @return int + */ + public function getHoverRadius() + { + return $this->hoverRadius; + } + + /** + * @param int $hoverRadius + * + * @return Point + */ + public function setHoverRadius($hoverRadius) + { + $this->hoverRadius = intval($hoverRadius); + + return $this; + } + + /** + * @return int + */ + public function getHoverBorderWidth() + { + return $this->hoverBorderWidth; + } + + /** + * @param int $hoverBorderWidth + * + * @return Point + */ + public function setHoverBorderWidth($hoverBorderWidth) + { + $this->hoverBorderWidth = intval($hoverBorderWidth); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Rectangle.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Rectangle.php new file mode 100644 index 0000000000..ccd35f73a0 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Rectangle.php @@ -0,0 +1,142 @@ +backgroundColor; + } + + /** + * @param string $backgroundColor + * + * @return Rectangle + */ + public function setBackgroundColor($backgroundColor) + { + $this->backgroundColor = is_null($backgroundColor) ? null : strval($backgroundColor); + + return $this; + } + + /** + * @return int + */ + public function getBorderWidth() + { + return $this->borderWidth; + } + + /** + * @param int $borderWidth + * + * @return Rectangle + */ + public function setBorderWidth($borderWidth) + { + $this->borderWidth = intval($borderWidth); + + return $this; + } + + /** + * @return string + */ + public function getBorderColor() + { + return $this->borderColor; + } + + /** + * @param string $borderColor + * + * @return Rectangle + */ + public function setBorderColor($borderColor) + { + $this->borderColor = is_null($borderColor) ? null : strval($borderColor); + + return $this; + } + + /** + * @return string + */ + public function getBorderSkipped() + { + return $this->borderSkipped; + } + + /** + * @param string $borderSkipped + * + * @return Rectangle + */ + public function setBorderSkipped($borderSkipped) + { + $this->borderSkipped = is_null($borderSkipped) ? null : strval($borderSkipped); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Fonts.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Fonts.php new file mode 100644 index 0000000000..5f5a7c7746 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Fonts.php @@ -0,0 +1,163 @@ +size; + } + + + /** + * @param integer $size + * + * @return $this + */ + public function setSize($size) + { + $this->size = intval($size); + + return $this; + } + + + /** + * @return string + */ + public function getFamily() + { + return $this->family; + } + + + /** + * @param string $family + * + * @return $this + */ + public function setFamily($family) + { + $this->family = strval($family); + + return $this; + } + + + /** + * @return string + */ + public function getColor() + { + return $this->color; + } + + + /** + * @param string $color + * + * @return $this + */ + public function setColor($color) + { + $this->color = strval($color); + + return $this; + } + + + /** + * @return string + */ + public function getStyle() + { + return $this->style; + } + + + /** + * @param string $style + * + * @return $this + */ + public function setStyle($style) + { + $this->style = strval($style); + + return $this; + } + + + /** + * @return string + */ + public function getWeight() + { + return $this->weight; + } + + + /** + * @param string $weight + * + * @return $this + */ + public function setWeight($weight) + { + $this->weight = strval($weight); + + return $this; + } + + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Hover.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Hover.php new file mode 100644 index 0000000000..36cf1474f1 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Hover.php @@ -0,0 +1,134 @@ +mode; + } + + /** + * @param string $mode + * + * @return $this + */ + public function setMode($mode) + { + $this->mode = strval($mode); + + return $this; + } + + /** + * @return bool + */ + public function isIntersect() + { + return $this->intersect; + } + + /** + * @return bool + */ + public function getIntersect() + { + return $this->intersect; + } + + /** + * @param bool $intersect + * + * @return $this + */ + public function setIntersect($intersect) + { + $this->intersect = ! ! $intersect; + + return $this; + } + + /** + * @return int + */ + public function getAnimationDuration() + { + return $this->animationDuration; + } + + /** + * @param int $animationDuration + * + * @return $this + */ + public function setAnimationDuration($animationDuration) + { + $this->animationDuration = intval($animationDuration); + + return $this; + } + + /** + * @return \Laminas\Json\Expr + */ + public function getOnHover() + { + return $this->onHover; + } + + /** + * @param Expr $onHover + * + * @return $this + */ + public function setOnHover($onHover) + { + $this->onHover = new Expr(strval($onHover)); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Layout.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Layout.php new file mode 100644 index 0000000000..b41a20cc37 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Layout.php @@ -0,0 +1,59 @@ +padding = intval($padding); + } + + /** + * @return int|Padding + */ + public function getPadding() + { + return $this->padding; + } + + /** + * @return Padding + */ + public function padding() + { + if (is_null($this->padding)) { + $this->padding = new Padding(); + } + + return $this->padding; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Layout/Padding.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Layout/Padding.php new file mode 100644 index 0000000000..0b62c162e4 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Layout/Padding.php @@ -0,0 +1,124 @@ +bottom; + } + + /** + * @param int $bottom + * + * @return $this + */ + public function setBottom($bottom) + { + $this->bottom = intval($bottom); + + return $this; + } + + /** + * @return int + */ + public function getLeft() + { + return $this->left; + } + + /** + * @param int $left + * + * @return $this + */ + public function setLeft($left) + { + $this->left = intval($left); + + return $this; + } + + /** + * @return int + */ + public function getRight() + { + return $this->right; + } + + /** + * @param int $right + * + * @return $this + */ + public function setRight($right) + { + $this->right = intval($right); + + return $this; + } + + /** + * @return int + */ + public function getTop() + { + return $this->top; + } + + /** + * @param int $top + * + * @return $this + */ + public function setTop($top) + { + $this->top = intval($top); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Legend.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Legend.php new file mode 100644 index 0000000000..0cb0ff3352 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Legend.php @@ -0,0 +1,244 @@ +display; + } + + + /** + * @param boolean $display + * + * @return $this + */ + public function setDisplay($display) + { + $this->display = boolval($display); + + return $this; + } + + + /** + * @return string + */ + public function getPosition() + { + return $this->position; + } + + + /** + * @param string $position + * + * @return $this + */ + public function setPosition($position) + { + $this->position = strval($position); + + return $this; + } + + + /** + * @return boolean + */ + public function isFullWidth() + { + return $this->fullWidth; + } + + + /** + * @param boolean $fullWidth + * + * @return $this + */ + public function setFullWidth($fullWidth) + { + $this->fullWidth = boolval($fullWidth); + + return $this; + } + + + /** + * @return Expr + */ + public function getOnClick() + { + return $this->onClick; + } + + + /** + * @param string $onClick + * + * @return $this + */ + public function setOnClick($onClick) + { + $this->onClick = new Expr(strval($onClick)); + + return $this; + } + + + /** + * @return Expr + */ + public function getOnHover() + { + return $this->onHover; + } + + + /** + * @param string $onHover + * + * @return $this + */ + public function setOnHover($onHover) + { + $this->onHover = new Expr(strval($onHover)); + + return $this; + } + + + /** + * @return Labels + */ + public function labels() + { + if (is_null($this->labels)) { + $this->labels = new LegendLabels(); + } + + return $this->labels; + } + + + /** + * @return boolean + */ + public function isReverse() + { + return $this->reverse; + } + + + /** + * @param boolean $reverse + * + * @return $this + */ + public function setReverse($reverse) + { + $this->reverse = boolval($reverse); + + return $this; + } + + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } + + + /** + * Get align. + * + * @return string + */ + public function getAlign() + { + return $this->align; + } + + + /** + * Set align. + * + * @param string $align Align. + * + * @return $this + */ + public function setAlign(string $align) + { + $this->align = $align; + + return $this; + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Legend/Labels.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Legend/Labels.php new file mode 100644 index 0000000000..960de236ef --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Legend/Labels.php @@ -0,0 +1,158 @@ +boxWidth; + } + + + /** + * @param integer $boxWidth + * + * @return Labels + */ + public function setBoxWidth($boxWidth) + { + $this->boxWidth = intval($boxWidth); + + return $this; + } + + + /** + * Return Font. + * + * @return Font + */ + public function getFonts() + { + if (isset($this->font) === false) { + $this->font = new Fonts(); + } + + return $this->font; + } + + + /** + * @return integer + */ + public function getPadding() + { + return $this->padding; + } + + + /** + * @param integer $padding + * + * @return Labels + */ + public function setPadding($padding) + { + $this->padding = intval($padding); + + return $this; + } + + + /** + * @return Expr + */ + public function getGenerateLabels() + { + return $this->generateLabels; + } + + + /** + * @param string $generateLabels + * + * @return Labels + */ + public function setGenerateLabels($generateLabels) + { + $this->generateLabels = new Expr(strval($generateLabels)); + + return $this; + } + + + /** + * @return boolean + */ + public function isUsePointStyle() + { + return $this->usePointStyle; + } + + + /** + * @param boolean $usePointStyle + * + * @return Labels + */ + public function setUsePointStyle($usePointStyle) + { + $this->usePointStyle = !!$usePointStyle; + + return $this; + } + + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Legend/PieLegend.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Legend/PieLegend.php new file mode 100644 index 0000000000..bbec2be898 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Legend/PieLegend.php @@ -0,0 +1,13 @@ +animation)) { + $this->animation = new PieAnimation(); + } + + return $this->animation; + } + + /** + * @return int + */ + public function getCutoutPercentage() + { + return $this->cutoutPercentage; + } + + /** + * @param int $cutoutPercentage + * + * @return $this + */ + public function setCutoutPercentage($cutoutPercentage) + { + $this->cutoutPercentage = $cutoutPercentage; + + return $this; + } + + /** + * @return float + */ + public function getRotation() + { + return $this->rotation; + } + + /** + * @param float $rotation + * + * @return $this + */ + public function setRotation($rotation) + { + $this->rotation = $rotation; + + return $this; + } + + /** + * @return float + */ + public function getCircumference() + { + return $this->circumference; + } + + /** + * @param float $circumference + * + * @return $this + */ + public function setCircumference($circumference) + { + $this->circumference = $circumference; + + return $this; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Plugins.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Plugins.php new file mode 100644 index 0000000000..f1dc674a2a --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Plugins.php @@ -0,0 +1,73 @@ +legend) === false) { + $this->legend = new Legend(); + } + + return $this->legend; + } + + /** + * Return Title. + * + * @return Title + */ + public function getTitle() + { + if (isset($this->title) === false) { + $this->title = new Title(); + } + + return $this->title; + } + + + /** + * Return Data label. + * + * @return DataLabel + */ + public function getDataLabel() + { + if (isset($this->datalabels) === false) { + $this->datalabels = new DataLabel(); + } + + return $this->datalabels; + } + + + /** + * Serialize. + * + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/PolarAreaOptions.php b/pandora_console/vendor/artica/phpchartjs/src/Options/PolarAreaOptions.php new file mode 100644 index 0000000000..21b2f1bb35 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/PolarAreaOptions.php @@ -0,0 +1,14 @@ +type; + } + + /** + * @param string $type + * + * @return $this + */ + public function setType($type) + { + $this->type = $type; + + return $this; + } + + + /** + * @return string + */ + public function getBounds() + { + return $this->bounds; + } + + /** + * @param string $bounds + * + * @return $this + */ + public function setBounds($bounds) + { + $this->bounds = $bounds; + + return $this; + } + + /** + * @return bool + */ + public function isDisplay() + { + return $this->display; + } + + /** + * @param bool $display + * + * @return $this + */ + public function setDisplay($display) + { + $this->display = $display; + + return $this; + } + + /** + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * @param string $id + * + * @return $this + */ + public function setId($id) + { + $this->id = strval($id); + + return $this; + } + + /** + * @return bool + */ + public function isStacked() + { + return $this->stacked; + } + + /** + * @param bool $stacked + * + * @return $this + */ + public function setStacked($stacked) + { + $this->stacked = ! ! $stacked; + + return $this; + } + + /** + * @return int + */ + public function getBarThickness() + { + return $this->barThickness; + } + + /** + * @param int $barThickness + * + * @return $this + */ + public function setBarThickness($barThickness) + { + $this->barThickness = intval($barThickness); + + return $this; + } + + /** + * @return string + */ + public function getPosition() + { + return $this->position; + } + + /** + * @param string $position + * + * @return $this + */ + public function setPosition($position) + { + $this->position = strval($position); + + return $this; + } + + /** + * @return string + */ + public function getBeforeUpdate() + { + return $this->beforeUpdate; + } + + /** + * @param string $beforeUpdate + * + * @return $this + */ + public function setBeforeUpdate($beforeUpdate) + { + $this->beforeUpdate = strval($beforeUpdate); + + return $this; + } + + /** + * @return string + */ + public function getBeforeSetDimensions() + { + return $this->beforeSetDimensions; + } + + /** + * @param string $beforeSetDimensions + * + * @return $this + */ + public function setBeforeSetDimensions($beforeSetDimensions) + { + $this->beforeSetDimensions = strval($beforeSetDimensions); + + return $this; + } + + /** + * @return string + */ + public function getAfterSetDimensions() + { + return $this->afterSetDimensions; + } + + /** + * @param string $afterSetDimensions + * + * @return $this + */ + public function setAfterSetDimensions($afterSetDimensions) + { + $this->afterSetDimensions = strval($afterSetDimensions); + + return $this; + } + + /** + * @return string + */ + public function getBeforeDataLimits() + { + return $this->beforeDataLimits; + } + + /** + * @param string $beforeDataLimits + * + * @return $this + */ + public function setBeforeDataLimits($beforeDataLimits) + { + $this->beforeDataLimits = strval($beforeDataLimits); + + return $this; + } + + /** + * @return string + */ + public function getAfterDataLimits() + { + return $this->afterDataLimits; + } + + /** + * @param string $afterDataLimits + * + * @return $this + */ + public function setAfterDataLimits($afterDataLimits) + { + $this->afterDataLimits = strval($afterDataLimits); + + return $this; + } + + /** + * @return string + */ + public function getBeforeBuildTicks() + { + return $this->beforeBuildTicks; + } + + /** + * @param string $beforeBuildTicks + * + * @return $this + */ + public function setBeforeBuildTicks($beforeBuildTicks) + { + $this->beforeBuildTicks = strval($beforeBuildTicks); + + return $this; + } + + /** + * @return string + */ + public function getAfterBuildTicks() + { + return $this->afterBuildTicks; + } + + /** + * @param string $afterBuildTicks + * + * @return $this + */ + public function setAfterBuildTicks($afterBuildTicks) + { + $this->afterBuildTicks = strval($afterBuildTicks); + + return $this; + } + + /** + * @return string + */ + public function getBeforeTickToLabelConversion() + { + return $this->beforeTickToLabelConversion; + } + + /** + * @param string $beforeTickToLabelConversion + * + * @return $this + */ + public function setBeforeTickToLabelConversion($beforeTickToLabelConversion) + { + $this->beforeTickToLabelConversion = strval($beforeTickToLabelConversion); + + return $this; + } + + /** + * @return string + */ + public function getAfterTickToLabelConversion() + { + return $this->afterTickToLabelConversion; + } + + /** + * @param string $afterTickToLabelConversion + * + * @return $this + */ + public function setAfterTickToLabelConversion($afterTickToLabelConversion) + { + $this->afterTickToLabelConversion = strval($afterTickToLabelConversion); + + return $this; + } + + /** + * @return string + */ + public function getBeforeCalculateTickRotation() + { + return $this->beforeCalculateTickRotation; + } + + /** + * @param string $beforeCalculateTickRotation + * + * @return $this + */ + public function setBeforeCalculateTickRotation($beforeCalculateTickRotation) + { + $this->beforeCalculateTickRotation = strval($beforeCalculateTickRotation); + + return $this; + } + + /** + * @return string + */ + public function getAfterCalculateTickRotation() + { + return $this->afterCalculateTickRotation; + } + + /** + * @param string $afterCalculateTickRotation + * + * @return $this + */ + public function setAfterCalculateTickRotation($afterCalculateTickRotation) + { + $this->afterCalculateTickRotation = strval($afterCalculateTickRotation); + + return $this; + } + + /** + * @return string + */ + public function getBeforeFit() + { + return $this->beforeFit; + } + + /** + * @param string $beforeFit + * + * @return $this + */ + public function setBeforeFit($beforeFit) + { + $this->beforeFit = strval($beforeFit); + + return $this; + } + + /** + * @return string + */ + public function getAfterFit() + { + return $this->afterFit; + } + + /** + * @param string $afterFit + * + * @return $this + */ + public function setAfterFit($afterFit) + { + $this->afterFit = strval($afterFit); + + return $this; + } + + /** + * @return string + */ + public function getAfterUpdate() + { + return $this->afterUpdate; + } + + /** + * @param string $afterUpdate + * + * @return $this + */ + public function setAfterUpdate($afterUpdate) + { + $this->afterUpdate = strval($afterUpdate); + + return $this; + } + + /** + * @return GridLines + */ + public function getGrid() + { + return $this->grid; + } + + /** + * @return GridLines + */ + public function grid() + { + if (is_null($this->grid)) { + $this->grid = new GridLines(); + } + + return $this->grid; + } + + /** + * @return ScaleLabel + */ + public function getScaleLabel() + { + return $this->scaleLabel; + } + + /** + * @return ScaleLabel + */ + public function scaleLabel() + { + if (is_null($this->scaleLabel)) { + $this->scaleLabel = new ScaleLabel(); + } + + return $this->scaleLabel; + } + + /** + * @return Ticks + */ + public function getTicks() + { + return $this->ticks; + } + + /** + * @return Ticks + */ + public function ticks() + { + if (is_null($this->ticks)) { + $this->ticks = new Ticks(); + } + + return $this->ticks; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Scales.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales.php new file mode 100644 index 0000000000..167b43e111 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales.php @@ -0,0 +1,78 @@ +x)) { + $this->x = new XAxis(); + } + + return $this->x; + } + + /** + * @return YAxis + */ + public function getY() + { + if (is_null($this->y)) { + $this->y = new YAxis(); + } + + return $this->y; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/GridLines.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/GridLines.php new file mode 100644 index 0000000000..5af702fe8d --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/GridLines.php @@ -0,0 +1,339 @@ +display; + } + + /** + * @param bool $display + * + * @return $this + */ + public function setDisplay($display) + { + $this->display = $display; + + return $this; + } + + /** + * @return string|string[] + */ + public function getColor() + { + return $this->color; + } + + /** + * @param string|string[] $color + * + * @return $this + */ + public function setColor($color) + { + if (is_array($color)) { + $this->color = $this->recursiveToString($color); + } else { + $this->color = is_null($color) ? null : strval($color); + } + + return $this; + } + + /** + * @return float[]|null + */ + public function getBorderDash() + { + return $this->borderDash; + } + + /** + * @param float[] $borderDash + * + * @return $this + */ + public function setBorderDash($borderDash) + { + if (is_array($borderDash)) { + $this->borderDash = $this->recursiveToFloat($borderDash); + } + + return $this; + } + + /** + * @return float + */ + public function getBorderDashOffset() + { + return $this->borderDashOffset; + } + + /** + * @param float $borderDashOffset + * + * @return $this + */ + public function setBorderDashOffset($borderDashOffset) + { + $this->borderDashOffset = floatval($borderDashOffset); + + return $this; + } + + /** + * @return int|int[] + */ + public function getLineWidth() + { + return $this->lineWidth; + } + + /** + * @param int|int[] $lineWidth + * + * @return $this + */ + public function setLineWidth($lineWidth) + { + if (is_array($lineWidth)) { + $this->lineWidth = $this->recursiveToInt($lineWidth); + } else { + $this->lineWidth = is_null($lineWidth) ? null : intval($lineWidth); + } + + return $this; + } + + /** + * @return bool + */ + public function isDrawBorder() + { + return $this->drawBorder; + } + + /** + * @param bool $drawBorder + * + * @return $this + */ + public function setDrawBorder($drawBorder) + { + $this->drawBorder = boolval($drawBorder); + + return $this; + } + + /** + * @return bool + */ + public function isDrawOnChartArea() + { + return $this->drawOnChartArea; + } + + /** + * @param bool $drawOnChartArea + * + * @return $this + */ + public function setDrawOnChartArea($drawOnChartArea) + { + $this->drawOnChartArea = boolval($drawOnChartArea); + + return $this; + } + + /** + * @return bool + */ + public function isDrawTicks() + { + return $this->drawTicks; + } + + /** + * @param bool $drawTicks + * + * @return $this + */ + public function setDrawTicks($drawTicks) + { + $this->drawTicks = boolval($drawTicks); + + return $this; + } + + /** + * @return int + */ + public function getTickMarkLength() + { + return $this->tickMarkLength; + } + + /** + * @param int $tickMarkLength + * + * @return $this + */ + public function setTickMarkLength($tickMarkLength) + { + $this->tickMarkLength = intval($tickMarkLength); + + return $this; + } + + /** + * @return int + */ + public function getZeroLineWidth() + { + return $this->zeroLineWidth; + } + + /** + * @param int $zeroLineWidth + * + * @return $this + */ + public function setZeroLineWidth($zeroLineWidth) + { + $this->zeroLineWidth = intval($zeroLineWidth); + + return $this; + } + + /** + * @return string + */ + public function getZeroLineColor() + { + return $this->zeroLineColor; + } + + /** + * @param string $zeroLineColor + * + * @return $this + */ + public function setZeroLineColor($zeroLineColor) + { + $this->zeroLineColor = is_null($zeroLineColor) ? null : strval($zeroLineColor); + + return $this; + } + + /** + * @return bool + */ + public function isOffsetGridLines() + { + return $this->offsetGridLines; + } + + /** + * @param bool $offsetGridLines + * + * @return $this + */ + public function setOffsetGridLines($offsetGridLines) + { + $this->offsetGridLines = boolval($offsetGridLines); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/ScaleLabel.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/ScaleLabel.php new file mode 100644 index 0000000000..b74a4a6220 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/ScaleLabel.php @@ -0,0 +1,175 @@ +display; + } + + /** + * @param bool $display + * + * @return $this + */ + public function setDisplay($display) + { + $this->display = ! ! $display; + + return $this; + } + + /** + * @return string + */ + public function getLabelString() + { + return $this->labelString; + } + + /** + * @param string $labelString + * + * @return $this + */ + public function setLabelString($labelString) + { + $this->labelString = strval($labelString); + + return $this; + } + + /** + * @return string + */ + public function getFontColor() + { + return $this->fontColor; + } + + /** + * @param string $fontColor + * + * @return $this + */ + public function setFontColor($fontColor) + { + $this->fontColor = strval($fontColor); + + return $this; + } + + /** + * @return string + */ + public function getFontFamily() + { + return $this->fontFamily; + } + + /** + * @param string $fontFamily + * + * @return $this + */ + public function setFontFamily($fontFamily) + { + $this->fontFamily = strval($fontFamily); + + return $this; + } + + /** + * @return int + */ + public function getFontSize() + { + return $this->fontSize; + } + + /** + * @param int $fontSize + * + * @return $this + */ + public function setFontSize($fontSize) + { + $this->fontSize = intval($fontSize); + + return $this; + } + + /** + * @return string + */ + public function getFontStyle() + { + return $this->fontStyle; + } + + /** + * @param string $fontStyle + * + * @return $this + */ + public function setFontStyle($fontStyle) + { + $this->fontStyle = strval($fontStyle); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/Ticks.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/Ticks.php new file mode 100644 index 0000000000..00991061b8 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/Ticks.php @@ -0,0 +1,396 @@ +suggestedMin; + } + + /** + * @param float $suggestedMin + * + * @return $this + */ + public function setSuggestedMin($suggestedMin) + { + $this->suggestedMin = floatval($suggestedMin); + + return $this; + } + + /** + * @return bool + */ + public function isBeginAtZero() + { + return $this->beginAtZero; + } + + /** + * @param bool $beginAtZero + * + * @return $this + */ + public function setBeginAtZero($beginAtZero) + { + $this->beginAtZero = boolval($beginAtZero); + + return $this; + } + + /** + * @return float + */ + public function getStepSize() + { + return $this->stepSize; + } + + /** + * @param float $stepSize + * + * @return $this + */ + public function setStepSize($stepSize) + { + $this->stepSize = floatval($stepSize); + + return $this; + } + + /** + * @return bool + */ + public function isAutoSkip() + { + return $this->autoSkip; + } + + /** + * @param bool $autoSkip + * + * @return $this + */ + public function setAutoSkip($autoSkip) + { + $this->autoSkip = boolval($autoSkip); + + return $this; + } + + /** + * @return int + */ + public function getAutoSkipPadding() + { + return $this->autoSkipPadding; + } + + /** + * @param int $autoSkipPadding + * + * @return $this + */ + public function setAutoSkipPadding($autoSkipPadding) + { + $this->autoSkipPadding = intval($autoSkipPadding); + + return $this; + } + + /** + * @return Expr + */ + public function getCallback() + { + return $this->callback; + } + + /** + * @param string $callback + * + * @return $this + */ + public function setCallback($callback) + { + $this->callback = new Expr(strval($callback)); + + return $this; + } + + /** + * @return bool + */ + public function isDisplay() + { + return $this->display; + } + + /** + * @param bool $display + * + * @return $this + */ + public function setDisplay($display) + { + $this->display = boolval($display); + + return $this; + } + + /** + * Return Font. + * + * @return Font + */ + public function getFonts() + { + if (isset($this->font) === false) { + $this->font = new Fonts(); + } + + return $this->font; + } + + /** + * @return int + */ + public function getLabelOffset() + { + return $this->labelOffset; + } + + /** + * @param int $labelOffset + * + * @return $this + */ + public function setLabelOffset($labelOffset) + { + $this->labelOffset = intval($labelOffset); + + return $this; + } + + /** + * @return int + */ + public function getMaxRotation() + { + return $this->maxRotation; + } + + /** + * @param int $maxRotation + * + * @return $this + */ + public function setMaxRotation($maxRotation) + { + $this->maxRotation = intval($maxRotation); + + return $this; + } + + /** + * @return int + */ + public function getMinRotation() + { + return $this->minRotation; + } + + /** + * @param int $minRotation + * + * @return $this + */ + public function setMinRotation($minRotation) + { + $this->minRotation = intval($minRotation); + + return $this; + } + + /** + * @return bool + */ + public function isMirror() + { + return $this->mirror; + } + + /** + * @param bool $mirror + * + * @return $this + */ + public function setMirror($mirror) + { + $this->mirror = boolval($mirror); + + return $this; + } + + /** + * @return int + */ + public function getPadding() + { + return $this->padding; + } + + /** + * @param int $padding + * + * @return $this + */ + public function setPadding($padding) + { + $this->padding = intval($padding); + + return $this; + } + + /** + * @return bool + */ + public function isReverse() + { + return $this->reverse; + } + + /** + * @param bool $reverse + * + * @return $this + */ + public function setReverse($reverse) + { + $this->reverse = boolval($reverse); + + return $this; + } + + /** + * @return int + */ + public function getMax() + { + return $this->max; + } + + /** + * @param int $max + * + * @return $this + */ + public function setMax($max) + { + $this->max = intval($max); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/XAxis.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/XAxis.php new file mode 100644 index 0000000000..cf1da92e46 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/XAxis.php @@ -0,0 +1,71 @@ +categoryPercentage; + } + + /** + * @param float $categoryPercentage + * + * @return $this + */ + public function setCategoryPercentage($categoryPercentage) + { + $this->categoryPercentage = floatval($categoryPercentage); + + return $this; + } + + /** + * @return float + */ + public function getBarPercentage() + { + return $this->barPercentage; + } + + /** + * @param float $barPercentage + * + * @return $this + */ + public function setBarPercentage($barPercentage) + { + $this->barPercentage = floatval($barPercentage); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/XAxisCollection.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/XAxisCollection.php new file mode 100644 index 0000000000..1033e574b3 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/XAxisCollection.php @@ -0,0 +1,37 @@ +data as $row) { + /** @var XAxis $row */ + $rows[] = $row->getArrayCopy(); + } + + return $rows; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/YAxis.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/YAxis.php new file mode 100644 index 0000000000..7aad0fbd4e --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Scales/YAxis.php @@ -0,0 +1,13 @@ +data as $row) { + /** @var YAxis $row */ + $rows[] = $row->getArrayCopy(); + } + + return $rows; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/ScatterOptions.php b/pandora_console/vendor/artica/phpchartjs/src/Options/ScatterOptions.php new file mode 100644 index 0000000000..08cf8672ac --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/ScatterOptions.php @@ -0,0 +1,13 @@ +display; + } + + + /** + * @param boolean $display + * + * @return $this + */ + public function setDisplay($display) + { + $this->display = boolval($display); + + return $this; + } + + + /** + * @return string + */ + public function getPosition() + { + return $this->position; + } + + + /** + * @param string $position + * + * @return $this + */ + public function setPosition($position) + { + $this->position = strval($position); + + return $this; + } + + + /** + * @return string + */ + public function getColor() + { + return $this->color; + } + + + /** + * @param string $color + * + * @return $this + */ + public function setColor($color) + { + $this->color = strval($color); + + return $this; + } + + + /** + * @return boolean + */ + public function isFullWidth() + { + return $this->fullWidth; + } + + + /** + * @param boolean $fullWidth + * + * @return $this + */ + public function setFullWidth($fullWidth) + { + $this->fullWidth = boolval($fullWidth); + + return $this; + } + + + /** + * @return integer + */ + public function getPadding() + { + return $this->padding; + } + + + /** + * @param integer $padding + * + * @return $this + */ + public function setPadding($padding) + { + $this->padding = intval($padding); + + return $this; + } + + + /** + * @return string + */ + public function getText() + { + return $this->text; + } + + + /** + * @param string $text + * + * @return $this + */ + public function setText($text) + { + $this->text = strval($text); + + return $this; + } + + + /** + * Return Font. + * + * @return Font + */ + public function getFonts() + { + if (isset($this->font) === false) { + $this->font = new Fonts(); + } + + return $this->font; + } + + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Tooltips.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Tooltips.php new file mode 100644 index 0000000000..fe76d8876c --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Tooltips.php @@ -0,0 +1,819 @@ +enabled; + } + + /** + * @param bool $enabled + * + * @return $this + */ + public function setEnabled($enabled) + { + $this->enabled = boolval($enabled); + + return $this; + } + + /** + * @return \Laminas\Json\Expr + */ + public function getCustom() + { + return $this->custom; + } + + /** + * @param \Laminas\Json\Expr $custom + * + * @return $this + */ + public function setCustom($custom) + { + $this->custom = $custom; + + return $this; + } + + /** + * @return string + */ + public function getMode() + { + return $this->mode; + } + + /** + * @param string $mode + * + * @return $this + */ + public function setMode($mode) + { + $this->mode = strval($mode); + + return $this; + } + + /** + * @return bool + */ + public function isIntersect() + { + return $this->intersect; + } + + /** + * @param bool $intersect + * + * @return $this + */ + public function setIntersect($intersect) + { + $this->intersect = boolval($intersect); + + return $this; + } + + /** + * @return string + */ + public function getPosition() + { + return $this->position; + } + + /** + * @param string $position + * + * @return $this + */ + public function setPosition($position) + { + $this->position = strval($position); + + return $this; + } + + /** + * @return Expr + */ + public function getItemSort() + { + return $this->itemSort; + } + + /** + * @param Expr $itemSort + * + * @return $this + */ + public function setItemSort($itemSort) + { + $this->itemSort = new Expr(strval($itemSort)); + + return $this; + } + + /** + * @return Expr + */ + public function getFilter() + { + return $this->filter; + } + + /** + * @param Expr $filter + * + * @return $this + */ + public function setFilter($filter) + { + $this->filter = new Expr(strval($filter)); + + return $this; + } + + /** + * @return string + */ + public function getBackgroundColor() + { + return $this->backgroundColor; + } + + /** + * @param string $backgroundColor + * + * @return $this + */ + public function setBackgroundColor($backgroundColor) + { + $this->backgroundColor = strval($backgroundColor); + + return $this; + } + + /** + * @return string + */ + public function getTitleFontFamily() + { + return $this->titleFontFamily; + } + + /** + * @param string $titleFontFamily + * + * @return $this + */ + public function setTitleFontFamily($titleFontFamily) + { + $this->titleFontFamily = strval($titleFontFamily); + + return $this; + } + + /** + * @return int + */ + public function getTitleFontSize() + { + return $this->titleFontSize; + } + + /** + * @param int $titleFontSize + * + * @return $this + */ + public function setTitleFontSize($titleFontSize) + { + $this->titleFontSize = intval($titleFontSize); + + return $this; + } + + /** + * @return string + */ + public function getTitleFontStyle() + { + return $this->titleFontStyle; + } + + /** + * @param string $titleFontStyle + * + * @return $this + */ + public function setTitleFontStyle($titleFontStyle) + { + $this->titleFontStyle = strval($titleFontStyle); + + return $this; + } + + /** + * @return string + */ + public function getTitleFontColor() + { + return $this->titleFontColor; + } + + /** + * @param string $titleFontColor + * + * @return $this + */ + public function setTitleFontColor($titleFontColor) + { + $this->titleFontColor = strval($titleFontColor); + + return $this; + } + + /** + * @return int + */ + public function getTitleSpacing() + { + return $this->titleSpacing; + } + + /** + * @param int $titleSpacing + * + * @return $this + */ + public function setTitleSpacing($titleSpacing) + { + $this->titleSpacing = intval($titleSpacing); + + return $this; + } + + /** + * @return int + */ + public function getTitleMarginBottom() + { + return $this->titleMarginBottom; + } + + /** + * @param int $titleMarginBottom + * + * @return $this + */ + public function setTitleMarginBottom($titleMarginBottom) + { + $this->titleMarginBottom = intval($titleMarginBottom); + + return $this; + } + + /** + * @return string + */ + public function getBodyFontFamily() + { + return $this->bodyFontFamily; + } + + /** + * @param string $bodyFontFamily + * + * @return $this + */ + public function setBodyFontFamily($bodyFontFamily) + { + $this->bodyFontFamily = strval($bodyFontFamily); + + return $this; + } + + /** + * @return int + */ + public function getBodyFontSize() + { + return $this->bodyFontSize; + } + + /** + * @param int $bodyFontSize + * + * @return $this + */ + public function setBodyFontSize($bodyFontSize) + { + $this->bodyFontSize = intval($bodyFontSize); + + return $this; + } + + /** + * @return string + */ + public function getBodyFontStyle() + { + return $this->bodyFontStyle; + } + + /** + * @param string $bodyFontStyle + * + * @return $this + */ + public function setBodyFontStyle($bodyFontStyle) + { + $this->bodyFontStyle = strval($bodyFontStyle); + + return $this; + } + + /** + * @return string + */ + public function getBodyFontColor() + { + return $this->bodyFontColor; + } + + /** + * @param string $bodyFontColor + * + * @return $this + */ + public function setBodyFontColor($bodyFontColor) + { + $this->bodyFontColor = strval($bodyFontColor); + + return $this; + } + + /** + * @return int + */ + public function getBodySpacing() + { + return $this->bodySpacing; + } + + /** + * @param int $bodySpacing + * + * @return $this + */ + public function setBodySpacing($bodySpacing) + { + $this->bodySpacing = intval($bodySpacing); + + return $this; + } + + /** + * @return string + */ + public function getFooterFontFamily() + { + return $this->footerFontFamily; + } + + /** + * @param string $footerFontFamily + * + * @return $this + */ + public function setFooterFontFamily($footerFontFamily) + { + $this->footerFontFamily = strval($footerFontFamily); + + return $this; + } + + /** + * @return int + */ + public function getFooterFontSize() + { + return $this->footerFontSize; + } + + /** + * @param int $footerFontSize + * + * @return $this + */ + public function setFooterFontSize($footerFontSize) + { + $this->footerFontSize = intval($footerFontSize); + + return $this; + } + + /** + * @return string + */ + public function getFooterFontStyle() + { + return $this->footerFontStyle; + } + + /** + * @param string $footerFontStyle + * + * @return $this + */ + public function setFooterFontStyle($footerFontStyle) + { + $this->footerFontStyle = strval($footerFontStyle); + + return $this; + } + + /** + * @return string + */ + public function getFooterFontColor() + { + return $this->footerFontColor; + } + + /** + * @param string $footerFontColor + * + * @return $this + */ + public function setFooterFontColor($footerFontColor) + { + $this->footerFontColor = strval($footerFontColor); + + return $this; + } + + /** + * @return int + */ + public function getFooterSpacing() + { + return $this->footerSpacing; + } + + /** + * @param int $footerSpacing + * + * @return $this + */ + public function setFooterSpacing($footerSpacing) + { + $this->footerSpacing = intval($footerSpacing); + + return $this; + } + + /** + * @return int + */ + public function getFooterMarginTop() + { + return $this->footerMarginTop; + } + + /** + * @param int $footerMarginTop + * + * @return $this + */ + public function setFooterMarginTop($footerMarginTop) + { + $this->footerMarginTop = intval($footerMarginTop); + + return $this; + } + + /** + * @return int + */ + public function getXPadding() + { + return $this->xPadding; + } + + /** + * @param int $xPadding + * + * @return $this + */ + public function setXPadding($xPadding) + { + $this->xPadding = intval($xPadding); + + return $this; + } + + /** + * @return int + */ + public function getYPadding() + { + return $this->yPadding; + } + + /** + * @param int $yPadding + * + * @return $this + */ + public function setYPadding($yPadding) + { + $this->yPadding = intval($yPadding); + + return $this; + } + + /** + * @return int + */ + public function getCaretSize() + { + return $this->caretSize; + } + + /** + * @param int $caretSize + * + * @return $this + */ + public function setCaretSize($caretSize) + { + $this->caretSize = intval($caretSize); + + return $this; + } + + /** + * @return int + */ + public function getCornerRadius() + { + return $this->cornerRadius; + } + + /** + * @param int $cornerRadius + * + * @return $this + */ + public function setCornerRadius($cornerRadius) + { + $this->cornerRadius = intval($cornerRadius); + + return $this; + } + + /** + * @return string + */ + public function getMultiKeyBackground() + { + return $this->multiKeyBackground; + } + + /** + * @param string $multiKeyBackground + * + * @return $this + */ + public function setMultiKeyBackground($multiKeyBackground) + { + $this->multiKeyBackground = strval($multiKeyBackground); + + return $this; + } + + /** + * @return bool + */ + public function isDisplayColors() + { + return $this->displayColors; + } + + /** + * @param bool $displayColors + * + * @return $this + */ + public function setDisplayColors($displayColors) + { + $this->displayColors = boolval($displayColors); + + return $this; + } + + /** + * @return Callbacks + */ + public function callbacks() + { + if (is_null($this->callbacks)) { + $this->callbacks = new Callbacks(); + } + + return $this->callbacks; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Tooltips/Callbacks.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Tooltips/Callbacks.php new file mode 100644 index 0000000000..f41ad08a63 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Tooltips/Callbacks.php @@ -0,0 +1,326 @@ +beforeTitle; + } + + /** + * @param string $beforeTitle + * + * @return $this + */ + public function setBeforeTitle($beforeTitle) + { + $this->beforeTitle = new Expr(strval($beforeTitle)); + + return $this; + } + + /** + * @return Expr + */ + public function getTitle() + { + return $this->title; + } + + /** + * @param string $title + * + * @return $this + */ + public function setTitle($title) + { + $this->title = new Expr(strval($title)); + + return $this; + } + + /** + * @return Expr + */ + public function getAfterTitle() + { + return $this->afterTitle; + } + + /** + * @param string $afterTitle + * + * @return $this + */ + public function setAfterTitle($afterTitle) + { + $this->afterTitle = new Expr(strval($afterTitle)); + + return $this; + } + + /** + * @return Expr + */ + public function getBeforeLabel() + { + return $this->beforeLabel; + } + + /** + * @param string $beforeLabel + * + * @return $this + */ + public function setBeforeLabel($beforeLabel) + { + $this->beforeLabel = new Expr(strval($beforeLabel)); + + return $this; + } + + /** + * @return Expr + */ + public function getLabel() + { + return $this->label; + } + + /** + * @param string $label + * + * @return $this + */ + public function setLabel($label) + { + $this->label = new Expr(strval($label)); + + return $this; + } + + /** + * @return Expr + */ + public function getLabelColor() + { + return $this->labelColor; + } + + /** + * @param string $labelColor + * + * @return $this + */ + public function setLabelColor($labelColor) + { + $this->labelColor = new Expr(strval($labelColor)); + + return $this; + } + + /** + * @return Expr + */ + public function getAfterLabel() + { + return $this->afterLabel; + } + + /** + * @param string $afterLabel + * + * @return $this + */ + public function setAfterLabel($afterLabel) + { + $this->afterLabel = new Expr(strval($afterLabel)); + + return $this; + } + + /** + * @return Expr + */ + public function getAfterBody() + { + return $this->afterBody; + } + + /** + * @param string $afterBody + * + * @return $this + */ + public function setAfterBody($afterBody) + { + $this->afterBody = new Expr(strval($afterBody)); + + return $this; + } + + /** + * @return Expr + */ + public function getBeforeFooter() + { + return $this->beforeFooter; + } + + /** + * @param string $beforeFooter + * + * @return $this + */ + public function setBeforeFooter($beforeFooter) + { + $this->beforeFooter = new Expr(strval($beforeFooter)); + + return $this; + } + + /** + * @return Expr + */ + public function getFooter() + { + return $this->footer; + } + + /** + * @param string $footer + * + * @return $this + */ + public function setFooter($footer) + { + $this->footer = new Expr(strval($footer)); + + return $this; + } + + /** + * @return Expr + */ + public function getAfterFooter() + { + return $this->afterFooter; + } + + /** + * @param string $afterFooter + * + * @return $this + */ + public function setAfterFooter($afterFooter) + { + $this->afterFooter = new Expr(strval($afterFooter)); + + return $this; + } + + /** + * @return Expr + */ + public function getDataPoints() + { + return $this->dataPoints; + } + + /** + * @param string $dataPoints + * + * @return $this + */ + public function setDataPoints($dataPoints) + { + $this->dataPoints = new Expr(strval($dataPoints)); + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/WaterMark.php b/pandora_console/vendor/artica/phpchartjs/src/Options/WaterMark.php new file mode 100644 index 0000000000..7587cf864f --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/WaterMark.php @@ -0,0 +1,162 @@ +width; + } + + + /** + * @param float $width + * + * @return $this + */ + public function setWidth($width) + { + $this->width = intval($width); + + return $this; + } + + /** + * @return float + */ + public function getHeight() + { + return $this->height; + } + + + /** + * @param float $height + * + * @return $this + */ + public function setHeight($height) + { + $this->height = intval($height); + + return $this; + } + + + /** + * @return string + */ + public function getSrc() + { + return $this->src; + } + + + /** + * @param string $src + * + * @return $this + */ + public function setSrc($src) + { + $this->src = strval($src); + + return $this; + } + + + /** + * @return string + */ + public function getPosition() + { + return $this->position; + } + + + /** + * @param string $position + * + * @return $this + */ + public function setPosition($position) + { + $this->position = strval($position); + + return $this; + } + + + /** + * @return string + */ + public function getAlign() + { + return $this->align; + } + + + /** + * @param string $align + * + * @return $this + */ + public function setAlign($align) + { + $this->align = strval($align); + + return $this; + } + + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/PluginsCollection.php b/pandora_console/vendor/artica/phpchartjs/src/PluginsCollection.php new file mode 100644 index 0000000000..3e25aeecbc --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/PluginsCollection.php @@ -0,0 +1,22 @@ +data; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Renderer/Html.php b/pandora_console/vendor/artica/phpchartjs/src/Renderer/Html.php new file mode 100644 index 0000000000..1acf3de67e --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Renderer/Html.php @@ -0,0 +1,49 @@ +createElement('canvas'); + $canvas->setAttribute('id', $this->chart->getId()); + + // Add title, height and width if applicable + if ($this->chart->getTitle()) { + $canvas->setAttribute('title', $this->chart->getTitle()); + } + if ($this->chart->getHeight()) { + $canvas->setAttribute('height', $this->chart->getHeight()); + } + if ($this->chart->getWidth()) { + $canvas->setAttribute('width', $this->chart->getWidth()); + } + + $dom->appendChild($canvas); + + // Render JavaScript + $scriptRenderer = new JavaScript($this->chart); + $script = $dom->createElement('script', $scriptRenderer->render($flags)); + $dom->appendChild($script); + + return $dom->saveHTML(); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php b/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php new file mode 100644 index 0000000000..100276743f --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php @@ -0,0 +1,125 @@ +chart->getId()}\" ).getContext( \"2d\" );"; + + // Now, setup the chart instance + $jsonRenderer = new Json($this->chart); + $json = $jsonRenderer->render($flags); + + // Watermark. + if (empty($this->chart->defaults()->getWatermark()) === false) { + $script[] = 'const chart_watermark_'.$this->chart->getId().' = { + id: "chart_watermark_'.$this->chart->getId().'", + afterDraw: (chart) => { + const image = new Image(); + image.src = "'.$this->chart->defaults()->getWatermark()->getSrc().'"; + if (image.complete) { + const image_height = '.($this->chart->defaults()->getWatermark()->getHeight() ?? 20).'; + const image_width = '.($this->chart->defaults()->getWatermark()->getWidth() ?? 100).'; + const ctx = chart.ctx; + let x = 0; + let y = 0; + + switch ("'.$this->chart->defaults()->getWatermark()->getPosition().'") { + case "start": + x = 0; + break; + + case "center": + x = (chart.width / 2) - image_width; + break; + + default: + case "end": + x = chart.width - image_width; + break; + } + + switch ("'.$this->chart->defaults()->getWatermark()->getAlign().'") { + default: + case "top": + y = 0; + break; + + case "center": + y = (chart.height / 2) + image_height; + break; + + case "bottom": + y = chart.height + image_height; + break; + } + + ctx.globalAlpha = 1; + ctx.drawImage(image, x, y, image_width, image_height); + ctx.globalAlpha = 1; + } else { + image.onload = () => chart.draw(); + } + } + };'; + $script[] = 'Chart.register(chart_watermark_'.$this->chart->getId().');'; + } + + + + // Create chart. + $script[] = 'try {'; + $script[] = " var chart = new Chart( ctx, {$json} );"; + + // Defaults values. + $script[] = ' Chart.defaults.font.size = '.($this->chart->defaults()->getFonts()->getSize() ?? 8).';'; + $script[] = ' Chart.defaults.font.family = "'.($this->chart->defaults()->getFonts()->getFamily() ?? 'Lato, sans-serif').'";'; + $script[] = ' Chart.defaults.font.style = "'.($this->chart->defaults()->getFonts()->getStyle() ?? 'normal').'";'; + $script[] = ' Chart.defaults.font.weight = "'.($this->chart->defaults()->getFonts()->getWeight() ?? '').'";'; + + $script[] = '} catch (error) {'; + $script[] = ' console.error(error);'; + $script[] = '}'; + + $scriptString = implode("\n", $script); + + return $scriptString; + + // Return the script + return <<chart->getId()}'] = chart; + }})(window.onload); + JS; + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Renderer/Json.php b/pandora_console/vendor/artica/phpchartjs/src/Renderer/Json.php new file mode 100644 index 0000000000..6e3843b0c0 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Renderer/Json.php @@ -0,0 +1,64 @@ + constant(get_class($this->chart).'::TYPE'), + 'data' => [], + ]; + + $labels = $this->chart->labels()->jsonSerialize(); + if ($labels) { + $config['data']['labels'] = $labels; + } + + $dataSets = $this->chart->dataSets()->jsonSerialize(); + if ($dataSets) { + $config['data']['datasets'] = $dataSets; + } + + $options = $this->chart->options()->jsonSerialize(); + if (! empty($options)) { + $config['options'] = $options; + } + + $defaults = $this->chart->defaults()->jsonSerialize(); + if (! empty($defaults)) { + $config['defaults'] = $defaults; + } + + $plugins = $this->chart->plugins()->jsonSerialize(); + if (! empty($plugins)) { + $config['plugins'] = $plugins; + } + + $output = JsonHelper::encode($config, false, ['enableJsonExprFinder' => true]); + if (($flags & Renderer::RENDER_PRETTY)) { + $output = JsonHelper::prettyPrint($output); + } + + return $output; + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Renderer/Renderer.php b/pandora_console/vendor/artica/phpchartjs/src/Renderer/Renderer.php new file mode 100644 index 0000000000..67131777cf --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Renderer/Renderer.php @@ -0,0 +1,32 @@ +chart = $chart; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/src/Renderer/RendererInterface.php b/pandora_console/vendor/artica/phpchartjs/src/Renderer/RendererInterface.php new file mode 100644 index 0000000000..2fe7659600 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Renderer/RendererInterface.php @@ -0,0 +1,27 @@ + $value) { + $function = 'set' . ucfirst($key); + if (! is_null($value) && method_exists($obj, $function)) { + $obj->$function($value); + } + } + } + + /** + * this method reads all defined attributes from the input array + * $input_data and calls the getter. It returns the resulting array. + * + * @param $obj + * @param array $dataTypes is an associative array that refers fieldnames to values. + * The values could be any primitive type, including an array. + * + * @return array + */ + public static function getAttributes($obj, array $dataTypes) + { + + if (! is_object($obj)) { + throw new RuntimeException("First param should be an object. "); + } + + $array = []; + foreach ($dataTypes as $key => $value) { + $function = ( gettype($value) == "boolean" ? 'is' : 'get' ) . ucfirst($key); + if (method_exists($obj, $function)) { + $getResult = $obj->$function($value); + $getResult = $getResult instanceof Expr ? $getResult->__toString() : $getResult; + $array[ $key ] = $getResult; + } + } + + return $array; + } + + /** + * @param $input_array + * + * @return mixed + */ + public static function removeNullsFromArray($input_array) + { + $array = $input_array; + $keys = array_keys($array); + foreach ($keys as $key) { + if (is_null($array[ $key ])) { + unset($array[ $key ]); + } + } + + return $array; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/bootstrap.php b/pandora_console/vendor/artica/phpchartjs/test/bootstrap.php new file mode 100644 index 0000000000..6c8c4f51b9 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/bootstrap.php @@ -0,0 +1,3 @@ +setId('myChart'); + +// Set labels +$bar->labels()->exchangeArray(["M", "T", "W", "T", "F", "S", "S"]); + +// Add Datasets +$apples = $bar->createDataSet(); + +$apples->setLabel("apples") + ->setBackgroundColor("rgba( 0, 150, 0, .5 )") + ->data()->exchangeArray([12, 19, 3, 17, 28, 24, 7]); +$bar->addDataSet($apples); + +$oranges = $bar->createDataSet(); +$oranges->setLabel("oranges") + ->setBackgroundColor('rgba( 255, 153, 0, .5 )') + ->data()->exchangeArray([30, 29, 5, 5, 20, 3, 10]); +$bar->addDataSet($oranges); + +?> + + + + Bar + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/barAndLine.php b/pandora_console/vendor/artica/phpchartjs/test/example/barAndLine.php new file mode 100644 index 0000000000..d000b7e58b --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/barAndLine.php @@ -0,0 +1,72 @@ +create($factory::BAR); + +// Set labels +$bar->labels()->exchangeArray(["January", "February", "March", "April", "May", "June", "July"]); + +// Add Datasets +$dataSet = new LineDataSet(); +$dataSet->setLabel('My First dataset') + ->setType('line') + ->setFill(false) + ->setLineTension(0.1) + ->setBackgroundColor('rgba(75,192,192,0.4)') + ->setBorderColor('rgba(75,192,192,1)') + ->setBorderCapStyle('butt') + ->setBorderDash([]) + ->setBorderDashOffset(0.0) + ->setBorderJoinStyle('miter') + ->setPointBorderColor('rgba(75,192,192,1)') + ->setPointBackgroundColor('#fff') + ->setPointBorderWidth(1) + ->setPointHoverRadius(5) + ->setPointHoverBackgroundColor('rgba(75,192,192,1)') + ->setPointHoverBorderColor('rgba(220,220,220,1)') + ->setPointHoverBorderWidth(2) + ->setPointRadius(1) + ->setPointHitRadius(10) + ->data()->exchangeArray([65, 59, 80, 81, 56, 55, 40]); +$bar->addDataSet($dataSet); + +// Set mode to stacked +$scales = $bar->options()->getScales(); +$scales->getYAxes()->append($scales->createYAxis()->setStacked(true)) + ->append($scales->createYAxis()->setPosition('right')->setId('y2')); + +// Add even more data +$apples = $bar->createDataSet(); +$apples->setLabel('apples') + ->setYAxisID('y2') + ->setBackgroundColor('rgba( 0, 150, 0, .5 )') + ->data()->exchangeArray([12, 19, 3, 17, 28, 24, 7]); +$bar->addDataSet($apples); + +$oranges = $bar->createDataSet(); +$oranges->setLabel('oranges') + ->setYAxisID('y2') + ->setBackgroundColor('rgba( 255, 153, 0, .5 )') + ->data()->exchangeArray([30, 29, 5, 5, 20, 3, 10]); +$bar->addDataSet($oranges); + +?> + + + + Bar & line + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/barWithoutScales.php b/pandora_console/vendor/artica/phpchartjs/test/example/barWithoutScales.php new file mode 100644 index 0000000000..3dfa2c468b --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/barWithoutScales.php @@ -0,0 +1,52 @@ +setId('myChart'); + +// Set labels +$bar->labels()->exchangeArray(["M", "T", "W", "T", "F", "S", "S"]); + +// Add Datasets +$apples = $bar->createDataSet(); + +$apples->setLabel("apples") + ->setBackgroundColor("rgba( 0, 150, 0, .5 )") + ->data()->exchangeArray([12, 19, 3, 17, 28, 24, 7]); +$bar->addDataSet($apples); + +$oranges = $bar->createDataSet(); +$oranges->setLabel("oranges") + ->setBackgroundColor('rgba( 255, 153, 0, .5 )') + ->data()->exchangeArray([30, 29, 5, 5, 20, 3, 10]); +$bar->addDataSet($oranges); + +/** @var BarOptions $options */ +$options = $bar->options(); +$xAxis = $options->getScales()->createXAxis(); +$yAxis = $options->getScales()->createYAxis(); + +$xAxis->setDisplay(false); +$yAxis->setDisplay(false); + +$options->getScales()->getXAxes()->append($xAxis); +$options->getScales()->getYAxes()->append($yAxis); + +?> + + + + Bar without scales + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/bubble.php b/pandora_console/vendor/artica/phpchartjs/test/example/bubble.php new file mode 100644 index 0000000000..b67099d399 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/bubble.php @@ -0,0 +1,54 @@ +create($factory::BUBBLE); + +// Set labels +$bubble->labels()->exchangeArray(["M", "T", "W", "T", "F", "S", "S"]); + +// Add Datasets +$apples = $bubble->createDataSet(); +$apples->setLabel('My first dataset') + ->setBackgroundColor('rgba( 0, 150, 0, .5 )') + ->data()->exchangeArray([ + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ]); +$bubble->addDataSet($apples); + +$oranges = $bubble->createDataSet(); +$oranges->setLabel('My second dataset') + ->setBackgroundColor('rgba( 255, 153, 0, .5 )') + ->data()->exchangeArray([ + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ]); +$bubble->addDataSet($oranges); + +?> + + + + Bubble + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/disableAspectRatio.php b/pandora_console/vendor/artica/phpchartjs/test/example/disableAspectRatio.php new file mode 100644 index 0000000000..14af2f0392 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/disableAspectRatio.php @@ -0,0 +1,57 @@ +create($factory::BUBBLE); + +// Set labels +$bubble->labels()->exchangeArray(["M", "T", "W", "T", "F", "S", "S"]); + +// Add Datasets +$apples = $bubble->createDataSet(); +$apples->setLabel('My first dataset') + ->setBackgroundColor('rgba( 0, 150, 0, .5 )') + ->data()->exchangeArray([ + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ]); +$bubble->addDataSet($apples); + +$oranges = $bubble->createDataSet(); +$oranges->setLabel('My second dataset') + ->setBackgroundColor('rgba( 255, 153, 0, .5 )') + ->data()->exchangeArray([ + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ['x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50)], + ]); +$bubble->addDataSet($oranges); + +$bubble->options()->setMaintainAspectRatio(false); +$bubble->setHeight(250); + +?> + + + + Disable aspect ratio + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/doughnut.php b/pandora_console/vendor/artica/phpchartjs/test/example/doughnut.php new file mode 100644 index 0000000000..3c708eca58 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/doughnut.php @@ -0,0 +1,57 @@ +create($factory::DOUGHNUT); + +// Set labels +$doughnut->labels()->exchangeArray([ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday", +]); + +// Add Datasets +$apples = $doughnut->createDataSet(); +$apples->setLabel('apples') + ->setBackgroundColor($colors) + ->data()->exchangeArray([12, 19, 3, 17, 28, 24, 7,]); +$doughnut->addDataSet($apples); + +$oranges = $doughnut->createDataSet(); +$oranges->setLabel('oranges') + ->setBackgroundColor($colors) + ->data()->exchangeArray([30, 29, 5, 5, 20, 3, 10,]); +$doughnut->addDataSet($oranges); + +?> + + + + Doughnut + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/halfDoughnut.php b/pandora_console/vendor/artica/phpchartjs/test/example/halfDoughnut.php new file mode 100644 index 0000000000..df33165511 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/halfDoughnut.php @@ -0,0 +1,63 @@ +create($factory::DOUGHNUT); +/** @var \Artica\PHPChartJS\Options\PieOptions $options */ +$options = $doughnut->options(); +$options->setCutoutPercentage(50) + ->setCircumference(pi()) + ->setRotation(pi()) + ->getAnimation()->setDuration(1); + +// Set labels +$doughnut->labels()->exchangeArray([ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday", +]); + +// Add Datasets +$apples = $doughnut->createDataSet(); +$apples->setLabel('apples') + ->setBackgroundColor($colors) + ->data()->exchangeArray([12, 19, 3, 17, 28, 24, 7,]); +$doughnut->addDataSet($apples); + +$oranges = $doughnut->createDataSet(); +$oranges->setLabel('oranges') + ->setBackgroundColor($colors) + ->data()->exchangeArray([30, 29, 5, 5, 20, 3, 10,]); +$doughnut->addDataSet($oranges); + +?> + + + + Half doughnut + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/hidden.php b/pandora_console/vendor/artica/phpchartjs/test/example/hidden.php new file mode 100644 index 0000000000..f4ca8d436c --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/hidden.php @@ -0,0 +1,41 @@ +setId('myChart'); + +// Set labels +$bar->labels()->exchangeArray(["M", "T", "W", "T", "F", "S", "S"]); + +// Add Datasets +$apples = $bar->createDataSet(); + +$apples->setLabel("apples") + ->setBackgroundColor("rgba( 0, 150, 0, .5 )") + ->data()->exchangeArray([12, 19, 3, 17, 28, 24, 7]); +$bar->addDataSet($apples); + +$oranges = $bar->createDataSet(); +$oranges->setLabel("oranges") + ->setBackgroundColor('rgba( 255, 153, 0, .5 )') + ->data()->exchangeArray([30, 29, 5, 5, 20, 3, 10]); +$oranges->setHidden(true); +$bar->addDataSet($oranges); + +?> + + + + Bar + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/horizontalBar.php b/pandora_console/vendor/artica/phpchartjs/test/example/horizontalBar.php new file mode 100644 index 0000000000..94afd655e7 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/horizontalBar.php @@ -0,0 +1,44 @@ +create($factory::HORIZONTAL_BAR); + +// Set labels +$bar->labels()->exchangeArray(["M", "T", "W", "T", "F", "S", "S"]); + +// Add Datasets +$apples = $bar->createDataSet(); +$apples->setLabel('apples') + ->setBackgroundColor('rgba( 0, 150, 0, .5 )') + ->data()->exchangeArray([12, 19, 3, 17, 28, 24, 7]); +$bar->addDataSet($apples); + +$oranges = $bar->createDataSet(); +$oranges->setLabel('oranges') + ->setBackgroundColor('rgba( 255, 153, 0, .5 )') + ->data()->exchangeArray([30, 29, 5, 5, 20, 3, 10]); +$bar->addDataSet($oranges); + +$scales = $bar->options()->getScales(); +$scales->getXAxes()->append($scales->createXAxis()->setStacked(true)); +$scales->getYAxes()->append($scales->createYAxis()->setStacked(true)); + +?> + + + + Horizontal bar + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/index.html b/pandora_console/vendor/artica/phpchartjs/test/example/index.html new file mode 100644 index 0000000000..9b5a69d186 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/index.html @@ -0,0 +1,94 @@ + + + + + + + + + + + Articaam/phpchartjs - examples + + +
+
+
+

Articaam/phpchartjs - examples

+ +
+
+ + + + +
+ + + + + + + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/line.php b/pandora_console/vendor/artica/phpchartjs/test/example/line.php new file mode 100644 index 0000000000..7c8f0571b2 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/line.php @@ -0,0 +1,71 @@ +create($factory::LINE); + +// Set labels +$line->labels()->exchangeArray(["January", "February", "March", "April", "May", "June", "July"]); + +// Add Datasets +$dataSet = $line->createDataSet(); +$dataSet->setLabel('My First dataset') + ->setFill(false) + ->setLineTension(0.1) + ->setBackgroundColor('rgba(75,192,192,0.4)') + ->setBorderColor('rgba(75,192,192,1)') + ->setBorderCapStyle('butt') + ->setBorderDash([]) + ->setBorderDashOffset(0.0) + ->setBorderJoinStyle('miter') + ->setPointBorderColor('rgba(75,192,192,1)') + ->setPointBackgroundColor('#fff') + ->setPointBorderWidth(1) + ->setPointHoverRadius(5) + ->setPointHoverBackgroundColor('rgba(75,192,192,1)') + ->setPointHoverBorderColor('rgba(220,220,220,1)') + ->setPointHoverBorderWidth(2) + ->setPointRadius(1) + ->setPointHitRadius(10) + ->setSpanGaps(false) + ->data()->exchangeArray([65, 59, 80, 81, 56, 55, 40]); +$line->addDataSet($dataSet); + +// Set mode to stacked +$scales = $line->options()->getScales(); +$scales->getYAxes()->append($scales->createYAxis()->setStacked(true)) + ->append($scales->createYAxis()->setPosition('right')->setId('y2')); + +// Add even more data +$apples = $line->createDataSet(); +$apples->setLabel('apples') + ->setYAxisID('y2') + ->setBackgroundColor('rgba( 0, 150, 0, .5 )') + ->data()->exchangeArray([12, 19, 3, 17, 28, 24, 7]); +$line->addDataSet($apples); + +$oranges = $line->createDataSet(); +$oranges->setLabel('oranges') + ->setYAxisID('y2') + ->setBackgroundColor('rgba( 255, 153, 0, .5 )') + ->data()->exchangeArray([30, 29, 5, 5, 20, 3, 10]); +$line->addDataSet($oranges); + +?> + + + + Line + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/lineScatter.php b/pandora_console/vendor/artica/phpchartjs/test/example/lineScatter.php new file mode 100644 index 0000000000..ae9dfdebba --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/lineScatter.php @@ -0,0 +1,40 @@ +create($factory::LINE); + +// Add Datasets +$dataSet = $line->createDataSet(); +$dataSet->setLabel('Scatter Dataset')->data()->exchangeArray([ + ['x' => -10, 'y' => 0], + ['x' => 0, 'y' => 10], + ['x' => 10, 'y' => 5], +]); +$line->addDataSet($dataSet); + +$scales = $line->options()->getScales(); +$xAxis = $scales->createXAxis(); +$xAxis->setType('linear') + ->setPosition('bottom'); + +$scales->getXAxes()->append($xAxis); + +?> + + + + Line scatter + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/onClick.php b/pandora_console/vendor/artica/phpchartjs/test/example/onClick.php new file mode 100644 index 0000000000..060a0818d5 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/onClick.php @@ -0,0 +1,49 @@ +setId('myChart'); + +// Set labels +$bar->labels()->exchangeArray(["M", "T", "W", "T", "F", "S", "S"]); + +// Add Datasets +$apples = $bar->createDataSet(); + +$apples->setLabel("apples") + ->setBackgroundColor("rgba( 0, 150, 0, .5 )") + ->data()->exchangeArray([12, 19, 3, 17, 28, 24, 7]); +$bar->addDataSet($apples); + +$oranges = $bar->createDataSet(); +$oranges->setLabel("oranges") + ->setBackgroundColor('rgba( 255, 153, 0, .5 )') + ->data()->exchangeArray([30, 29, 5, 5, 20, 3, 10]); +$bar->addDataSet($oranges); +$bar->options()->setOnClick('myClickEvent'); +?> + + + + onClick + + + +render(); +?> + + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/pie.php b/pandora_console/vendor/artica/phpchartjs/test/example/pie.php new file mode 100644 index 0000000000..4d69523455 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/pie.php @@ -0,0 +1,52 @@ +create($factory::PIE); + +// Set labels +$pie->labels()->exchangeArray([ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday", +]); + +// Add Datasets +$apples = $pie->createDataSet(); +$apples->setLabel('My First dataset') + ->setBackgroundColor($colors) + ->data()->exchangeArray([165, 59, 80, 81, 56, 55, 40]); +$pie->addDataSet($apples); + +?> + + + + Pie + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/polarArea.php b/pandora_console/vendor/artica/phpchartjs/test/example/polarArea.php new file mode 100644 index 0000000000..5ff22379e5 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/polarArea.php @@ -0,0 +1,35 @@ +create($factory::POLAR_AREA); + +// Set labels +$polarArea->labels()->exchangeArray(["Red", "Green", "Yellow", "Grey", "Blue"]); + +// Add Datasets +$dataSet = $polarArea->createDataSet(); +$dataSet->setLabel('My dataset') + ->setBackgroundColor($colors) + ->data()->exchangeArray([11, 16, 7, 3, 14]); +$polarArea->addDataSet($dataSet); + +?> + + + + Polar area + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/radar.php b/pandora_console/vendor/artica/phpchartjs/test/example/radar.php new file mode 100644 index 0000000000..c6b27766de --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/radar.php @@ -0,0 +1,58 @@ +create($factory::RADAR); + +// Set labels +$radar->labels()->exchangeArray([ + "Eating", + "Drinking", + "Sleeping", + "Designing", + "Coding", + "Cycling", + "Running", +]); + +// Add Datasets +$dataSet1 = $radar->createDataSet(); +$dataSet1->setLabel('My first dataset') + ->setBackgroundColor('rgba(179,181,198,0.2)') + ->setBorderColor('rgba(179,181,198,1)') + ->setPointBackgroundColor('rgba(179,181,198,1)') + ->setPointBorderColor('#fff') + ->setPointHoverBackgroundColor('#fff') + ->setPointHoverBorderColor('rgba(179,181,198,1)') + ->data()->exchangeArray([65, 59, 90, 81, 56, 55, 40]); +$radar->addDataSet($dataSet1); + +$dataSet2 = $radar->createDataSet(); +$dataSet2->setLabel('My second dataset') + ->setBackgroundColor('rgba(255,99,132,0.2)') + ->setBorderColor('rgba(255,99,132,1)') + ->setPointBackgroundColor('rgba(255,99,132,1)') + ->setPointBorderColor('#fff') + ->setPointHoverBackgroundColor('#fff') + ->setPointHoverBorderColor('rgba(255,99,132,1)') + ->data()->exchangeArray([28, 48, 40, 19, 96, 27, 100]); +$radar->addDataSet($dataSet2); + +?> + + + + Radar + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/example/scatter.php b/pandora_console/vendor/artica/phpchartjs/test/example/scatter.php new file mode 100644 index 0000000000..6d1a9ff0e5 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/example/scatter.php @@ -0,0 +1,69 @@ +create($factory::SCATTER); +$scatter->setTitle('Scatter chart'); + +/** @var ScatterOptions $options */ +$options = $scatter->options(); +$xAxis = $options->getScales()->createXAxis(); +$xAxis->ticks()->setStepSize(1); +$yAxis = $options->getScales()->createYAxis(); + +$options->getScales()->getXAxes()->append($xAxis); +$options->getScales()->getYAxes()->append($yAxis); + +// Set labels +$scatter->labels()->exchangeArray(["M", "T", "W", "T", "F", "S", "S"]); + +// Add Datasets +$apples = $scatter->createDataSet(); +$apples->setLabel('My first dataset') + ->setBackgroundColor('rgba( 0, 150, 0, .5 )') + ->setPointStyle('rect') + ->setPointRadius(10); +$apples->data()->exchangeArray([ + ['x' => 0, 'y' => 0], + ['x' => 0, 'y' => 1], + ['x' => 0, 'y' => 2], + ['x' => 0, 'y' => 3], + ['x' => 0, 'y' => 4], + ['x' => 0, 'y' => 5], + ['x' => 0, 'y' => 6], +]); +$scatter->addDataSet($apples); + +$oranges = $scatter->createDataSet(); +$oranges->setLabel('My second dataset') + ->setBackgroundColor('rgba( 255, 153, 0, .5 )'); +$oranges->data()->exchangeArray([ + ['x' => 1, 'y' => 0], + ['x' => 1, 'y' => 1], + ['x' => 1, 'y' => 2], + ['x' => 1, 'y' => 3], + ['x' => 1, 'y' => 4], + ['x' => 1, 'y' => 5], + ['x' => 1, 'y' => 6], +]); +$scatter->addDataSet($oranges); + +?> + + + + Scatter + + + +render(); +?> + + diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/BarTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/BarTest.php new file mode 100644 index 0000000000..0c1382f2f5 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/BarTest.php @@ -0,0 +1,56 @@ +assertInstanceOf(ChartInterface::class, $bar, 'The correct interface has been implemented'); + $this->assertInstanceOf(Bar::class, $bar, 'The correct class has been created'); + } + + /** + * Test the DataSet created by the Bar chart + */ + public function testDataSet() + { + $bar = new Bar(); + $chartData = [ 0, 1, 4, 2, 3, 0, 5, 2, 6 ]; + + // DataSet + $dataSet = $bar->createDataSet(); + $this->assertInstanceOf(BarDataSet::class, $dataSet, 'The correct class has been created by the chart'); + + // Populate the collection + $dataSet->data()->exchangeArray($chartData); + + // Check if data is still correct. + $bar->addDataSet($dataSet); + $this->assertEquals($chartData, $bar->dataSets()->offsetGet(0)->data()->getArrayCopy()); + } + + /** + * + */ + public function testOptions() + { + $bar = new Bar(); + $this->assertInstanceOf(BarOptions::class, $bar->options(), 'The correct class should be created'); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/BubbleTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/BubbleTest.php new file mode 100644 index 0000000000..40a27148ad --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/BubbleTest.php @@ -0,0 +1,63 @@ +assertInstanceOf(ChartInterface::class, $bubble, 'The correct interface should be implemented'); + $this->assertInstanceOf(Bubble::class, $bubble, 'The correct class should be created'); + } + + /** + * Test the DataSet created by the Bar chart + */ + public function testDataSet() + { + $bubble = new Bubble(); + $chartData = [ + [ 'x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50) ], + [ 'x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50) ], + [ 'x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50) ], + [ 'x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50) ], + [ 'x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50) ], + [ 'x' => rand(0, 40), 'y' => rand(0, 30), 'r' => rand(0, 50) ], + ]; + + // DataSet + $dataSet = $bubble->createDataSet(); + $this->assertInstanceOf(BubbleDataSet::class, $dataSet, 'The correct class should be created by the chart'); + + // Populate the collection + $dataSet->data()->exchangeArray($chartData); + + // Check if data is still correct. + $bubble->addDataSet($dataSet); + $this->assertEquals($chartData, $bubble->dataSets()->offsetGet(0)->data()->getArrayCopy()); + } + + /** + * + */ + public function testOptions() + { + $bar = new Bubble(); + $this->assertInstanceOf(BubbleOptions::class, $bar->options(), 'The correct class should be created'); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/DoughnutTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/DoughnutTest.php new file mode 100644 index 0000000000..7d243e3e16 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/DoughnutTest.php @@ -0,0 +1,56 @@ +assertInstanceOf(ChartInterface::class, $doughnut, 'The correct interface has been implemented'); + $this->assertInstanceOf(Doughnut::class, $doughnut, 'The correct class has been created'); + } + + /** + * Test the DataSet created by the Doughnut chart + */ + public function testDataSet() + { + $Doughnut = new Doughnut(); + $chartData = [ 0, 1, 4, 2, 3, 0, 5, 2, 6 ]; + + // DataSet + $dataSet = $Doughnut->createDataSet(); + $this->assertInstanceOf(PieDataSet::class, $dataSet, 'The correct class has been created by the chart'); + + // Populate the collection + $dataSet->data()->exchangeArray($chartData); + + // Check if data is still correct. + $Doughnut->addDataSet($dataSet); + $this->assertEquals($chartData, $Doughnut->dataSets()->offsetGet(0)->data()->getArrayCopy()); + } + + /** + * + */ + public function testOptions() + { + $Doughnut = new Doughnut(); + $this->assertInstanceOf(PieOptions::class, $Doughnut->options(), 'The correct class should be created'); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/LineTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/LineTest.php new file mode 100644 index 0000000000..e023e784d2 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/LineTest.php @@ -0,0 +1,56 @@ +assertInstanceOf(ChartInterface::class, $Line, 'The correct interface has been implemented'); + $this->assertInstanceOf(Line::class, $Line, 'The correct class has been created'); + } + + /** + * Test the DataSet created by the Line chart + */ + public function testDataSet() + { + $Line = new Line(); + $chartData = [ 0, 1, 4, 2, 3, 0, 5, 2, 6 ]; + + // DataSet + $dataSet = $Line->createDataSet(); + $this->assertInstanceOf(LineDataSet::class, $dataSet, 'The correct class has been created by the chart'); + + // Populate the collection + $dataSet->data()->exchangeArray($chartData); + + // Check if data is still correct. + $Line->addDataSet($dataSet); + $this->assertEquals($chartData, $Line->dataSets()->offsetGet(0)->data()->getArrayCopy()); + } + + /** + * + */ + public function testOptions() + { + $Line = new Line(); + $this->assertInstanceOf(LineOptions::class, $Line->options(), 'The correct class should be created'); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/PieTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/PieTest.php new file mode 100644 index 0000000000..e6a7be9346 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/PieTest.php @@ -0,0 +1,56 @@ +assertInstanceOf(ChartInterface::class, $Pie, 'The correct interface has been implemented'); + $this->assertInstanceOf(Pie::class, $Pie, 'The correct class has been created'); + } + + /** + * Test the DataSet created by the Pie chart + */ + public function testDataSet() + { + $Pie = new Pie(); + $chartData = [ 0, 1, 4, 2, 3, 0, 5, 2, 6 ]; + + // DataSet + $dataSet = $Pie->createDataSet(); + $this->assertInstanceOf(PieDataSet::class, $dataSet, 'The correct class has been created by the chart'); + + // Populate the collection + $dataSet->data()->exchangeArray($chartData); + + // Check if data is still correct. + $Pie->addDataSet($dataSet); + $this->assertEquals($chartData, $Pie->dataSets()->offsetGet(0)->data()->getArrayCopy()); + } + + /** + * + */ + public function testOptions() + { + $Pie = new Pie(); + $this->assertInstanceOf(PieOptions::class, $Pie->options(), 'The correct class should be created'); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/PolarAreaTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/PolarAreaTest.php new file mode 100644 index 0000000000..0b359babd2 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/PolarAreaTest.php @@ -0,0 +1,60 @@ +assertInstanceOf(ChartInterface::class, $PolarArea, 'The correct interface has been implemented'); + $this->assertInstanceOf(PolarArea::class, $PolarArea, 'The correct class has been created'); + } + + /** + * Test the DataSet created by the PolarArea chart + */ + public function testDataSet() + { + $PolarArea = new PolarArea(); + $chartData = [ 0, 1, 4, 2, 3, 0, 5, 2, 6 ]; + + // DataSet + $dataSet = $PolarArea->createDataSet(); + $this->assertInstanceOf(PolarAreaDataSet::class, $dataSet, 'The correct class has been created by the chart'); + + // Populate the collection + $dataSet->data()->exchangeArray($chartData); + + // Check if data is still correct. + $PolarArea->addDataSet($dataSet); + $this->assertEquals($chartData, $PolarArea->dataSets()->offsetGet(0)->data()->getArrayCopy()); + } + + /** + * + */ + public function testOptions() + { + $PolarArea = new PolarArea(); + $this->assertInstanceOf( + PolarAreaOptions::class, + $PolarArea->options(), + 'The correct class should be created' + ); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/RadarTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/RadarTest.php new file mode 100644 index 0000000000..691f43d1f7 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/RadarTest.php @@ -0,0 +1,56 @@ +assertInstanceOf(ChartInterface::class, $Radar, 'The correct interface has been implemented'); + $this->assertInstanceOf(Radar::class, $Radar, 'The correct class has been created'); + } + + /** + * Test the DataSet created by the Radar chart + */ + public function testDataSet() + { + $Radar = new Radar(); + $chartData = [ 0, 1, 4, 2, 3, 0, 5, 2, 6 ]; + + // DataSet + $dataSet = $Radar->createDataSet(); + $this->assertInstanceOf(RadarDataSet::class, $dataSet, 'The correct class has been created by the chart'); + + // Populate the collection + $dataSet->data()->exchangeArray($chartData); + + // Check if data is still correct. + $Radar->addDataSet($dataSet); + $this->assertEquals($chartData, $Radar->dataSets()->offsetGet(0)->data()->getArrayCopy()); + } + + /** + * + */ + public function testOptions() + { + $Radar = new Radar(); + $this->assertInstanceOf(RadarOptions::class, $Radar->options(), 'The correct class should be created'); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/ScatterTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/ScatterTest.php new file mode 100644 index 0000000000..2c60fd5dfb --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Chart/ScatterTest.php @@ -0,0 +1,57 @@ +assertInstanceOf(ChartInterface::class, $scatter, 'The correct interface has been implemented'); + $this->assertInstanceOf(Scatter::class, $scatter, 'The correct class has been created'); + } + + /** + * Test the DataSet created by the Scatter chart + */ + public function testDataSet() + { + $scatter = new Scatter(); + $chartData = [0, 1, 4, 2, 3, 0, 5, 2, 6]; + + // DataSet + $dataSet = $scatter->createDataSet(); + $this->assertInstanceOf(ScatterDataSet::class, $dataSet, 'The correct class has been created by the chart'); + + // Populate the collection + $dataSet->data()->exchangeArray($chartData); + + // Check if data is still correct. + $scatter->addDataSet($dataSet); + $this->assertEquals($chartData, $scatter->dataSets()->offsetGet(0)->data()->getArrayCopy()); + } + + /** + * + */ + public function testOptions() + { + $scatter = new Scatter(); + $this->assertInstanceOf(ScatterOptions::class, $scatter->options(), 'The correct class should be created'); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/ChartOwnedTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/ChartOwnedTest.php new file mode 100644 index 0000000000..39768def31 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/ChartOwnedTest.php @@ -0,0 +1,41 @@ +assertNull($options->owner(), 'Owner should be empty'); + + $this->assertSame($options, $options->setOwner($bar = new Bar())); + $this->assertSame($bar, $options->owner()); + } + + /** + * + */ + public function testOwnerFromChart() + { + $bar = new Bar(); + $this->assertInstanceOf(ChartOwnedInterface::class, $bar->options()); + $this->assertSame($bar, $bar->options()->owner()); + + $this->assertInstanceOf(ChartOwnedInterface::class, $dataSet = $bar->createDataSet()); + $this->assertSame($dataSet->owner(), $bar); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/ChartTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/ChartTest.php new file mode 100644 index 0000000000..acf6fbf0c5 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/ChartTest.php @@ -0,0 +1,318 @@ + 'height', + // int + 'width' => 'width', + // int + 'title' => 'title', + // string + 'labels' => 'labels', + // LabelsCollection + 'options' => 'options', + // Options + 'dataSets' => 'dataSets', + // DataSetCollection + ]; + + /** + * @var array + */ + private $empty_data = [ + 'height' => null, + // int + 'width' => null, + // int + 'title' => null, + // string + ]; + + + /** + * + */ + public function setUp(): void + { + $this->chart = new Bar(); + } + + + /** + * + */ + public function testGetId() + { + $result = $this->chart->getId(); + self::assertNotNull($result); + } + + + /** + * + */ + public function testSetId() + { + $expected = '1203'; + $this->chart->setId($expected); + self::assertSame($expected, $this->chart->getId()); + } + + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->chart, $this->data_types); + self::assertSame($expected, $result); + } + + + /** + * + */ + public function testHeight() + { + $expected = 15; + $this->chart->setHeight($expected); + $result = $this->chart->getHeight(); + self::assertSame($expected, $result); + } + + + /** + * + */ + public function testWidth() + { + $expected = 17; + $this->chart->setWidth($expected); + $result = $this->chart->getWidth(); + self::assertSame($expected, $result); + } + + + /** + * + */ + public function testTitle() + { + $expected = 'no title'; + $this->chart->setTitle($expected); + $result = $this->chart->getTitle(); + self::assertSame($expected, $result); + } + + + /** + * + */ + public function testLabels() + { + $result = $this->chart->labels(); + self::assertInstanceOf(LabelsCollection::class, $result); + } + + + /** + * + */ + public function testLabelsAdd() + { + $labels = new LabelsCollection(); + $label = 'no label at all'; + $labels->append($label); + $result = $this->chart->addLabel($label)->labels(); + self::assertNotSame($labels, $result); + self::assertEquals($labels, $result); + } + + + /** + * + */ + public function testGetLabelValid() + { + $labels = new LabelsCollection(); + $label = 'no label at all'; + $labels->append($label); + $this->chart->addLabel($label)->labels(); + $result = $this->chart->getLabel(0); + self::assertSame($label, $result); + $result1 = $this->chart->getLabel(1); + self::assertNull($result1); + } + + + /** + * + */ + public function testGetLabelInValid() + { + $labels = new LabelsCollection(); + $label = 'only 1 label'; + $labels->append($label); + $this->chart->addLabel($label)->labels(); + $result1 = $this->chart->getLabel(1); + self::assertNull($result1); + } + + + /** + * + */ + public function testDataSets() + { + $expected = new DataSetCollection(); + $result = $this->chart->dataSets(); + self::assertNotSame($expected, $result); + self::assertEquals($expected, $result); + } + + + /** + * + */ + public function testAddDataSet() + { + $expected = new DataSetCollection(); + $dataSet1 = new DataSet(); + $expected->append($dataSet1); + $dataSet1->setOwner($this->chart); + $dataSet2 = new DataSet(); + $this->chart->addDataSet($dataSet2); + self::assertEquals($dataSet1, $dataSet2); + } + + + /** + * + */ + public function testGetDataSetEmpty() + { + $result = $this->chart->getDataSet(0); + self::assertNull($result); + } + + + /** + * + */ + public function testGetDataSet() + { + $dataSet = new DataSet(); + $this->chart->addDataSet($dataSet); + $result = $this->chart->getDataSet(0); + self::assertSame($dataSet, $result); + } + + + /** + * + */ + public function testRenderCanvas() + { + $chartHtml = '
'.$this->chart->render().'
'; + $htmlDoc = new DOMDocument(); + $htmlDoc->loadXML($chartHtml); + $canvas = $htmlDoc->getElementsByTagName('canvas')->item(0); + $result = $canvas->getAttribute('id'); + self::assertStringStartsWith('chart', $result); + } + + + /** + * + */ + public function testRenderHeight() + { + $expected = '500'; + $this->chart->setHeight($expected); + $chartHtml = '
'.$this->chart->render(true).'
'; + $htmlDoc = new DOMDocument(); + $htmlDoc->loadXML($chartHtml); + $canvas = $htmlDoc->getElementsByTagName('canvas')->item(0); + $result = $canvas->getAttribute('height'); + self::assertSame($expected, $result); + } + + + /** + * + */ + public function testRenderWidth() + { + $expected = '500'; + $this->chart->setWidth($expected); + $chartHtml = '
'.$this->chart->render(true).'
'; + $htmlDoc = new DOMDocument(); + $htmlDoc->loadXML($chartHtml); + $canvas = $htmlDoc->getElementsByTagName('canvas')->item(0); + $result = $canvas->getAttribute('width'); + self::assertSame($expected, $result); + } + + + /** + * + */ + public function testRenderScript() + { + $chartHtml = '
'.$this->chart->render(true).'
'; + $htmlDoc = new DOMDocument(); + $htmlDoc->loadXML($chartHtml); + $script = $htmlDoc->getElementsByTagName('script')->item(0); + self::assertNotEmpty($script->nodeValue); + } + + + /** + * + */ + public function testCreateDataSet() + { + $result = $this->chart->createDataSet(); + self::assertInstanceOf(BarDataSet::class, $result); + } + + + /** + * + */ + public function testOptions() + { + $result = $this->chart->options(); + self::assertInstanceOf(BarOptions::class, $result); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Collection/DataTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Collection/DataTest.php new file mode 100644 index 0000000000..6245bb44a2 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Collection/DataTest.php @@ -0,0 +1,42 @@ +data = new Data(); + } + + + /** + * + */ + public function testJsonSerializeEmpty() + { + $expected = []; + $result = $this->data->jsonSerialize(); + self::assertSame($expected, $result); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/ConfigDefaults/GlobalConfigTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/ConfigDefaults/GlobalConfigTest.php new file mode 100644 index 0000000000..bc40fabff8 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/ConfigDefaults/GlobalConfigTest.php @@ -0,0 +1,127 @@ + '', + 'defaultFontFamily' => '', + 'defaultFontSize' => 1, + 'defaultFontStyle' => '', + ]; + + /** + * @var array + */ + private $input_data = [ + 'defaultFontColor' => 'defaultFontColor', + 'defaultFontFamily' => 'defaultFontFamily', + 'defaultFontSize' => 2, + 'defaultFontStyle' => 'defaultFontStyle', + ]; + + /** + * @var array + */ + private $empty_data = [ + 'defaultFontColor' => null, + 'defaultFontFamily' => null, + 'defaultFontSize' => null, + 'defaultFontStyle' => null, + ]; + + /** + * + */ + public function setUp(): void + { + $this->config = GlobalConfig::getInstance(); + } + + /** + * + */ + public function testEmpty() + { + $result = TestUtils::getAttributes($this->config, $this->data_types); + $expected = $this->empty_data; + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSet() + { + TestUtils::setAttributes($this->config, $this->input_data); + $result = TestUtils::getAttributes($this->config, $this->data_types); + $expected = $this->input_data; + self::assertSame($expected, $result); + } + + /** + * + */ + public function testLayout() + { + $result = $this->config->layout(); + self::assertInstanceOf(LayoutConfig::class, $result); + } + + /** + * + */ + public function testTooltips() + { + $result = $this->config->tooltips(); + self::assertInstanceOf(TooltipsConfig::class, $result); + } + + /** + * + */ + public function testHover() + { + $result = $this->config->hover(); + self::assertInstanceOf(HoverConfig::class, $result); + } + + /** + * + */ + public function testAnimation() + { + $result = $this->config->animation(); + self::assertInstanceOf(AnimationConfig::class, $result); + } + + /** + * + */ + public function testElements() + { + $result = $this->config->elements(); + self::assertInstanceOf(ElementsConfig::class, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/DataSetCollectionTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/DataSetCollectionTest.php new file mode 100644 index 0000000000..5d5252c333 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/DataSetCollectionTest.php @@ -0,0 +1,66 @@ +dataSetCollection = new DataSetCollection(); + } + + /** + * + */ + public function testGetArrayCopyEmpty() + { + $expected = []; + $result = $this->dataSetCollection->getArrayCopy(); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetArrayCopyNonEmpty() + { + $expected = [[]]; + $this->dataSetCollection->append(new DataSet()); + $result = $this->dataSetCollection->getArrayCopy(); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testJsonSerializeEmpty() + { + $expected = []; + $result = $this->dataSetCollection->jsonSerialize(); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testJsonSerializeNonEmpty() + { + $expected = [[]]; + $this->dataSetCollection->append(new DataSet()); + $result = $this->dataSetCollection->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/DataSetTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/DataSetTest.php new file mode 100644 index 0000000000..906259448c --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/DataSetTest.php @@ -0,0 +1,285 @@ +assertInstanceOf(ChartOwnedInterface::class, $dataSet, 'Class implements ChartOwnedInterface'); + $this->assertInstanceOf( + ArraySerializableInterface::class, + $dataSet, + 'Class implements ArraySerializableInterface' + ); + $this->assertInstanceOf(JsonSerializable::class, $dataSet, 'Class implements JsonSerializable'); + } + + /** + * + */ + public function testOwner() + { + $dataSet = new DataSet(); + + $this->assertNull($dataSet->owner(), 'The dataset has no owner'); + + $chart = new Bar(); + $chart->addDataSet($dataSet); + + $this->assertEquals($chart, $dataSet->owner(), 'The owner of the dataSet is set and returned correctly'); + $this->assertInstanceOf( + ChartInterface::class, + $dataSet->owner(), + 'The owner of the dataSet implements the correct interface' + ); + } + + /** + * + */ + public function testType() + { + $dataSet = new DataSet(); + + $this->assertNull($dataSet->getType(), 'The type is not set'); + + $dataSet->setType(Bar::TYPE); + $this->assertEquals(Bar::TYPE, $dataSet->getType(), 'The type is set and returned correctly'); + } + + /** + * + */ + public function testData() + { + $dataSet = new DataSet(); + + $dataCollection = $dataSet->data(); + $this->assertInstanceOf(Data::class, $dataCollection, 'The data collection is the right class'); + $this->assertInstanceOf(ArrayAccess::class, $dataCollection, 'The data collection extends Collection'); + $this->assertInstanceOf( + JsonSerializable::class, + $dataCollection, + 'The data collection implements JsonSerializable' + ); + } + + /** + * + */ + public function testLabel() + { + $dataSet = new DataSet(); + + $this->assertNull($dataSet->getLabel(), 'The label should not be set'); + + $dataSet->setLabel('Foo'); + $this->assertEquals('Foo', $dataSet->getLabel(), 'The label should have been set correctly'); + } + + /** + * + */ + public function testBackgroundColor() + { + $dataSet = new DataSet(); + + $this->assertNull($dataSet->getBackgroundColor(), 'The background color is not set'); + + $dataSet->setBackgroundColor('#fff'); + $this->assertEquals('#fff', $dataSet->getBackgroundColor()); + + $backgroundColorArray = ['#fff', 'rgb( 255, 255, 255 )', 'rgba( 255, 255, 255, .5 )', 'white']; + $dataSet->setBackgroundColor($backgroundColorArray); + $this->assertEquals( + $backgroundColorArray, + $dataSet->getBackgroundColor(), + 'The background color is set again and returned correctly' + ); + } + + /** + * + */ + public function testBorderColor() + { + $dataSet = new DataSet(); + + $this->assertNull($dataSet->getBorderColor(), 'The border color is not set'); + + $dataSet->setBorderColor('#fff'); + $this->assertEquals('#fff', $dataSet->getBorderColor(), 'The border color is set and returned correctly'); + + $borderColorArray = ['#fff', 'rgb( 255, 255, 255 )', 'rgba( 255, 255, 255, .5 )', 'white']; + $dataSet->setBorderColor($borderColorArray); + $this->assertEquals( + $borderColorArray, + $dataSet->getBorderColor(), + 'The border color is set again and returned correctly' + ); + } + + /** + * Test setting and getting the border width. + */ + public function testBorderWidth() + { + $dataSet = new DataSet(); + $this->assertNull($dataSet->getBorderWidth(), 'The border width is not set'); + + $this->assertEquals( + $dataSet, + $dataSet->setBorderWidth(10), + 'Setting the border width should return the DataSet instance' + ); + $this->assertTrue(is_int($dataSet->getBorderWidth()), 'Return type should be int'); + $this->assertEquals(10, $dataSet->getBorderWidth(), 'The border width should equal int 10'); + + $dataSet->setBorderWidth('20'); + $this->assertTrue(is_int($dataSet->getBorderWidth()), 'Return type should be int'); + $this->assertEquals(20, $dataSet->getBorderWidth(), 'The border width should equal int 20'); + + $dataSet->setBorderWidth('30abc'); + $this->assertTrue(is_int($dataSet->getBorderWidth()), 'Return type should be int'); + $this->assertEquals(30, $dataSet->getBorderWidth(), 'The border width should equal int 30'); + + $dataSet->setBorderWidth(40.00); + $this->assertTrue(is_int($dataSet->getBorderWidth()), 'Return type should be int'); + $this->assertEquals(40, $dataSet->getBorderWidth(), 'The border width should equal int 40'); + + $dataSet->setBorderWidth('abc50'); + $this->assertTrue(is_int($dataSet->getBorderWidth()), 'Return type should be int'); + $this->assertEquals(0, $dataSet->getBorderWidth(), 'The border width should equal int 0'); + + $dataSet->setBorderWidth([10, '20', '30abc', 40.00, 'abc50']); + $this->assertTrue(is_array($dataSet->getBorderWidth()), 'Return type should be array'); + $this->assertEquals([10, 20, 30, 40, 0], $dataSet->getBorderWidth(), 'Return value should be array of int'); + } + + /** + * + */ + public function testBorderSkipped() + { + $dataSet = new DataSet(); + + $this->assertNull($dataSet->getBorderSkipped(), 'The border skipped value is not set'); + + $this->assertInstanceOf( + DataSet::class, + $dataSet->setBorderSkipped('bottom'), + 'The correct class is returned' + ); + $this->assertEquals('bottom', $dataSet->getBorderSkipped(), 'The correct value is returned'); + } + + /** + * + */ + public function testAxes() + { + $dataSet = new DataSet(); + + $this->assertNull($dataSet->getXAxisID(), 'The xAxisID value should not be set'); + + $this->assertInstanceOf(DataSet::class, $dataSet->setXAxisID('myXAxis')); + $this->assertEquals('myXAxis', $dataSet->getXAxisID(), 'The correct value is returned'); + $this->assertEquals('myXAxis', $dataSet->getArrayCopy()['xAxisID'], 'getArrayCopy is failing'); + $this->assertEquals('myXAxis', $dataSet->jsonSerialize()['xAxisID'], 'Serialized data is not correct'); + + $this->assertNull($dataSet->getYAxisID(), 'The yAxisID value is not set'); + + $this->assertInstanceOf(DataSet::class, $dataSet->setYAxisID('myYAxis')); + $this->assertEquals('myYAxis', $dataSet->getYAxisID(), 'The correct value is not returned'); + $this->assertEquals('myXAxis', $dataSet->jsonSerialize()['xAxisID'], 'Serialized data is not correct'); + } + + /** + * + */ + public function testHoverBackgroundColor() + { + $dataSet = new DataSet(); + + $this->assertNull($dataSet->getHoverBackgroundColor(), 'The hoverBackgroundColor value is not set'); + + $this->assertInstanceOf(DataSet::class, $dataSet->setHoverBackgroundColor('#fff')); + $this->assertEquals('#fff', $dataSet->getHoverBackgroundColor(), 'The correct value is returned'); + + $newColors = ['silver', '#fff', 'rgb( 0, 0, 0 )', 'rgba( 255, 255, 255, .5 )']; + $dataSet->setHoverBackgroundColor($newColors); + $this->assertEquals($newColors, $dataSet->getHoverBackgroundColor(), 'The correct value is returned'); + } + + /** + * + */ + public function testHoverBorderColor() + { + $dataSet = new DataSet(); + + $this->assertNull($dataSet->getHoverBorderColor(), 'The hoverBorderColor value is not set'); + + $this->assertInstanceOf(DataSet::class, $dataSet->setHoverBorderColor('#fff')); + $this->assertEquals('#fff', $dataSet->getHoverBorderColor(), 'The correct value is returned'); + + $dataSet->setHoverBorderColor(['silver', '#fff', 'rgb( 0, 0, 0 )', 'rgba( 255, 255, 255, .5 )', 0]); + $this->assertEquals( + ['silver', '#fff', 'rgb( 0, 0, 0 )', 'rgba( 255, 255, 255, .5 )', '0'], + $dataSet->getHoverBorderColor(), + 'The correct value is returned' + ); + } + + /** + * + */ + public function testHoverBorderWidth() + { + $dataSet = new DataSet(); + + $this->assertNull($dataSet->getHoverBorderWidth(), 'The hoverBorderWidth value is not set'); + + $this->assertInstanceOf(DataSet::class, $dataSet->setHoverBorderWidth(1)); + $this->assertEquals(1, $dataSet->getHoverBorderWidth(), 'The correct value is returned'); + + $dataSet->setHoverBorderWidth([1, 10, '5a', 0]); + $this->assertEquals([1, 10, 5, 0], $dataSet->getHoverBorderWidth(), 'The correct value is returned'); + } + + /** + * + */ + public function testVisibility() + { + $dataSet = new DataSet(); + $this->assertArrayNotHasKey('hidden', $dataSet->jsonSerialize(), 'Value should not be present'); + $this->assertFalse($dataSet->isHidden(), 'Default value should be false'); + $this->assertArrayHasKey('hidden', $dataSet->jsonSerialize(), 'Value should be present'); + $this->assertInstanceOf(DataSet::class, $dataSet->setHidden(true)); + $this->assertTrue($dataSet->isHidden(), 'Value should be true'); + $this->assertTrue($dataSet->jsonSerialize()['hidden'], 'Value should be true'); + $this->assertInstanceOf(DataSet::class, $dataSet->setHidden(null)); + $this->assertArrayNotHasKey('hidden', $dataSet->jsonSerialize(), 'Value should not be present'); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Delegate/ArraySerializableTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Delegate/ArraySerializableTest.php new file mode 100644 index 0000000000..371a47a164 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Delegate/ArraySerializableTest.php @@ -0,0 +1,202 @@ +classA = new A(1, 2); + $this->classB = new B(3, 4, 5, 6); + } + + /** + * + */ + public function testSuperclass() + { + $expected = [ 'a' => 1, 'b' => 2 ]; + ksort($expected); + $result = $this->classA->getArrayCopy(); + ksort($result); + self::assertSame($expected, $result); + } +} + +/** + * Class A + * @package Test\Delegate + */ +class A +{ + use ArraySerializable; + + /** + * @var int + */ + protected $a; + + /** + * @var int + */ + protected $b; + + /** + * + * should not show (private) + * @var int + */ + private $x; + + /** + * should not show (private) + * @var int + */ + private $y; + + /** + * A constructor. + * + * @param $a int + * @param $b int + */ + public function __construct($a, $b) + { + $this->a = $a; + $this->b = $b; + } + + /** + * @return int + */ + public function getA() + { + return $this->a; + } + + /** + * @param int $a + */ + public function setA($a) + { + $this->a = $a; + } + + /** + * @return int + */ + public function getB() + { + return $this->b; + } + + /** + * @param int $b + */ + public function setB($b) + { + $this->b = $b; + } + + /** + * @return int + */ + public function getX() + { + return $this->x; + } + + /** + * this method should never be called by jsonSerialize because it is not + * a boolean. + * + * @return int + */ + public function getY() + { + return $this->y; + } +} + +/** + * Class B + * @package Test\Delegate + */ +class B extends A +{ + /** + * @var int + */ + protected $c; + + /** + * @var int + */ + protected $d; + + /** + * B constructor. + * + * @param $a int + * @param $b int + * @param $c int + * @param $d int + */ + public function __construct($a, $b, $c, $d) + { + parent::__construct($a, $b); + $this->c = $c; + $this->d = $d; + } + + /** + * @return int + */ + public function getC() + { + return $this->c; + } + + /** + * @param int $c + */ + public function setC($c) + { + $this->c = $c; + } + + /** + * @return int + */ + public function getD() + { + return $this->d; + } + + /** + * @param int $d + */ + public function setD($d) + { + $this->d = $d; + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/FactoryTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/FactoryTest.php new file mode 100644 index 0000000000..5d8df1308b --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/FactoryTest.php @@ -0,0 +1,140 @@ +assertInstanceOf(Factory::class, $factory, 'Factory is correct class'); + } + + /** + * + */ + public function testBar() + { + $factory = new Factory(); + $chart = $factory->create($factory::BAR); + + $this->assertInstanceOf(ChartInterface::class, $chart, 'The correct interface has been implemented'); + $this->assertInstanceOf(Bar::class, $chart, 'The correct class has been created'); + } + + /** + * + */ + public function testBubble() + { + $factory = new Factory(); + $chart = $factory->create($factory::BUBBLE); + + $this->assertInstanceOf(ChartInterface::class, $chart, 'The correct interface has been implemented'); + $this->assertInstanceOf(Bubble::class, $chart, 'The correct class has been created'); + } + + /** + * + */ + public function testDoughnut() + { + $factory = new Factory(); + $chart = $factory->create($factory::DOUGHNUT); + + $this->assertInstanceOf(ChartInterface::class, $chart, 'The correct interface has been implemented'); + $this->assertInstanceOf(Pie::class, $chart, 'The correct class has been extended'); + $this->assertInstanceOf(Doughnut::class, $chart, 'The correct class has been created'); + } + + /** + * + */ + public function testHorizontalBar() + { + $factory = new Factory(); + $chart = $factory->create($factory::HORIZONTAL_BAR); + + $this->assertInstanceOf(ChartInterface::class, $chart, 'The correct interface has been implemented'); + $this->assertInstanceOf(Bar::class, $chart, 'The correct class has been extended'); + $this->assertInstanceOf(HorizontalBar::class, $chart, 'The correct class has been created'); + } + + /** + * + */ + public function testLine() + { + $factory = new Factory(); + $chart = $factory->create($factory::LINE); + + $this->assertInstanceOf(ChartInterface::class, $chart, 'The correct interface has been implemented'); + $this->assertInstanceOf(Line::class, $chart, 'The correct class has been created'); + } + + /** + * + */ + public function testPie() + { + $factory = new Factory(); + $chart = $factory->create($factory::PIE); + + $this->assertInstanceOf(ChartInterface::class, $chart, 'The correct interface has been implemented'); + $this->assertInstanceOf(Pie::class, $chart, 'The correct class has been created'); + } + + /** + * + */ + public function testPolarArea() + { + $factory = new Factory(); + $chart = $factory->create($factory::POLAR_AREA); + + $this->assertInstanceOf(ChartInterface::class, $chart, 'The correct interface has been implemented'); + $this->assertInstanceOf(PolarArea::class, $chart, 'The correct class has been created'); + } + + /** + * + */ + public function testRadar() + { + $factory = new Factory(); + $chart = $factory->create($factory::RADAR); + + $this->assertInstanceOf(ChartInterface::class, $chart, 'The correct interface has been implemented'); + $this->assertInstanceOf(Radar::class, $chart, 'The correct class has been created'); + } + + /** + * + */ + public function testNonExisting() + { + $factory = new Factory(); + $this->expectException(\InvalidArgumentException::class); + + $factory->create('foo'); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/LabelsCollectionTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/LabelsCollectionTest.php new file mode 100644 index 0000000000..68f3a572e9 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/LabelsCollectionTest.php @@ -0,0 +1,69 @@ +labelsCollectionEmpty = new LabelsCollection(); + $this->labelsCollection = new LabelsCollection($this->labelsArray); + } + + + /** + * + */ + public function testJsonSerializeEmpty() + { + $expected = []; + $result = $this->labelsCollectionEmpty->jsonSerialize(); + self::assertSame($expected, $result); + } + + + /** + * + */ + public function testJsonSerialize() + { + $expected = $this->labelsArray; + $result = $this->labelsCollection->jsonSerialize(); + self::assertSame($expected, $result); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/AnimationTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/AnimationTest.php new file mode 100644 index 0000000000..7034596b7a --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/AnimationTest.php @@ -0,0 +1,100 @@ + 1, + 'easing' => '', + 'onProgress' => '', + 'onComplete' => '', + ]; + + /** + * @var array + */ + private $input_data_no_expressions = [ + 'duration' => 1, + 'easing' => '', + 'onProgress' => null, + 'onComplete' => null, + ]; + + /** + * @var array + */ + private $input_data_with_expressions = [ + 'duration' => 1, + 'easing' => '', + 'onProgress' => 'function() { echo "onProgress"; }', + 'onComplete' => 'function() { echo "onComplete"; }', + ]; + + /** + * @var array + */ + private $empty_data = [ + 'duration' => null, + 'easing' => null, + 'onProgress' => null, + 'onComplete' => null, + ]; + + /** + * + */ + public function setUp(): void + { + $this->animation = new Animation(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->animation, $this->data_types); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testGetAndSetWithExpressions() + { + $expected = $this->input_data_with_expressions; + TestUtils::setAttributes($this->animation, $this->input_data_with_expressions); + $result = TestUtils::getAttributes($this->animation, $this->data_types); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testJsonSerializeNoExpressions() + { + $expected = TestUtils::removeNullsFromArray($this->input_data_no_expressions); + TestUtils::setAttributes($this->animation, $this->input_data_no_expressions); + $result = $this->animation->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ClickTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ClickTest.php new file mode 100644 index 0000000000..ed31e5dcfb --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ClickTest.php @@ -0,0 +1,70 @@ + null, + ]; + + private $input_data_no_expressions = ['onClick' => null]; + private $input_data_with_expressions = null; + + /** + * + */ + public function setUp(): void + { + $this->options = new Options(); + $this->input_data_with_expressions = ['onClick' => new Expr('function(event, array) { echo "onClick"; }')]; + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->input_data_no_expressions; + TestUtils::setAttributes($this->options, $this->input_data_no_expressions); + $result = TestUtils::getAttributes($this->options, $this->data_types); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testGetAndSetWithExpressions() + { + $expected = $this->input_data_with_expressions; + TestUtils::setAttributes($this->options, $this->input_data_with_expressions); + $result = TestUtils::getAttributes($this->options, $this->data_types); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testJsonSerializeWithoutExpressions() + { + $expected = TestUtils::removeNullsFromArray($this->input_data_no_expressions); + TestUtils::setAttributes($this->options, $this->input_data_no_expressions); + $result = $this->options->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/ArcTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/ArcTest.php new file mode 100644 index 0000000000..e890568bfd --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/ArcTest.php @@ -0,0 +1,87 @@ + '', /* string */ + 'borderColor' => '', /* string */ + 'borderWidth' => 1, /* int */ + ]; + + /** + * @var array + */ + private $empty_data = [ + 'backgroundColor' => null, /* string */ + 'borderColor' => null, /* string */ + 'borderWidth' => null, /* int */ + ]; + + /** + * @var array + */ + private $input_data = [ + 'backgroundColor' => 'backgroundColor', /* string */ + 'borderColor' => 'borderColor', /* string */ + 'borderWidth' => 2, /* int */ + ]; + + /** + * + */ + public function setUp(): void + { + $this->arc = new Arc(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->arc, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSetNoObjects() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->arc, $this->input_data); + $result = TestUtils::getAttributes($this->arc, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testJsonSerialize() + { + $expected = TestUtils::removeNullsFromArray($this->input_data); + TestUtils::setAttributes($this->arc, $this->input_data); + $result = $this->arc->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/LineTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/LineTest.php new file mode 100644 index 0000000000..88795b2970 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/LineTest.php @@ -0,0 +1,111 @@ + 1.0, /* float */ + 'backgroundColor' => '', /* string */ + 'borderWidth' => 1, /* int */ + 'borderColor' => '', /* string */ + 'borderCapStyle' => '', /* string */ + 'borderDash' => [1, 2], /* int[] */ + 'borderDashOffset' => 1.0, /* float */ + 'borderJoinStyle' => '', /* string */ + 'capBezierPoints' => false, /* bool */ + 'fill' => '', /* string */ + 'stepped' => false, /* bool */ + ]; + + /** + * @var array + */ + private $empty_data = [ + 'tension' => null, /* float */ + 'backgroundColor' => null, /* string */ + 'borderWidth' => null, /* int */ + 'borderColor' => null, /* string */ + 'borderCapStyle' => null, /* string */ + 'borderDash' => null, /* int[] */ + 'borderDashOffset' => null, /* float */ + 'borderJoinStyle' => null, /* string */ + 'capBezierPoints' => null, /* bool */ + 'fill' => null, /* bool */ + 'stepped' => null, /* bool */ + ]; + + /** + * @var array + */ + private $input_data = [ + 'tension' => 0.2, /* float */ + 'backgroundColor' => 'backgroundColor', /* string */ + 'borderWidth' => 2, /* int */ + 'borderColor' => 'borderColor', /* string */ + 'borderCapStyle' => 'borderCapStyle', /* string */ + 'borderDash' => [5, 6], /* int[] */ + 'borderDashOffset' => 0.1, /* float */ + 'borderJoinStyle' => 'borderJoinStyle', /* string */ + 'capBezierPoints' => true, /* bool */ + 'fill' => true, /* bool */ + 'stepped' => true, /* bool */ + ]; + + /** + * + */ + public function setUp(): void + { + $this->line = new Line(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->line, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSetNoObjects() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->line, $this->input_data); + $result = TestUtils::getAttributes($this->line, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testJsonSerialize() + { + $expected = TestUtils::removeNullsFromArray($this->input_data); + TestUtils::setAttributes($this->line, $this->input_data); + $result = $this->line->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/PointTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/PointTest.php new file mode 100644 index 0000000000..7f42cbe048 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/PointTest.php @@ -0,0 +1,105 @@ + 1, /* int */ + 'pointStyle' => '', /* string */ + 'rotation' => 1, /* int */ + 'backgroundColor' => '', /* string */ + 'borderWidth' => 1, /* int */ + 'borderColor' => '', /* string */ + 'hitRadius' => 1, /* int */ + 'hoverRadius' => 1, /* int */ + 'hoverBorderWidth' => 1, /* int */ + ]; + + /** + * @var array + */ + private $empty_data = [ + 'radius' => null, /* int */ + 'pointStyle' => null, /* string */ + 'rotation' => null, /* int */ + 'backgroundColor' => null, /* string */ + 'borderWidth' => null, /* int */ + 'borderColor' => null, /* string */ + 'hitRadius' => null, /* int */ + 'hoverRadius' => null, /* int */ + 'hoverBorderWidth' => null, /* int */ + ]; + + /** + * @var array + */ + private $input_data = [ + 'radius' => 2, /* int */ + 'pointStyle' => 'pointStyle', /* string */ + 'rotation' => 2, /* int */ + 'backgroundColor' => 'backgroundColor', /* string */ + 'borderWidth' => 2, /* int */ + 'borderColor' => 'borderColor', /* string */ + 'hitRadius' => 2, /* int */ + 'hoverRadius' => 2, /* int */ + 'hoverBorderWidth' => 2, /* int */ + ]; + + /** + * + */ + public function setUp(): void + { + $this->point = new Point(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->point, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSetNoObjects() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->point, $this->input_data); + $result = TestUtils::getAttributes($this->point, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testJsonSerialize() + { + $expected = TestUtils::removeNullsFromArray($this->input_data); + TestUtils::setAttributes($this->point, $this->input_data); + $result = $this->point->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/RectangleTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/RectangleTest.php new file mode 100644 index 0000000000..34bdccd439 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Elements/RectangleTest.php @@ -0,0 +1,90 @@ + '', /* string */ + 'borderWidth' => 1, /* int */ + 'borderColor' => '', /* string */ + 'borderSkipped' => '', /* string */ + ]; + + /** + * @var array + */ + private $empty_data = [ + 'backgroundColor' => null, /* string */ + 'borderWidth' => null, /* int */ + 'borderColor' => null, /* string */ + 'borderSkipped' => null, /* string */ + ]; + + /** + * @var array + */ + private $input_data = [ + 'backgroundColor' => 'backgroundColor', /* string */ + 'borderWidth' => 2, /* int */ + 'borderColor' => 'borderColor', /* string */ + 'borderSkipped' => 'borderSkipped', /* string */ + ]; + + /** + * + */ + public function setUp(): void + { + $this->rectangle = new Rectangle(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->rectangle, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSetNoObjects() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->rectangle, $this->input_data); + $result = TestUtils::getAttributes($this->rectangle, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testJsonSerialize() + { + $expected = TestUtils::removeNullsFromArray($this->input_data); + TestUtils::setAttributes($this->rectangle, $this->input_data); + $result = $this->rectangle->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ElementsTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ElementsTest.php new file mode 100644 index 0000000000..81bb02af3d --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ElementsTest.php @@ -0,0 +1,123 @@ + '', /* Rectangle */ + 'line' => '', /* Line */ + 'point' => '', /* Point */ + 'arc' => '', /* Arc */ + ]; + + /** + * @var array + */ + private $empty_data = [ + 'rectangle' => null, /* Rectangle */ + 'line' => null, /* Line */ + 'point' => null, /* Point */ + 'arc' => null, /* Arc */ + ]; + + /** + * @var array + */ + private $input_data = [ + 'rectangle' => null, /* Rectangle */ + 'line' => null, /* Line */ + 'point' => null, /* Point */ + 'arc' => null, /* Arc */ + ]; + + /** + * + */ + public function setUp(): void + { + $this->elements = new Elements(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->elements, $this->data_types); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testRectangle() + { + $rectangle = $this->elements->rectangle(); + self::assertNotNull($rectangle); + self::assertInstanceOf(Rectangle::class, $rectangle); + } + + /** + * + */ + public function testLine() + { + $line = $this->elements->line(); + self::assertNotNull($line); + self::assertInstanceOf(Line::class, $line); + } + + /** + * + */ + public function testPoint() + { + $point = $this->elements->point(); + self::assertNotNull($point); + self::assertInstanceOf(Point::class, $point); + } + + /** + * + */ + public function testArc() + { + $arc = $this->elements->arc(); + self::assertNotNull($arc); + self::assertInstanceOf(Arc::class, $arc); + } + + /** + * + */ + public function testJsonSerialize() + { + $expected = TestUtils::removeNullsFromArray($this->input_data); + TestUtils::setAttributes($this->elements, $this->input_data); + $result = $this->elements->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/HoverTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/HoverTest.php new file mode 100644 index 0000000000..b55a4e9ae3 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/HoverTest.php @@ -0,0 +1,100 @@ + '', + 'intersect' => false, + 'animationDuration' => 1, + 'onHover' => '', + ]; + + /** + * @var array + */ + private $input_data_no_expressions = [ + 'mode' => 'mode', + 'intersect' => true, + 'animationDuration' => 2, + 'onHover' => null, + ]; + + /** + * @var array + */ + private $input_data_with_expressions = [ + 'mode' => 'mode', + 'intersect' => true, + 'animationDuration' => 2, + 'onHover' => 'function() { echo "onHover"; }', + ]; + + /** + * @var array + */ + private $empty_data = [ + 'mode' => null, + 'intersect' => null, + 'animationDuration' => null, + 'onHover' => null, + ]; + + /** + * + */ + public function setUp(): void + { + $this->hover = new Hover(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->hover, $this->data_types); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testGetAndSetWithExpressions() + { + $expected = $this->input_data_with_expressions; + TestUtils::setAttributes($this->hover, $this->input_data_with_expressions); + $result = TestUtils::getAttributes($this->hover, $this->data_types); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testJsonSerializeWithoutExpressions() + { + $expected = TestUtils::removeNullsFromArray($this->input_data_no_expressions); + TestUtils::setAttributes($this->hover, $this->input_data_no_expressions); + $result = $this->hover->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Layout/PaddingTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Layout/PaddingTest.php new file mode 100644 index 0000000000..9f2b365d98 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Layout/PaddingTest.php @@ -0,0 +1,86 @@ +padding = new Padding(); + } + + + /** + * + */ + public function testBottom() + { + $this->assertNull($this->padding->getBottom()); + $this->padding->setBottom(20); + $this->assertSame(20, $this->padding->getBottom()); + } + + + /** + * + */ + public function testLeft() + { + $this->assertNull($this->padding->getLeft()); + $this->padding->setLeft(20); + $this->assertSame(20, $this->padding->getLeft()); + } + + + /** + * + */ + public function testRight() + { + $this->assertNull($this->padding->getRight()); + $this->padding->setRight(20); + $this->assertSame(20, $this->padding->getRight()); + } + + + /** + * + */ + public function testTop() + { + $this->assertNull($this->padding->getTop()); + $this->padding->setTop(20); + $this->assertSame(20, $this->padding->getTop()); + } + + + /** + * + */ + public function testJsonSerialize() + { + $this->padding->setTop(20); + $result = $this->padding->jsonSerialize(); + $this->assertEquals(20, $result['top']); + } + + +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/LayoutTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/LayoutTest.php new file mode 100644 index 0000000000..198e00c7c1 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/LayoutTest.php @@ -0,0 +1,109 @@ + 1, + ]; + + /** + * @var array + */ + private $input_data = [ + 'padding' => 2, + ]; + + /** + * @var array + */ + private $empty_data = [ + 'padding' => null, + ]; + + /** + * + */ + public function setUp(): void + { + $this->layout = new Layout(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->layout, $this->data_types); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testPaddingInt() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->layout, $this->input_data); + $result = TestUtils::getAttributes($this->layout, $this->data_types); + self::assertEquals($expected, $result); + } + + /** + * Test whether Layout stores the Padding object correctly and + * relays changes correctly. We are *not* testing Padding + */ + public function testPaddingObject() + { + self::assertInstanceOf(Layout\Padding::class, $this->layout->padding()); + $this->layout->padding()->setLeft(2.1); + self::assertEquals(2, $this->layout->padding()->getLeft()); + } + + /** + * + */ + public function testJsonSerializeAllInt() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->layout, $this->input_data); + self::assertEquals($expected, $this->layout->jsonSerialize()); + } + + /** + * + */ + public function testJsonSerializePaddingObj() + { + $expected = $this->empty_data; + $expected['padding'] = [ + "bottom" => null, + "left" => null, + "right" => 5, + "top" => null, + ]; + + $this->layout->padding()->setRight(5); + $result = $this->layout->jsonSerialize(); + self::assertEquals(5, $result['padding']['right']); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Legend/LabelsTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Legend/LabelsTest.php new file mode 100644 index 0000000000..540baba46e --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Legend/LabelsTest.php @@ -0,0 +1,132 @@ + 1, + 'fontSize' => 1, + 'fontStyle' => '', + 'fontColor' => '', + 'fontFamily' => '', + 'generateLabels' => '', + 'padding' => 1, + 'usePointStyle' => false, + ]; + + /** + * @var array + */ + private $input_data_1 = [ + 'boxWidth' => 12, + 'fontSize' => 13, + 'fontStyle' => 'fontStyle', + 'fontColor' => 'fontColor', + 'fontFamily' => 'fontFamily', + 'generateLabels' => null, + 'padding' => 14, + 'usePointStyle' => true, + ]; + + /** + * @var array + */ + private $input_data_2 = [ + 'boxWidth' => 12, + 'fontSize' => 13, + 'fontStyle' => 'fontStyle', + 'fontColor' => 'fontColor', + 'fontFamily' => 'fontFamily', + 'generateLabels' => 'generateLabels', + 'padding' => 14, + 'usePointStyle' => true, + ]; + + /** + * @var array + */ + private $empty_data = [ + 'boxWidth' => null, + 'fontSize' => null, + 'fontStyle' => null, + 'fontColor' => null, + 'fontFamily' => null, + 'generateLabels' => null, + 'padding' => null, + 'usePointStyle' => null, + ]; + + /** + * + */ + public function setUp(): void + { + $this->labels = new Labels(); + } + + /** + * + */ + public function testEmptyData() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->labels, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSetWithoutExpr() + { + $expected = $this->input_data_1; + TestUtils::setAttributes($this->labels, $this->input_data_1); + $result = TestUtils::getAttributes($this->labels, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testExpr() + { + TestUtils::setAttributes($this->labels, $this->input_data_2); + $result = $this->labels->getGenerateLabels()->__toString(); + $expected = $this->input_data_2['generateLabels']; + self::assertSame($expected, $result); + } + + /** + * This test uses assertEquals in stead of assertSame because json_encode / json_decode + * transform the float numbers to string, after which the decimal zero's disappear. It is + * still a float, but will be recognized by assertSame as an int. For that reason assertSame + * will not work as expected. + * + */ + public function testJsonSerializeWithoutExpr() + { + $expected = TestUtils::removeNullsFromArray($this->input_data_1); + TestUtils::setAttributes($this->labels, $expected); + $result = $this->labels->jsonSerialize(); + self::assertEquals($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/LegendTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/LegendTest.php new file mode 100644 index 0000000000..9f29a6501d --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/LegendTest.php @@ -0,0 +1,125 @@ + false, + 'position' => '', + 'fullWidth' => false, + 'onClick' => '', + 'onHover' => '', + 'reverse' => false, + 'labels' => '', /* LabelsCollection */ + ]; + + /** + * @var array + */ + private $input_data_with_expressions = [ + 'display' => true, + 'position' => 'position', + 'fullWidth' => true, + 'onClick' => 'onClick', + 'onHover' => 'onHover', + 'reverse' => true, + ]; + + /** + * @var array + */ + private $input_data_no_expressions = [ + 'display' => true, + 'position' => 'position', + 'fullWidth' => true, + 'onClick' => null, + 'onHover' => null, + 'labels' => null, + 'reverse' => true, + ]; + + /** + * @var array + */ + private $empty_data = [ + 'display' => null, + 'position' => null, + 'fullWidth' => null, + 'onClick' => null, + 'onHover' => null, + 'reverse' => null, + ]; + + /** + * + */ + public function setUp(): void + { + $this->legend = new Legend(); + + $this->input_data_with_expressions['onClick'] = new Expr($this->input_data_with_expressions['onClick']); + $this->input_data_with_expressions['onHover'] = new Expr($this->input_data_with_expressions['onHover']); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->legend, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSetWithExpr() + { + $expected = $this->input_data_with_expressions; + TestUtils::setAttributes($this->legend, $this->input_data_with_expressions); + $result = TestUtils::getAttributes($this->legend, $this->data_types); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testLabelsCollection() + { + $labels = $this->legend->labels(); + self::assertNotNull($labels); + self::assertInstanceOf(LabelsCollection::class, $labels); + } + + /** + * + */ + public function testJsonSerializeWithoutExpressions() + { + $expected = TestUtils::removeNullsFromArray($this->input_data_no_expressions); + TestUtils::setAttributes($this->legend, $this->input_data_no_expressions); + $result = $this->legend->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ScaleTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ScaleTest.php new file mode 100644 index 0000000000..cd4826e088 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ScaleTest.php @@ -0,0 +1,186 @@ + '', /* string */ + 'display' => false, /* bool */ + 'id' => '', /* string */ + 'stacked' => false, /* bool */ + 'barThickness' => 1, /* int */ + 'position' => '', /* string */ + 'beforeUpdate' => '', /* string */ + 'beforeSetDimensions' => '', /* string */ + 'afterSetDimensions' => '', /* string */ + 'beforeDataLimits' => '', /* string */ + 'afterDataLimits' => '', /* string */ + 'beforeBuildTicks' => '', /* string */ + 'afterBuildTicks' => '', /* string */ + 'beforeTickToLabelConversion' => '', /* string */ + 'afterTickToLabelConversion' => '', /* string */ + 'beforeCalculateTickRotation' => '', /* string */ + 'afterCalculateTickRotation' => '', /* string */ + 'beforeFit' => '', /* string */ + 'afterFit' => '', /* string */ + 'afterUpdate' => '', /* string */ + 'gridLines' => '', /* GridLines */ + 'scaleLabel' => '', /* ScaleLabel */ + 'ticks' => '', /* Ticks */ + ]; + + /** + * @var array + */ + private $input_data = [ + 'type' => 'type', /* string */ + 'display' => true, /* bool */ + 'id' => 'id', /* string */ + 'stacked' => true, /* bool */ + 'barThickness' => 2, /* int */ + 'position' => 'position', /* string */ + 'beforeUpdate' => 'beforeUpdate', /* string */ + 'beforeSetDimensions' => 'beforeSetDimensions', /* string */ + 'afterSetDimensions' => 'afterSetDimensions', /* string */ + 'beforeDataLimits' => 'beforeDataLimits', /* string */ + 'afterDataLimits' => 'afterDataLimits', /* string */ + 'beforeBuildTicks' => 'beforeBuildTicks', /* string */ + 'afterBuildTicks' => 'afterBuildTicks', /* string */ + 'beforeTickToLabelConversion' => 'beforeTickToLabelConversion', /* string */ + 'afterTickToLabelConversion' => 'afterTickToLabelConversion', /* string */ + 'beforeCalculateTickRotation' => 'beforeCalculateTickRotation', /* string */ + 'afterCalculateTickRotation' => 'afterCalculateTickRotation', /* string */ + 'beforeFit' => 'beforeFit', /* string */ + 'afterFit' => 'afterFit', /* string */ + 'afterUpdate' => 'afterUpdate', /* string */ + 'gridLines' => null, /* GridLines */ + 'scaleLabel' => null, /* ScaleLabel */ + 'ticks' => null, /* Ticks */ + ]; + + /** + * @var array + */ + private $empty_data = [ + 'type' => null, /* string */ + 'display' => null, /* bool */ + 'id' => null, /* string */ + 'stacked' => null, /* bool */ + 'barThickness' => null, /* int */ + 'position' => null, /* string */ + 'beforeUpdate' => null, /* string */ + 'beforeSetDimensions' => null, /* string */ + 'afterSetDimensions' => null, /* string */ + 'beforeDataLimits' => null, /* string */ + 'afterDataLimits' => null, /* string */ + 'beforeBuildTicks' => null, /* string */ + 'afterBuildTicks' => null, /* string */ + 'beforeTickToLabelConversion' => null, /* string */ + 'afterTickToLabelConversion' => null, /* string */ + 'beforeCalculateTickRotation' => null, /* string */ + 'afterCalculateTickRotation' => null, /* string */ + 'beforeFit' => null, /* string */ + 'afterFit' => null, /* string */ + 'afterUpdate' => null, /* string */ + 'gridLines' => null, /* GridLines */ + 'scaleLabel' => null, /* ScaleLabel */ + 'ticks' => null, /* Ticks */ + ]; + + /** + * + */ + public function setUp(): void + { + $this->scale = new AScale(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->scale, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSetNoObjects() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->scale, $this->input_data); + $result = TestUtils::getAttributes($this->scale, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGridLines() + { + $g = $this->scale->gridLines(); + self::assertInstanceOf(GridLines::class, $g); + } + + /** + * + */ + public function testScaleLabel() + { + $s = $this->scale->scaleLabel(); + self::assertInstanceOf(ScaleLabel::class, $s); + } + + /** + * + */ + public function testTicks() + { + $t = $this->scale->ticks(); + self::assertInstanceOf(Ticks::class, $t); + } + + /** + * + */ + public function testJsonSerializeNoObjects() + { + $expected = TestUtils::removeNullsFromArray($this->input_data); + TestUtils::setAttributes($this->scale, $this->input_data); + $result = $this->scale->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/GridLinesTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/GridLinesTest.php new file mode 100644 index 0000000000..56de5f7d30 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/GridLinesTest.php @@ -0,0 +1,141 @@ + false, + 'color' => '', + 'borderDash' => 1.0, + 'borderDashOffset' => [1.0], + 'lineWidth' => 1, + 'drawBorder' => false, + 'drawOnChartArea' => false, + 'drawTicks' => false, + 'tickMarkLength' => 1, + 'zeroLineWidth' => 1, + 'zeroLineColor' => '', + 'offsetGridLines' => false, + ]; + + /** + * @var array + */ + private $input_data_single_value = [ + 'display' => true, + 'color' => 'color', + 'borderDash' => [2.0], + 'borderDashOffset' => 3.0, + 'lineWidth' => 4, + 'drawBorder' => true, + 'drawOnChartArea' => true, + 'drawTicks' => true, + 'tickMarkLength' => 5, + 'zeroLineWidth' => 6, + 'zeroLineColor' => 'zeroLineColor', + 'offsetGridLines' => true, + ]; + + private $input_data_nested_arrays = [ + 'display' => true, + 'color' => ['color1', 'color2', ['color3', 'color4']], + 'borderDash' => [2.0, 3.0, [4.0, 5.0]], + 'borderDashOffset' => 3.0, + 'lineWidth' => [4, 5, [6, 7], 8], + 'drawBorder' => true, + 'drawOnChartArea' => true, + 'drawTicks' => true, + 'tickMarkLength' => 5, + 'zeroLineWidth' => 6, + 'zeroLineColor' => 'zeroLineColor', + 'offsetGridLines' => true, + ]; + + /** + * @var array + */ + private $empty_data = [ + 'display' => null, + 'color' => null, + 'borderDash' => null, + 'borderDashOffset' => null, + 'lineWidth' => null, + 'drawBorder' => null, + 'drawOnChartArea' => null, + 'drawTicks' => null, + 'tickMarkLength' => null, + 'zeroLineWidth' => null, + 'zeroLineColor' => null, + 'offsetGridLines' => null, + ]; + + /** + * + */ + public function setUp(): void + { + $this->gridLines = new GridLines(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->gridLines, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSetSingleValues() + { + $expected = $this->input_data_single_value; + TestUtils::setAttributes($this->gridLines, $this->input_data_single_value); + $result = TestUtils::getAttributes($this->gridLines, $this->data_types); + self::assertSame($expected, $result); + } + + public function testGetAndSetNestedArrayValues() + { + $expected = $this->input_data_nested_arrays; + TestUtils::setAttributes($this->gridLines, $this->input_data_nested_arrays); + $result = TestUtils::getAttributes($this->gridLines, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * This test uses assertEquals in stead of assertSame because json_encode / json_decode + * transform the float numbers to string, after which the decimal zero's disappear. It is + * still a float, but will be recognized by assertSame as an int. For that reason assertSame + * will not work as expected. + * + */ + public function testJsonSerialize() + { + $expected = $this->input_data_single_value; + TestUtils::setAttributes($this->gridLines, $this->input_data_single_value); + $result = $this->gridLines->jsonSerialize(); + self::assertEquals($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/ScaleLabelTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/ScaleLabelTest.php new file mode 100644 index 0000000000..9d8fd8df85 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/ScaleLabelTest.php @@ -0,0 +1,100 @@ + false, + 'labelString' => '', + 'fontColor' => '', + 'fontFamily' => '', + 'fontSize' => 1, + 'fontStyle' => '', + ]; + + /** + * @var array + */ + private $input_data = [ + 'display' => false, + 'labelString' => 'labelString', + 'fontColor' => 'fontColor', + 'fontFamily' => 'fontFamily', + 'fontSize' => 1, + 'fontStyle' => 'fontStyle', + ]; + + /** + * @var array + */ + private $empty_data = [ + 'display' => null, + 'labelString' => null, + 'fontColor' => null, + 'fontFamily' => null, + 'fontSize' => null, + 'fontStyle' => null, + ]; + + /** + * + */ + public function setUp(): void + { + $this->scaleLabel = new ScaleLabel(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->scaleLabel, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSet() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->scaleLabel, $this->input_data); + $result = TestUtils::getAttributes($this->scaleLabel, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * This test uses assertEquals in stead of assertSame because json_encode / json_decode + * transform the float numbers to string, after which the decimal zero's disappear. It is + * still a float, but will be recognized by assertSame as an int. For that reason assertSame + * will not work as expected. + * + */ + public function testJsonSerialize() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->scaleLabel, $this->input_data); + $result = $this->scaleLabel->jsonSerialize(); + self::assertEquals($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/TicksTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/TicksTest.php new file mode 100644 index 0000000000..616c47986f --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/TicksTest.php @@ -0,0 +1,167 @@ + 1.0, + 'beginAtZero' => false, + 'stepSize' => 1.0, + 'autoSkip' => false, + 'autoSkipPadding' => 1, + 'callback' => '', + 'display' => false, + 'fontColor' => '', + 'fontFamily' => '', + 'fontSize' => 1, + 'fontStyle' => '', + 'labelOffset' => 1, + 'maxRotation' => 1, + 'minRotation' => 1, + 'mirror' => false, + 'padding' => 1, + 'reverse' => false, + ]; + + /** + * @var array + */ + private $input_data_1 = [ + 'suggestedMin' => 2.0, + 'beginAtZero' => true, + 'stepSize' => 3.0, + 'autoSkip' => true, + 'autoSkipPadding' => 4, + 'callback' => null, + 'display' => true, + 'fontColor' => 'fontColor', + 'fontFamily' => 'fontFamily', + 'fontSize' => 5, + 'fontStyle' => 'fontStyle', + 'labelOffset' => 6, + 'maxRotation' => 7, + 'minRotation' => 8, + 'mirror' => true, + 'padding' => 9, + 'reverse' => true, + ]; + + /** + * @var array + */ + private $input_data_2 = [ + 'suggestedMin' => 2.0, + 'beginAtZero' => true, + 'stepSize' => 3.0, + 'autoSkip' => true, + 'autoSkipPadding' => 4, + 'callback' => "function () { console.log('Hello'); }", + 'display' => true, + 'fontColor' => 'fontColor', + 'fontFamily' => 'fontFamily', + 'fontSize' => 5, + 'fontStyle' => 'fontStyle', + 'labelOffset' => 6, + 'maxRotation' => 7, + 'minRotation' => 8, + 'mirror' => true, + 'padding' => 9, + 'reverse' => true, + ]; + + /** + * @var array + */ + private $empty_data = [ + 'suggestedMin' => null, + 'beginAtZero' => null, + 'stepSize' => null, + 'autoSkip' => null, + 'autoSkipPadding' => null, + 'callback' => null, + 'display' => null, + 'fontColor' => null, + 'fontFamily' => null, + 'fontSize' => null, + 'fontStyle' => null, + 'labelOffset' => null, + 'maxRotation' => null, + 'minRotation' => null, + 'mirror' => null, + 'padding' => null, + 'reverse' => null, + ]; + + /** + * + */ + public function setUp(): void + { + $this->ticks = new Ticks(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->ticks, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSetWithoutExpr() + { + $expected = $this->input_data_1; + TestUtils::setAttributes($this->ticks, $this->input_data_1); + $result = TestUtils::getAttributes($this->ticks, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testExpr() + { + TestUtils::setAttributes($this->ticks, $this->input_data_2); + $result = $this->ticks->getCallback()->__toString(); + $expected = $this->input_data_2['callback']; + self::assertSame($expected, $result); + } + + /** + * This test uses assertEquals in stead of assertSame because json_encode / json_decode + * transform the float numbers to string, after which the decimal zero's disappear. It is + * still a float, but will be recognized by assertSame as an int. For that reason assertSame + * will not work as expected. + * + */ + public function testJsonSerializeWithoutExpr() + { + $expected = TestUtils::removeNullsFromArray($this->input_data_1); + TestUtils::setAttributes($this->ticks, $expected); + $result = $this->ticks->jsonSerialize(); + self::assertEquals($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/XAxisCollectionTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/XAxisCollectionTest.php new file mode 100644 index 0000000000..01aaca8ec9 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Scales/XAxisCollectionTest.php @@ -0,0 +1,84 @@ +xAxisCollection = new XAxisCollection(); + $this->input_data = []; + foreach ($this->input_data as $value) { + $this->xAxisCollection[] = $value; + } + } + + /** + * + */ + public function testGetArrayCopyEmpty() + { + $expected = []; + $xAxisCollection = new XAxisCollection(); + $result = $xAxisCollection->getArrayCopy(); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetArrayCopyNonEmpty() + { + $expected = []; + $x = new XAxis(); + $expected[] = $x->getArrayCopy(); + $this->xAxisCollection[] = $x; + $result = $this->xAxisCollection->getArrayCopy(); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testJsonSerializeEmpty() + { + $expected = []; + $result = $this->xAxisCollection->jsonSerialize(); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testJsonSerializeNonEmpty() + { + $expected = []; + $x = new XAxis(); + $expected[] = $x->getArrayCopy(); + $this->xAxisCollection[] = $x; + $result = $this->xAxisCollection->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ScalesTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ScalesTest.php new file mode 100644 index 0000000000..a609d634aa --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/ScalesTest.php @@ -0,0 +1,89 @@ +scales = new Scales(); + } + + /** + * + */ + public function testCreateXAxis() + { + self::assertInstanceOf(Scales\XAxis::class, $this->scales->createXAxis()); + } + + /** + * + */ + public function testCreateYAxis() + { + self::assertInstanceOf(Scales\YAxis::class, $this->scales->createYAxis()); + } + + /** + * + */ + public function testEmptyXAxis() + { + $expected = new Scales\XAxisCollection(); + $result = $this->scales->getXAxes(); + self::assertInstanceOf(Scales\XAxisCollection::class, $result); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testEmptyYAxis() + { + $expected = new Scales\YAxisCollection(); + $result = $this->scales->getYAxes(); + self::assertInstanceOf(Scales\YAxisCollection::class, $result); + self::assertEquals($expected, $result); + } + + /** + * + */ + public function testJsonSerialize() + { + $xc = new Scales\XAxisCollection(); + $x1 = new Scales\XAxis(); + $x1->setBarThickness(2); + $xc[] = $x1; + $expected['xAxes'] = $xc->jsonSerialize(); + + $yc = new Scales\YAxisCollection(); + $y1 = new Scales\YAxis(); + $y1->setBarThickness(3); + $yc[] = $y1; + + $expected['xAxes'] = $xc->jsonSerialize(); + $expected['yAxes'] = $yc->jsonSerialize(); + $this->scales->getXAxes()[] = $x1; + $this->scales->getYAxes()[] = $y1; + $result = $this->scales->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/TitleTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/TitleTest.php new file mode 100644 index 0000000000..350dcaf68a --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/TitleTest.php @@ -0,0 +1,104 @@ + false, /* bool */ + 'position' => '', /* string */ + 'fullWidth' => false, /* bool */ + 'fontSize' => 1, /* int */ + 'fontFamily' => '', /* string */ + 'fontColor' => '', /* string */ + 'fontStyle' => '', /* string */ + 'padding' => 1, /* int */ + 'text' => '', /* string */ + ]; + + /** + * @var array + */ + private $input_data = [ + 'display' => true, /* bool */ + 'position' => 'position', /* string */ + 'fullWidth' => true, /* bool */ + 'fontSize' => 2, /* int */ + 'fontFamily' => 'fontFamily', /* string */ + 'fontColor' => 'fontColor', /* string */ + 'fontStyle' => 'fontStyle', /* string */ + 'padding' => 3, /* int */ + 'text' => 'text', /* string */ + ]; + + /** + * @var array + */ + private $empty_data = [ + 'display' => null, /* bool */ + 'position' => null, /* string */ + 'fullWidth' => null, /* bool */ + 'fontSize' => null, /* int */ + 'fontFamily' => null, /* string */ + 'fontColor' => null, /* string */ + 'fontStyle' => null, /* string */ + 'padding' => null, /* int */ + 'text' => null, /* string */ + ]; + + /** + * + */ + public function setUp(): void + { + $this->title = new Title(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->title, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSet() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->title, $this->input_data); + $result = TestUtils::getAttributes($this->title, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testJsonSerialize() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->title, $this->input_data); + $result = $this->title->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Tooltips/CallbacksTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Tooltips/CallbacksTest.php new file mode 100644 index 0000000000..006cf4dc07 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/Tooltips/CallbacksTest.php @@ -0,0 +1,125 @@ + '', + 'title' => '', + 'afterTitle' => '', + 'beforeLabel' => '', + 'label' => '', + 'labelColor' => '', + 'afterLabel' => '', + 'afterBody' => '', + 'beforeFooter' => '', + 'footer' => '', + 'afterFooter' => '', + 'dataPoints' => '', + ]; + + /** + * @var array + */ + private $input_data = [ + 'beforeTitle' => "function() { alert( 'Hello' ); }", + 'title' => "function() { alert( 'Hello' ); }", + 'afterTitle' => "function() { alert( 'Hello' ); }", + 'beforeLabel' => "function() { alert( 'Hello' ); }", + 'label' => "function() { alert( 'Hello' ); }", + 'labelColor' => "function() { alert( 'Hello' ); }", + 'afterLabel' => "function() { alert( 'Hello' ); }", + 'afterBody' => "function() { alert( 'Hello' ); }", + 'beforeFooter' => "function() { alert( 'Hello' ); }", + 'footer' => "function() { alert( 'Hello' ); }", + 'afterFooter' => "function() { alert( 'Hello' ); }", + 'dataPoints' => "function() { alert( 'Hello' ); }", + ]; + + /** + * @var array + */ + private $empty_data = [ + 'beforeTitle' => null, + 'title' => null, + 'afterTitle' => null, + 'beforeLabel' => null, + 'label' => null, + 'labelColor' => null, + 'afterLabel' => null, + 'afterBody' => null, + 'beforeFooter' => null, + 'footer' => null, + 'afterFooter' => null, + 'dataPoints' => null, + ]; + + private $initial_data = []; + + /** + * + */ + public function setUp(): void + { + $this->callbacks = new Callbacks(); + + // Re-initialize Expr properties + $keys = array_keys($this->empty_data); + foreach ($keys as $key) { + $this->initial_data[$key] = new Expr(''); + } + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->callbacks, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSet() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->callbacks, $this->input_data); + $result = TestUtils::getAttributes($this->callbacks, $this->data_types); + array_walk( + $result, + function (&$value) { + $value = strval($value); + } + ); + self::assertSame($expected, $result); + } + + public function testJsonSerializeEmpty() + { + $expected = []; + $result = $this->callbacks->jsonSerialize(); + self::assertSame($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/Options/TooltipsTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/TooltipsTest.php new file mode 100644 index 0000000000..f640eb1180 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/Options/TooltipsTest.php @@ -0,0 +1,227 @@ + false, /* bool */ + 'custom' => '', /* Expr */ + 'mode' => '', /* string */ + 'intersect' => false, /* bool */ + 'position' => '', /* string */ + 'itemSort' => '', /* Expr */ + 'filter' => '', /* Expr */ + 'backgroundColor' => '', /* string */ + 'titleFontFamily' => '', /* string */ + 'titleFontSize' => 1, /* int */ + 'titleFontStyle' => '', /* string */ + 'titleFontColor' => '', /* string */ + 'titleSpacing' => '', /* int */ + 'titleMarginBottom' => '', /* int */ + 'bodyFontFamily' => '', /* string */ + 'bodyFontSize' => '', /* int */ + 'bodyFontStyle' => '', /* string */ + 'bodyFontColor' => '', /* string */ + 'bodySpacing' => '', /* int */ + 'footerFontFamily' => '', /* string */ + 'footerFontSize' => 1, /* int */ + 'footerFontStyle' => '', /* string */ + 'footerFontColor' => '', /* string */ + 'footerSpacing' => 1, /* int */ + 'footerMarginTop' => 1, /* int */ + 'xPadding' => 1, /* int */ + 'yPadding' => 1, /* int */ + 'caretSize' => 1, /* int */ + 'cornerRadius' => 1, /* int */ + 'multiKeyBackground' => '', /* string */ + 'displayColors' => false, /* bool */ + ]; + + /** + * @var array + */ + public $input_data = [ + 'enabled' => true, /* bool */ + 'custom' => 'custom', /* Expr */ + 'mode' => 'mode', /* string */ + 'intersect' => true, /* bool */ + 'position' => 'position', /* string */ + 'itemSort' => 'itemSort', /* Expr */ + 'filter' => 'filter', /* Expr */ + 'backgroundColor' => 'backgroundColor', /* string */ + 'titleFontFamily' => 'titleFontFamily', /* string */ + 'titleFontSize' => 2, /* int */ + 'titleFontStyle' => 'titleFontStyle', /* string */ + 'titleFontColor' => 'titleFontColor', /* string */ + 'titleSpacing' => 3, /* int */ + 'titleMarginBottom' => 4, /* int */ + 'bodyFontFamily' => 'bodyFontFamily', /* string */ + 'bodyFontSize' => 5, /* int */ + 'bodyFontStyle' => 'bodyFontStyle', /* string */ + 'bodyFontColor' => 'bodyFontColor', /* string */ + 'bodySpacing' => 6, /* int */ + 'footerFontFamily' => 'footerFontFamily', /* string */ + 'footerFontSize' => 7, /* int */ + 'footerFontStyle' => 'footerFontStyle', /* string */ + 'footerFontColor' => 'footerFontColor', /* string */ + 'footerSpacing' => 8, /* int */ + 'footerMarginTop' => 9, /* int */ + 'xPadding' => 10, /* int */ + 'yPadding' => 11, /* int */ + 'caretSize' => 12, /* int */ + 'cornerRadius' => 13, /* int */ + 'multiKeyBackground' => 'multiKeyBackground', /* string */ + 'displayColors' => true, /* bool */ + ]; + + /** + * @var array + */ + public $input_data_no_expressions = [ + 'enabled' => true, /* bool */ + 'custom' => null, /* Expr */ + 'mode' => 'mode', /* string */ + 'intersect' => true, /* bool */ + 'position' => 'position', /* string */ + 'itemSort' => null, /* Expr */ + 'filter' => null, /* Expr */ + 'backgroundColor' => 'backgroundColor', /* string */ + 'titleFontFamily' => 'titleFontFamily', /* string */ + 'titleFontSize' => 2, /* int */ + 'titleFontStyle' => 'titleFontStyle', /* string */ + 'titleFontColor' => 'titleFontColor', /* string */ + 'titleSpacing' => 3, /* int */ + 'titleMarginBottom' => 4, /* int */ + 'bodyFontFamily' => 'bodyFontFamily', /* string */ + 'bodyFontSize' => 5, /* int */ + 'bodyFontStyle' => 'bodyFontStyle', /* string */ + 'bodyFontColor' => 'bodyFontColor', /* string */ + 'bodySpacing' => 6, /* int */ + 'footerFontFamily' => 'footerFontFamily', /* string */ + 'footerFontSize' => 7, /* int */ + 'footerFontStyle' => 'footerFontStyle', /* string */ + 'footerFontColor' => 'footerFontColor', /* string */ + 'footerSpacing' => 8, /* int */ + 'footerMarginTop' => 9, /* int */ + 'xPadding' => 10, /* int */ + 'yPadding' => 11, /* int */ + 'caretSize' => 12, /* int */ + 'cornerRadius' => 13, /* int */ + 'multiKeyBackground' => 'multiKeyBackground', /* string */ + 'displayColors' => true, /* bool */ + ]; + + /** + * @var array + */ + public $empty_data = [ + 'enabled' => null, /* bool */ + 'custom' => null, /* Expr */ + 'mode' => null, /* string */ + 'intersect' => null, /* bool */ + 'position' => null, /* string */ + 'itemSort' => null, /* Expr */ + 'filter' => null, /* Expr */ + 'backgroundColor' => null, /* string */ + 'titleFontFamily' => null, /* string */ + 'titleFontSize' => null, /* int */ + 'titleFontStyle' => null, /* string */ + 'titleFontColor' => null, /* string */ + 'titleSpacing' => null, /* int */ + 'titleMarginBottom' => null, /* int */ + 'bodyFontFamily' => null, /* string */ + 'bodyFontSize' => null, /* int */ + 'bodyFontStyle' => null, /* string */ + 'bodyFontColor' => null, /* string */ + 'bodySpacing' => null, /* int */ + 'footerFontFamily' => null, /* string */ + 'footerFontSize' => null, /* int */ + 'footerFontStyle' => null, /* string */ + 'footerFontColor' => null, /* string */ + 'footerSpacing' => null, /* int */ + 'footerMarginTop' => null, /* int */ + 'xPadding' => null, /* int */ + 'yPadding' => null, /* int */ + 'caretSize' => null, /* int */ + 'cornerRadius' => null, /* int */ + 'multiKeyBackground' => null, /* string */ + 'displayColors' => null, /* bool */ + ]; + + /** + * + */ + public function setUp(): void + { + $this->tooltips = new Tooltips(); + } + + /** + * + */ + public function testEmpty() + { + $expected = $this->empty_data; + $result = TestUtils::getAttributes($this->tooltips, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testGetAndSet() + { + $expected = $this->input_data; + TestUtils::setAttributes($this->tooltips, $this->input_data); + $result = TestUtils::getAttributes($this->tooltips, $this->data_types); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testCallbackInstance() + { + $result = $this->tooltips->callbacks(); + self::assertInstanceOf(Tooltips\Callbacks::class, $result); + } + + /** + * + */ + public function testJsonSerializeNoExpressions() + { + $expected = TestUtils::removeNullsFromArray($this->input_data_no_expressions); + TestUtils::setAttributes($this->tooltips, $expected); + $result = $this->tooltips->jsonSerialize(); + self::assertSame($expected, $result); + } + + /** + * + */ + public function testCallbackEmpty() + { + $expected = new Tooltips\Callbacks(); + $result = $this->tooltips->callbacks(); + self::assertEquals($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/OptionsTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/OptionsTest.php new file mode 100644 index 0000000000..59921b533e --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/OptionsTest.php @@ -0,0 +1,139 @@ +options = new Options(); + } + + /** + * + */ + public function testTitle() + { + $title = $this->options->getTitle(); + self::assertInstanceOf(Title::class, $title); + } + + /** + * + */ + public function testLayout() + { + $layout = $this->options->getLayout(); + self::assertInstanceOf(Layout::class, $layout); + } + + /** + * + */ + public function testElements() + { + $layout = $this->options->getElements(); + self::assertInstanceOf(Elements::class, $layout); + } + + /** + * + */ + public function testAnimation() + { + $animation = $this->options->getAnimation(); + self::assertInstanceOf(Animation::class, $animation); + } + + /** + * + */ + public function testHover() + { + $hover = $this->options->getHover(); + self::assertInstanceOf(Hover::class, $hover); + } + + /** + * + */ + public function testScales() + { + $scales = $this->options->getScales(); + self::assertInstanceOf(Scales::class, $scales); + } + + /** + * + */ + public function testLagend() + { + $legend = $this->options->getLegend(); + self::assertInstanceOf(Legend::class, $legend); + } + + /** + * + */ + public function testTooltips() + { + $tooltips = $this->options->getTooltips(); + self::assertInstanceOf(Tooltips::class, $tooltips); + } + + /** + * + */ + public function testAspectRatio() + { + // Test default value. Should be true. + self::assertTrue($this->options->isMaintainAspectRatio()); + + // Set to false. + self::assertSame($this->options, $this->options->setMaintainAspectRatio(false)); + self::assertFalse($this->options->isMaintainAspectRatio()); + + // Set to true again. + self::assertSame($this->options, $this->options->setMaintainAspectRatio(true)); + self::assertTrue($this->options->isMaintainAspectRatio()); + } + + /** + * + */ + public function testJsonSerialize() + { + $expected = $this->empty_options; + $result = $this->options->jsonSerialize(); + self::assertEquals($expected, $result); + } +} diff --git a/pandora_console/vendor/artica/phpchartjs/test/unit/RendererTest.php b/pandora_console/vendor/artica/phpchartjs/test/unit/RendererTest.php new file mode 100644 index 0000000000..a406fed450 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/test/unit/RendererTest.php @@ -0,0 +1,81 @@ +setId('myChart') + ->addLabel('Label 1')->addLabel('Label 2') + ->setTitle('My beautiful chart') + ->setHeight(320) + ->setWidth(480); + + /** @var DataSet $dataSet */ + $chart->addDataSet($dataSet = $chart->createDataSet()); + $dataSet->setLabel('My First Dataset'); + + $chart->options()->getTitle()->setText('My cool graph'); + $chart->options()->getLegend()->setDisplay(false); + + $this->chart = $chart; + } + + /** + * Test and validate generated JSON. See http://www.ietf.org/rfc/rfc4627.txt and http://json.org/. + * JavaScript functions will not be recognized and will result in failures of this test. + */ + public function testJson() + { + $renderer = new Json($this->chart); + $json = $renderer->render(); + $regex = << -? (?= [1-9]|0(?!\d) ) \d+ (\.\d+)? ([eE] [+-]? \d+)? ) + (? true | false | null ) + (? " ([^"\\\\]* | \\\\ ["\\\\bfnrt\/] | \\\\ u [0-9a-f]{4} )* " ) + (? \[ (?: (?&json) (?: , (?&json) )* )? \s* \] ) + (? \s* (?&string) \s* : (?&json) ) + (? \{ (?: (?&pair) (?: , (?&pair) )* )? \s* \} ) + (? \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) \s* ) +) +\A (?&json) \Z/six +REGEX; + + $result = preg_match($regex, $json, $matches); + + $this->assertEquals(1, $result, 'Validate JSON output'); + } + + /** + * + */ + public function testHtml() + { + $renderer = new Html($this->chart); + + $this->assertTrue(is_string($renderer->render()), 'Validate HTML output'); + } +} diff --git a/pandora_console/vendor/autoload.php b/pandora_console/vendor/autoload.php index d95bcefe2b..cac482501f 100644 --- a/pandora_console/vendor/autoload.php +++ b/pandora_console/vendor/autoload.php @@ -3,8 +3,21 @@ // autoload.php @generated by Composer if (PHP_VERSION_ID < 50600) { - echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; - exit(1); + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, $err); + } elseif (!headers_sent()) { + echo $err; + } + } + trigger_error( + $err, + E_USER_ERROR + ); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/pandora_console/vendor/chrome-php/chrome/LICENSE b/pandora_console/vendor/chrome-php/chrome/LICENSE new file mode 100644 index 0000000000..034561bd81 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2017-2020 Soufiane Ghzal +Copyright (c) 2020-2022 Graham Campbell +Copyright (c) 2020-2022 Enrico Dias + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pandora_console/vendor/chrome-php/chrome/composer.json b/pandora_console/vendor/chrome-php/chrome/composer.json new file mode 100644 index 0000000000..4ff43d04e7 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/composer.json @@ -0,0 +1,55 @@ +{ + "name": "chrome-php/chrome", + "description": "Instrument headless chrome/chromium instances from PHP", + "keywords": ["chrome", "chromium", "crawl", "browser", "headless", "screenshot", "pdf", "puppeteer"], + "license": "MIT", + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Enrico Dias", + "email": "enrico@enricodias.com", + "homepage": "https://github.com/enricodias" + } + ], + "require": { + "php": "^7.3 || ^8.0", + "chrome-php/wrench": "^1.3", + "evenement/evenement": "^3.0.1", + "monolog/monolog": "^1.27.1 || ^2.8 || ^3.2", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/filesystem": "^4.4 || ^5.0 || ^6.0", + "symfony/polyfill-mbstring": "^1.26", + "symfony/process": "^4.4 || ^5.0 || ^6.0" + }, + "require-dev":{ + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^9.5.23", + "symfony/var-dumper": "^4.4 || ^5.0 || ^6.0" + }, + "autoload":{ + "psr-4" : { + "HeadlessChromium\\": "src/" + } + }, + "autoload-dev":{ + "psr-4" : { + "HeadlessChromium\\Test\\": "tests/" + } + }, + "config": { + "allow-plugins": { + "bamarni/composer-bin-plugin": true + }, + "preferred-install": "dist" + }, + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/AutoDiscover.php b/pandora_console/vendor/chrome-php/chrome/src/AutoDiscover.php new file mode 100644 index 0000000000..38b02c8a45 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/AutoDiscover.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium; + +class AutoDiscover +{ + /** + * @var callable(): string + */ + private $osFamily; + + /** + * @param (callable(): string)|null $osFamily + */ + public function __construct(?callable $osFamily = null) + { + $this->osFamily = $osFamily ?? function (): string { + return \PHP_OS_FAMILY; + }; + } + + public function guessChromeBinaryPath(): string + { + if (\array_key_exists('CHROME_PATH', $_SERVER)) { + return $_SERVER['CHROME_PATH']; + } + + switch (($this->osFamily)()) { + case 'Darwin': + return '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'; + case 'Windows': + return self::getFromRegistry() ?? '%ProgramFiles(x86)%\Google\Chrome\Application\chrome.exe'; + default: + return null === self::shellExec('command -v google-chrome') ? 'chrome' : 'google-chrome'; + } + } + + private static function getFromRegistry(): ?string + { + $registryKey = self::shellExec( + 'reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe" /ve' + ); + + if (null === $registryKey) { + return null; + } + + \preg_match('/.:(?!.*:).*/', $registryKey, $matches); + + return $matches[0] ?? null; + } + + private static function shellExec(string $command): ?string + { + try { + $result = @\shell_exec($command); + + return \is_string($result) ? $result : null; + } catch (\Throwable $e) { + return null; + } + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Browser.php b/pandora_console/vendor/chrome-php/chrome/src/Browser.php new file mode 100644 index 0000000000..bdcd0ef06f --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Browser.php @@ -0,0 +1,254 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium; + +use HeadlessChromium\Communication\Connection; +use HeadlessChromium\Communication\Message; +use HeadlessChromium\Communication\Target; +use HeadlessChromium\Exception\CommunicationException; +use HeadlessChromium\Exception\CommunicationException\ResponseHasError; +use HeadlessChromium\Exception\NoResponseAvailable; +use HeadlessChromium\Exception\OperationTimedOut; + +class Browser +{ + /** + * @var Connection + */ + protected $connection; + + /** + * @var array + */ + protected $targets = []; + + /** + * @var array + */ + protected $pages = []; + + /** + * A preScript to be automatically added on every new pages. + * + * @var string|null + */ + protected $pagePreScript; + + public function __construct(Connection $connection) + { + $this->connection = $connection; + + // listen for target created + $this->connection->on(Connection::EVENT_TARGET_CREATED, function (array $params): void { + // create and store the target + $this->targets[$params['targetInfo']['targetId']] = new Target($params['targetInfo'], $this->connection); + }); + + // listen for target info changed + $this->connection->on(Connection::EVENT_TARGET_INFO_CHANGED, function (array $params): void { + // get target by id + $target = $this->getTarget($params['targetInfo']['targetId']); + + if ($target) { + $target->targetInfoChanged($params['targetInfo']); + } + }); + + // listen for target destroyed + $this->connection->on(Connection::EVENT_TARGET_DESTROYED, function (array $params): void { + // get target by id + $target = $this->getTarget($params['targetId']); + + if ($target) { + // remove the page + unset($this->pages[$params['targetId']]); + // remove the target + unset($this->targets[$params['targetId']]); + $target->destroy(); + $this->connection + ->getLogger() + ->debug('✘ target('.$params['targetId'].') was destroyed and unreferenced.'); + } + }); + + // enable target discovery + $connection->sendMessageSync(new Message('Target.setDiscoverTargets', ['discover' => true])); + } + + /** + * @return Connection + */ + public function getConnection(): Connection + { + return $this->connection; + } + + /** + * Set a preScript to be added on every new pages. + * Use null to disable it. + * + * @param string|null $script + */ + public function setPagePreScript(string $script = null): void + { + $this->pagePreScript = $script; + } + + /** + * Closes the browser. + * + * @throws \Exception + */ + public function close(): void + { + $this->sendCloseMessage(); + } + + /** + * Send close message to the browser. + * + * @throws OperationTimedOut + */ + final public function sendCloseMessage(): void + { + $r = $this->connection->sendMessageSync(new Message('Browser.close')); + if (!$r->isSuccessful()) { + // log + $this->connection->getLogger()->debug('process: ✗ could not close gracefully'); + throw new \Exception('cannot close, Browser.close not supported'); + } + } + + /** + * Creates a new page. + * + * @throws NoResponseAvailable + * @throws CommunicationException + * @throws OperationTimedOut + * + * @return Page + */ + public function createPage(): Page + { + // page url + $params = ['url' => 'about:blank']; + + // create page and get target id + $response = $this->connection->sendMessageSync(new Message('Target.createTarget', $params)); + $targetId = $response['result']['targetId']; + + // todo handle error + + $target = $this->getTarget($targetId); + if (!$target) { + throw new \RuntimeException('Target could not be created for page.'); + } + + $page = $this->getPage($targetId); + + return $page; + } + + /** + * @param string $targetId + * + * @return Target|null + */ + public function getTarget($targetId) + { + // make sure target was created (via Target.targetCreated event) + if (!\array_key_exists($targetId, $this->targets)) { + return null; + } + + return $this->targets[$targetId]; + } + + /** + * @return Target[] + */ + public function getTargets() + { + return \array_values($this->targets); + } + + /** + * @param string $targetId + * + * @throws CommunicationException + * + * @return Page|null + */ + public function getPage($targetId) + { + if (\array_key_exists($targetId, $this->pages)) { + return $this->pages[$targetId]; + } + + $target = $this->getTarget($targetId); + + if ('page' !== $target->getTargetInfo('type')) { + return null; + } + + // get initial frame tree + $frameTreeResponse = $target->getSession()->sendMessageSync(new Message('Page.getFrameTree')); + + // make sure frame tree was found + if (!$frameTreeResponse->isSuccessful()) { + throw new ResponseHasError('Cannot read frame tree. Please, consider upgrading chrome version.'); + } + + // create page + $page = new Page($target, $frameTreeResponse['result']['frameTree']); + + // Page.enable + $page->getSession()->sendMessageSync(new Message('Page.enable')); + + // Network.enable + $page->getSession()->sendMessageSync(new Message('Network.enable')); + + // Runtime.enable + $page->getSession()->sendMessageSync(new Message('Runtime.enable')); + + // Page.setLifecycleEventsEnabled + $page->getSession()->sendMessageSync(new Message('Page.setLifecycleEventsEnabled', ['enabled' => true])); + + // set up http headers + $headers = $this->connection->getConnectionHttpHeaders(); + + if (\count($headers) > 0) { + $page->setExtraHTTPHeaders($headers); + } + + // add prescript + if ($this->pagePreScript) { + $page->addPreScript($this->pagePreScript); + } + + $this->pages[$targetId] = $page; + + return $page; + } + + /** + * @return Page[] + */ + public function getPages() + { + $ids = \array_keys($this->targets); + + $pages = \array_filter(\array_map([$this, 'getPage'], $ids)); + + return \array_values($pages); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php b/pandora_console/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php new file mode 100644 index 0000000000..e01347f52f --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Browser/BrowserProcess.php @@ -0,0 +1,467 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Browser; + +use HeadlessChromium\Browser; +use HeadlessChromium\Communication\Connection; +use HeadlessChromium\Exception\OperationTimedOut; +use HeadlessChromium\Utils; +use Psr\Log\LoggerAwareInterface; +use Psr\Log\LoggerAwareTrait; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\Process\Process; +use Wrench\Exception\SocketException; + +/** + * A browser process starter. Don't use directly, use BrowserFactory instead. + */ +class BrowserProcess implements LoggerAwareInterface +{ + use LoggerAwareTrait; + + /** + * chrome instance's user data data. + * + * @var string + */ + protected $userDataDir; + + /** + * @var Process + */ + protected $process; + + /** + * True if the user data dir is temporary and should be deleted on process closes. + * + * @var bool + */ + protected $userDataDirIsTemp; + + /** + * @var Connection + */ + protected $connection; + + /** + * @var ProcessAwareBrowser + */ + protected $browser; + + /** + * @var bool + */ + protected $wasKilled = false; + + /** + * @var bool + */ + protected $wasStarted = false; + + /** + * @var string + */ + protected $wsUri; + + /** + * BrowserProcess constructor. + * + * @param LoggerInterface|null $logger + */ + public function __construct(LoggerInterface $logger = null) + { + // set or create logger + $this->setLogger($logger ?? new NullLogger()); + } + + /** + * Starts the browser. + * + * @param string $binary + * @param array $options + */ + public function start($binary, $options): void + { + if ($this->wasStarted) { + // cannot start twice because once started this class contains the necessary data to cleanup the browser. + // starting in again would result in replacing those data. + throw new \RuntimeException('This process was already started'); + } + + $this->wasStarted = true; + + // log + $this->logger->debug('process: initializing'); + + // user data dir + if (!\array_key_exists('userDataDir', $options) || !$options['userDataDir']) { + // if no data dir specified create it + $options['userDataDir'] = $this->createTempDir(); + + // set user data dir to get removed on close + $this->userDataDirIsTemp = true; + } + $this->userDataDir = $options['userDataDir']; + + // log + $this->logger->debug('process: using directory: '.$options['userDataDir']); + + // get args for command line + $args = $this->getArgsFromOptions($binary, $options); + + // setup chrome process + if (!\array_key_exists('keepAlive', $options) || !$options['keepAlive']) { + $process = new Process($args, null, $options['envVariables'] ?? null); + } else { + $process = new ProcessKeepAlive($args, null, $options['envVariables'] ?? null); + } + $this->process = $process; + + // log + $this->logger->debug('process: starting process: '.$process->getCommandLine()); + + // and start + $process->start(); + + // wait for start and retrieve ws uri + $startupTimeout = $options['startupTimeout'] ?? 30; + $this->wsUri = $this->waitForStartup($process, $startupTimeout * 1000 * 1000); + + // log + $this->logger->debug('process: connecting using '.$this->wsUri); + + // connect to browser + $connection = new Connection($this->wsUri, $this->logger, $options['sendSyncDefaultTimeout'] ?? 5000); + $connection->connect(); + + // connection delay + if (\array_key_exists('connectionDelay', $options)) { + $connection->setConnectionDelay($options['connectionDelay']); + } + + // connection headers + if (\array_key_exists('headers', $options)) { + $connection->setConnectionHttpHeaders($options['headers']); + } + + // set connection to allow killing chrome + $this->connection = $connection; + + // create browser instance + $this->browser = new ProcessAwareBrowser($connection, $this); + } + + /** + * @return ProcessAwareBrowser + */ + public function getBrowser() + { + return $this->browser; + } + + /** + * @return string + */ + public function getSocketUri() + { + return $this->wsUri; + } + + /** + * Kills the process and clean temporary files. + * + * @throws OperationTimedOut + */ + public function kill(): void + { + // log + $this->logger->debug('process: killing chrome'); + + if ($this->wasKilled) { + // log + $this->logger->debug('process: chrome already killed, ignoring'); + + return; + } + + $this->wasKilled = true; + + if (isset($this->process)) { + // close gracefully if connection exists + if (isset($this->connection)) { + // if socket connect try graceful close + if ($this->connection->isConnected()) { + // first try to close with Browser.close + // if Browser.close is not implemented, try to kill by closing all pages + try { + // log + $this->logger->debug('process: trying to close chrome gracefully'); + $this->browser->sendCloseMessage(); + } catch (\Exception $e) { + // log + $this->logger->debug('process: closing chrome gracefully - compatibility'); + + // close all pages if connected + try { + $this->connection->isConnected() && Utils::closeAllPage($this->connection); + } catch (OperationTimedOut $e) { + // log + $this->logger->debug('process: failed to close all pages'); + } + } + + // disconnect socket + try { + $this->connection->disconnect(); + } catch (SocketException $e) { + // Socket might be already disconnected + } + + // log + $this->logger->debug('process: waiting for process to close'); + + // wait for process to close + $generator = function (Process $process) { + while ($process->isRunning()) { + yield 2 * 1000; // wait for 2ms + } + }; + $timeout = 8 * 1000 * 1000; // 8 seconds + + try { + Utils::tryWithTimeout($timeout, $generator($this->process)); + } catch (OperationTimedOut $e) { + // log + $this->logger->debug('process: process didn\'t close by itself'); + } + } + } + + // stop process if running + if ($this->process->isRunning()) { + // log + $this->logger->debug('process: stopping process'); + + // stop process + $exitCode = $this->process->stop(); + + // log + $this->logger->debug('process: process stopped with exit code '.$exitCode); + } + } + + // remove data dir + if ($this->userDataDirIsTemp && $this->userDataDir) { + try { + // log + $this->logger->debug('process: cleaning temporary resources:'.$this->userDataDir); + + // cleaning + $fs = new Filesystem(); + $fs->remove($this->userDataDir); + } catch (\Exception $e) { + // log + $this->logger->debug('process: ✗ could not clean temporary resources'); + } + } + } + + /** + * Get args for creating chrome's startup command. + * + * @param array $options + * + * @return array + */ + private function getArgsFromOptions($binary, array $options) + { + // command line args to add to start chrome (inspired by puppeteer configs) + // see https://peter.sh/experiments/chromium-command-line-switches/ + $args = [ + $binary, + + // auto debug port + '--remote-debugging-port=0', + + // disable undesired features + '--disable-background-networking', + '--disable-background-timer-throttling', + '--disable-client-side-phishing-detection', + '--disable-hang-monitor', + '--disable-popup-blocking', + '--disable-prompt-on-repost', + '--disable-sync', + '--disable-translate', + '--disable-features=ChromeWhatsNewUI', + '--metrics-recording-only', + '--no-first-run', + '--safebrowsing-disable-auto-update', + + // automation mode + '--enable-automation', + + // password settings + '--password-store=basic', + '--use-mock-keychain', // osX only + ]; + + // enable headless mode + if (!\array_key_exists('headless', $options) || $options['headless']) { + $args[] = '--headless'; + $args[] = '--disable-gpu'; + $args[] = '--font-render-hinting=none'; + $args[] = '--hide-scrollbars'; + $args[] = '--mute-audio'; + } + + // disable loading of images (currently can't be done via devtools, only CLI) + if (\array_key_exists('enableImages', $options) && (false === $options['enableImages'])) { + $args[] = '--blink-settings=imagesEnabled=false'; + } + + // window's size + if (\array_key_exists('windowSize', $options) && $options['windowSize']) { + if ( + !\is_array($options['windowSize']) || + 2 !== \count($options['windowSize']) || + !\is_numeric($options['windowSize'][0]) || + !\is_numeric($options['windowSize'][1]) + ) { + throw new \InvalidArgumentException('Option "windowSize" must be an array of dimensions (eg: [1000, 1200])'); + } + + $args[] = '--window-size='.\implode(',', $options['windowSize']); + } + + // sandbox mode - useful if you want to use chrome headless inside docker + if (\array_key_exists('noSandbox', $options) && $options['noSandbox']) { + $args[] = '--no-sandbox'; + } + + // user agent + if (\array_key_exists('userAgent', $options)) { + $args[] = '--user-agent='.$options['userAgent']; + } + + // ignore certificate errors + if (\array_key_exists('ignoreCertificateErrors', $options) && $options['ignoreCertificateErrors']) { + $args[] = '--ignore-certificate-errors'; + } + + // proxy server + if (\array_key_exists('proxyServer', $options)) { + $args[] = '--proxy-server='.$options['proxyServer']; + } + if (\array_key_exists('noProxyServer', $options) && $options['noProxyServer']) { + $args[] = '--no-proxy-server'; + } + if (\array_key_exists('proxyBypassList', $options)) { + $args[] = '--proxy-bypass-list='.$options['proxyBypassList']; + } + + // add custom flags + if (\array_key_exists('customFlags', $options) && \is_array($options['customFlags'])) { + $args = \array_merge($args, $options['customFlags']); + } + + // add user data dir to args + $args[] = '--user-data-dir='.$options['userDataDir']; + + return $args; + } + + /** + * Wait for chrome to startup (given a process) and return the ws uri to connect to. + * + * @param Process $process + * @param int $timeout + * + * @return mixed + */ + private function waitForStartup(Process $process, int $timeout) + { + // log + $this->logger->debug('process: waiting for '.$timeout / 1000000 .' seconds for startup'); + + try { + $generator = function (Process $process) { + while (true) { + if (!$process->isRunning()) { + // log + $this->logger->debug('process: ✗ chrome process stopped'); + + // exception + $message = 'Chrome process stopped before startup completed.'; + $error = \trim($process->getErrorOutput()); + if (!empty($error)) { + $message .= ' Additional info: '.$error; + } + throw new \RuntimeException($message); + } + + $output = \trim($process->getIncrementalErrorOutput()); + + if ($output) { + // log + $this->logger->debug('process: chrome output:'.$output); + + $outputs = \explode(\PHP_EOL, $output); + + foreach ($outputs as $output) { + $output = \trim($output); + + // ignore empty line + if (empty($output)) { + continue; + } + + // find socket uri + if (\preg_match('/DevTools listening on (ws:\/\/.*)/', $output, $matches)) { + // log + $this->logger->debug('process: ✓ accepted output'); + + return $matches[1]; + } else { + // log + $this->logger->debug('process: ignoring output:'.\trim($output)); + } + } + } + + // wait for 10ms + yield 10 * 1000; + } + }; + + return Utils::tryWithTimeout($timeout, $generator($process)); + } catch (OperationTimedOut $e) { + throw new \RuntimeException('Cannot start browser', 0, $e); + } + } + + /** + * Creates a temp directory for the app. + * + * @return string path to the new temp directory + */ + private function createTempDir() + { + $tmpFile = \tempnam(\sys_get_temp_dir(), 'chromium-php-'); + + \unlink($tmpFile); + \mkdir($tmpFile); + + return $tmpFile; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Browser/ProcessAwareBrowser.php b/pandora_console/vendor/chrome-php/chrome/src/Browser/ProcessAwareBrowser.php new file mode 100644 index 0000000000..6a57d27e8d --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Browser/ProcessAwareBrowser.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Browser; + +use HeadlessChromium\Browser; +use HeadlessChromium\Communication\Connection; + +class ProcessAwareBrowser extends Browser +{ + /** + * @var BrowserProcess + */ + protected $browserProcess; + + public function __construct(Connection $connection, BrowserProcess $browserProcess) + { + parent::__construct($connection); + + $this->browserProcess = $browserProcess; + } + + /** + * {@inheritdoc} + */ + public function close(): void + { + $this->browserProcess->kill(); + } + + /** + * @return string + */ + public function getSocketUri() + { + return $this->browserProcess->getSocketUri(); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Browser/ProcessKeepAlive.php b/pandora_console/vendor/chrome-php/chrome/src/Browser/ProcessKeepAlive.php new file mode 100644 index 0000000000..3caeb1b18a --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Browser/ProcessKeepAlive.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Browser; + +use Symfony\Component\Process\Process; + +class ProcessKeepAlive extends Process +{ + public function __destruct() + { + // Do nothing because we are in mode keep alive, default behavior is to kill the process + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/BrowserFactory.php b/pandora_console/vendor/chrome-php/chrome/src/BrowserFactory.php new file mode 100644 index 0000000000..8155c68831 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/BrowserFactory.php @@ -0,0 +1,201 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium; + +use HeadlessChromium\Browser\BrowserProcess; +use HeadlessChromium\Browser\ProcessAwareBrowser; +use HeadlessChromium\Communication\Connection; +use HeadlessChromium\Exception\BrowserConnectionFailed; +use Monolog\Handler\StreamHandler; +use Monolog\Logger; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; +use Symfony\Component\Process\Process; +use Wrench\Exception\HandshakeException; + +class BrowserFactory +{ + protected $chromeBinary; + + /** + * Options for browser creation. + * + * - connectionDelay: Delay to apply between each operation for debugging purposes (default: none) + * - customFlags: An array of flags to pass to the command line. + * - debugLogger: A string (e.g "php://stdout"), or resource, or PSR-3 logger instance to print debug messages (default: none) + * - enableImages: Toggles loading of images (default: true) + * - envVariables: An array of environment variables to pass to the process (example DISPLAY variable) + * - headers: An array of custom HTTP headers + * - headless: Enable or disable headless mode (default: true) + * - ignoreCertificateErrors: Set chrome to ignore ssl errors + * - keepAlive: Set to `true` to keep alive the chrome instance when the script terminates (default: false) + * - noSandbox: Enable no sandbox mode, useful to run in a docker container (default: false) + * - proxyServer: Proxy server to use. ex: `127.0.0.1:8080` (default: none) + * - sendSyncDefaultTimeout: Default timeout (ms) for sending sync messages (default 5000 ms) + * - startupTimeout: Maximum time in seconds to wait for chrome to start (default: 30 sec) + * - userAgent: User agent to use for the whole browser + * - userDataDir: Chrome user data dir (default: a new empty dir is generated temporarily) + * - windowSize: Size of the window. ex: `[1920, 1080]` (default: none) + */ + protected $options = []; + + public function __construct(string $chromeBinary = null) + { + $this->chromeBinary = $chromeBinary ?? (new AutoDiscover())->guessChromeBinaryPath(); + } + + /** + * Start a chrome process and allows to interact with it. + * + * @see BrowserFactory::$options + * + * @param array|null $options overwrite options for browser creation + * + * @return ProcessAwareBrowser a Browser instance to interact with the new chrome process + */ + public function createBrowser(?array $options = null): ProcessAwareBrowser + { + $options = $options ?? $this->options; + + // create logger from options + $logger = self::createLogger($options); + + // create browser process + $browserProcess = new BrowserProcess($logger); + + // instruct the runtime to kill chrome and clean temp files on exit + if (!\array_key_exists('keepAlive', $options) || !$options['keepAlive']) { + \register_shutdown_function([$browserProcess, 'kill']); + } + + // start the browser and connect to it + $browserProcess->start($this->chromeBinary, $options); + + return $browserProcess->getBrowser(); + } + + public function addHeader(string $name, string $value): void + { + $this->options['headers'][$name] = $value; + } + + /** + * @param array $headers + */ + public function addHeaders(array $headers): void + { + foreach ($headers as $name => $value) { + $this->addHeader($name, $value); + } + } + + /** + * Connects to an existing browser using it's web socket uri. + * + * usage: + * + * ``` + * $browserFactory = new BrowserFactory(); + * $browser = $browserFactory->createBrowser(); + * + * $uri = $browser->getSocketUri(); + * + * $existingBrowser = BrowserFactory::connectToBrowser($uri); + * ``` + * + * @param string $uri + * @param array $options options when creating the connection to the browser: + * - connectionDelay: amount of time in seconds to slows down connection for debugging purposes (default: none) + * - debugLogger: resource string ("php://stdout"), resource or psr-3 logger instance (default: none) + * - sendSyncDefaultTimeout: maximum time in ms to wait for synchronous messages to send (default 5000 ms) + * + * @throws BrowserConnectionFailed + * + * @return Browser + */ + public static function connectToBrowser(string $uri, array $options = []): Browser + { + $logger = self::createLogger($options); + + if ($logger) { + $logger->debug('Browser Factory: connecting using '.$uri); + } + + // connect to browser + $connection = new Connection($uri, $logger, $options['sendSyncDefaultTimeout'] ?? 5000); + + // try to connect + try { + $connection->connect(); + } catch (HandshakeException $e) { + throw new BrowserConnectionFailed('Invalid socket uri', 0, $e); + } + + // make sure it is connected + if (!$connection->isConnected()) { + throw new BrowserConnectionFailed('Cannot connect to the browser, make sure it was not closed'); + } + + // connection delay + if (\array_key_exists('connectionDelay', $options)) { + $connection->setConnectionDelay($options['connectionDelay']); + } + + return new Browser($connection); + } + + /** + * Set default options to be used in all browser instances. + * + * @see BrowserFactory::$options + */ + public function setOptions(array $options): void + { + $this->options = $options; + } + + /** + * Add or overwrite options to the default options list. + * + * @see BrowserFactory::$options + */ + public function addOptions(array $options): void + { + $this->options = \array_merge($this->options, $options); + } + + public function getOptions(): array + { + return $this->options; + } + + /** + * Create a logger instance from given options. + */ + private static function createLogger(array $options): LoggerInterface + { + $logger = $options['debugLogger'] ?? null; + + if ($logger instanceof LoggerInterface) { + return $logger; + } + + if (\is_string($logger) || \is_resource($logger)) { + $log = new Logger('chrome'); + $log->pushHandler(new StreamHandler($logger)); + + return $log; + } + + return new NullLogger(); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Clip.php b/pandora_console/vendor/chrome-php/chrome/src/Clip.php new file mode 100644 index 0000000000..7be7cd7eb8 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Clip.php @@ -0,0 +1,119 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium; + +class Clip +{ + protected $x; + protected $y; + protected $height; + protected $width; + protected $scale; + + /** + * Clip constructor. + * + * @param int $x + * @param int $y + * @param int $height + * @param int $width + * @param float $scale + */ + public function __construct($x, $y, $width, $height, $scale = 1.0) + { + $this->x = $x; + $this->y = $y; + $this->height = $height; + $this->width = $width; + $this->scale = $scale; + } + + /** + * @return mixed + */ + public function getX() + { + return $this->x; + } + + /** + * @return mixed + */ + public function getY() + { + return $this->y; + } + + /** + * @return mixed + */ + public function getHeight() + { + return $this->height; + } + + /** + * @return mixed + */ + public function getWidth() + { + return $this->width; + } + + /** + * @return mixed + */ + public function getScale() + { + return $this->scale; + } + + /** + * @param mixed $x + */ + public function setX($x): void + { + $this->x = $x; + } + + /** + * @param mixed $y + */ + public function setY($y): void + { + $this->y = $y; + } + + /** + * @param mixed $height + */ + public function setHeight($height): void + { + $this->height = $height; + } + + /** + * @param mixed $width + */ + public function setWidth($width): void + { + $this->width = $width; + } + + /** + * @param mixed $scale + */ + public function setScale($scale): void + { + $this->scale = $scale; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Communication/Connection.php b/pandora_console/vendor/chrome-php/chrome/src/Communication/Connection.php new file mode 100644 index 0000000000..cbd7543382 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Communication/Connection.php @@ -0,0 +1,458 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Communication; + +use Evenement\EventEmitter; +use HeadlessChromium\Communication\Socket\SocketInterface; +use HeadlessChromium\Communication\Socket\Wrench; +use HeadlessChromium\Exception\CommunicationException; +use HeadlessChromium\Exception\CommunicationException\CannotReadResponse; +use HeadlessChromium\Exception\CommunicationException\InvalidResponse; +use HeadlessChromium\Exception\OperationTimedOut; +use HeadlessChromium\Exception\TargetDestroyed; +use Psr\Log\LoggerAwareInterface; +use Psr\Log\LoggerAwareTrait; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; +use Wrench\Client as WrenchBaseClient; + +class Connection extends EventEmitter implements LoggerAwareInterface +{ + use LoggerAwareTrait; + + public const EVENT_TARGET_CREATED = 'method:Target.targetCreated'; + public const EVENT_TARGET_INFO_CHANGED = 'method:Target.targetInfoChanged'; + public const EVENT_TARGET_DESTROYED = 'method:Target.targetDestroyed'; + + /** + * When strict mode is enabled communication error will result in exceptions. + * + * @var bool + */ + protected $strict = true; + + /** + * time in ms to wait between each message to be sent + * That helps to see what is happening when debugging. + * + * @var int + */ + protected $delay; + + /** + * time in ms when the previous message was sent. Used to know how long to wait for before send next message + * (only when $delay is set). + * + * @var int + */ + private $lastMessageSentTime; + + /** + * @var SocketInterface + */ + protected $wsClient; + + /** + * List of response sent from the remote host and that are waiting to be read. + * + * @var array + */ + protected $responseBuffer = []; + + /** + * Default timeout for send sync in ms. + * + * @var int + */ + protected $sendSyncDefaultTimeout; + + /** + * @var Session[] + */ + protected $sessions = []; + + /** + * @var array array of data received and waiting to be read + */ + protected $receivedData = []; + + /** + * @var array + */ + protected $httpHeaders = []; + + /** + * CommunicationChannel constructor. + * + * @param SocketInterface|string $socketClient + * @param int|null $sendSyncDefaultTimeout + */ + public function __construct($socketClient, LoggerInterface $logger = null, int $sendSyncDefaultTimeout = null) + { + // set or create logger + $this->setLogger($logger ?? new NullLogger()); + + // set timeout + $this->sendSyncDefaultTimeout = $sendSyncDefaultTimeout ?? 5000; + + // create socket client + if (\is_string($socketClient)) { + $socketClient = new Wrench(new WrenchBaseClient($socketClient, 'http://127.0.0.1'), $this->logger); + } elseif (!\is_object($socketClient) && !$socketClient instanceof SocketInterface) { + throw new \InvalidArgumentException('$socketClient param should be either a SockInterface instance or a web socket uri string'); + } + + $this->wsClient = $socketClient; + } + + /** + * @return LoggerInterface + */ + public function getLogger(): LoggerInterface + { + return $this->logger; + } + + /** + * Set the delay to apply everytime before data are sent. + * + * @param int $delay + */ + public function setConnectionDelay(int $delay): void + { + $this->delay = $delay; + } + + /** + * @param array $headers + * + * @return void + */ + public function setConnectionHttpHeaders(array $headers): void + { + $this->httpHeaders = $headers; + } + + /** + * @return array + */ + public function getConnectionHttpHeaders(): array + { + return $this->httpHeaders; + } + + /** + * Gets the default timeout used when sending a message synchronously. + * + * @return int + */ + public function getSendSyncDefaultTimeout(): int + { + return $this->sendSyncDefaultTimeout; + } + + /** + * @return bool + */ + public function isStrict(): bool + { + return $this->strict; + } + + /** + * @param bool $strict + */ + public function setStrict(bool $strict): void + { + $this->strict = $strict; + } + + /** + * Connects to the server. + * + * @return bool Whether a new connection was made + */ + public function connect() + { + return $this->wsClient->connect(); + } + + /** + * Disconnects the underlying socket, and marks the client as disconnected. + * + * @return bool + */ + public function disconnect() + { + return $this->wsClient->disconnect(); + } + + /** + * Returns whether the client is currently connected. + * + * @return bool true if connected + */ + public function isConnected() + { + return $this->wsClient->isConnected(); + } + + /** + * Wait before sending next message. + */ + private function waitForDelay(): void + { + if ($this->lastMessageSentTime) { + $currentTime = (int) (\hrtime(true) / 1000 / 1000); + // if not enough time was spent until last message was sent, wait + if ($this->lastMessageSentTime + $this->delay > $currentTime) { + $timeToWait = ($this->lastMessageSentTime + $this->delay) - $currentTime; + \usleep($timeToWait * 1000); + } + } + + $this->lastMessageSentTime = (int) (\hrtime(true) / 1000 / 1000); + } + + /** + * Sends the given message and returns a response reader. + * + * @param Message $message + * + * @throws CommunicationException + * + * @return ResponseReader + */ + public function sendMessage(Message $message): ResponseReader + { + // if delay enabled wait before sending message + if ($this->delay > 0) { + $this->waitForDelay(); + } + + $sent = $this->wsClient->sendData((string) $message); + + if (!$sent) { + $message = 'Message could not be sent.'; + + if (!$this->isConnected()) { + $message .= ' Reason: the connection is closed.'; + } else { + $message .= ' Reason: unknown.'; + } + + throw new CommunicationException($message); + } + + return new ResponseReader($message, $this); + } + + /** + * @param Message $message + * @param int|null $timeout + * + * @throws OperationTimedOut + * + * @return Response + */ + public function sendMessageSync(Message $message, int $timeout = null): Response + { + $responseReader = $this->sendMessage($message); + $response = $responseReader->waitForResponse($timeout ?? $this->sendSyncDefaultTimeout); + + return $response; + } + + /** + * Create a session for the given target id. + * + * @param string $targetId + * @param ?string $sessionId + * + * @return Session + */ + public function createSession($targetId, $sessionId = null): Session + { + if (null === $sessionId) { + $response = $this->sendMessageSync( + new Message('Target.attachToTarget', ['targetId' => $targetId, 'flatten' => true]) + ); + if (empty($response['result'])) { + throw new TargetDestroyed('The target was destroyed.'); + } + $sessionId = $response['result']['sessionId']; + } + $session = new Session($targetId, $sessionId, $this); + + $this->sessions[$sessionId] = $session; + + $session->on('destroyed', function () use ($sessionId): void { + $this->logger->debug('✘ session('.$sessionId.') was destroyed and unreferenced.'); + unset($this->sessions[$sessionId]); + }); + + return $session; + } + + /** + * Receive and stack data from the socket. + */ + private function receiveData(): void + { + $this->receivedData = \array_merge($this->receivedData, $this->wsClient->receiveData()); + } + + /** + * Read data from CRI and store messages. + * + * @throws CannotReadResponse + * @throws InvalidResponse + * + * @return bool true if data were received + */ + public function readData() + { + $hasData = false; + + while ($this->readLine()) { + $hasData = true; + } + + return $hasData; + } + + public function readLine() + { + // if buffer empty, then read from input + if (empty($this->receivedData)) { + $this->receiveData(); + } + + // dispatch first line of buffer + $datum = \array_shift($this->receivedData); + if ($datum) { + return $this->dispatchMessage($datum); + } + + return false; + } + + /** + * Dispatches the message and either stores the response or emits an event. + * + * @throws InvalidResponse + * + * @return bool + * + * @internal + */ + private function dispatchMessage(string $message, Session $session = null) + { + // responses come as json string + $response = \json_decode($message, true); + + // if json not valid throw exception + $jsonError = \json_last_error(); + if (\JSON_ERROR_NONE !== $jsonError) { + if ($this->isStrict()) { + throw new CannotReadResponse(\sprintf('Response from chrome remote interface is not a valid json response. JSON error: %s', $jsonError)); + } + + return false; + } + + // response must be array + if (!\is_array($response)) { + if ($this->isStrict()) { + throw new CannotReadResponse('Response from chrome remote interface was not a valid array'); + } + + return false; + } + + // id is required to identify the response + if (!isset($response['id'])) { + if (isset($response['method'])) { + if ('Target.receivedMessageFromTarget' == $response['method']) { + $session = $this->sessions[$response['params']['sessionId']]; + + return $this->dispatchMessage($response['params']['message'], $session); + } else { + if (!$session && isset($response['sessionId'])) { + $session = $this->sessions[$response['sessionId']] ?? null; + } + if ($session) { + $this->logger->debug( + 'session('.$session->getSessionId().'): ⇶ dispatching method:'.$response['method'] + ); + $session->emit('method:'.$response['method'], [$response['params']]); + } else { + $this->logger->debug('connection: ⇶ dispatching method:'.$response['method']); + $this->emit('method:'.$response['method'], [$response['params']]); + } + } + + return false; + } + + if ($this->isStrict()) { + throw new InvalidResponse('Response from chrome remote interface did not provide a valid message id'); + } + + return false; + } + + // store response + $this->responseBuffer[$response['id']] = $response; + + return true; + } + + /** + * True if a response for the given id exists. + * + * @param string $id + * + * @return bool + */ + public function hasResponseForId($id) + { + return \array_key_exists($id, $this->responseBuffer); + } + + /** + * @param string $id + * + * @return array|null + */ + public function getResponseForId($id) + { + if (\array_key_exists($id, $this->responseBuffer)) { + $data = $this->responseBuffer[$id]; + unset($this->responseBuffer[$id]); + + return $data; + } + + return null; + } + + /** + * @param string $sessionId + * + * @return bool + */ + public function isSessionDestroyed($sessionId) + { + return !isset($this->sessions[$sessionId]); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Communication/Message.php b/pandora_console/vendor/chrome-php/chrome/src/Communication/Message.php new file mode 100644 index 0000000000..c25ac7c945 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Communication/Message.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Communication; + +class Message +{ + /** + * global message id auto incremented for each message sent. + * + * @var int + */ + private static $messageId = 0; + + /** + * @var int + */ + protected $id; + + /** + * @var string + */ + protected $method; + + /** + * @var array + */ + protected $params; + + /** + * @var ?string + */ + protected $sessionId; + + /** + * get the last generated message id. + * + * @return int + */ + public static function getLastMessageId() + { + return self::$messageId; + } + + /** + * @param string $method + * @param array $params + */ + public function __construct(string $method, array $params = [], ?string $sessionId = null) + { + $this->id = ++self::$messageId; + $this->method = $method; + $this->params = $params; + $this->sessionId = $sessionId; + } + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + + /** + * @return string + */ + public function getMethod(): string + { + return $this->method; + } + + /** + * @return array + */ + public function getParams(): array + { + return $this->params; + } + + public function __toString(): string + { + $message = [ + 'id' => $this->getId(), + 'method' => $this->getMethod(), + 'params' => (object) $this->getParams(), + ]; + if (null !== $this->sessionId) { + $message['sessionId'] = $this->sessionId; + } + + return \json_encode($message); + } + + public function getSessionId(): ?string + { + return $this->sessionId; + } + + public function setSessionId(string $sessionId): void + { + $this->sessionId = $sessionId; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Communication/Response.php b/pandora_console/vendor/chrome-php/chrome/src/Communication/Response.php new file mode 100644 index 0000000000..a72ab13eee --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Communication/Response.php @@ -0,0 +1,134 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Communication; + +class Response implements \ArrayAccess +{ + protected $message; + + protected $data; + + /** + * Response constructor. + */ + public function __construct(array $data, Message $message) + { + $this->data = $data; + $this->message = $message; + } + + /** + * True if the response is error free. + * + * @return bool + */ + public function isSuccessful() + { + return !\array_key_exists('error', $this->data); + } + + /** + * Get the error message if set. + * + * @return string|null + */ + public function getErrorMessage(bool $extended = true) + { + $message = []; + + if ($extended && isset($this->data['error']['code'])) { + $message[] = $this->data['error']['code']; + } + + if (isset($this->data['error']['message'])) { + $message[] = $this->data['error']['message']; + } + + if ($extended && isset($this->data['error']['data']) && \is_string($this->data['error']['data'])) { + $message[] = $this->data['error']['data']; + } + + return \implode(' - ', $message); + } + + /** + * Get the error code if set. + * + * @return string|null + */ + public function getErrorCode() + { + return $this->data['error']['code'] ?? null; + } + + /** + * @param string $name + * + * @return mixed + */ + public function getResultData($name) + { + return $this->data['result'][$name] ?? null; + } + + /** + * @return Message + */ + public function getMessage(): Message + { + return $this->message; + } + + /** + * The data returned by chrome dev tools. + * + * @return array + */ + public function getData(): array + { + return $this->data; + } + + /** + * {@inheritdoc} + */ + #[\ReturnTypeWillChange] + public function offsetExists($offset) + { + return \array_key_exists($offset, $this->data); + } + + /** + * {@inheritdoc} + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + return $this->data[$offset]; + } + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $value): void + { + throw new \Exception('Responses are immutable'); + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset): void + { + throw new \Exception('Responses are immutable'); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Communication/ResponseReader.php b/pandora_console/vendor/chrome-php/chrome/src/Communication/ResponseReader.php new file mode 100644 index 0000000000..016dbc7d1f --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Communication/ResponseReader.php @@ -0,0 +1,188 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Communication; + +use HeadlessChromium\Exception\NoResponseAvailable; +use HeadlessChromium\Exception\OperationTimedOut; +use HeadlessChromium\Utils; + +class ResponseReader +{ + /** + * @var Message + */ + protected $message; + + /** + * @var Connection + */ + protected $connection; + + /** + * @var Response|null + */ + protected $response = null; + + /** + * Response constructor. + * + * @param Message $message + * @param Connection $connection + */ + public function __construct(Message $message, Connection $connection) + { + $this->message = $message; + $this->connection = $connection; + } + + /** + * True if a response is available. + * + * @return bool + */ + public function hasResponse() + { + return null !== $this->response; + } + + /** + * the message to get a response for. + * + * @return Message + */ + public function getMessage(): Message + { + return $this->message; + } + + /** + * The connection to check messages for. + * + * @return Connection + */ + public function getConnection(): Connection + { + return $this->connection; + } + + /** + * Get the response. + * + * Note: response will always be missing until checkForResponse is called + * and the response is available in the buffer + * + * @throws NoResponseAvailable + * + * @return Response + */ + public function getResponse(): Response + { + if (!$this->response) { + throw new NoResponseAvailable('Response is not available. Try to use the method waitForResponse instead.'); + } + + return $this->response; + } + + /** + * Wait for a response. + * + * @param int $timeout time to wait for a response (milliseconds) + * + * @throws NoResponseAvailable + * @throws OperationTimedOut + * + * @return Response + */ + public function waitForResponse(int $timeout = null): Response + { + if ($this->hasResponse()) { + return $this->getResponse(); + } + + // default 2000ms + $timeout = $timeout ?? 2000; + + return Utils::tryWithTimeout($timeout * 1000, $this->waitForResponseGenerator()); + } + + /** + * To be used in waitForResponse method. + * + * @throws NoResponseAvailable + * + * @return \Generator|Response + * + * @internal + */ + private function waitForResponseGenerator() + { + while (true) { + // 50 microseconds between each iteration + $tryDelay = 50; + + // read available response + $hasResponse = $this->checkForResponse(); + + // if found return it + if ($hasResponse) { + return $this->getResponse(); + } + + // wait before next check + yield $tryDelay; + } + } + + /** + * Check in the connection if a response exists for the message and store it if the response exists. + * + * @return bool + */ + public function checkForResponse() + { + // if response is already read, ignore + if ($this->hasResponse()) { + return true; + } + + $id = $this->message->getId(); + + // if response exists store it + if ($this->connection->hasResponseForId($id)) { + $this->response = new Response($this->connection->getResponseForId($id), $this->message); + + return true; + } + + // read data + while (!$this->connection->hasResponseForId($id)) { + if (!$this->connection->readLine()) { + break; + } + } + + // if response store it + if ($this->connection->hasResponseForId($id)) { + $this->response = new Response($this->connection->getResponseForId($id), $this->message); + + return true; + } + + // check if the session was destroyed in the mean time + if (null !== $this->message->getSessionId() && $this->connection->isSessionDestroyed($this->message->getSessionId())) { + throw new \HeadlessChromium\Exception\TargetDestroyed('The session is destroyed.'); + } + + return false; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Communication/Session.php b/pandora_console/vendor/chrome-php/chrome/src/Communication/Session.php new file mode 100644 index 0000000000..627a285239 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Communication/Session.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Communication; + +use Evenement\EventEmitter; +use HeadlessChromium\Exception\CommunicationException; +use HeadlessChromium\Exception\NoResponseAvailable; +use HeadlessChromium\Exception\TargetDestroyed; + +class Session extends EventEmitter +{ + /** + * @var string + */ + protected $sessionId; + + /** + * @var string + */ + protected $targetId; + + /** + * @var Connection|null + */ + protected $connection; + + /** + * @var bool + */ + protected $destroyed = false; + + /** + * Session constructor. + * + * @param string $targetId + * @param string $sessionId + * @param Connection $connection + */ + public function __construct(string $targetId, string $sessionId, Connection $connection) + { + $this->sessionId = $sessionId; + $this->targetId = $targetId; + $this->connection = $connection; + } + + /** + * @param Message $message + * + * @throws CommunicationException + * + * @return ResponseReader + */ + public function sendMessage(Message $message): ResponseReader + { + if ($this->destroyed) { + throw new TargetDestroyed('The session was destroyed.'); + } + + if (null === $message->getSessionId()) { + $message->setSessionId($this->getSessionId()); + } + $topResponse = $this->getConnection()->sendMessage($message); + + return $topResponse; + } + + /** + * @param Message $message + * @param int $timeout + * + * @throws NoResponseAvailable + * @throws CommunicationException + * + * @return Response + */ + public function sendMessageSync(Message $message, int $timeout = null): Response + { + $responseReader = $this->sendMessage($message); + + $response = $responseReader->waitForResponse($timeout ?? $this->getConnection()->getSendSyncDefaultTimeout()); + + if (!$response) { + throw new NoResponseAvailable('No response was sent in the given timeout'); + } + + return $response; + } + + /** + * @return string + */ + public function getSessionId() + { + return $this->sessionId; + } + + /** + * @return string + */ + public function getTargetId() + { + return $this->targetId; + } + + /** + * @return Connection + */ + public function getConnection() + { + if ($this->destroyed) { + throw new TargetDestroyed('The session was destroyed.'); + } + + return $this->connection; + } + + /** + * Marks the session as destroyed. + * + * @internal + */ + public function destroy(): void + { + if ($this->destroyed) { + throw new TargetDestroyed('The session was already destroyed.'); + } + $this->emit('destroyed'); + $this->connection = null; + $this->destroyed = true; + $this->removeAllListeners(); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Communication/Socket/MockSocket.php b/pandora_console/vendor/chrome-php/chrome/src/Communication/Socket/MockSocket.php new file mode 100644 index 0000000000..66a450b5e8 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Communication/Socket/MockSocket.php @@ -0,0 +1,127 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Communication\Socket; + +/** + * A mock adapter for unit tests. + */ +class MockSocket implements SocketInterface +{ + protected $sentData = []; + + protected $receivedData = []; + protected $receivedDataForNextMessage = []; + + protected $isConnected = false; + + protected $shouldConnect = true; + + /** + * {@inheritdoc} + */ + public function sendData($data) + { + if (!$this->isConnected()) { + return false; + } + + $this->sentData[] = $data; + + if (!empty($this->receivedDataForNextMessage)) { + $data = \json_decode($data, true); + + if ($data['id']) { + $next = \array_shift($this->receivedDataForNextMessage); + $next = \json_decode($next, true); + $next['id'] = $data['id']; + $this->receivedData[] = \json_encode($next); + + if (isset($data['method']) && 'Target.sendMessageToTarget' == $data['method']) { + --$next['id']; + $this->receivedData[] = \json_encode($next); + } + } + } + + return true; + } + + /** + * resets the data stored with sendData. + */ + public function flushData(): void + { + $this->sentData = []; + } + + /** + * gets the data stored with sendData. + */ + public function getSentData() + { + return $this->sentData; + } + + /** + * {@inheritdoc} + */ + public function receiveData(): array + { + $data = $this->receivedData; + $this->receivedData = []; + + return $data; + } + + /** + * Add data to be returned with receiveData. + * + * @param bool $forNextMessage true to set the response id automatically + * for next message (can stack for multiple messages + */ + public function addReceivedData($data, $forNextMessage = false): void + { + if ($forNextMessage) { + $this->receivedDataForNextMessage[] = $data; + } else { + $this->receivedData[] = $data; + } + } + + /** + * {@inheritdoc} + */ + public function connect() + { + $this->isConnected = $this->shouldConnect; + + return $this->isConnected; + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + return $this->isConnected; + } + + /** + * {@inheritdoc} + */ + public function disconnect($reason = 1000) + { + $this->isConnected = false; + + return true; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Communication/Socket/SocketInterface.php b/pandora_console/vendor/chrome-php/chrome/src/Communication/Socket/SocketInterface.php new file mode 100644 index 0000000000..d151617c28 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Communication/Socket/SocketInterface.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Communication\Socket; + +/** + * A simplified interface to wrap a socket client. + */ +interface SocketInterface +{ + /** + * Sends data to the socket. + * + * @return bool whether the data were sent + */ + public function sendData($data); + + /** + * Receives data sent by the server. + * + * @return array Payload received since the last call to receive() + */ + public function receiveData(): array; + + /** + * Connect to the server. + * + * @return bool Whether a new connection was made + */ + public function connect(); + + /** + * Whether the client is currently connected. + * + * @return bool + */ + public function isConnected(); + + /** + * Disconnects the underlying socket, and marks the client as disconnected. + * + * @param int $reason see http://tools.ietf.org/html/rfc6455#section-7.4 + * + * @return bool + */ + public function disconnect($reason = 1000); +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Communication/Socket/Wrench.php b/pandora_console/vendor/chrome-php/chrome/src/Communication/Socket/Wrench.php new file mode 100644 index 0000000000..fa3ffa381d --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Communication/Socket/Wrench.php @@ -0,0 +1,140 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Communication\Socket; + +use Psr\Log\LoggerAwareInterface; +use Psr\Log\LoggerAwareTrait; +use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; +use Wrench\Client as WrenchClient; +use Wrench\Payload\Payload; + +class Wrench implements SocketInterface, LoggerAwareInterface +{ + use LoggerAwareTrait; + + /** + * An auto incremented counter to uniquely identify each socket instance. + * + * @var int + */ + private static $socketIdCounter = 0; + + /** + * @var WrenchClient + */ + protected $client; + + /** + * Id of this socket generated from self::$socketIdCounter. + * + * @var int + */ + protected $socketId = 0; + + /** + * @param WrenchClient $client + */ + public function __construct(WrenchClient $client, LoggerInterface $logger = null) + { + $this->client = $client; + + $this->setLogger($logger ?? new NullLogger()); + + $this->socketId = ++self::$socketIdCounter; + } + + /** + * {@inheritdoc} + */ + public function sendData($data) + { + // log + $this->logger->debug('socket('.$this->socketId.'): → sending data:'.$data); + + // send data + return $this->client->sendData($data); + } + + /** + * {@inheritdoc} + */ + public function receiveData(): array + { + $playloads = $this->client->receive(); + + $data = []; + + if ($playloads) { + foreach ($playloads as $playload) { + /** @var Payload */ + $dataString = $playload->getPayload(); + $data[] = $dataString; + + // log + $this->logger->debug('socket('.$this->socketId.'): ← receiving data:'.$dataString); + } + } + + return $data; + } + + /** + * {@inheritdoc} + */ + public function connect() + { + // log + $this->logger->debug('socket('.$this->socketId.'): connecting'); + + $connected = $this->client->connect(); + + if ($connected) { + // log + $this->logger->debug('socket('.$this->socketId.'): ✓ connected'); + } else { + // log + $this->logger->debug('socket('.$this->socketId.'): ✗ could not connect'); + } + + return $connected; + } + + /** + * {@inheritdoc} + */ + public function isConnected() + { + return $this->client->isConnected(); + } + + /** + * {@inheritdoc} + */ + public function disconnect($reason = 1000) + { + // log + $this->logger->debug('socket('.$this->socketId.'): disconnecting'); + + $disconnected = $this->client->disconnect($reason); + + if ($disconnected) { + // log + $this->logger->debug('socket('.$this->socketId.'): ✓ disconnected'); + } else { + // log + $this->logger->debug('socket('.$this->socketId.'): ✗ could not disconnect'); + } + + return $disconnected; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Communication/Target.php b/pandora_console/vendor/chrome-php/chrome/src/Communication/Target.php new file mode 100644 index 0000000000..d3b7b198bb --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Communication/Target.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Communication; + +use HeadlessChromium\Exception\TargetDestroyed; + +class Target +{ + /** + * @var array + */ + protected $targetInfo; + + /** + * @var Session|null + */ + protected $session; + + /** + * @var Connection + */ + private $connection; + + /** + * @var bool + */ + protected $destroyed = false; + + /** + * Target constructor. + */ + public function __construct(array $targetInfo, Connection $connection) + { + $this->targetInfo = $targetInfo; + $this->connection = $connection; + } + + /** + * @param ?string $sessionId + * + * @return Session + */ + public function getSession(?string $sessionId = null): Session + { + if ($this->destroyed) { + throw new TargetDestroyed('The target was destroyed.'); + } + + // if not already done, create a session for the target + if (!$this->session) { + $this->session = $this->connection->createSession($this->getTargetInfo('targetId'), $sessionId); + } + + return $this->session; + } + + /** + * Marks the target as destroyed. + * + * @internal + */ + public function destroy(): void + { + if ($this->destroyed) { + throw new TargetDestroyed('The target was already destroyed.'); + } + + if ($this->session) { + $this->session->destroy(); + $this->session = null; + } + + $this->destroyed = true; + } + + /** + * @return bool + */ + public function isDestroyed(): bool + { + return $this->destroyed; + } + + /** + * Get target info value by it's name or null if it does not exist. + * + * @param string $infoName + * + * @return mixed + */ + public function getTargetInfo($infoName) + { + return $this->targetInfo[$infoName] ?? null; + } + + /** + * To be called when Target.targetInfoChanged is triggered. + * + * @param array $targetInfo + * + * @internal + */ + public function targetInfoChanged($targetInfo): void + { + $this->targetInfo = $targetInfo; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Cookies/Cookie.php b/pandora_console/vendor/chrome-php/chrome/src/Cookies/Cookie.php new file mode 100644 index 0000000000..046fd687c7 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Cookies/Cookie.php @@ -0,0 +1,105 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Cookies; + +class Cookie implements \ArrayAccess +{ + /** + * @var array + */ + protected $data; + + /** + * Cookie constructor. + */ + public function __construct(array $data) + { + if (isset($data['expires']) && \is_string($data['expires']) && !\is_numeric($data['expires'])) { + $data['expires'] = \strtotime($data['expires']); + } + + $this->data = $data; + } + + /** + * @return mixed + */ + public function getValue() + { + return $this->offsetGet('value'); + } + + /** + * @return mixed + */ + public function getName() + { + return $this->offsetGet('name'); + } + + /** + * @return mixed + */ + public function getDomain() + { + return $this->offsetGet('domain'); + } + + /** + * {@inheritdoc} + */ + #[\ReturnTypeWillChange] + public function offsetExists($offset) + { + return \array_key_exists($offset, $this->data); + } + + /** + * {@inheritdoc} + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + return $this->data[$offset] ?? null; + } + + /** + * {@inheritdoc} + */ + public function offsetSet($offset, $value): void + { + throw new \RuntimeException('Cannot set cookie values'); + } + + /** + * {@inheritdoc} + */ + public function offsetUnset($offset): void + { + throw new \RuntimeException('Cannot unset cookie values'); + } + + /** + * @param string $name + * @param string $value + * @param array $params + * + * @return Cookie + */ + public static function create($name, $value, array $params = []) + { + $params['name'] = $name; + $params['value'] = $value; + + return new self($params); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Cookies/CookiesCollection.php b/pandora_console/vendor/chrome-php/chrome/src/Cookies/CookiesCollection.php new file mode 100644 index 0000000000..23ba52c8cd --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Cookies/CookiesCollection.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Cookies; + +class CookiesCollection implements \IteratorAggregate, \Countable +{ + /** + * @var Cookie[] + */ + protected $cookies = []; + + /** + * CookiesCollection constructor. + */ + public function __construct(array $cookies = null) + { + if ($cookies) { + foreach ($cookies as $cookie) { + if (\is_array($cookie)) { + $cookie = new Cookie($cookie); + } + $this->addCookie($cookie); + } + } + } + + /** + * Adds a cookie. + */ + public function addCookie(Cookie $cookie): void + { + $this->cookies[] = $cookie; + } + + /** + * {@inheritdoc} + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + return new \ArrayIterator($this->cookies); + } + + /** + * {@inheritdoc} + */ + #[\ReturnTypeWillChange] + public function count() + { + return \count($this->cookies); + } + + /** + * Get the cookie at the given index. + * + * @param int $i + * + * @return Cookie + */ + public function getAt($i): Cookie + { + if (!isset($this->cookies[$i])) { + throw new \RuntimeException(\sprintf('No cookie at index %s', $i)); + } + + return $this->cookies[$i]; + } + + /** + * Find cookies with matching values. + * + * usage: + * + * ``` + * // find cookies having name == 'foo' + * $newCookies = $cookies->filterBy('name', 'foo'); + * + * // find cookies having domain == 'example.com' + * $newCookies = $cookies->filterBy('domain', 'example.com'); + * ``` + * + * @param string $param + * @param string $value + * + * @return CookiesCollection + */ + public function filterBy(string $param, string $value) + { + return new self(\array_filter($this->cookies, function (Cookie $cookie) use ($param, $value) { + return $cookie[$param] == $value; + })); + } + + /** + * Find first cookies with matching value. + * + * usage: + * + * ``` + * // find first cookie having name == 'foo' + * $cookie = $cookies->findOneBy('name', 'foo'); + * + * if ($cookie) { + * // do something + * } + * ``` + * + * @param string $param + * @param string $value + * + * @return Cookie|null + */ + public function findOneBy(string $param, string $value) + { + foreach ($this->cookies as $cookie) { + if ($cookie[$param] == $value) { + return $cookie; + } + } + + return null; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Dom/Dom.php b/pandora_console/vendor/chrome-php/chrome/src/Dom/Dom.php new file mode 100644 index 0000000000..99ca137de3 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Dom/Dom.php @@ -0,0 +1,56 @@ +getSession()->sendMessage($message); + $response = $stream->waitForResponse(1000); + + $rootNodeId = $response->getResultData('root')['nodeId']; + + parent::__construct($page, $rootNodeId); + } + + public function search(string $selector): array + { + $message = new Message('DOM.performSearch', [ + 'query' => $selector, + ]); + $response = $this->page->getSession()->sendMessageSync($message); + + $this->assertNotError($response); + + $searchId = $response->getResultData('searchId'); + $count = $response->getResultData('resultCount'); + + if (0 === $count) { + return []; + } + $message = new Message('DOM.getSearchResults', [ + 'searchId' => $searchId, + 'fromIndex' => 0, + 'toIndex' => $count, + ]); + + $response = $this->page->getSession()->sendMessageSync($message); + + $this->assertNotError($response); + + $nodes = []; + $nodeIds = $response->getResultData('nodeIds'); + foreach ($nodeIds as $nodeId) { + $nodes[] = new Node($this->page, $nodeId); + } + + return $nodes; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Dom/Node.php b/pandora_console/vendor/chrome-php/chrome/src/Dom/Node.php new file mode 100644 index 0000000000..fb3362454d --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Dom/Node.php @@ -0,0 +1,206 @@ +page = $page; + $this->nodeId = $nodeId; + } + + public function getAttributes(): NodeAttributes + { + $message = new Message('DOM.getAttributes', [ + 'nodeId' => $this->nodeId, + ]); + $response = $this->page->getSession()->sendMessageSync($message); + + $this->assertNotError($response); + + $attributes = $response->getResultData('attributes'); + + return new NodeAttributes($attributes); + } + + public function setAttributeValue(string $name, string $value): void + { + $message = new Message('DOM.setAttributeValue', [ + 'nodeId' => $this->nodeId, + 'name' => $name, + 'value' => $value, + ]); + $response = $this->page->getSession()->sendMessageSync($message); + + $this->assertNotError($response); + } + + public function querySelector(string $selector): ?self + { + $message = new Message('DOM.querySelector', [ + 'nodeId' => $this->nodeId, + 'selector' => $selector, + ]); + $response = $this->page->getSession()->sendMessageSync($message); + $this->assertNotError($response); + + $nodeId = $response->getResultData('nodeId'); + + if (null !== $nodeId && 0 !== $nodeId) { + return new self($this->page, $nodeId); + } + + return null; + } + + public function querySelectorAll(string $selector): array + { + $message = new Message('DOM.querySelectorAll', [ + 'nodeId' => $this->nodeId, + 'selector' => $selector, + ]); + $response = $this->page->getSession()->sendMessageSync($message); + + $this->assertNotError($response); + + $nodes = []; + $nodeIds = $response->getResultData('nodeIds'); + foreach ($nodeIds as $nodeId) { + $nodes[] = new self($this->page, $nodeId); + } + + return $nodes; + } + + public function focus(): void + { + $message = new Message('DOM.focus', [ + 'nodeId' => $this->nodeId, + ]); + $response = $this->page->getSession()->sendMessageSync($message); + + $this->assertNotError($response); + } + + public function getAttribute(string $name): ?string + { + return $this->getAttributes()->get($name); + } + + public function getPosition(): ?NodePosition + { + $message = new Message('DOM.getBoxModel', [ + 'nodeId' => $this->nodeId, + ]); + $response = $this->page->getSession()->sendMessageSync($message); + + $this->assertNotError($response); + + $points = $response->getResultData('model')['content']; + + if (null !== $points) { + return new NodePosition($points); + } else { + return null; + } + } + + public function hasPosition(): bool + { + return null !== $this->getPosition(); + } + + public function getHTML(): string + { + $message = new Message('DOM.getOuterHTML', [ + 'nodeId' => $this->nodeId, + ]); + $response = $this->page->getSession()->sendMessageSync($message); + + $this->assertNotError($response); + + return $response->getResultData('outerHTML'); + } + + public function getText(): string + { + return \strip_tags($this->getHTML()); + } + + public function scrollIntoView(): void + { + $message = new Message('DOM.scrollIntoViewIfNeeded', [ + 'nodeId' => $this->nodeId, + ]); + $response = $this->page->getSession()->sendMessageSync($message); + + $this->assertNotError($response); + } + + /** + * @throws DomException + */ + public function click(): void + { + if (false === $this->hasPosition()) { + throw new DomException('Failed to click element without position'); + } + $this->scrollIntoView(); + $position = $this->getPosition(); + $this->page->mouse() + ->move($position->getCenterX(), $position->getCenterY()) + ->click(); + } + + public function sendKeys(string $text): void + { + $this->scrollIntoView(); + $this->focus(); + $this->page->keyboard() + ->typeText($text); + } + + public function sendFile(string $filePath): void + { + $this->sendFiles([$filePath]); + } + + public function sendFiles(array $filePaths): void + { + $message = new Message('DOM.setFileInputFiles', [ + 'files' => $filePaths, + 'nodeId' => $this->nodeId, + ]); + $response = $this->page->getSession()->sendMessageSync($message); + + $this->assertNotError($response); + } + + /** + * @throws DomException + */ + public function assertNotError(Response $response): void + { + if (!$response->isSuccessful()) { + throw new DOMException($response->getErrorMessage()); + } + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Dom/NodeAttributes.php b/pandora_console/vendor/chrome-php/chrome/src/Dom/NodeAttributes.php new file mode 100644 index 0000000000..92322834da --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Dom/NodeAttributes.php @@ -0,0 +1,35 @@ +attributes[$attrs[$i]] = $attrs[$i + 1]; + } + } + + public function toArray(): array + { + return $this->attributes; + } + + public function has(string $name): bool + { + return isset($this->attributes[$name]); + } + + public function get(string $name): ?string + { + return $this->attributes[$name] ?? null; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Dom/NodePosition.php b/pandora_console/vendor/chrome-php/chrome/src/Dom/NodePosition.php new file mode 100644 index 0000000000..0d4f07ec35 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Dom/NodePosition.php @@ -0,0 +1,76 @@ +x = $leftTopX; + $this->y = $leftTopY; + + $this->height = $leftBottomY - $leftTopY; + $this->width = $rightBottomX - $leftBottomX; + } + + public function getX(): int + { + return (int) $this->x; + } + + public function getY(): int + { + return (int) $this->y; + } + + public function getWidth(): int + { + return (int) $this->width; + } + + public function getHeight(): int + { + return (int) $this->height; + } + + public function getCenterX(): int + { + return (int) ($this->x + ($this->width / 2)); + } + + public function getCenterY(): int + { + return (int) ($this->y + ($this->height / 2)); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Dom/Selector/CssSelector.php b/pandora_console/vendor/chrome-php/chrome/src/Dom/Selector/CssSelector.php new file mode 100644 index 0000000000..26b518f5e3 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Dom/Selector/CssSelector.php @@ -0,0 +1,29 @@ +expression = $expression; + } + + public function expressionCount(): string + { + return \sprintf('document.querySelectorAll("%s").length', $this->expression); + } + + public function expressionFindOne(int $position): string + { + return \sprintf('document.querySelectorAll("%s")[%d]', $this->expression, $position - 1); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Dom/Selector/Selector.php b/pandora_console/vendor/chrome-php/chrome/src/Dom/Selector/Selector.php new file mode 100644 index 0000000000..1d2ce01dd5 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Dom/Selector/Selector.php @@ -0,0 +1,12 @@ +expression = $expression; + } + + public function expressionCount(): string + { + return \sprintf( + 'document.evaluate("%s", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength', + \addslashes($this->expression) + ); + } + + public function expressionFindOne(int $position): string + { + return \sprintf( + 'document.evaluate("%s[%d]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue', + \addslashes($this->expression), + $position + ); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/BrowserConnectionFailed.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/BrowserConnectionFailed.php new file mode 100644 index 0000000000..5eb8f18e3d --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/BrowserConnectionFailed.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class BrowserConnectionFailed extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException.php new file mode 100644 index 0000000000..f6a48819ee --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class CommunicationException extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException/CannotReadResponse.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException/CannotReadResponse.php new file mode 100644 index 0000000000..d2578fef1d --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException/CannotReadResponse.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception\CommunicationException; + +use HeadlessChromium\Exception\CommunicationException; + +class CannotReadResponse extends CommunicationException +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException/InvalidResponse.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException/InvalidResponse.php new file mode 100644 index 0000000000..f77ad25f22 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException/InvalidResponse.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception\CommunicationException; + +use HeadlessChromium\Exception\CommunicationException; + +class InvalidResponse extends CommunicationException +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException/ResponseHasError.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException/ResponseHasError.php new file mode 100644 index 0000000000..d734fbec89 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/CommunicationException/ResponseHasError.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception\CommunicationException; + +use HeadlessChromium\Exception\CommunicationException; + +class ResponseHasError extends CommunicationException +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/DomException.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/DomException.php new file mode 100644 index 0000000000..a6226c5c84 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/DomException.php @@ -0,0 +1,9 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class ElementNotFoundException extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/EvaluationFailed.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/EvaluationFailed.php new file mode 100644 index 0000000000..46a6fa7ba6 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/EvaluationFailed.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class EvaluationFailed extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/FilesystemException.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/FilesystemException.php new file mode 100644 index 0000000000..9e81f3125f --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/FilesystemException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class FilesystemException extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/InvalidTimezoneId.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/InvalidTimezoneId.php new file mode 100644 index 0000000000..ee3850a8f6 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/InvalidTimezoneId.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class InvalidTimezoneId extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/JavascriptException.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/JavascriptException.php new file mode 100644 index 0000000000..383b5d79da --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/JavascriptException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class JavascriptException extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/NavigationExpired.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/NavigationExpired.php new file mode 100644 index 0000000000..b58fad2993 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/NavigationExpired.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class NavigationExpired extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/NoResponseAvailable.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/NoResponseAvailable.php new file mode 100644 index 0000000000..d4df245c1f --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/NoResponseAvailable.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class NoResponseAvailable extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/OperationTimedOut.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/OperationTimedOut.php new file mode 100644 index 0000000000..8e4e5bc057 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/OperationTimedOut.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class OperationTimedOut extends \Exception +{ + public static function createFromTimeout(int $timeoutMicroSec): self + { + return new self(\sprintf('Operation timed out after %s.', self::getTimeoutPhrase($timeoutMicroSec))); + } + + private static function getTimeoutPhrase(int $timeoutMicroSec): string + { + if ($timeoutMicroSec > 1000 * 1000) { + return \sprintf('%ds', (int) ($timeoutMicroSec / (1000 * 1000))); + } + + if ($timeoutMicroSec > 1000) { + return \sprintf('%dms', (int) ($timeoutMicroSec / 1000)); + } + + return \sprintf('%dμs', (int) ($timeoutMicroSec)); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/PdfFailed.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/PdfFailed.php new file mode 100644 index 0000000000..ff96f3a1e9 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/PdfFailed.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class PdfFailed extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/ScreenshotFailed.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/ScreenshotFailed.php new file mode 100644 index 0000000000..cc6a6d8917 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/ScreenshotFailed.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class ScreenshotFailed extends \Exception +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Exception/TargetDestroyed.php b/pandora_console/vendor/chrome-php/chrome/src/Exception/TargetDestroyed.php new file mode 100644 index 0000000000..b6ca33f647 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Exception/TargetDestroyed.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Exception; + +class TargetDestroyed extends \RuntimeException +{ +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Frame.php b/pandora_console/vendor/chrome-php/chrome/src/Frame.php new file mode 100644 index 0000000000..cdb05e6432 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Frame.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium; + +class Frame +{ + public const LIFECYCLE_INIT = 'init'; + + /** + * @var array + */ + protected $frameData; + + /** + * @var array + */ + protected $lifeCycleEvents = []; + + /** + * @var string + */ + protected $latestLoaderId; + + /** + * @var string + */ + protected $frameId; + + /** + * @var int + */ + protected $executionContextId; + + /** + * Frame constructor. + * + * @param array $frameData + */ + public function __construct(array $frameData) + { + $this->frameData = $frameData; + $this->latestLoaderId = $frameData['loaderId']; + $this->frameId = $frameData['id']; + } + + /** + * @internal + */ + public function onLifecycleEvent(array $params): void + { + if (self::LIFECYCLE_INIT === $params['name']) { + $this->lifeCycleEvents = []; + $this->latestLoaderId = $params['loaderId']; + $this->frameId = $params['frameId']; + } + + $this->lifeCycleEvents[$params['name']] = $params['timestamp']; + } + + /** + * @return int + */ + public function getExecutionContextId(): int + { + return $this->executionContextId; + } + + /** + * @param int $executionContextId + */ + public function setExecutionContextId(int $executionContextId): void + { + $this->executionContextId = $executionContextId; + } + + /** + * @return string + */ + public function getFrameId(): string + { + return $this->frameId; + } + + /** + * @return string + */ + public function getLatestLoaderId(): string + { + return $this->latestLoaderId; + } + + /** + * Gets the life cycle events of the frame with the time they occurred at. + * + * @return array + */ + public function getLifeCycle(): array + { + return $this->lifeCycleEvents; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/FrameManager.php b/pandora_console/vendor/chrome-php/chrome/src/FrameManager.php new file mode 100644 index 0000000000..8c13aa474f --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/FrameManager.php @@ -0,0 +1,106 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium; + +class FrameManager +{ + /** + * @var Page + */ + protected $page; + + /** + * @var Frame[] + */ + protected $frames = []; + + /** + * @var Frame + */ + protected $mainFrame; + + /** + * FrameManager constructor. + */ + public function __construct(Page $page, array $frameTree) + { + $this->page = $page; + + if (isset($frameTree['frame'])) { + // TODO parse children frames + $this->frames[$frameTree['frame']['id']] = new Frame($frameTree['frame']); + + // associate main frame + $this->mainFrame = $this->frames[$frameTree['frame']['id']]; + } + + // TODO listen for frame events + + // update frame on init + $this->page->getSession()->on('method:Page.lifecycleEvent', function (array $params): void { + if (isset($this->frames[$params['frameId']])) { + $frame = $this->frames[$params['frameId']]; + $frame->onLifecycleEvent($params); + } + }); + + // attach context id to frame + $this->page->getSession()->on('method:Runtime.executionContextCreated', function (array $params): void { + if (isset($params['context']['auxData']['frameId']) && $params['context']['auxData']['isDefault']) { + if ($this->hasFrame($params['context']['auxData']['frameId'])) { + $frame = $this->getFrame($params['context']['auxData']['frameId']); + $frame->setExecutionContextId($params['context']['id']); + } + } + }); + + // TODO maybe implement Runtime.executionContextDestroyed and Runtime.executionContextsCleared + } + + /** + * Checks if the given frame exists. + * + * @param string $frameId + * + * @return bool + */ + public function hasFrame($frameId): bool + { + return \array_key_exists($frameId, $this->frames); + } + + /** + * Get a frame given its id. + * + * @param string $frameId + * + * @return Frame + */ + public function getFrame($frameId): Frame + { + if (!isset($this->frames[$frameId])) { + throw new \RuntimeException(\sprintf('No such frame "%s"', $frameId)); + } + + return $this->frames[$frameId]; + } + + /** + * Gets the main frame. + * + * @return Frame + */ + public function getMainFrame(): Frame + { + return $this->mainFrame; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Input/Key.php b/pandora_console/vendor/chrome-php/chrome/src/Input/Key.php new file mode 100644 index 0000000000..b36db44619 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Input/Key.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Input; + +/** + * Holds key constants and their respective bit values. + * + * @see https://chromedevtools.github.io/devtools-protocol/1-2/Input/ + */ +abstract class Key +{ + public const ALT = 1; + public const CONTROL = 2; + public const META = 4; + public const SHIFT = 8; + public const COMMAND = self::META; +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Input/Keyboard.php b/pandora_console/vendor/chrome-php/chrome/src/Input/Keyboard.php new file mode 100644 index 0000000000..766f82d6c8 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Input/Keyboard.php @@ -0,0 +1,236 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Input; + +use HeadlessChromium\Communication\Message; +use HeadlessChromium\Page; + +class Keyboard +{ + use KeyboardKeys; + + /** + * @var Page + */ + protected $page; + + /** + * @var int + */ + protected $sleep = 0; + + /** + * @param Page $page + */ + public function __construct(Page $page) + { + $this->page = $page; + } + + /** + * Type a text string, char by char, without applying modifiers. + * + * @param string $text text string to be typed + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * + * @return $this + */ + public function typeText(string $text) + { + $this->page->assertNotClosed(); + + $length = \mb_strlen($text); + + for ($i = 0; $i < $length; ++$i) { + $this->page->getSession()->sendMessageSync(new Message('Input.dispatchKeyEvent', [ + 'type' => 'char', + 'modifiers' => $this->getModifiers(), + 'text' => \mb_substr($text, $i, 1), + ])); + + \usleep($this->sleep); + } + + return $this; + } + + /** + * Type a raw key using the rawKeyDown event, without sending any codes or modifiers. + * + * Example: + * + * ```php + * $page->keyboard()->typeRawKey('Tab'); + * ``` + * + * @param string $key single raw key to be typed + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * + * @return $this + */ + public function typeRawKey(string $key): self + { + $this->page->assertNotClosed(); + + $this->onKeyPress($key); + + $this->page->getSession()->sendMessageSync(new Message('Input.dispatchKeyEvent', [ + 'type' => 'rawKeyDown', + 'key' => $key, + ])); + + \usleep($this->sleep); + + $this->release($key); + + return $this; + } + + /** + * Press and release a single key. + * + * Example: + * + * ```php + * $page->keyboard()->type('a'); + * ``` + * + * @param string $key single key to be typed + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * + * @return $this + */ + public function type(string $key): self + { + return $this->press($key)->release($key); + } + + /** + * Press a single key with key codes and modifiers. + * + * A key can be pressed multiple times sequentially. This is what happens + * in a real browser when the user presses and holds down hown the key. + * + * Example: + * + * ```php + * $page->keyboard()->press('Control')->press('c'); // press ctrl + c + * ``` + * + * @param string $key single key to be pressed + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * + * @return $this + */ + public function press(string $key): self + { + $this->page->assertNotClosed(); + + $this->onKeyPress($key); + + $this->page->getSession()->sendMessageSync(new Message('Input.dispatchKeyEvent', [ + 'type' => 'keyDown', + 'modifiers' => $this->getModifiers(), + 'text' => $key, + 'key' => $this->getCurrentKey(), + 'windowsVirtualKeyCode' => $this->getKeyCode(), + ])); + + \usleep($this->sleep); + + return $this; + } + + /** + * Release a single key. + * + * A key is released only once, even if it was pressed multiple times. + * If no key is given, all pressed keys will be released. + * + * Example: + * + * ```php + * $page->keyboard()->release('Control'); // release Control + * $page->keyboard()->release(); // release all + * ``` + * + * @param string $key (optional) single key to be released + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * + * @return $this + */ + public function release(string $key = null): self + { + $this->page->assertNotClosed(); + + if (null === $key) { + $this->releaseAll(); + + return $this; + } + + $this->onKeyRelease($key); + + $this->page->getSession()->sendMessageSync(new Message('Input.dispatchKeyEvent', [ + 'type' => 'keyUp', + 'key' => $this->getCurrentKey(), + ])); + + \usleep($this->sleep); + + return $this; + } + + /** + * Release all pressed keys. + * + * @return self + */ + private function releaseAll(): self + { + foreach ($this->pressedKeys as $key => $value) { + if (true === $value) { + $this->release($key); + } + } + + return $this; + } + + /** + * Set the time interval between key strokes in milliseconds. + * + * @param int $milliseconds + * + * @return $this + */ + public function setKeyInterval(int $milliseconds) + { + if ($milliseconds < 0) { + $milliseconds = 0; + } + + $this->sleep = $milliseconds * 1000; + + return $this; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Input/KeyboardKeys.php b/pandora_console/vendor/chrome-php/chrome/src/Input/KeyboardKeys.php new file mode 100644 index 0000000000..459c770505 --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Input/KeyboardKeys.php @@ -0,0 +1,223 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Input; + +/** + * Translates typed keys to their respective codes. + * + * @see https://chromedevtools.github.io/devtools-protocol/1-2/Input/ + */ +trait KeyboardKeys +{ + /** + * Array of currently pressed keys (keyDown events). + * + * The elements of this array should be unique. A real keyboard can create several keyDown events + * by holding down a key, but only one keyUp event will be sent when the key is released. + */ + protected $pressedKeys = []; + + /** + * Current key as a sanitized string. + * + * Single letters like "v" must be in uppercase, otherwise key combinations like ctrl + v won't work. + */ + protected $currentKey = ''; + + /** + * Bit field representing pressed modifier keys. + */ + protected $modifiers = 0; + + /** + * Aliases for modifier keys, in lowercase. + */ + protected $keyAliases = [ + Key::ALT => [ + 'alt', + 'altgr', + 'alt gr', + ], + Key::CONTROL => [ + 'control', + 'ctrl', + 'ctr', + ], + Key::META => [ + 'meta', + 'command', + 'cmd', + ], + Key::SHIFT => [ + 'shift', + ], + ]; + + /** + * Register a pressed key and apply modifiers. + * + * @param string $key pressed key + * + * @return void + */ + protected function onKeyPress(string $key): void + { + $this->setCurrentKey($key); + + if (true === $this->isKeyPressed()) { + return; + } + + $this->pressedKeys[$this->currentKey] = true; + + $this->toggleModifierFromKey(); + } + + /** + * Register a released key and remove modifiers. + * + * @param string $key released key + * + * @return void + */ + protected function onKeyRelease(string $key): void + { + $this->setCurrentKey($key); + + if (false === $this->isKeyPressed()) { + return; + } + + unset($this->pressedKeys[$this->currentKey]); + + $this->toggleModifierFromKey(); + } + + /** + * Check the current key against the list of aliases. + * If it match, try to add or remove its bits to the modifier. + * + * @see self::$keyAliases + * @see self::$modifiers + * + * @return void + */ + protected function toggleModifierFromKey(): void + { + $key = \strtolower($this->currentKey); + + foreach ($this->keyAliases as $modifier => $aliases) { + if (true === \in_array($key, $aliases)) { + $this->toggleModifier($modifier); + break; + } + } + } + + /** + * Perform bit operations to add or remove bits from the modifier. + * + * Examples: + * + * 0001 + * | 0100 + * = 0101 + * + * 0101 + * & 0100 + * = 0100 + * + * 0101 + * & 0010 + * = 0000 + * + * @see self::$modifiers + * + * @return void + */ + protected function toggleModifier(int $bit): void + { + if (($this->modifiers & $bit) === $bit) { + $this->modifiers &= ~$bit; + + return; + } + + $this->modifiers |= $bit; + } + + /** + * Check if the current key was pressed and not released yet. + * + * @return bool true if they key is listed as pressed + */ + protected function isKeyPressed(): bool + { + return \array_key_exists($this->currentKey, $this->pressedKeys); + } + + /** + * Return the current key code. + * + * @return int the key code + */ + public function getKeyCode(): int + { + return \ord($this->currentKey); + } + + /** + * Return the current bit modifier. + * The browser expects to receive this value as int. + * + * @return int current bit modifier + */ + public function getModifiers(): int + { + return $this->modifiers; + } + + /** + * Return the current key being processed. + * + * @return string the current key + */ + public function getCurrentKey(): string + { + return $this->currentKey; + } + + /** + * Return the list of unique pressed keys that were not released yet. + * + * @return array list of pressed keys + */ + public function getPressedKeys(): array + { + return $this->pressedKeys; + } + + /** + * Set a key as the current key. + * + * Single character keys must be in uppercase, otherwhie things like ctrl + v won't work. + * Triming the string will also prevent future mistakes during normal usage. + * + * @param string $key key to be set as current + * + * @return void + */ + protected function setCurrentKey(string $key): void + { + $this->currentKey = \ucfirst(\trim($key)); + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Input/Mouse.php b/pandora_console/vendor/chrome-php/chrome/src/Input/Mouse.php new file mode 100644 index 0000000000..49526d150f --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Input/Mouse.php @@ -0,0 +1,392 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium\Input; + +use HeadlessChromium\Communication\Message; +use HeadlessChromium\Dom\Selector\CssSelector; +use HeadlessChromium\Dom\Selector\Selector; +use HeadlessChromium\Exception\ElementNotFoundException; +use HeadlessChromium\Exception\JavascriptException; +use HeadlessChromium\Page; +use HeadlessChromium\Utils; + +class Mouse +{ + public const BUTTON_LEFT = 'left'; + public const BUTTON_NONE = 'none'; + public const BUTTON_RIGHT = 'right'; + public const BUTTON_MIDDLE = 'middle'; + + /** + * @var Page + */ + protected $page; + + protected $x = 0; + protected $y = 0; + + protected $button = self::BUTTON_NONE; + + /** + * @param Page $page + */ + public function __construct(Page $page) + { + $this->page = $page; + } + + /** + * @param int $x + * @param int $y + * @param array|null $options + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * + * @return $this + */ + public function move(int $x, int $y, array $options = null) + { + $this->page->assertNotClosed(); + + // get origin of the move + $originX = $this->x; + $originY = $this->y; + + // set new position after move + $this->x = $x; + $this->y = $y; + + // number of steps to achieve the move + $steps = $options['steps'] ?? 1; + if ($steps <= 0) { + throw new \InvalidArgumentException('options "steps" for mouse move must be a positive integer'); + } + + // move + for ($i = 1; $i <= $steps; ++$i) { + $this->page->getSession()->sendMessageSync(new Message('Input.dispatchMouseEvent', [ + 'x' => $originX + ($this->x - $originX) * ($i / $steps), + 'y' => $originY + ($this->y - $originY) * ($i / $steps), + 'type' => 'mouseMoved', + ])); + } + + return $this; + } + + /** + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + */ + public function press(array $options = null) + { + $this->page->assertNotClosed(); + $this->page->getSession()->sendMessageSync(new Message('Input.dispatchMouseEvent', [ + 'x' => $this->x, + 'y' => $this->y, + 'type' => 'mousePressed', + 'button' => $options['button'] ?? self::BUTTON_LEFT, + 'clickCount' => 1, + ])); + + return $this; + } + + /** + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + */ + public function release(array $options = null) + { + $this->page->assertNotClosed(); + $this->page->getSession()->sendMessageSync(new Message('Input.dispatchMouseEvent', [ + 'x' => $this->x, + 'y' => $this->y, + 'type' => 'mouseReleased', + 'button' => $options['button'] ?? self::BUTTON_LEFT, + 'clickCount' => 1, + ])); + + return $this; + } + + /** + * @param array|null $options + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + */ + public function click(array $options = null) + { + $this->press($options); + $this->release($options); + + return $this; + } + + /** + * Scroll up using the mouse wheel. + * + * @param int $distance Distance in pixels + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * + * @return $this + */ + public function scrollUp(int $distance) + { + return $this->scroll((-1 * \abs($distance))); + } + + /** + * Scroll down using the mouse wheel. + * + * @param int $distance Distance in pixels + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * + * @return $this + */ + public function scrollDown(int $distance) + { + return $this->scroll(\abs($distance)); + } + + /** + * Scroll a positive or negative distance using the mouseWheel event type. + * + * @param int $distanceY Distance in pixels for the Y axis + * @param int $distanceX (optional) Distance in pixels for the X axis + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * @throws \HeadlessChromium\Exception\OperationTimedOut + * + * @return $this + */ + private function scroll(int $distanceY, int $distanceX = 0): self + { + $this->page->assertNotClosed(); + + $scrollableArea = $this->page->getLayoutMetrics()->getCssContentSize(); + $visibleArea = $this->page->getLayoutMetrics()->getCssVisualViewport(); + + $maximumX = $scrollableArea['width'] - $visibleArea['clientWidth']; + $maximumY = $scrollableArea['height'] - $visibleArea['clientHeight']; + + $distanceX = $this->getMaximumDistance($distanceX, $visibleArea['pageX'], $maximumX); + $distanceY = $this->getMaximumDistance($distanceY, $visibleArea['pageY'], $maximumY); + + $targetX = $visibleArea['pageX'] + $distanceX; + $targetY = $visibleArea['pageY'] + $distanceY; + + // make sure the mouse is on the screen + $this->move($this->x, $this->y); + + // scroll + $this->page->getSession()->sendMessageSync(new Message('Input.dispatchMouseEvent', [ + 'type' => 'mouseWheel', + 'x' => $this->x, + 'y' => $this->y, + 'deltaX' => $distanceX, + 'deltaY' => $distanceY, + ])); + + // wait until the scroll is done + Utils::tryWithTimeout(30000 * 1000, $this->waitForScroll($targetX, $targetY)); + + // set new position after move + $this->x += $distanceX; + $this->y += $distanceY; + + return $this; + } + + /** + * Scroll in both X and Y axis until the given boundaries fit in the screen. + * + * This method currently scrolls only to right and bottom. If the desired element is outside the visible screen + * to the left or top, thie method will not work. Its visibility will stay private until it works for both cases. + * + * @param int $right The element right boundary + * @param int $bottom The element bottom boundary + * + * @return $this + */ + private function scrollToBoundary(int $right, int $bottom): self + { + $visibleArea = $this->page->getLayoutMetrics()->getCssLayoutViewport(); + + $distanceX = $distanceY = 0; + + if ($right > $visibleArea['clientWidth']) { + $distanceX = $right - $visibleArea['clientWidth']; + } + + if ($bottom > $visibleArea['clientHeight']) { + $distanceY = $bottom - $visibleArea['clientHeight']; + } + + return $this->scroll($distanceY, $distanceX); + } + + /** + * Find an element and move the mouse to a random position over it. + * + * The search could result in several elements. The $position param can be used to select a specific element. + * The given position can only be between 1 and the maximum number or elements. It will be adjusted to the + * minimum and maximum values if needed. + * + * Example: + * $page->mouse()->find('#a'): + * $page->mouse()->find('.a', 2); + * + * @see https://developer.mozilla.org/docs/Web/API/Document/querySelector + * + * @param string $selectors selectors to use with document.querySelector + * @param int $position (optional) which element of the result set should be used + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * @throws \HeadlessChromium\Exception\ElementNotFoundException + * + * @return $this + */ + public function find(string $selectors, int $position = 1): self + { + $this->findElement(new CssSelector($selectors), $position); + + return $this; + } + + /** + * Find an element and move the mouse to a random position over it. + * + * The search could result in several elements. The $position param can be used to select a specific element. + * The given position can only be between 1 and the maximum number or elements. It will be adjusted to the + * minimum and maximum values if needed. + * + * Example: + * $page->mouse()->findElement(new CssSelector('#a')): + * $page->mouse()->findElement(new CssSelector('.a'), 2); + * $page->mouse()->findElement(new XPathSelector('//*[@id="a"]'), 2); + * + * @param Selector $selector selector to use + * @param int $position (optional) which element of the result set should be used + * + * @throws \HeadlessChromium\Exception\CommunicationException + * @throws \HeadlessChromium\Exception\NoResponseAvailable + * @throws \HeadlessChromium\Exception\ElementNotFoundException + * + * @return $this + */ + public function findElement(Selector $selector, int $position = 1): self + { + $this->page->assertNotClosed(); + + try { + $element = Utils::getElementPositionFromPage($this->page, $selector, $position); + } catch (JavascriptException $exception) { + throw new ElementNotFoundException('The search for "'.$selector->expressionCount().'" returned no result.'); + } + + if (false === \array_key_exists('x', $element)) { + throw new ElementNotFoundException('The search for "'.$selector->expressionFindOne($position).'" returned an element with no position.'); + } + + $rightBoundary = \floor($element['right']); + $bottomBoundary = \floor($element['bottom']); + + $this->scrollToBoundary($rightBoundary, $bottomBoundary); + + $visibleArea = $this->page->getLayoutMetrics()->getLayoutViewport(); + + $offsetX = $visibleArea['pageX']; + $offsetY = $visibleArea['pageY']; + $minX = $element['left'] - $offsetX; + $minY = $element['top'] - $offsetY; + + $positionX = \floor($minX + (($rightBoundary - $offsetX) - $minX) / 2); + $positionY = \ceil($minY + (($bottomBoundary - $offsetY) - $minY) / 2); + + $this->move($positionX, $positionY); + + return $this; + } + + /** + * Get the maximum distance to scroll a page. + * + * @param int $distance Distance to scroll, positive or negative + * @param int $current Current position + * @param int $maximum Maximum possible distance + * + * @return int allowed distance to scroll + */ + private function getMaximumDistance(int $distance, int $current, int $maximum): int + { + $result = $current + $distance; + + if ($result < 0) { + return $distance + \abs($result); + } + + if ($result > $maximum) { + return $maximum - $current; + } + + return $distance; + } + + /** + * Wait for the browser to process the scroll command. + * + * Return the number of microseconds to wait before trying again or true in case of success. + * + * @see \HeadlessChromium\Utils::tryWithTimeout + * + * @param int $targetX + * @param int $targetY + * + * @throws \HeadlessChromium\Exception\OperationTimedOut + * + * @return bool|\Generator + */ + private function waitForScroll(int $targetX, int $targetY) + { + while (true) { + $visibleArea = $this->page->getLayoutMetrics()->getCssVisualViewport(); + + if ($visibleArea['pageX'] === $targetX && $visibleArea['pageY'] === $targetY) { + return true; + } + + yield 1000; + } + } + + /** + * Get the current mouse position. + * + * @return array [x, y] + */ + public function getPosition(): array + { + return [ + 'x' => $this->x, + 'y' => $this->y, + ]; + } +} diff --git a/pandora_console/vendor/chrome-php/chrome/src/Page.php b/pandora_console/vendor/chrome-php/chrome/src/Page.php new file mode 100644 index 0000000000..6a10c81b9c --- /dev/null +++ b/pandora_console/vendor/chrome-php/chrome/src/Page.php @@ -0,0 +1,1050 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace HeadlessChromium; + +use HeadlessChromium\Communication\Message; +use HeadlessChromium\Communication\Session; +use HeadlessChromium\Communication\Target; +use HeadlessChromium\Cookies\Cookie; +use HeadlessChromium\Cookies\CookiesCollection; +use HeadlessChromium\Dom\Dom; +use HeadlessChromium\Dom\Selector\CssSelector; +use HeadlessChromium\Exception\CommunicationException; +use HeadlessChromium\Exception\InvalidTimezoneId; +use HeadlessChromium\Exception\JavascriptException; +use HeadlessChromium\Exception\NoResponseAvailable; +use HeadlessChromium\Exception\TargetDestroyed; +use HeadlessChromium\Input\Keyboard; +use HeadlessChromium\Input\Mouse; +use HeadlessChromium\PageUtils\CookiesGetter; +use HeadlessChromium\PageUtils\PageEvaluation; +use HeadlessChromium\PageUtils\PageLayoutMetrics; +use HeadlessChromium\PageUtils\PageNavigation; +use HeadlessChromium\PageUtils\PagePdf; +use HeadlessChromium\PageUtils\PageScreenshot; +use HeadlessChromium\PageUtils\ResponseWaiter; + +class Page +{ + public const DOM_CONTENT_LOADED = 'DOMContentLoaded'; + public const LOAD = 'load'; + public const NETWORK_IDLE = 'networkIdle'; + + /** + * @var Target + */ + protected $target; + + /** + * @var FrameManager + */ + protected $frameManager; + + /** + * @var Mouse|null + */ + protected $mouse; + + /** + * @var Keyboard|null + */ + protected $keyboard; + + /** + * Page constructor. + * + * @param Target $target + * @param array $frameTree + */ + public function __construct(Target $target, array $frameTree) + { + $this->target = $target; + $this->frameManager = new FrameManager($this, $frameTree); + } + + /** + * Adds a script to be evaluated upon page navigation. + * + * @param string $script + * @param array $options + * - onLoad: defer script execution after page has loaded (useful for scripts that require the dom to be populated) + * + * @throws CommunicationException + * @throws NoResponseAvailable + */ + public function addPreScript(string $script, array $options = []): void + { + // defer script execution + if (isset($options['onLoad']) && $options['onLoad']) { + $script = 'window.onload = () => {'.$script.'}'; + } + + // add script + $this->getSession()->sendMessageSync( + new Message('Page.addScriptToEvaluateOnNewDocument', ['source' => $script]) + ); + } + + /** + * Retrieves layout metrics of the page. + * + * Example: + * + * ```php + * $metrics = $page->getLayoutMetrics(); + * $contentSize = $metrics->getContentSize(); + * ``` + * + * @throws CommunicationException + * + * @return PageLayoutMetrics + */ + public function getLayoutMetrics() + { + $this->assertNotClosed(); + + $reader = $this->getSession()->sendMessage( + new Message('Page.getLayoutMetrics') + ); + + return new PageLayoutMetrics($reader); + } + + /** + * @return FrameManager + */ + public function getFrameManager(): FrameManager + { + $this->assertNotClosed(); + + return $this->frameManager; + } + + /** + * Get the session this page is attached to. + * + * @return Session + */ + public function getSession(): Session + { + $this->assertNotClosed(); + + return $this->target->getSession(); + } + + /** + * Sets the HTTP header necessary for basic authentication. + * + * @param string $username + * @param string $password + */ + public function setBasicAuthHeader(string $username, string $password): void + { + $header = \base64_encode($username.':'.$password); + $this->setExtraHTTPHeaders([ + 'Authorization' => 'Basic '.$header, + ]); + } + + /** + * Sets the path to save downloaded files. + * + * @param string $path + */ + public function setDownloadPath(string $path): void + { + $this->getSession()->sendMessage(new Message( + 'Page.setDownloadBehavior', + ['behavior' => 'allow', 'downloadPath' => $path] + )); + } + + /** + * Set extra http headers. + * + * If headers are not passed, all instances of Page::class will use global settings from the BrowserFactory::class + * + * @see https://chromedevtools.github.io/devtools-protocol/1-2/Network/#method-setExtraHTTPHeaders + * + * @param array $headers + * + * @throws CommunicationException + */ + public function setExtraHTTPHeaders(array $headers = []): void + { + $response = $this->getSession()->sendMessage(new Message( + 'Network.setExtraHTTPHeaders', + ['headers' => $headers] + ))->waitForResponse(); + + if (false === $response->isSuccessful()) { + throw new CommunicationException($response->getErrorMessage()); + } + } + + /** + * @param string $url + * @param array $options + * - strict: make waitForNAvigation to fail if a new navigation is initiated. Default: false + * + * @throws CommunicationException + * + * @return PageNavigation + */ + public function navigate(string $url, array $options = []) + { + $this->assertNotClosed(); + + return new PageNavigation($this, $url, $options['strict'] ?? false); + } + + /** + * Evaluates the given string in the page context. + * + * Example: + * + * ```php + * $evaluation = $page->evaluate('document.querySelector("title").innerHTML'); + * $response = $evaluation->getReturnValue(); + * ``` + * + * @param string $expression + * + * @throws CommunicationException + * + * @return PageEvaluation + */ + public function evaluate(string $expression) + { + $this->assertNotClosed(); + + $currentLoaderId = $this->frameManager->getMainFrame()->getLatestLoaderId(); + $reader = $this->getSession()->sendMessage( + new Message( + 'Runtime.evaluate', + [ + 'awaitPromise' => true, + 'returnByValue' => true, + 'expression' => $expression, + 'userGesture' => true, + ] + ) + ); + + return new PageEvaluation($reader, $currentLoaderId, $this); + } + + /** + * Call a js function with the given argument in the page context. + * + * Example: + * + * ```php + * $evaluation = $page->callFunction('function(a, b) {return a + b}', [1, 2]); + * + * echo $evaluation->getReturnValue(); + * // 3 + * ``` + * + * @param string $functionDeclaration + * @param array $arguments + * + * @throws CommunicationException + * + * @return PageEvaluation + */ + public function callFunction(string $functionDeclaration, array $arguments = []): PageEvaluation + { + $this->assertNotClosed(); + + $currentLoaderId = $this->frameManager->getMainFrame()->getLatestLoaderId(); + $executionContextId = $this->frameManager->getMainFrame()->getExecutionContextId(); + $reader = $this->getSession()->sendMessage( + new Message( + 'Runtime.callFunctionOn', + [ + 'functionDeclaration' => $functionDeclaration, + 'arguments' => \array_map(function ($arg) { + return [ + 'value' => $arg, + ]; + }, $arguments), + 'executionContextId' => $executionContextId, + 'awaitPromise' => true, + 'returnByValue' => true, + 'userGesture' => true, + ] + ) + ); + + return new PageEvaluation($reader, $currentLoaderId, $this); + } + + /** + * Add a script tag to the page (ie. '); + } elseif ($format === self::FORMAT_JS) { + static::writeOutput(static::generateScript()); + } + static::resetStatic(); + } + } + + public function close(): void + { + self::resetStatic(); + } + + public function reset() + { + parent::reset(); + + self::resetStatic(); + } + + /** + * Forget all logged records + */ + public static function resetStatic(): void + { + static::$records = []; + } + + /** + * Wrapper for register_shutdown_function to allow overriding + */ + protected function registerShutdownFunction(): void + { + if (PHP_SAPI !== 'cli') { + register_shutdown_function(['Monolog\Handler\BrowserConsoleHandler', 'send']); + } + } + + /** + * Wrapper for echo to allow overriding + */ + protected static function writeOutput(string $str): void + { + echo $str; + } + + /** + * Checks the format of the response + * + * If Content-Type is set to application/javascript or text/javascript -> js + * If Content-Type is set to text/html, or is unset -> html + * If Content-Type is anything else -> unknown + * + * @return string One of 'js', 'html' or 'unknown' + * @phpstan-return self::FORMAT_* + */ + protected static function getResponseFormat(): string + { + // Check content type + foreach (headers_list() as $header) { + if (stripos($header, 'content-type:') === 0) { + return static::getResponseFormatFromContentType($header); + } + } + + return self::FORMAT_HTML; + } + + /** + * @return string One of 'js', 'html' or 'unknown' + * @phpstan-return self::FORMAT_* + */ + protected static function getResponseFormatFromContentType(string $contentType): string + { + // This handler only works with HTML and javascript outputs + // text/javascript is obsolete in favour of application/javascript, but still used + if (stripos($contentType, 'application/javascript') !== false || stripos($contentType, 'text/javascript') !== false) { + return self::FORMAT_JS; + } + + if (stripos($contentType, 'text/html') !== false) { + return self::FORMAT_HTML; + } + + return self::FORMAT_UNKNOWN; + } + + private static function generateScript(): string + { + $script = []; + foreach (static::$records as $record) { + $context = static::dump('Context', $record['context']); + $extra = static::dump('Extra', $record['extra']); + + if (empty($context) && empty($extra)) { + $script[] = static::call_array('log', static::handleStyles($record['formatted'])); + } else { + $script = array_merge( + $script, + [static::call_array('groupCollapsed', static::handleStyles($record['formatted']))], + $context, + $extra, + [static::call('groupEnd')] + ); + } + } + + return "(function (c) {if (c && c.groupCollapsed) {\n" . implode("\n", $script) . "\n}})(console);"; + } + + /** + * @return string[] + */ + private static function handleStyles(string $formatted): array + { + $args = []; + $format = '%c' . $formatted; + preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); + + foreach (array_reverse($matches) as $match) { + $args[] = '"font-weight: normal"'; + $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0])); + + $pos = $match[0][1]; + $format = Utils::substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . Utils::substr($format, $pos + strlen($match[0][0])); + } + + $args[] = static::quote('font-weight: normal'); + $args[] = static::quote($format); + + return array_reverse($args); + } + + private static function handleCustomStyles(string $style, string $string): string + { + static $colors = ['blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey']; + static $labels = []; + + $style = preg_replace_callback('/macro\s*:(.*?)(?:;|$)/', function (array $m) use ($string, &$colors, &$labels) { + if (trim($m[1]) === 'autolabel') { + // Format the string as a label with consistent auto assigned background color + if (!isset($labels[$string])) { + $labels[$string] = $colors[count($labels) % count($colors)]; + } + $color = $labels[$string]; + + return "background-color: $color; color: white; border-radius: 3px; padding: 0 2px 0 2px"; + } + + return $m[1]; + }, $style); + + if (null === $style) { + $pcreErrorCode = preg_last_error(); + throw new \RuntimeException('Failed to run preg_replace_callback: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); + } + + return $style; + } + + /** + * @param mixed[] $dict + * @return mixed[] + */ + private static function dump(string $title, array $dict): array + { + $script = []; + $dict = array_filter($dict); + if (empty($dict)) { + return $script; + } + $script[] = static::call('log', static::quote('%c%s'), static::quote('font-weight: bold'), static::quote($title)); + foreach ($dict as $key => $value) { + $value = json_encode($value); + if (empty($value)) { + $value = static::quote(''); + } + $script[] = static::call('log', static::quote('%s: %o'), static::quote((string) $key), $value); + } + + return $script; + } + + private static function quote(string $arg): string + { + return '"' . addcslashes($arg, "\"\n\\") . '"'; + } + + /** + * @param mixed $args + */ + private static function call(...$args): string + { + $method = array_shift($args); + if (!is_string($method)) { + throw new \UnexpectedValueException('Expected the first arg to be a string, got: '.var_export($method, true)); + } + + return static::call_array($method, $args); + } + + /** + * @param mixed[] $args + */ + private static function call_array(string $method, array $args): string + { + return 'c.' . $method . '(' . implode(', ', $args) . ');'; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php new file mode 100644 index 0000000000..fcce5d6309 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php @@ -0,0 +1,167 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; + +/** + * Buffers all records until closing the handler and then pass them as batch. + * + * This is useful for a MailHandler to send only one mail per request instead of + * sending one per log message. + * + * @author Christophe Coevoet + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class BufferHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface +{ + use ProcessableHandlerTrait; + + /** @var HandlerInterface */ + protected $handler; + /** @var int */ + protected $bufferSize = 0; + /** @var int */ + protected $bufferLimit; + /** @var bool */ + protected $flushOnOverflow; + /** @var Record[] */ + protected $buffer = []; + /** @var bool */ + protected $initialized = false; + + /** + * @param HandlerInterface $handler Handler. + * @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. + * @param bool $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded + */ + public function __construct(HandlerInterface $handler, int $bufferLimit = 0, $level = Logger::DEBUG, bool $bubble = true, bool $flushOnOverflow = false) + { + parent::__construct($level, $bubble); + $this->handler = $handler; + $this->bufferLimit = $bufferLimit; + $this->flushOnOverflow = $flushOnOverflow; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($record['level'] < $this->level) { + return false; + } + + if (!$this->initialized) { + // __destructor() doesn't get called on Fatal errors + register_shutdown_function([$this, 'close']); + $this->initialized = true; + } + + if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) { + if ($this->flushOnOverflow) { + $this->flush(); + } else { + array_shift($this->buffer); + $this->bufferSize--; + } + } + + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + $this->buffer[] = $record; + $this->bufferSize++; + + return false === $this->bubble; + } + + public function flush(): void + { + if ($this->bufferSize === 0) { + return; + } + + $this->handler->handleBatch($this->buffer); + $this->clear(); + } + + public function __destruct() + { + // suppress the parent behavior since we already have register_shutdown_function() + // to call close(), and the reference contained there will prevent this from being + // GC'd until the end of the request + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + $this->flush(); + + $this->handler->close(); + } + + /** + * Clears the buffer without flushing any messages down to the wrapped handler. + */ + public function clear(): void + { + $this->bufferSize = 0; + $this->buffer = []; + } + + public function reset() + { + $this->flush(); + + parent::reset(); + + $this->resetProcessors(); + + if ($this->handler instanceof ResettableInterface) { + $this->handler->reset(); + } + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + $this->handler->setFormatter($formatter); + + return $this; + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + return $this->handler->getFormatter(); + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php new file mode 100644 index 0000000000..234ecf614e --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php @@ -0,0 +1,196 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\ChromePHPFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/) + * + * This also works out of the box with Firefox 43+ + * + * @author Christophe Coevoet + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class ChromePHPHandler extends AbstractProcessingHandler +{ + use WebRequestRecognizerTrait; + + /** + * Version of the extension + */ + protected const VERSION = '4.0'; + + /** + * Header name + */ + protected const HEADER_NAME = 'X-ChromeLogger-Data'; + + /** + * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+) + */ + protected const USER_AGENT_REGEX = '{\b(?:Chrome/\d+(?:\.\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\d|\d{3,})(?:\.\d)*)\b}'; + + /** @var bool */ + protected static $initialized = false; + + /** + * Tracks whether we sent too much data + * + * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending + * + * @var bool + */ + protected static $overflowed = false; + + /** @var mixed[] */ + protected static $json = [ + 'version' => self::VERSION, + 'columns' => ['label', 'log', 'backtrace', 'type'], + 'rows' => [], + ]; + + /** @var bool */ + protected static $sendHeaders = true; + + public function __construct($level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + if (!function_exists('json_encode')) { + throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s ChromePHPHandler'); + } + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + if (!$this->isWebRequest()) { + return; + } + + $messages = []; + + foreach ($records as $record) { + if ($record['level'] < $this->level) { + continue; + } + /** @var Record $message */ + $message = $this->processRecord($record); + $messages[] = $message; + } + + if (!empty($messages)) { + $messages = $this->getFormatter()->formatBatch($messages); + self::$json['rows'] = array_merge(self::$json['rows'], $messages); + $this->send(); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new ChromePHPFormatter(); + } + + /** + * Creates & sends header for a record + * + * @see sendHeader() + * @see send() + */ + protected function write(array $record): void + { + if (!$this->isWebRequest()) { + return; + } + + self::$json['rows'][] = $record['formatted']; + + $this->send(); + } + + /** + * Sends the log header + * + * @see sendHeader() + */ + protected function send(): void + { + if (self::$overflowed || !self::$sendHeaders) { + return; + } + + if (!self::$initialized) { + self::$initialized = true; + + self::$sendHeaders = $this->headersAccepted(); + if (!self::$sendHeaders) { + return; + } + + self::$json['request_uri'] = $_SERVER['REQUEST_URI'] ?? ''; + } + + $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true); + $data = base64_encode($json); + if (strlen($data) > 3 * 1024) { + self::$overflowed = true; + + $record = [ + 'message' => 'Incomplete logs, chrome header size limit reached', + 'context' => [], + 'level' => Logger::WARNING, + 'level_name' => Logger::getLevelName(Logger::WARNING), + 'channel' => 'monolog', + 'datetime' => new \DateTimeImmutable(), + 'extra' => [], + ]; + self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); + $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true); + $data = base64_encode($json); + } + + if (trim($data) !== '') { + $this->sendHeader(static::HEADER_NAME, $data); + } + } + + /** + * Send header string to the client + */ + protected function sendHeader(string $header, string $content): void + { + if (!headers_sent() && self::$sendHeaders) { + header(sprintf('%s: %s', $header, $content)); + } + } + + /** + * Verifies if the headers are accepted by the current user agent + */ + protected function headersAccepted(): bool + { + if (empty($_SERVER['HTTP_USER_AGENT'])) { + return false; + } + + return preg_match(static::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']) === 1; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php new file mode 100644 index 0000000000..5265761323 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\JsonFormatter; +use Monolog\Logger; + +/** + * CouchDB handler + * + * @author Markus Bachmann + */ +class CouchDBHandler extends AbstractProcessingHandler +{ + /** @var mixed[] */ + private $options; + + /** + * @param mixed[] $options + */ + public function __construct(array $options = [], $level = Logger::DEBUG, bool $bubble = true) + { + $this->options = array_merge([ + 'host' => 'localhost', + 'port' => 5984, + 'dbname' => 'logger', + 'username' => null, + 'password' => null, + ], $options); + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $basicAuth = null; + if ($this->options['username']) { + $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']); + } + + $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname']; + $context = stream_context_create([ + 'http' => [ + 'method' => 'POST', + 'content' => $record['formatted'], + 'ignore_errors' => true, + 'max_redirects' => 0, + 'header' => 'Content-type: application/json', + ], + ]); + + if (false === @file_get_contents($url, false, $context)) { + throw new \RuntimeException(sprintf('Could not connect to %s', $url)); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php new file mode 100644 index 0000000000..3535a4fcd7 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php @@ -0,0 +1,167 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Logs to Cube. + * + * @link https://github.com/square/cube/wiki + * @author Wan Chen + * @deprecated Since 2.8.0 and 3.2.0, Cube appears abandoned and thus we will drop this handler in Monolog 4 + */ +class CubeHandler extends AbstractProcessingHandler +{ + /** @var resource|\Socket|null */ + private $udpConnection = null; + /** @var resource|\CurlHandle|null */ + private $httpConnection = null; + /** @var string */ + private $scheme; + /** @var string */ + private $host; + /** @var int */ + private $port; + /** @var string[] */ + private $acceptedSchemes = ['http', 'udp']; + + /** + * Create a Cube handler + * + * @throws \UnexpectedValueException when given url is not a valid url. + * A valid url must consist of three parts : protocol://host:port + * Only valid protocols used by Cube are http and udp + */ + public function __construct(string $url, $level = Logger::DEBUG, bool $bubble = true) + { + $urlInfo = parse_url($url); + + if ($urlInfo === false || !isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) { + throw new \UnexpectedValueException('URL "'.$url.'" is not valid'); + } + + if (!in_array($urlInfo['scheme'], $this->acceptedSchemes)) { + throw new \UnexpectedValueException( + 'Invalid protocol (' . $urlInfo['scheme'] . ').' + . ' Valid options are ' . implode(', ', $this->acceptedSchemes) + ); + } + + $this->scheme = $urlInfo['scheme']; + $this->host = $urlInfo['host']; + $this->port = (int) $urlInfo['port']; + + parent::__construct($level, $bubble); + } + + /** + * Establish a connection to an UDP socket + * + * @throws \LogicException when unable to connect to the socket + * @throws MissingExtensionException when there is no socket extension + */ + protected function connectUdp(): void + { + if (!extension_loaded('sockets')) { + throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler'); + } + + $udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0); + if (false === $udpConnection) { + throw new \LogicException('Unable to create a socket'); + } + + $this->udpConnection = $udpConnection; + if (!socket_connect($this->udpConnection, $this->host, $this->port)) { + throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port); + } + } + + /** + * Establish a connection to an http server + * + * @throws \LogicException when unable to connect to the socket + * @throws MissingExtensionException when no curl extension + */ + protected function connectHttp(): void + { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is required to use http URLs with the CubeHandler'); + } + + $httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put'); + if (false === $httpConnection) { + throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port); + } + + $this->httpConnection = $httpConnection; + curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, "POST"); + curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $date = $record['datetime']; + + $data = ['time' => $date->format('Y-m-d\TH:i:s.uO')]; + unset($record['datetime']); + + if (isset($record['context']['type'])) { + $data['type'] = $record['context']['type']; + unset($record['context']['type']); + } else { + $data['type'] = $record['channel']; + } + + $data['data'] = $record['context']; + $data['data']['level'] = $record['level']; + + if ($this->scheme === 'http') { + $this->writeHttp(Utils::jsonEncode($data)); + } else { + $this->writeUdp(Utils::jsonEncode($data)); + } + } + + private function writeUdp(string $data): void + { + if (!$this->udpConnection) { + $this->connectUdp(); + } + + socket_send($this->udpConnection, $data, strlen($data), 0); + } + + private function writeHttp(string $data): void + { + if (!$this->httpConnection) { + $this->connectHttp(); + } + + if (null === $this->httpConnection) { + throw new \LogicException('No connection could be established'); + } + + curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']'); + curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json', + 'Content-Length: ' . strlen('['.$data.']'), + ]); + + Curl\Util::execute($this->httpConnection, 5, false); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php new file mode 100644 index 0000000000..7213e8ee23 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\Curl; + +use CurlHandle; + +/** + * This class is marked as internal and it is not under the BC promise of the package. + * + * @internal + */ +final class Util +{ + /** @var array */ + private static $retriableErrorCodes = [ + CURLE_COULDNT_RESOLVE_HOST, + CURLE_COULDNT_CONNECT, + CURLE_HTTP_NOT_FOUND, + CURLE_READ_ERROR, + CURLE_OPERATION_TIMEOUTED, + CURLE_HTTP_POST_ERROR, + CURLE_SSL_CONNECT_ERROR, + ]; + + /** + * Executes a CURL request with optional retries and exception on failure + * + * @param resource|CurlHandle $ch curl handler + * @param int $retries + * @param bool $closeAfterDone + * @return bool|string @see curl_exec + */ + public static function execute($ch, int $retries = 5, bool $closeAfterDone = true) + { + while ($retries--) { + $curlResponse = curl_exec($ch); + if ($curlResponse === false) { + $curlErrno = curl_errno($ch); + + if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || !$retries) { + $curlError = curl_error($ch); + + if ($closeAfterDone) { + curl_close($ch); + } + + throw new \RuntimeException(sprintf('Curl error (code %d): %s', $curlErrno, $curlError)); + } + + continue; + } + + if ($closeAfterDone) { + curl_close($ch); + } + + return $curlResponse; + } + + return false; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php new file mode 100644 index 0000000000..9b85ae7edc --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php @@ -0,0 +1,186 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Simple handler wrapper that deduplicates log records across multiple requests + * + * It also includes the BufferHandler functionality and will buffer + * all messages until the end of the request or flush() is called. + * + * This works by storing all log records' messages above $deduplicationLevel + * to the file specified by $deduplicationStore. When further logs come in at the end of the + * request (or when flush() is called), all those above $deduplicationLevel are checked + * against the existing stored logs. If they match and the timestamps in the stored log is + * not older than $time seconds, the new log record is discarded. If no log record is new, the + * whole data set is discarded. + * + * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers + * that send messages to people, to avoid spamming with the same message over and over in case of + * a major component failure like a database server being down which makes all requests fail in the + * same way. + * + * @author Jordi Boggiano + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + */ +class DeduplicationHandler extends BufferHandler +{ + /** + * @var string + */ + protected $deduplicationStore; + + /** + * @var Level + */ + protected $deduplicationLevel; + + /** + * @var int + */ + protected $time; + + /** + * @var bool + */ + private $gc = false; + + /** + * @param HandlerInterface $handler Handler. + * @param string $deduplicationStore The file/path where the deduplication log should be kept + * @param string|int $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes + * @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * + * @phpstan-param Level|LevelName|LogLevel::* $deduplicationLevel + */ + public function __construct(HandlerInterface $handler, ?string $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, int $time = 60, bool $bubble = true) + { + parent::__construct($handler, 0, Logger::DEBUG, $bubble, false); + + $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore; + $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel); + $this->time = $time; + } + + public function flush(): void + { + if ($this->bufferSize === 0) { + return; + } + + $passthru = null; + + foreach ($this->buffer as $record) { + if ($record['level'] >= $this->deduplicationLevel) { + $passthru = $passthru || !$this->isDuplicate($record); + if ($passthru) { + $this->appendRecord($record); + } + } + } + + // default of null is valid as well as if no record matches duplicationLevel we just pass through + if ($passthru === true || $passthru === null) { + $this->handler->handleBatch($this->buffer); + } + + $this->clear(); + + if ($this->gc) { + $this->collectLogs(); + } + } + + /** + * @phpstan-param Record $record + */ + private function isDuplicate(array $record): bool + { + if (!file_exists($this->deduplicationStore)) { + return false; + } + + $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + if (!is_array($store)) { + return false; + } + + $yesterday = time() - 86400; + $timestampValidity = $record['datetime']->getTimestamp() - $this->time; + $expectedMessage = preg_replace('{[\r\n].*}', '', $record['message']); + + for ($i = count($store) - 1; $i >= 0; $i--) { + list($timestamp, $level, $message) = explode(':', $store[$i], 3); + + if ($level === $record['level_name'] && $message === $expectedMessage && $timestamp > $timestampValidity) { + return true; + } + + if ($timestamp < $yesterday) { + $this->gc = true; + } + } + + return false; + } + + private function collectLogs(): void + { + if (!file_exists($this->deduplicationStore)) { + return; + } + + $handle = fopen($this->deduplicationStore, 'rw+'); + + if (!$handle) { + throw new \RuntimeException('Failed to open file for reading and writing: ' . $this->deduplicationStore); + } + + flock($handle, LOCK_EX); + $validLogs = []; + + $timestampValidity = time() - $this->time; + + while (!feof($handle)) { + $log = fgets($handle); + if ($log && substr($log, 0, 10) >= $timestampValidity) { + $validLogs[] = $log; + } + } + + ftruncate($handle, 0); + rewind($handle); + foreach ($validLogs as $log) { + fwrite($handle, $log); + } + + flock($handle, LOCK_UN); + fclose($handle); + + $this->gc = false; + } + + /** + * @phpstan-param Record $record + */ + private function appendRecord(array $record): void + { + file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . preg_replace('{[\r\n].*}', '', $record['message']) . "\n", FILE_APPEND); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php new file mode 100644 index 0000000000..ebd52c3a0d --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Formatter\FormatterInterface; +use Doctrine\CouchDB\CouchDBClient; + +/** + * CouchDB handler for Doctrine CouchDB ODM + * + * @author Markus Bachmann + */ +class DoctrineCouchDBHandler extends AbstractProcessingHandler +{ + /** @var CouchDBClient */ + private $client; + + public function __construct(CouchDBClient $client, $level = Logger::DEBUG, bool $bubble = true) + { + $this->client = $client; + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->client->postDocument($record['formatted']); + } + + protected function getDefaultFormatter(): FormatterInterface + { + return new NormalizerFormatter; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php new file mode 100644 index 0000000000..21840bf60b --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php @@ -0,0 +1,104 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Aws\Sdk; +use Aws\DynamoDb\DynamoDbClient; +use Monolog\Formatter\FormatterInterface; +use Aws\DynamoDb\Marshaler; +use Monolog\Formatter\ScalarFormatter; +use Monolog\Logger; + +/** + * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/) + * + * @link https://github.com/aws/aws-sdk-php/ + * @author Andrew Lawson + */ +class DynamoDbHandler extends AbstractProcessingHandler +{ + public const DATE_FORMAT = 'Y-m-d\TH:i:s.uO'; + + /** + * @var DynamoDbClient + */ + protected $client; + + /** + * @var string + */ + protected $table; + + /** + * @var int + */ + protected $version; + + /** + * @var Marshaler + */ + protected $marshaler; + + public function __construct(DynamoDbClient $client, string $table, $level = Logger::DEBUG, bool $bubble = true) + { + /** @phpstan-ignore-next-line */ + if (defined('Aws\Sdk::VERSION') && version_compare(Sdk::VERSION, '3.0', '>=')) { + $this->version = 3; + $this->marshaler = new Marshaler; + } else { + $this->version = 2; + } + + $this->client = $client; + $this->table = $table; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $filtered = $this->filterEmptyFields($record['formatted']); + if ($this->version === 3) { + $formatted = $this->marshaler->marshalItem($filtered); + } else { + /** @phpstan-ignore-next-line */ + $formatted = $this->client->formatAttributes($filtered); + } + + $this->client->putItem([ + 'TableName' => $this->table, + 'Item' => $formatted, + ]); + } + + /** + * @param mixed[] $record + * @return mixed[] + */ + protected function filterEmptyFields(array $record): array + { + return array_filter($record, function ($value) { + return !empty($value) || false === $value || 0 === $value; + }); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new ScalarFormatter(self::DATE_FORMAT); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php new file mode 100644 index 0000000000..fc92ca42d5 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php @@ -0,0 +1,129 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Elastica\Document; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\ElasticaFormatter; +use Monolog\Logger; +use Elastica\Client; +use Elastica\Exception\ExceptionInterface; + +/** + * Elastic Search handler + * + * Usage example: + * + * $client = new \Elastica\Client(); + * $options = array( + * 'index' => 'elastic_index_name', + * 'type' => 'elastic_doc_type', Types have been removed in Elastica 7 + * ); + * $handler = new ElasticaHandler($client, $options); + * $log = new Logger('application'); + * $log->pushHandler($handler); + * + * @author Jelle Vink + */ +class ElasticaHandler extends AbstractProcessingHandler +{ + /** + * @var Client + */ + protected $client; + + /** + * @var mixed[] Handler config options + */ + protected $options = []; + + /** + * @param Client $client Elastica Client object + * @param mixed[] $options Handler configuration + */ + public function __construct(Client $client, array $options = [], $level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + $this->client = $client; + $this->options = array_merge( + [ + 'index' => 'monolog', // Elastic index name + 'type' => 'record', // Elastic document type + 'ignore_error' => false, // Suppress Elastica exceptions + ], + $options + ); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->bulkSend([$record['formatted']]); + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if ($formatter instanceof ElasticaFormatter) { + return parent::setFormatter($formatter); + } + + throw new \InvalidArgumentException('ElasticaHandler is only compatible with ElasticaFormatter'); + } + + /** + * @return mixed[] + */ + public function getOptions(): array + { + return $this->options; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new ElasticaFormatter($this->options['index'], $this->options['type']); + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + $documents = $this->getFormatter()->formatBatch($records); + $this->bulkSend($documents); + } + + /** + * Use Elasticsearch bulk API to send list of documents + * + * @param Document[] $documents + * + * @throws \RuntimeException + */ + protected function bulkSend(array $documents): void + { + try { + $this->client->addDocuments($documents); + } catch (ExceptionInterface $e) { + if (!$this->options['ignore_error']) { + throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e); + } + } + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php new file mode 100644 index 0000000000..e88375c0e5 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php @@ -0,0 +1,218 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Elastic\Elasticsearch\Response\Elasticsearch; +use Throwable; +use RuntimeException; +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\ElasticsearchFormatter; +use InvalidArgumentException; +use Elasticsearch\Common\Exceptions\RuntimeException as ElasticsearchRuntimeException; +use Elasticsearch\Client; +use Elastic\Elasticsearch\Exception\InvalidArgumentException as ElasticInvalidArgumentException; +use Elastic\Elasticsearch\Client as Client8; + +/** + * Elasticsearch handler + * + * @link https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html + * + * Simple usage example: + * + * $client = \Elasticsearch\ClientBuilder::create() + * ->setHosts($hosts) + * ->build(); + * + * $options = array( + * 'index' => 'elastic_index_name', + * 'type' => 'elastic_doc_type', + * ); + * $handler = new ElasticsearchHandler($client, $options); + * $log = new Logger('application'); + * $log->pushHandler($handler); + * + * @author Avtandil Kikabidze + */ +class ElasticsearchHandler extends AbstractProcessingHandler +{ + /** + * @var Client|Client8 + */ + protected $client; + + /** + * @var mixed[] Handler config options + */ + protected $options = []; + + /** + * @var bool + */ + private $needsType; + + /** + * @param Client|Client8 $client Elasticsearch Client object + * @param mixed[] $options Handler configuration + */ + public function __construct($client, array $options = [], $level = Logger::DEBUG, bool $bubble = true) + { + if (!$client instanceof Client && !$client instanceof Client8) { + throw new \TypeError('Elasticsearch\Client or Elastic\Elasticsearch\Client instance required'); + } + + parent::__construct($level, $bubble); + $this->client = $client; + $this->options = array_merge( + [ + 'index' => 'monolog', // Elastic index name + 'type' => '_doc', // Elastic document type + 'ignore_error' => false, // Suppress Elasticsearch exceptions + ], + $options + ); + + if ($client instanceof Client8 || $client::VERSION[0] === '7') { + $this->needsType = false; + // force the type to _doc for ES8/ES7 + $this->options['type'] = '_doc'; + } else { + $this->needsType = true; + } + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->bulkSend([$record['formatted']]); + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if ($formatter instanceof ElasticsearchFormatter) { + return parent::setFormatter($formatter); + } + + throw new InvalidArgumentException('ElasticsearchHandler is only compatible with ElasticsearchFormatter'); + } + + /** + * Getter options + * + * @return mixed[] + */ + public function getOptions(): array + { + return $this->options; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new ElasticsearchFormatter($this->options['index'], $this->options['type']); + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + $documents = $this->getFormatter()->formatBatch($records); + $this->bulkSend($documents); + } + + /** + * Use Elasticsearch bulk API to send list of documents + * + * @param array[] $records Records + _index/_type keys + * @throws \RuntimeException + */ + protected function bulkSend(array $records): void + { + try { + $params = [ + 'body' => [], + ]; + + foreach ($records as $record) { + $params['body'][] = [ + 'index' => $this->needsType ? [ + '_index' => $record['_index'], + '_type' => $record['_type'], + ] : [ + '_index' => $record['_index'], + ], + ]; + unset($record['_index'], $record['_type']); + + $params['body'][] = $record; + } + + /** @var Elasticsearch */ + $responses = $this->client->bulk($params); + + if ($responses['errors'] === true) { + throw $this->createExceptionFromResponses($responses); + } + } catch (Throwable $e) { + if (! $this->options['ignore_error']) { + throw new RuntimeException('Error sending messages to Elasticsearch', 0, $e); + } + } + } + + /** + * Creates elasticsearch exception from responses array + * + * Only the first error is converted into an exception. + * + * @param mixed[]|Elasticsearch $responses returned by $this->client->bulk() + */ + protected function createExceptionFromResponses($responses): Throwable + { + foreach ($responses['items'] ?? [] as $item) { + if (isset($item['index']['error'])) { + return $this->createExceptionFromError($item['index']['error']); + } + } + + if (class_exists(ElasticInvalidArgumentException::class)) { + return new ElasticInvalidArgumentException('Elasticsearch failed to index one or more records.'); + } + + return new ElasticsearchRuntimeException('Elasticsearch failed to index one or more records.'); + } + + /** + * Creates elasticsearch exception from error array + * + * @param mixed[] $error + */ + protected function createExceptionFromError(array $error): Throwable + { + $previous = isset($error['caused_by']) ? $this->createExceptionFromError($error['caused_by']) : null; + + if (class_exists(ElasticInvalidArgumentException::class)) { + return new ElasticInvalidArgumentException($error['type'] . ': ' . $error['reason'], 0, $previous); + } + + return new ElasticsearchRuntimeException($error['type'] . ': ' . $error['reason'], 0, $previous); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php new file mode 100644 index 0000000000..f2e22036bd --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Stores to PHP error_log() handler. + * + * @author Elan Ruusamäe + */ +class ErrorLogHandler extends AbstractProcessingHandler +{ + public const OPERATING_SYSTEM = 0; + public const SAPI = 4; + + /** @var int */ + protected $messageType; + /** @var bool */ + protected $expandNewlines; + + /** + * @param int $messageType Says where the error should go. + * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries + */ + public function __construct(int $messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, bool $bubble = true, bool $expandNewlines = false) + { + parent::__construct($level, $bubble); + + if (false === in_array($messageType, self::getAvailableTypes(), true)) { + $message = sprintf('The given message type "%s" is not supported', print_r($messageType, true)); + + throw new \InvalidArgumentException($message); + } + + $this->messageType = $messageType; + $this->expandNewlines = $expandNewlines; + } + + /** + * @return int[] With all available types + */ + public static function getAvailableTypes(): array + { + return [ + self::OPERATING_SYSTEM, + self::SAPI, + ]; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%'); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!$this->expandNewlines) { + error_log((string) $record['formatted'], $this->messageType); + + return; + } + + $lines = preg_split('{[\r\n]+}', (string) $record['formatted']); + if ($lines === false) { + $pcreErrorCode = preg_last_error(); + throw new \RuntimeException('Failed to preg_split formatted string: ' . $pcreErrorCode . ' / '. Utils::pcreLastErrorMessage($pcreErrorCode)); + } + foreach ($lines as $line) { + error_log($line, $this->messageType); + } + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php new file mode 100644 index 0000000000..d4e234ce05 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Throwable; + +/** + * Forwards records to at most one handler + * + * If a handler fails, the exception is suppressed and the record is forwarded to the next handler. + * + * As soon as one handler handles a record successfully, the handling stops there. + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class FallbackGroupHandler extends GroupHandler +{ + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + foreach ($this->handlers as $handler) { + try { + $handler->handle($record); + break; + } catch (Throwable $e) { + // What throwable? + } + } + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + if ($this->processors) { + $processed = []; + foreach ($records as $record) { + $processed[] = $this->processRecord($record); + } + /** @var Record[] $records */ + $records = $processed; + } + + foreach ($this->handlers as $handler) { + try { + $handler->handleBatch($records); + break; + } catch (Throwable $e) { + // What throwable? + } + } + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php new file mode 100644 index 0000000000..718f17ef19 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php @@ -0,0 +1,212 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; +use Psr\Log\LogLevel; + +/** + * Simple handler wrapper that filters records based on a list of levels + * + * It can be configured with an exact list of levels to allow, or a min/max level. + * + * @author Hennadiy Verkh + * @author Jordi Boggiano + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class FilterHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface +{ + use ProcessableHandlerTrait; + + /** + * Handler or factory callable($record, $this) + * + * @var callable|HandlerInterface + * @phpstan-var callable(?Record, HandlerInterface): HandlerInterface|HandlerInterface + */ + protected $handler; + + /** + * Minimum level for logs that are passed to handler + * + * @var int[] + * @phpstan-var array + */ + protected $acceptedLevels; + + /** + * Whether the messages that are handled can bubble up the stack or not + * + * @var bool + */ + protected $bubble; + + /** + * @psalm-param HandlerInterface|callable(?Record, HandlerInterface): HandlerInterface $handler + * + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $filterHandler). + * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided + * @param int|string $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * + * @phpstan-param Level|LevelName|LogLevel::*|array $minLevelOrList + * @phpstan-param Level|LevelName|LogLevel::* $maxLevel + */ + public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, bool $bubble = true) + { + $this->handler = $handler; + $this->bubble = $bubble; + $this->setAcceptedLevels($minLevelOrList, $maxLevel); + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + /** + * @phpstan-return array + */ + public function getAcceptedLevels(): array + { + return array_flip($this->acceptedLevels); + } + + /** + * @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided + * @param int|string $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array + * + * @phpstan-param Level|LevelName|LogLevel::*|array $minLevelOrList + * @phpstan-param Level|LevelName|LogLevel::* $maxLevel + */ + public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY): self + { + if (is_array($minLevelOrList)) { + $acceptedLevels = array_map('Monolog\Logger::toMonologLevel', $minLevelOrList); + } else { + $minLevelOrList = Logger::toMonologLevel($minLevelOrList); + $maxLevel = Logger::toMonologLevel($maxLevel); + $acceptedLevels = array_values(array_filter(Logger::getLevels(), function ($level) use ($minLevelOrList, $maxLevel) { + return $level >= $minLevelOrList && $level <= $maxLevel; + })); + } + $this->acceptedLevels = array_flip($acceptedLevels); + + return $this; + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return isset($this->acceptedLevels[$record['level']]); + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if (!$this->isHandling($record)) { + return false; + } + + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + $this->getHandler($record)->handle($record); + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + $filtered = []; + foreach ($records as $record) { + if ($this->isHandling($record)) { + $filtered[] = $record; + } + } + + if (count($filtered) > 0) { + $this->getHandler($filtered[count($filtered) - 1])->handleBatch($filtered); + } + } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @return HandlerInterface + * + * @phpstan-param Record $record + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = ($this->handler)($record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + $handler->setFormatter($formatter); + + return $this; + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + return $handler->getFormatter(); + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } + + public function reset() + { + $this->resetProcessors(); + + if ($this->getHandler() instanceof ResettableInterface) { + $this->getHandler()->reset(); + } + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php new file mode 100644 index 0000000000..0aa5607b15 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +/** + * Interface for activation strategies for the FingersCrossedHandler. + * + * @author Johannes M. Schmitt + * + * @phpstan-import-type Record from \Monolog\Logger + */ +interface ActivationStrategyInterface +{ + /** + * Returns whether the given record activates the handler. + * + * @phpstan-param Record $record + */ + public function isHandlerActivated(array $record): bool; +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php new file mode 100644 index 0000000000..7b9abb582e --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Channel and Error level based monolog activation strategy. Allows to trigger activation + * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except + * for records of the 'sql' channel; those should trigger activation on level 'WARN'. + * + * Example: + * + * + * $activationStrategy = new ChannelLevelActivationStrategy( + * Logger::CRITICAL, + * array( + * 'request' => Logger::ALERT, + * 'sensitive' => Logger::ERROR, + * ) + * ); + * $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy); + * + * + * @author Mike Meessen + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class ChannelLevelActivationStrategy implements ActivationStrategyInterface +{ + /** + * @var Level + */ + private $defaultActionLevel; + + /** + * @var array + */ + private $channelToActionLevel; + + /** + * @param int|string $defaultActionLevel The default action level to be used if the record's category doesn't match any + * @param array $channelToActionLevel An array that maps channel names to action levels. + * + * @phpstan-param array $channelToActionLevel + * @phpstan-param Level|LevelName|LogLevel::* $defaultActionLevel + */ + public function __construct($defaultActionLevel, array $channelToActionLevel = []) + { + $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel); + $this->channelToActionLevel = array_map('Monolog\Logger::toMonologLevel', $channelToActionLevel); + } + + /** + * @phpstan-param Record $record + */ + public function isHandlerActivated(array $record): bool + { + if (isset($this->channelToActionLevel[$record['channel']])) { + return $record['level'] >= $this->channelToActionLevel[$record['channel']]; + } + + return $record['level'] >= $this->defaultActionLevel; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php new file mode 100644 index 0000000000..5ec88eab6e --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Error level based activation strategy. + * + * @author Johannes M. Schmitt + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class ErrorLevelActivationStrategy implements ActivationStrategyInterface +{ + /** + * @var Level + */ + private $actionLevel; + + /** + * @param int|string $actionLevel Level or name or value + * + * @phpstan-param Level|LevelName|LogLevel::* $actionLevel + */ + public function __construct($actionLevel) + { + $this->actionLevel = Logger::toMonologLevel($actionLevel); + } + + public function isHandlerActivated(array $record): bool + { + return $record['level'] >= $this->actionLevel; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php new file mode 100644 index 0000000000..0627b44514 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php @@ -0,0 +1,252 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; +use Monolog\Handler\FingersCrossed\ActivationStrategyInterface; +use Monolog\Logger; +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; +use Psr\Log\LogLevel; + +/** + * Buffers all records until a certain level is reached + * + * The advantage of this approach is that you don't get any clutter in your log files. + * Only requests which actually trigger an error (or whatever your actionLevel is) will be + * in the logs, but they will contain all records, not only those above the level threshold. + * + * You can then have a passthruLevel as well which means that at the end of the request, + * even if it did not get activated, it will still send through log records of e.g. at least a + * warning level. + * + * You can find the various activation strategies in the + * Monolog\Handler\FingersCrossed\ namespace. + * + * @author Jordi Boggiano + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class FingersCrossedHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface +{ + use ProcessableHandlerTrait; + + /** + * @var callable|HandlerInterface + * @phpstan-var callable(?Record, HandlerInterface): HandlerInterface|HandlerInterface + */ + protected $handler; + /** @var ActivationStrategyInterface */ + protected $activationStrategy; + /** @var bool */ + protected $buffering = true; + /** @var int */ + protected $bufferSize; + /** @var Record[] */ + protected $buffer = []; + /** @var bool */ + protected $stopBuffering; + /** + * @var ?int + * @phpstan-var ?Level + */ + protected $passthruLevel; + /** @var bool */ + protected $bubble; + + /** + * @psalm-param HandlerInterface|callable(?Record, HandlerInterface): HandlerInterface $handler + * + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $fingersCrossedHandler). + * @param int|string|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action, or a level name/value at which the handler is activated + * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $stopBuffering Whether the handler should stop buffering after being triggered (default true) + * @param int|string $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered + * + * @phpstan-param Level|LevelName|LogLevel::* $passthruLevel + * @phpstan-param Level|LevelName|LogLevel::*|ActivationStrategyInterface $activationStrategy + */ + public function __construct($handler, $activationStrategy = null, int $bufferSize = 0, bool $bubble = true, bool $stopBuffering = true, $passthruLevel = null) + { + if (null === $activationStrategy) { + $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING); + } + + // convert simple int activationStrategy to an object + if (!$activationStrategy instanceof ActivationStrategyInterface) { + $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy); + } + + $this->handler = $handler; + $this->activationStrategy = $activationStrategy; + $this->bufferSize = $bufferSize; + $this->bubble = $bubble; + $this->stopBuffering = $stopBuffering; + + if ($passthruLevel !== null) { + $this->passthruLevel = Logger::toMonologLevel($passthruLevel); + } + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return true; + } + + /** + * Manually activate this logger regardless of the activation strategy + */ + public function activate(): void + { + if ($this->stopBuffering) { + $this->buffering = false; + } + + $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer); + $this->buffer = []; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + if ($this->buffering) { + $this->buffer[] = $record; + if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) { + array_shift($this->buffer); + } + if ($this->activationStrategy->isHandlerActivated($record)) { + $this->activate(); + } + } else { + $this->getHandler($record)->handle($record); + } + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + $this->flushBuffer(); + + $this->getHandler()->close(); + } + + public function reset() + { + $this->flushBuffer(); + + $this->resetProcessors(); + + if ($this->getHandler() instanceof ResettableInterface) { + $this->getHandler()->reset(); + } + } + + /** + * Clears the buffer without flushing any messages down to the wrapped handler. + * + * It also resets the handler to its initial buffering state. + */ + public function clear(): void + { + $this->buffer = []; + $this->reset(); + } + + /** + * Resets the state of the handler. Stops forwarding records to the wrapped handler. + */ + private function flushBuffer(): void + { + if (null !== $this->passthruLevel) { + $level = $this->passthruLevel; + $this->buffer = array_filter($this->buffer, function ($record) use ($level) { + return $record['level'] >= $level; + }); + if (count($this->buffer) > 0) { + $this->getHandler(end($this->buffer))->handleBatch($this->buffer); + } + } + + $this->buffer = []; + $this->buffering = true; + } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @return HandlerInterface + * + * @phpstan-param Record $record + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = ($this->handler)($record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + $handler->setFormatter($formatter); + + return $this; + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + return $handler->getFormatter(); + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php new file mode 100644 index 0000000000..72718de631 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php @@ -0,0 +1,180 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\WildfireFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol. + * + * @author Eric Clemmons (@ericclemmons) + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class FirePHPHandler extends AbstractProcessingHandler +{ + use WebRequestRecognizerTrait; + + /** + * WildFire JSON header message format + */ + protected const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; + + /** + * FirePHP structure for parsing messages & their presentation + */ + protected const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; + + /** + * Must reference a "known" plugin, otherwise headers won't display in FirePHP + */ + protected const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3'; + + /** + * Header prefix for Wildfire to recognize & parse headers + */ + protected const HEADER_PREFIX = 'X-Wf'; + + /** + * Whether or not Wildfire vendor-specific headers have been generated & sent yet + * @var bool + */ + protected static $initialized = false; + + /** + * Shared static message index between potentially multiple handlers + * @var int + */ + protected static $messageIndex = 1; + + /** @var bool */ + protected static $sendHeaders = true; + + /** + * Base header creation function used by init headers & record headers + * + * @param array $meta Wildfire Plugin, Protocol & Structure Indexes + * @param string $message Log message + * + * @return array Complete header string ready for the client as key and message as value + * + * @phpstan-return non-empty-array + */ + protected function createHeader(array $meta, string $message): array + { + $header = sprintf('%s-%s', static::HEADER_PREFIX, join('-', $meta)); + + return [$header => $message]; + } + + /** + * Creates message header from record + * + * @return array + * + * @phpstan-return non-empty-array + * + * @see createHeader() + * + * @phpstan-param FormattedRecord $record + */ + protected function createRecordHeader(array $record): array + { + // Wildfire is extensible to support multiple protocols & plugins in a single request, + // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake. + return $this->createHeader( + [1, 1, 1, self::$messageIndex++], + $record['formatted'] + ); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new WildfireFormatter(); + } + + /** + * Wildfire initialization headers to enable message parsing + * + * @see createHeader() + * @see sendHeader() + * + * @return array + */ + protected function getInitHeaders(): array + { + // Initial payload consists of required headers for Wildfire + return array_merge( + $this->createHeader(['Protocol', 1], static::PROTOCOL_URI), + $this->createHeader([1, 'Structure', 1], static::STRUCTURE_URI), + $this->createHeader([1, 'Plugin', 1], static::PLUGIN_URI) + ); + } + + /** + * Send header string to the client + */ + protected function sendHeader(string $header, string $content): void + { + if (!headers_sent() && self::$sendHeaders) { + header(sprintf('%s: %s', $header, $content)); + } + } + + /** + * Creates & sends header for a record, ensuring init headers have been sent prior + * + * @see sendHeader() + * @see sendInitHeaders() + */ + protected function write(array $record): void + { + if (!self::$sendHeaders || !$this->isWebRequest()) { + return; + } + + // WildFire-specific headers must be sent prior to any messages + if (!self::$initialized) { + self::$initialized = true; + + self::$sendHeaders = $this->headersAccepted(); + if (!self::$sendHeaders) { + return; + } + + foreach ($this->getInitHeaders() as $header => $content) { + $this->sendHeader($header, $content); + } + } + + $header = $this->createRecordHeader($record); + if (trim(current($header)) !== '') { + $this->sendHeader(key($header), current($header)); + } + } + + /** + * Verifies if the headers are accepted by the current user agent + */ + protected function headersAccepted(): bool + { + if (!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])) { + return true; + } + + return isset($_SERVER['HTTP_X_FIREPHP_VERSION']); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php new file mode 100644 index 0000000000..85c95b9d76 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php @@ -0,0 +1,135 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; + +/** + * Sends logs to Fleep.io using Webhook integrations + * + * You'll need a Fleep.io account to use this handler. + * + * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation + * @author Ando Roots + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class FleepHookHandler extends SocketHandler +{ + protected const FLEEP_HOST = 'fleep.io'; + + protected const FLEEP_HOOK_URI = '/hook/'; + + /** + * @var string Webhook token (specifies the conversation where logs are sent) + */ + protected $token; + + /** + * Construct a new Fleep.io Handler. + * + * For instructions on how to create a new web hook in your conversations + * see https://fleep.io/integrations/webhooks/ + * + * @param string $token Webhook token + * @throws MissingExtensionException + */ + public function __construct( + string $token, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler'); + } + + $this->token = $token; + + $connectionString = 'ssl://' . static::FLEEP_HOST . ':443'; + parent::__construct( + $connectionString, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + } + + /** + * Returns the default formatter to use with this handler + * + * Overloaded to remove empty context and extra arrays from the end of the log message. + * + * @return LineFormatter + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(null, null, true, true); + } + + /** + * Handles a log record + */ + public function write(array $record): void + { + parent::write($record); + $this->closeSocket(); + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the header of the API Call + */ + private function buildHeader(string $content): string + { + $header = "POST " . static::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n"; + $header .= "Host: " . static::FLEEP_HOST . "\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + /** + * Builds the body of API call + * + * @phpstan-param FormattedRecord $record + */ + private function buildContent(array $record): string + { + $dataArray = [ + 'message' => $record['formatted'], + ]; + + return http_build_query($dataArray); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php new file mode 100644 index 0000000000..b837bdb66e --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\FlowdockFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Sends notifications through the Flowdock push API + * + * This must be configured with a FlowdockFormatter instance via setFormatter() + * + * Notes: + * API token - Flowdock API token + * + * @author Dominik Liebler + * @see https://www.flowdock.com/api/push + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class FlowdockHandler extends SocketHandler +{ + /** + * @var string + */ + protected $apiToken; + + /** + * @throws MissingExtensionException if OpenSSL is missing + */ + public function __construct( + string $apiToken, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler'); + } + + parent::__construct( + 'ssl://api.flowdock.com:443', + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + $this->apiToken = $apiToken; + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if (!$formatter instanceof FlowdockFormatter) { + throw new \InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); + } + + return parent::setFormatter($formatter); + } + + /** + * Gets the default formatter. + */ + protected function getDefaultFormatter(): FormatterInterface + { + throw new \InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + parent::write($record); + + $this->closeSocket(); + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the body of API call + * + * @phpstan-param FormattedRecord $record + */ + private function buildContent(array $record): string + { + return Utils::jsonEncode($record['formatted']['flowdock']); + } + + /** + * Builds the header of the API Call + */ + private function buildHeader(string $content): string + { + $header = "POST /v1/messages/team_inbox/" . $this->apiToken . " HTTP/1.1\r\n"; + $header .= "Host: api.flowdock.com\r\n"; + $header .= "Content-Type: application/json\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php new file mode 100644 index 0000000000..fc1693cd08 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; + +/** + * Interface to describe loggers that have a formatter + * + * @author Jordi Boggiano + */ +interface FormattableHandlerInterface +{ + /** + * Sets the formatter. + * + * @param FormatterInterface $formatter + * @return HandlerInterface self + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface; + + /** + * Gets the formatter. + * + * @return FormatterInterface + */ + public function getFormatter(): FormatterInterface; +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php new file mode 100644 index 0000000000..b60bdce0ef --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; + +/** + * Helper trait for implementing FormattableInterface + * + * @author Jordi Boggiano + */ +trait FormattableHandlerTrait +{ + /** + * @var ?FormatterInterface + */ + protected $formatter; + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $this->formatter = $formatter; + + return $this; + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + if (!$this->formatter) { + $this->formatter = $this->getDefaultFormatter(); + } + + return $this->formatter; + } + + /** + * Gets the default formatter. + * + * Overwrite this if the LineFormatter is not a good default for your handler. + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php new file mode 100644 index 0000000000..4ff26c4cd0 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Gelf\PublisherInterface; +use Monolog\Logger; +use Monolog\Formatter\GelfMessageFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Handler to send messages to a Graylog2 (http://www.graylog2.org) server + * + * @author Matt Lehner + * @author Benjamin Zikarsky + */ +class GelfHandler extends AbstractProcessingHandler +{ + /** + * @var PublisherInterface the publisher object that sends the message to the server + */ + protected $publisher; + + /** + * @param PublisherInterface $publisher a gelf publisher object + */ + public function __construct(PublisherInterface $publisher, $level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + + $this->publisher = $publisher; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->publisher->publish($record['formatted']); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new GelfMessageFormatter(); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php new file mode 100644 index 0000000000..3c9dc4b3b7 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\ResettableInterface; + +/** + * Forwards records to multiple handlers + * + * @author Lenar Lõhmus + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class GroupHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface +{ + use ProcessableHandlerTrait; + + /** @var HandlerInterface[] */ + protected $handlers; + /** @var bool */ + protected $bubble; + + /** + * @param HandlerInterface[] $handlers Array of Handlers. + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(array $handlers, bool $bubble = true) + { + foreach ($handlers as $handler) { + if (!$handler instanceof HandlerInterface) { + throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.'); + } + } + + $this->handlers = $handlers; + $this->bubble = $bubble; + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + foreach ($this->handlers as $handler) { + if ($handler->isHandling($record)) { + return true; + } + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + foreach ($this->handlers as $handler) { + $handler->handle($record); + } + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + if ($this->processors) { + $processed = []; + foreach ($records as $record) { + $processed[] = $this->processRecord($record); + } + /** @var Record[] $records */ + $records = $processed; + } + + foreach ($this->handlers as $handler) { + $handler->handleBatch($records); + } + } + + public function reset() + { + $this->resetProcessors(); + + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } + } + } + + public function close(): void + { + parent::close(); + + foreach ($this->handlers as $handler) { + $handler->close(); + } + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + foreach ($this->handlers as $handler) { + if ($handler instanceof FormattableHandlerInterface) { + $handler->setFormatter($formatter); + } + } + + return $this; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/Handler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/Handler.php new file mode 100644 index 0000000000..34b4935dd8 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/Handler.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Base Handler class providing basic close() support as well as handleBatch + * + * @author Jordi Boggiano + */ +abstract class Handler implements HandlerInterface +{ + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + foreach ($records as $record) { + $this->handle($record); + } + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + } + + public function __destruct() + { + try { + $this->close(); + } catch (\Throwable $e) { + // do nothing + } + } + + public function __sleep() + { + $this->close(); + + $reflClass = new \ReflectionClass($this); + + $keys = []; + foreach ($reflClass->getProperties() as $reflProp) { + if (!$reflProp->isStatic()) { + $keys[] = $reflProp->getName(); + } + } + + return $keys; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php new file mode 100644 index 0000000000..affcc51fca --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Interface that all Monolog Handlers must implement + * + * @author Jordi Boggiano + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + */ +interface HandlerInterface +{ + /** + * Checks whether the given record will be handled by this handler. + * + * This is mostly done for performance reasons, to avoid calling processors for nothing. + * + * Handlers should still check the record levels within handle(), returning false in isHandling() + * is no guarantee that handle() will not be called, and isHandling() might not be called + * for a given record. + * + * @param array $record Partial log record containing only a level key + * + * @return bool + * + * @phpstan-param array{level: Level} $record + */ + public function isHandling(array $record): bool; + + /** + * Handles a record. + * + * All records may be passed to this method, and the handler should discard + * those that it does not want to handle. + * + * The return value of this function controls the bubbling process of the handler stack. + * Unless the bubbling is interrupted (by returning true), the Logger class will keep on + * calling further handlers in the stack with a given log record. + * + * @param array $record The record to handle + * @return bool true means that this handler handled the record, and that bubbling is not permitted. + * false means the record was either not processed or that this handler allows bubbling. + * + * @phpstan-param Record $record + */ + public function handle(array $record): bool; + + /** + * Handles a set of records at once. + * + * @param array $records The records to handle (an array of record arrays) + * + * @phpstan-param Record[] $records + */ + public function handleBatch(array $records): void; + + /** + * Closes the handler. + * + * Ends a log cycle and frees all resources used by the handler. + * + * Closing a Handler means flushing all buffers and freeing any open resources/handles. + * + * Implementations have to be idempotent (i.e. it should be possible to call close several times without breakage) + * and ideally handlers should be able to reopen themselves on handle() after they have been closed. + * + * This is useful at the end of a request and will be called automatically when the object + * is destroyed if you extend Monolog\Handler\Handler. + * + * If you are thinking of calling this method yourself, most likely you should be + * calling ResettableInterface::reset instead. Have a look. + */ + public function close(): void; +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php new file mode 100644 index 0000000000..d4351b9f9d --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; + +/** + * This simple wrapper class can be used to extend handlers functionality. + * + * Example: A custom filtering that can be applied to any handler. + * + * Inherit from this class and override handle() like this: + * + * public function handle(array $record) + * { + * if ($record meets certain conditions) { + * return false; + * } + * return $this->handler->handle($record); + * } + * + * @author Alexey Karapetov + */ +class HandlerWrapper implements HandlerInterface, ProcessableHandlerInterface, FormattableHandlerInterface, ResettableInterface +{ + /** + * @var HandlerInterface + */ + protected $handler; + + public function __construct(HandlerInterface $handler) + { + $this->handler = $handler; + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return $this->handler->isHandling($record); + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + return $this->handler->handle($record); + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + $this->handler->handleBatch($records); + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + $this->handler->close(); + } + + /** + * {@inheritDoc} + */ + public function pushProcessor(callable $callback): HandlerInterface + { + if ($this->handler instanceof ProcessableHandlerInterface) { + $this->handler->pushProcessor($callback); + + return $this; + } + + throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class); + } + + /** + * {@inheritDoc} + */ + public function popProcessor(): callable + { + if ($this->handler instanceof ProcessableHandlerInterface) { + return $this->handler->popProcessor(); + } + + throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class); + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + $this->handler->setFormatter($formatter); + + return $this; + } + + throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + return $this->handler->getFormatter(); + } + + throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class); + } + + public function reset() + { + if ($this->handler instanceof ResettableInterface) { + $this->handler->reset(); + } + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php new file mode 100644 index 0000000000..000ccea40e --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * IFTTTHandler uses cURL to trigger IFTTT Maker actions + * + * Register a secret key and trigger/event name at https://ifttt.com/maker + * + * value1 will be the channel from monolog's Logger constructor, + * value2 will be the level name (ERROR, WARNING, ..) + * value3 will be the log record's message + * + * @author Nehal Patel + */ +class IFTTTHandler extends AbstractProcessingHandler +{ + /** @var string */ + private $eventName; + /** @var string */ + private $secretKey; + + /** + * @param string $eventName The name of the IFTTT Maker event that should be triggered + * @param string $secretKey A valid IFTTT secret key + */ + public function __construct(string $eventName, string $secretKey, $level = Logger::ERROR, bool $bubble = true) + { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is needed to use the IFTTTHandler'); + } + + $this->eventName = $eventName; + $this->secretKey = $secretKey; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + public function write(array $record): void + { + $postData = [ + "value1" => $record["channel"], + "value2" => $record["level_name"], + "value3" => $record["message"], + ]; + $postString = Utils::jsonEncode($postData); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $postString); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "Content-Type: application/json", + ]); + + Curl\Util::execute($ch); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php new file mode 100644 index 0000000000..71f64a267d --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Inspired on LogEntriesHandler. + * + * @author Robert Kaufmann III + * @author Gabriel Machado + */ +class InsightOpsHandler extends SocketHandler +{ + /** + * @var string + */ + protected $logToken; + + /** + * @param string $token Log token supplied by InsightOps + * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'. + * @param bool $useSSL Whether or not SSL encryption should be used + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct( + string $token, + string $region = 'us', + bool $useSSL = true, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler'); + } + + $endpoint = $useSSL + ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443' + : $region . '.data.logs.insight.rapid7.com:80'; + + parent::__construct( + $endpoint, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + $this->logToken = $token; + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + return $this->logToken . ' ' . $record['formatted']; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php new file mode 100644 index 0000000000..25fcd1594b --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * @author Robert Kaufmann III + */ +class LogEntriesHandler extends SocketHandler +{ + /** + * @var string + */ + protected $logToken; + + /** + * @param string $token Log token supplied by LogEntries + * @param bool $useSSL Whether or not SSL encryption should be used. + * @param string $host Custom hostname to send the data to if needed + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct( + string $token, + bool $useSSL = true, + $level = Logger::DEBUG, + bool $bubble = true, + string $host = 'data.logentries.com', + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); + } + + $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80'; + parent::__construct( + $endpoint, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + $this->logToken = $token; + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + return $this->logToken . ' ' . $record['formatted']; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php new file mode 100644 index 0000000000..6d13db375a --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php @@ -0,0 +1,160 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LogglyFormatter; +use function array_key_exists; +use CurlHandle; + +/** + * Sends errors to Loggly. + * + * @author Przemek Sobstel + * @author Adam Pancutt + * @author Gregory Barchard + */ +class LogglyHandler extends AbstractProcessingHandler +{ + protected const HOST = 'logs-01.loggly.com'; + protected const ENDPOINT_SINGLE = 'inputs'; + protected const ENDPOINT_BATCH = 'bulk'; + + /** + * Caches the curl handlers for every given endpoint. + * + * @var resource[]|CurlHandle[] + */ + protected $curlHandlers = []; + + /** @var string */ + protected $token; + + /** @var string[] */ + protected $tag = []; + + /** + * @param string $token API token supplied by Loggly + * + * @throws MissingExtensionException If the curl extension is missing + */ + public function __construct(string $token, $level = Logger::DEBUG, bool $bubble = true) + { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is needed to use the LogglyHandler'); + } + + $this->token = $token; + + parent::__construct($level, $bubble); + } + + /** + * Loads and returns the shared curl handler for the given endpoint. + * + * @param string $endpoint + * + * @return resource|CurlHandle + */ + protected function getCurlHandler(string $endpoint) + { + if (!array_key_exists($endpoint, $this->curlHandlers)) { + $this->curlHandlers[$endpoint] = $this->loadCurlHandle($endpoint); + } + + return $this->curlHandlers[$endpoint]; + } + + /** + * Starts a fresh curl session for the given endpoint and returns its handler. + * + * @param string $endpoint + * + * @return resource|CurlHandle + */ + private function loadCurlHandle(string $endpoint) + { + $url = sprintf("https://%s/%s/%s/", static::HOST, $endpoint, $this->token); + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + + return $ch; + } + + /** + * @param string[]|string $tag + */ + public function setTag($tag): self + { + $tag = !empty($tag) ? $tag : []; + $this->tag = is_array($tag) ? $tag : [$tag]; + + return $this; + } + + /** + * @param string[]|string $tag + */ + public function addTag($tag): self + { + if (!empty($tag)) { + $tag = is_array($tag) ? $tag : [$tag]; + $this->tag = array_unique(array_merge($this->tag, $tag)); + } + + return $this; + } + + protected function write(array $record): void + { + $this->send($record["formatted"], static::ENDPOINT_SINGLE); + } + + public function handleBatch(array $records): void + { + $level = $this->level; + + $records = array_filter($records, function ($record) use ($level) { + return ($record['level'] >= $level); + }); + + if ($records) { + $this->send($this->getFormatter()->formatBatch($records), static::ENDPOINT_BATCH); + } + } + + protected function send(string $data, string $endpoint): void + { + $ch = $this->getCurlHandler($endpoint); + + $headers = ['Content-Type: application/json']; + + if (!empty($this->tag)) { + $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag); + } + + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + + Curl\Util::execute($ch, 5, false); + } + + protected function getDefaultFormatter(): FormatterInterface + { + return new LogglyFormatter(); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php new file mode 100644 index 0000000000..859a469065 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php @@ -0,0 +1,106 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LogmaticFormatter; + +/** + * @author Julien Breux + */ +class LogmaticHandler extends SocketHandler +{ + /** + * @var string + */ + private $logToken; + + /** + * @var string + */ + private $hostname; + + /** + * @var string + */ + private $appname; + + /** + * @param string $token Log token supplied by Logmatic. + * @param string $hostname Host name supplied by Logmatic. + * @param string $appname Application name supplied by Logmatic. + * @param bool $useSSL Whether or not SSL encryption should be used. + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct( + string $token, + string $hostname = '', + string $appname = '', + bool $useSSL = true, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use SSL encrypted connection for LogmaticHandler'); + } + + $endpoint = $useSSL ? 'ssl://api.logmatic.io:10515' : 'api.logmatic.io:10514'; + $endpoint .= '/v1/'; + + parent::__construct( + $endpoint, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + + $this->logToken = $token; + $this->hostname = $hostname; + $this->appname = $appname; + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + return $this->logToken . ' ' . $record['formatted']; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + $formatter = new LogmaticFormatter(); + + if (!empty($this->hostname)) { + $formatter->setHostname($this->hostname); + } + if (!empty($this->appname)) { + $formatter->setAppname($this->appname); + } + + return $formatter; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php new file mode 100644 index 0000000000..97f3432028 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\HtmlFormatter; + +/** + * Base class for all mail handlers + * + * @author Gyula Sallai + * + * @phpstan-import-type Record from \Monolog\Logger + */ +abstract class MailHandler extends AbstractProcessingHandler +{ + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + $messages = []; + + foreach ($records as $record) { + if ($record['level'] < $this->level) { + continue; + } + /** @var Record $message */ + $message = $this->processRecord($record); + $messages[] = $message; + } + + if (!empty($messages)) { + $this->send((string) $this->getFormatter()->formatBatch($messages), $messages); + } + } + + /** + * Send a mail with the given content + * + * @param string $content formatted email body to be sent + * @param array $records the array of log records that formed this content + * + * @phpstan-param Record[] $records + */ + abstract protected function send(string $content, array $records): void; + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->send((string) $record['formatted'], [$record]); + } + + /** + * @phpstan-param non-empty-array $records + * @phpstan-return Record + */ + protected function getHighestRecord(array $records): array + { + $highestRecord = null; + foreach ($records as $record) { + if ($highestRecord === null || $highestRecord['level'] < $record['level']) { + $highestRecord = $record; + } + } + + return $highestRecord; + } + + protected function isHtmlBody(string $body): bool + { + return ($body[0] ?? null) === '<'; + } + + /** + * Gets the default formatter. + * + * @return FormatterInterface + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new HtmlFormatter(); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php new file mode 100644 index 0000000000..3003500ec0 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Swift; +use Swift_Message; + +/** + * MandrillHandler uses cURL to send the emails to the Mandrill API + * + * @author Adam Nicholson + */ +class MandrillHandler extends MailHandler +{ + /** @var Swift_Message */ + protected $message; + /** @var string */ + protected $apiKey; + + /** + * @psalm-param Swift_Message|callable(): Swift_Message $message + * + * @param string $apiKey A valid Mandrill API key + * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced + */ + public function __construct(string $apiKey, $message, $level = Logger::ERROR, bool $bubble = true) + { + parent::__construct($level, $bubble); + + if (!$message instanceof Swift_Message && is_callable($message)) { + $message = $message(); + } + if (!$message instanceof Swift_Message) { + throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it'); + } + $this->message = $message; + $this->apiKey = $apiKey; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $mime = 'text/plain'; + if ($this->isHtmlBody($content)) { + $mime = 'text/html'; + } + + $message = clone $this->message; + $message->setBody($content, $mime); + /** @phpstan-ignore-next-line */ + if (version_compare(Swift::VERSION, '6.0.0', '>=')) { + $message->setDate(new \DateTimeImmutable()); + } else { + /** @phpstan-ignore-next-line */ + $message->setDate(time()); + } + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json'); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'key' => $this->apiKey, + 'raw_message' => (string) $message, + 'async' => false, + ])); + + Curl\Util::execute($ch); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php new file mode 100644 index 0000000000..3965aeea5d --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Exception can be thrown if an extension for a handler is missing + * + * @author Christian Bergau + */ +class MissingExtensionException extends \Exception +{ +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php new file mode 100644 index 0000000000..3063091199 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php @@ -0,0 +1,86 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use MongoDB\Driver\BulkWrite; +use MongoDB\Driver\Manager; +use MongoDB\Client; +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\MongoDBFormatter; + +/** + * Logs to a MongoDB database. + * + * Usage example: + * + * $log = new \Monolog\Logger('application'); + * $client = new \MongoDB\Client('mongodb://localhost:27017'); + * $mongodb = new \Monolog\Handler\MongoDBHandler($client, 'logs', 'prod'); + * $log->pushHandler($mongodb); + * + * The above examples uses the MongoDB PHP library's client class; however, the + * MongoDB\Driver\Manager class from ext-mongodb is also supported. + */ +class MongoDBHandler extends AbstractProcessingHandler +{ + /** @var \MongoDB\Collection */ + private $collection; + /** @var Client|Manager */ + private $manager; + /** @var string */ + private $namespace; + + /** + * Constructor. + * + * @param Client|Manager $mongodb MongoDB library or driver client + * @param string $database Database name + * @param string $collection Collection name + */ + public function __construct($mongodb, string $database, string $collection, $level = Logger::DEBUG, bool $bubble = true) + { + if (!($mongodb instanceof Client || $mongodb instanceof Manager)) { + throw new \InvalidArgumentException('MongoDB\Client or MongoDB\Driver\Manager instance required'); + } + + if ($mongodb instanceof Client) { + $this->collection = $mongodb->selectCollection($database, $collection); + } else { + $this->manager = $mongodb; + $this->namespace = $database . '.' . $collection; + } + + parent::__construct($level, $bubble); + } + + protected function write(array $record): void + { + if (isset($this->collection)) { + $this->collection->insertOne($record['formatted']); + } + + if (isset($this->manager, $this->namespace)) { + $bulk = new BulkWrite; + $bulk->insert($record["formatted"]); + $this->manager->executeBulkWrite($this->namespace, $bulk); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new MongoDBFormatter; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php new file mode 100644 index 0000000000..0c0a3bdb1c --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php @@ -0,0 +1,174 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\LineFormatter; + +/** + * NativeMailerHandler uses the mail() function to send the emails + * + * @author Christophe Coevoet + * @author Mark Garrett + */ +class NativeMailerHandler extends MailHandler +{ + /** + * The email addresses to which the message will be sent + * @var string[] + */ + protected $to; + + /** + * The subject of the email + * @var string + */ + protected $subject; + + /** + * Optional headers for the message + * @var string[] + */ + protected $headers = []; + + /** + * Optional parameters for the message + * @var string[] + */ + protected $parameters = []; + + /** + * The wordwrap length for the message + * @var int + */ + protected $maxColumnWidth; + + /** + * The Content-type for the message + * @var string|null + */ + protected $contentType; + + /** + * The encoding for the message + * @var string + */ + protected $encoding = 'utf-8'; + + /** + * @param string|string[] $to The receiver of the mail + * @param string $subject The subject of the mail + * @param string $from The sender of the mail + * @param int $maxColumnWidth The maximum column width that the message lines will have + */ + public function __construct($to, string $subject, string $from, $level = Logger::ERROR, bool $bubble = true, int $maxColumnWidth = 70) + { + parent::__construct($level, $bubble); + $this->to = (array) $to; + $this->subject = $subject; + $this->addHeader(sprintf('From: %s', $from)); + $this->maxColumnWidth = $maxColumnWidth; + } + + /** + * Add headers to the message + * + * @param string|string[] $headers Custom added headers + */ + public function addHeader($headers): self + { + foreach ((array) $headers as $header) { + if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) { + throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); + } + $this->headers[] = $header; + } + + return $this; + } + + /** + * Add parameters to the message + * + * @param string|string[] $parameters Custom added parameters + */ + public function addParameter($parameters): self + { + $this->parameters = array_merge($this->parameters, (array) $parameters); + + return $this; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $contentType = $this->getContentType() ?: ($this->isHtmlBody($content) ? 'text/html' : 'text/plain'); + + if ($contentType !== 'text/html') { + $content = wordwrap($content, $this->maxColumnWidth); + } + + $headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n"); + $headers .= 'Content-type: ' . $contentType . '; charset=' . $this->getEncoding() . "\r\n"; + if ($contentType === 'text/html' && false === strpos($headers, 'MIME-Version:')) { + $headers .= 'MIME-Version: 1.0' . "\r\n"; + } + + $subject = $this->subject; + if ($records) { + $subjectFormatter = new LineFormatter($this->subject); + $subject = $subjectFormatter->format($this->getHighestRecord($records)); + } + + $parameters = implode(' ', $this->parameters); + foreach ($this->to as $to) { + mail($to, $subject, $content, $headers, $parameters); + } + } + + public function getContentType(): ?string + { + return $this->contentType; + } + + public function getEncoding(): string + { + return $this->encoding; + } + + /** + * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML messages. + */ + public function setContentType(string $contentType): self + { + if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) { + throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection'); + } + + $this->contentType = $contentType; + + return $this; + } + + public function setEncoding(string $encoding): self + { + if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) { + throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection'); + } + + $this->encoding = $encoding; + + return $this; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php new file mode 100644 index 0000000000..114d749eb9 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php @@ -0,0 +1,199 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Class to record a log on a NewRelic application. + * Enabling New Relic High Security mode may prevent capture of useful information. + * + * This handler requires a NormalizerFormatter to function and expects an array in $record['formatted'] + * + * @see https://docs.newrelic.com/docs/agents/php-agent + * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security + */ +class NewRelicHandler extends AbstractProcessingHandler +{ + /** + * Name of the New Relic application that will receive logs from this handler. + * + * @var ?string + */ + protected $appName; + + /** + * Name of the current transaction + * + * @var ?string + */ + protected $transactionName; + + /** + * Some context and extra data is passed into the handler as arrays of values. Do we send them as is + * (useful if we are using the API), or explode them for display on the NewRelic RPM website? + * + * @var bool + */ + protected $explodeArrays; + + /** + * {@inheritDoc} + * + * @param string|null $appName + * @param bool $explodeArrays + * @param string|null $transactionName + */ + public function __construct( + $level = Logger::ERROR, + bool $bubble = true, + ?string $appName = null, + bool $explodeArrays = false, + ?string $transactionName = null + ) { + parent::__construct($level, $bubble); + + $this->appName = $appName; + $this->explodeArrays = $explodeArrays; + $this->transactionName = $transactionName; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!$this->isNewRelicEnabled()) { + throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler'); + } + + if ($appName = $this->getAppName($record['context'])) { + $this->setNewRelicAppName($appName); + } + + if ($transactionName = $this->getTransactionName($record['context'])) { + $this->setNewRelicTransactionName($transactionName); + unset($record['formatted']['context']['transaction_name']); + } + + if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Throwable) { + newrelic_notice_error($record['message'], $record['context']['exception']); + unset($record['formatted']['context']['exception']); + } else { + newrelic_notice_error($record['message']); + } + + if (isset($record['formatted']['context']) && is_array($record['formatted']['context'])) { + foreach ($record['formatted']['context'] as $key => $parameter) { + if (is_array($parameter) && $this->explodeArrays) { + foreach ($parameter as $paramKey => $paramValue) { + $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue); + } + } else { + $this->setNewRelicParameter('context_' . $key, $parameter); + } + } + } + + if (isset($record['formatted']['extra']) && is_array($record['formatted']['extra'])) { + foreach ($record['formatted']['extra'] as $key => $parameter) { + if (is_array($parameter) && $this->explodeArrays) { + foreach ($parameter as $paramKey => $paramValue) { + $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue); + } + } else { + $this->setNewRelicParameter('extra_' . $key, $parameter); + } + } + } + } + + /** + * Checks whether the NewRelic extension is enabled in the system. + * + * @return bool + */ + protected function isNewRelicEnabled(): bool + { + return extension_loaded('newrelic'); + } + + /** + * Returns the appname where this log should be sent. Each log can override the default appname, set in this + * handler's constructor, by providing the appname in it's context. + * + * @param mixed[] $context + */ + protected function getAppName(array $context): ?string + { + if (isset($context['appname'])) { + return $context['appname']; + } + + return $this->appName; + } + + /** + * Returns the name of the current transaction. Each log can override the default transaction name, set in this + * handler's constructor, by providing the transaction_name in it's context + * + * @param mixed[] $context + */ + protected function getTransactionName(array $context): ?string + { + if (isset($context['transaction_name'])) { + return $context['transaction_name']; + } + + return $this->transactionName; + } + + /** + * Sets the NewRelic application that should receive this log. + */ + protected function setNewRelicAppName(string $appName): void + { + newrelic_set_appname($appName); + } + + /** + * Overwrites the name of the current transaction + */ + protected function setNewRelicTransactionName(string $transactionName): void + { + newrelic_name_transaction($transactionName); + } + + /** + * @param string $key + * @param mixed $value + */ + protected function setNewRelicParameter(string $key, $value): void + { + if (null === $value || is_scalar($value)) { + newrelic_add_custom_parameter($key, $value); + } else { + newrelic_add_custom_parameter($key, Utils::jsonEncode($value, null, true)); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new NormalizerFormatter(); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php new file mode 100644 index 0000000000..1ddf0beb91 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * No-op + * + * This handler handles anything, but does nothing, and does not stop bubbling to the rest of the stack. + * This can be used for testing, or to disable a handler when overriding a configuration without + * influencing the rest of the stack. + * + * @author Roel Harbers + */ +class NoopHandler extends Handler +{ + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return true; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + return false; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php new file mode 100644 index 0000000000..e75ee0c6e9 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Blackhole + * + * Any record it can handle will be thrown away. This can be used + * to put on top of an existing stack to override it temporarily. + * + * @author Jordi Boggiano + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class NullHandler extends Handler +{ + /** + * @var int + */ + private $level; + + /** + * @param string|int $level The minimum logging level at which this handler will be triggered + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function __construct($level = Logger::DEBUG) + { + $this->level = Logger::toMonologLevel($level); + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return $record['level'] >= $this->level; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + return $record['level'] >= $this->level; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php new file mode 100644 index 0000000000..22068c9a39 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php @@ -0,0 +1,149 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; + +/** + * Handler to only pass log messages when a certain threshold of number of messages is reached. + * + * This can be useful in cases of processing a batch of data, but you're for example only interested + * in case it fails catastrophically instead of a warning for 1 or 2 events. Worse things can happen, right? + * + * Usage example: + * + * ``` + * $log = new Logger('application'); + * $handler = new SomeHandler(...) + * + * // Pass all warnings to the handler when more than 10 & all error messages when more then 5 + * $overflow = new OverflowHandler($handler, [Logger::WARNING => 10, Logger::ERROR => 5]); + * + * $log->pushHandler($overflow); + *``` + * + * @author Kris Buist + */ +class OverflowHandler extends AbstractHandler implements FormattableHandlerInterface +{ + /** @var HandlerInterface */ + private $handler; + + /** @var int[] */ + private $thresholdMap = [ + Logger::DEBUG => 0, + Logger::INFO => 0, + Logger::NOTICE => 0, + Logger::WARNING => 0, + Logger::ERROR => 0, + Logger::CRITICAL => 0, + Logger::ALERT => 0, + Logger::EMERGENCY => 0, + ]; + + /** + * Buffer of all messages passed to the handler before the threshold was reached + * + * @var mixed[][] + */ + private $buffer = []; + + /** + * @param HandlerInterface $handler + * @param int[] $thresholdMap Dictionary of logger level => threshold + */ + public function __construct( + HandlerInterface $handler, + array $thresholdMap = [], + $level = Logger::DEBUG, + bool $bubble = true + ) { + $this->handler = $handler; + foreach ($thresholdMap as $thresholdLevel => $threshold) { + $this->thresholdMap[$thresholdLevel] = $threshold; + } + parent::__construct($level, $bubble); + } + + /** + * Handles a record. + * + * All records may be passed to this method, and the handler should discard + * those that it does not want to handle. + * + * The return value of this function controls the bubbling process of the handler stack. + * Unless the bubbling is interrupted (by returning true), the Logger class will keep on + * calling further handlers in the stack with a given log record. + * + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($record['level'] < $this->level) { + return false; + } + + $level = $record['level']; + + if (!isset($this->thresholdMap[$level])) { + $this->thresholdMap[$level] = 0; + } + + if ($this->thresholdMap[$level] > 0) { + // The overflow threshold is not yet reached, so we're buffering the record and lowering the threshold by 1 + $this->thresholdMap[$level]--; + $this->buffer[$level][] = $record; + + return false === $this->bubble; + } + + if ($this->thresholdMap[$level] == 0) { + // This current message is breaking the threshold. Flush the buffer and continue handling the current record + foreach ($this->buffer[$level] ?? [] as $buffered) { + $this->handler->handle($buffered); + } + $this->thresholdMap[$level]--; + unset($this->buffer[$level]); + } + + $this->handler->handle($record); + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + $this->handler->setFormatter($formatter); + + return $this; + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + return $this->handler->getFormatter(); + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php new file mode 100644 index 0000000000..23a1d1178f --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php @@ -0,0 +1,263 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; +use PhpConsole\Connector; +use PhpConsole\Handler as VendorPhpConsoleHandler; +use PhpConsole\Helper; + +/** + * Monolog handler for Google Chrome extension "PHP Console" + * + * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely + * + * Usage: + * 1. Install Google Chrome extension [now dead and removed from the chrome store] + * 2. See overview https://github.com/barbushin/php-console#overview + * 3. Install PHP Console library https://github.com/barbushin/php-console#installation + * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png) + * + * $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler())); + * \Monolog\ErrorHandler::register($logger); + * echo $undefinedVar; + * $logger->debug('SELECT * FROM users', array('db', 'time' => 0.012)); + * PC::debug($_SERVER); // PHP Console debugger for any type of vars + * + * @author Sergey Barbushin https://www.linkedin.com/in/barbushin + * + * @phpstan-import-type Record from \Monolog\Logger + * @deprecated Since 2.8.0 and 3.2.0, PHPConsole is abandoned and thus we will drop this handler in Monolog 4 + */ +class PHPConsoleHandler extends AbstractProcessingHandler +{ + /** @var array */ + private $options = [ + 'enabled' => true, // bool Is PHP Console server enabled + 'classesPartialsTraceIgnore' => ['Monolog\\'], // array Hide calls of classes started with... + 'debugTagsKeysInContext' => [0, 'tag'], // bool Is PHP Console server enabled + 'useOwnErrorsHandler' => false, // bool Enable errors handling + 'useOwnExceptionsHandler' => false, // bool Enable exceptions handling + 'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths + 'registerHelper' => true, // bool Register PhpConsole\Helper that allows short debug calls like PC::debug($var, 'ta.g.s') + 'serverEncoding' => null, // string|null Server internal encoding + 'headersLimit' => null, // int|null Set headers size limit for your web-server + 'password' => null, // string|null Protect PHP Console connection by password + 'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed + 'ipMasks' => [], // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1') + 'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required) + 'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings + 'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level + 'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number + 'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item + 'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON + 'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug + 'dataStorage' => null, // \PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ) + ]; + + /** @var Connector */ + private $connector; + + /** + * @param array $options See \Monolog\Handler\PHPConsoleHandler::$options for more details + * @param Connector|null $connector Instance of \PhpConsole\Connector class (optional) + * @throws \RuntimeException + */ + public function __construct(array $options = [], ?Connector $connector = null, $level = Logger::DEBUG, bool $bubble = true) + { + if (!class_exists('PhpConsole\Connector')) { + throw new \RuntimeException('PHP Console library not found. See https://github.com/barbushin/php-console#installation'); + } + parent::__construct($level, $bubble); + $this->options = $this->initOptions($options); + $this->connector = $this->initConnector($connector); + } + + /** + * @param array $options + * + * @return array + */ + private function initOptions(array $options): array + { + $wrongOptions = array_diff(array_keys($options), array_keys($this->options)); + if ($wrongOptions) { + throw new \RuntimeException('Unknown options: ' . implode(', ', $wrongOptions)); + } + + return array_replace($this->options, $options); + } + + private function initConnector(?Connector $connector = null): Connector + { + if (!$connector) { + if ($this->options['dataStorage']) { + Connector::setPostponeStorage($this->options['dataStorage']); + } + $connector = Connector::getInstance(); + } + + if ($this->options['registerHelper'] && !Helper::isRegistered()) { + Helper::register(); + } + + if ($this->options['enabled'] && $connector->isActiveClient()) { + if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) { + $handler = VendorPhpConsoleHandler::getInstance(); + $handler->setHandleErrors($this->options['useOwnErrorsHandler']); + $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']); + $handler->start(); + } + if ($this->options['sourcesBasePath']) { + $connector->setSourcesBasePath($this->options['sourcesBasePath']); + } + if ($this->options['serverEncoding']) { + $connector->setServerEncoding($this->options['serverEncoding']); + } + if ($this->options['password']) { + $connector->setPassword($this->options['password']); + } + if ($this->options['enableSslOnlyMode']) { + $connector->enableSslOnlyMode(); + } + if ($this->options['ipMasks']) { + $connector->setAllowedIpMasks($this->options['ipMasks']); + } + if ($this->options['headersLimit']) { + $connector->setHeadersLimit($this->options['headersLimit']); + } + if ($this->options['detectDumpTraceAndSource']) { + $connector->getDebugDispatcher()->detectTraceAndSource = true; + } + $dumper = $connector->getDumper(); + $dumper->levelLimit = $this->options['dumperLevelLimit']; + $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit']; + $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit']; + $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit']; + $dumper->detectCallbacks = $this->options['dumperDetectCallbacks']; + if ($this->options['enableEvalListener']) { + $connector->startEvalRequestsListener(); + } + } + + return $connector; + } + + public function getConnector(): Connector + { + return $this->connector; + } + + /** + * @return array + */ + public function getOptions(): array + { + return $this->options; + } + + public function handle(array $record): bool + { + if ($this->options['enabled'] && $this->connector->isActiveClient()) { + return parent::handle($record); + } + + return !$this->bubble; + } + + /** + * Writes the record down to the log of the implementing handler + */ + protected function write(array $record): void + { + if ($record['level'] < Logger::NOTICE) { + $this->handleDebugRecord($record); + } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Throwable) { + $this->handleExceptionRecord($record); + } else { + $this->handleErrorRecord($record); + } + } + + /** + * @phpstan-param Record $record + */ + private function handleDebugRecord(array $record): void + { + $tags = $this->getRecordTags($record); + $message = $record['message']; + if ($record['context']) { + $message .= ' ' . Utils::jsonEncode($this->connector->getDumper()->dump(array_filter($record['context'])), null, true); + } + $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']); + } + + /** + * @phpstan-param Record $record + */ + private function handleExceptionRecord(array $record): void + { + $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']); + } + + /** + * @phpstan-param Record $record + */ + private function handleErrorRecord(array $record): void + { + $context = $record['context']; + + $this->connector->getErrorsDispatcher()->dispatchError( + $context['code'] ?? null, + $context['message'] ?? $record['message'], + $context['file'] ?? null, + $context['line'] ?? null, + $this->options['classesPartialsTraceIgnore'] + ); + } + + /** + * @phpstan-param Record $record + * @return string + */ + private function getRecordTags(array &$record) + { + $tags = null; + if (!empty($record['context'])) { + $context = & $record['context']; + foreach ($this->options['debugTagsKeysInContext'] as $key) { + if (!empty($context[$key])) { + $tags = $context[$key]; + if ($key === 0) { + array_shift($context); + } else { + unset($context[$key]); + } + break; + } + } + } + + return $tags ?: strtolower($record['level_name']); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter('%message%'); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php new file mode 100644 index 0000000000..8a8cf1be66 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php @@ -0,0 +1,191 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Stores to STDIN of any process, specified by a command. + * + * Usage example: + *
+ * $log = new Logger('myLogger');
+ * $log->pushHandler(new ProcessHandler('/usr/bin/php /var/www/monolog/someScript.php'));
+ * 
+ * + * @author Kolja Zuelsdorf + */ +class ProcessHandler extends AbstractProcessingHandler +{ + /** + * Holds the process to receive data on its STDIN. + * + * @var resource|bool|null + */ + private $process; + + /** + * @var string + */ + private $command; + + /** + * @var string|null + */ + private $cwd; + + /** + * @var resource[] + */ + private $pipes = []; + + /** + * @var array + */ + protected const DESCRIPTOR_SPEC = [ + 0 => ['pipe', 'r'], // STDIN is a pipe that the child will read from + 1 => ['pipe', 'w'], // STDOUT is a pipe that the child will write to + 2 => ['pipe', 'w'], // STDERR is a pipe to catch the any errors + ]; + + /** + * @param string $command Command for the process to start. Absolute paths are recommended, + * especially if you do not use the $cwd parameter. + * @param string|null $cwd "Current working directory" (CWD) for the process to be executed in. + * @throws \InvalidArgumentException + */ + public function __construct(string $command, $level = Logger::DEBUG, bool $bubble = true, ?string $cwd = null) + { + if ($command === '') { + throw new \InvalidArgumentException('The command argument must be a non-empty string.'); + } + if ($cwd === '') { + throw new \InvalidArgumentException('The optional CWD argument must be a non-empty string or null.'); + } + + parent::__construct($level, $bubble); + + $this->command = $command; + $this->cwd = $cwd; + } + + /** + * Writes the record down to the log of the implementing handler + * + * @throws \UnexpectedValueException + */ + protected function write(array $record): void + { + $this->ensureProcessIsStarted(); + + $this->writeProcessInput($record['formatted']); + + $errors = $this->readProcessErrors(); + if (empty($errors) === false) { + throw new \UnexpectedValueException(sprintf('Errors while writing to process: %s', $errors)); + } + } + + /** + * Makes sure that the process is actually started, and if not, starts it, + * assigns the stream pipes, and handles startup errors, if any. + */ + private function ensureProcessIsStarted(): void + { + if (is_resource($this->process) === false) { + $this->startProcess(); + + $this->handleStartupErrors(); + } + } + + /** + * Starts the actual process and sets all streams to non-blocking. + */ + private function startProcess(): void + { + $this->process = proc_open($this->command, static::DESCRIPTOR_SPEC, $this->pipes, $this->cwd); + + foreach ($this->pipes as $pipe) { + stream_set_blocking($pipe, false); + } + } + + /** + * Selects the STDERR stream, handles upcoming startup errors, and throws an exception, if any. + * + * @throws \UnexpectedValueException + */ + private function handleStartupErrors(): void + { + $selected = $this->selectErrorStream(); + if (false === $selected) { + throw new \UnexpectedValueException('Something went wrong while selecting a stream.'); + } + + $errors = $this->readProcessErrors(); + + if (is_resource($this->process) === false || empty($errors) === false) { + throw new \UnexpectedValueException( + sprintf('The process "%s" could not be opened: ' . $errors, $this->command) + ); + } + } + + /** + * Selects the STDERR stream. + * + * @return int|bool + */ + protected function selectErrorStream() + { + $empty = []; + $errorPipes = [$this->pipes[2]]; + + return stream_select($errorPipes, $empty, $empty, 1); + } + + /** + * Reads the errors of the process, if there are any. + * + * @codeCoverageIgnore + * @return string Empty string if there are no errors. + */ + protected function readProcessErrors(): string + { + return (string) stream_get_contents($this->pipes[2]); + } + + /** + * Writes to the input stream of the opened process. + * + * @codeCoverageIgnore + */ + protected function writeProcessInput(string $string): void + { + fwrite($this->pipes[0], $string); + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + if (is_resource($this->process)) { + foreach ($this->pipes as $pipe) { + fclose($pipe); + } + proc_close($this->process); + $this->process = null; + } + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php new file mode 100644 index 0000000000..3adec7a4d8 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Processor\ProcessorInterface; + +/** + * Interface to describe loggers that have processors + * + * @author Jordi Boggiano + * + * @phpstan-import-type Record from \Monolog\Logger + */ +interface ProcessableHandlerInterface +{ + /** + * Adds a processor in the stack. + * + * @psalm-param ProcessorInterface|callable(Record): Record $callback + * + * @param ProcessorInterface|callable $callback + * @return HandlerInterface self + */ + public function pushProcessor(callable $callback): HandlerInterface; + + /** + * Removes the processor on top of the stack and returns it. + * + * @psalm-return ProcessorInterface|callable(Record): Record $callback + * + * @throws \LogicException In case the processor stack is empty + * @return callable|ProcessorInterface + */ + public function popProcessor(): callable; +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php new file mode 100644 index 0000000000..9ef6e301c5 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; +use Monolog\Processor\ProcessorInterface; + +/** + * Helper trait for implementing ProcessableInterface + * + * @author Jordi Boggiano + * + * @phpstan-import-type Record from \Monolog\Logger + */ +trait ProcessableHandlerTrait +{ + /** + * @var callable[] + * @phpstan-var array + */ + protected $processors = []; + + /** + * {@inheritDoc} + */ + public function pushProcessor(callable $callback): HandlerInterface + { + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * {@inheritDoc} + */ + public function popProcessor(): callable + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * Processes a record. + * + * @phpstan-param Record $record + * @phpstan-return Record + */ + protected function processRecord(array $record): array + { + foreach ($this->processors as $processor) { + $record = $processor($record); + } + + return $record; + } + + protected function resetProcessors(): void + { + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php new file mode 100644 index 0000000000..36e19cccf2 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Psr\Log\LoggerInterface; +use Monolog\Formatter\FormatterInterface; + +/** + * Proxies log messages to an existing PSR-3 compliant logger. + * + * If a formatter is configured, the formatter's output MUST be a string and the + * formatted message will be fed to the wrapped PSR logger instead of the original + * log record's message. + * + * @author Michael Moussa + */ +class PsrHandler extends AbstractHandler implements FormattableHandlerInterface +{ + /** + * PSR-3 compliant logger + * + * @var LoggerInterface + */ + protected $logger; + + /** + * @var FormatterInterface|null + */ + protected $formatter; + + /** + * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied + */ + public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + + $this->logger = $logger; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if (!$this->isHandling($record)) { + return false; + } + + if ($this->formatter) { + $formatted = $this->formatter->format($record); + $this->logger->log(strtolower($record['level_name']), (string) $formatted, $record['context']); + } else { + $this->logger->log(strtolower($record['level_name']), $record['message'], $record['context']); + } + + return false === $this->bubble; + } + + /** + * Sets the formatter. + * + * @param FormatterInterface $formatter + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $this->formatter = $formatter; + + return $this; + } + + /** + * Gets the formatter. + * + * @return FormatterInterface + */ + public function getFormatter(): FormatterInterface + { + if (!$this->formatter) { + throw new \LogicException('No formatter has been set and this handler does not have a default formatter'); + } + + return $this->formatter; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php new file mode 100644 index 0000000000..fed2303d7b --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php @@ -0,0 +1,246 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Psr\Log\LogLevel; + +/** + * Sends notifications through the pushover api to mobile phones + * + * @author Sebastian Göttschkes + * @see https://www.pushover.net/api + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class PushoverHandler extends SocketHandler +{ + /** @var string */ + private $token; + /** @var array */ + private $users; + /** @var string */ + private $title; + /** @var string|int|null */ + private $user = null; + /** @var int */ + private $retry; + /** @var int */ + private $expire; + + /** @var int */ + private $highPriorityLevel; + /** @var int */ + private $emergencyLevel; + /** @var bool */ + private $useFormattedMessage = false; + + /** + * All parameters that can be sent to Pushover + * @see https://pushover.net/api + * @var array + */ + private $parameterNames = [ + 'token' => true, + 'user' => true, + 'message' => true, + 'device' => true, + 'title' => true, + 'url' => true, + 'url_title' => true, + 'priority' => true, + 'timestamp' => true, + 'sound' => true, + 'retry' => true, + 'expire' => true, + 'callback' => true, + ]; + + /** + * Sounds the api supports by default + * @see https://pushover.net/api#sounds + * @var string[] + */ + private $sounds = [ + 'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming', + 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb', + 'persistent', 'echo', 'updown', 'none', + ]; + + /** + * @param string $token Pushover api token + * @param string|array $users Pushover user id or array of ids the message will be sent to + * @param string|null $title Title sent to the Pushover API + * @param bool $useSSL Whether to connect via SSL. Required when pushing messages to users that are not + * the pushover.net app owner. OpenSSL is required for this option. + * @param string|int $highPriorityLevel The minimum logging level at which this handler will start + * sending "high priority" requests to the Pushover API + * @param string|int $emergencyLevel The minimum logging level at which this handler will start + * sending "emergency" requests to the Pushover API + * @param int $retry The retry parameter specifies how often (in seconds) the Pushover servers will + * send the same notification to the user. + * @param int $expire The expire parameter specifies how many seconds your notification will continue + * to be retried for (every retry seconds). + * + * @phpstan-param string|array $users + * @phpstan-param Level|LevelName|LogLevel::* $highPriorityLevel + * @phpstan-param Level|LevelName|LogLevel::* $emergencyLevel + */ + public function __construct( + string $token, + $users, + ?string $title = null, + $level = Logger::CRITICAL, + bool $bubble = true, + bool $useSSL = true, + $highPriorityLevel = Logger::CRITICAL, + $emergencyLevel = Logger::EMERGENCY, + int $retry = 30, + int $expire = 25200, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80'; + parent::__construct( + $connectionString, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + + $this->token = $token; + $this->users = (array) $users; + $this->title = $title ?: (string) gethostname(); + $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel); + $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel); + $this->retry = $retry; + $this->expire = $expire; + } + + protected function generateDataStream(array $record): string + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * @phpstan-param FormattedRecord $record + */ + private function buildContent(array $record): string + { + // Pushover has a limit of 512 characters on title and message combined. + $maxMessageLength = 512 - strlen($this->title); + + $message = ($this->useFormattedMessage) ? $record['formatted'] : $record['message']; + $message = Utils::substr($message, 0, $maxMessageLength); + + $timestamp = $record['datetime']->getTimestamp(); + + $dataArray = [ + 'token' => $this->token, + 'user' => $this->user, + 'message' => $message, + 'title' => $this->title, + 'timestamp' => $timestamp, + ]; + + if (isset($record['level']) && $record['level'] >= $this->emergencyLevel) { + $dataArray['priority'] = 2; + $dataArray['retry'] = $this->retry; + $dataArray['expire'] = $this->expire; + } elseif (isset($record['level']) && $record['level'] >= $this->highPriorityLevel) { + $dataArray['priority'] = 1; + } + + // First determine the available parameters + $context = array_intersect_key($record['context'], $this->parameterNames); + $extra = array_intersect_key($record['extra'], $this->parameterNames); + + // Least important info should be merged with subsequent info + $dataArray = array_merge($extra, $context, $dataArray); + + // Only pass sounds that are supported by the API + if (isset($dataArray['sound']) && !in_array($dataArray['sound'], $this->sounds)) { + unset($dataArray['sound']); + } + + return http_build_query($dataArray); + } + + private function buildHeader(string $content): string + { + $header = "POST /1/messages.json HTTP/1.1\r\n"; + $header .= "Host: api.pushover.net\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + protected function write(array $record): void + { + foreach ($this->users as $user) { + $this->user = $user; + + parent::write($record); + $this->closeSocket(); + } + + $this->user = null; + } + + /** + * @param int|string $value + * + * @phpstan-param Level|LevelName|LogLevel::* $value + */ + public function setHighPriorityLevel($value): self + { + $this->highPriorityLevel = Logger::toMonologLevel($value); + + return $this; + } + + /** + * @param int|string $value + * + * @phpstan-param Level|LevelName|LogLevel::* $value + */ + public function setEmergencyLevel($value): self + { + $this->emergencyLevel = Logger::toMonologLevel($value); + + return $this; + } + + /** + * Use the formatted message? + */ + public function useFormattedMessage(bool $value): self + { + $this->useFormattedMessage = $value; + + return $this; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php new file mode 100644 index 0000000000..91d16eaf64 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; + +/** + * Logs to a Redis key using rpush + * + * usage example: + * + * $log = new Logger('application'); + * $redis = new RedisHandler(new Predis\Client("tcp://localhost:6379"), "logs", "prod"); + * $log->pushHandler($redis); + * + * @author Thomas Tourlourat + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class RedisHandler extends AbstractProcessingHandler +{ + /** @var \Predis\Client<\Predis\Client>|\Redis */ + private $redisClient; + /** @var string */ + private $redisKey; + /** @var int */ + protected $capSize; + + /** + * @param \Predis\Client<\Predis\Client>|\Redis $redis The redis instance + * @param string $key The key name to push records to + * @param int $capSize Number of entries to limit list size to, 0 = unlimited + */ + public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true, int $capSize = 0) + { + if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) { + throw new \InvalidArgumentException('Predis\Client or Redis instance required'); + } + + $this->redisClient = $redis; + $this->redisKey = $key; + $this->capSize = $capSize; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if ($this->capSize) { + $this->writeCapped($record); + } else { + $this->redisClient->rpush($this->redisKey, $record["formatted"]); + } + } + + /** + * Write and cap the collection + * Writes the record to the redis list and caps its + * + * @phpstan-param FormattedRecord $record + */ + protected function writeCapped(array $record): void + { + if ($this->redisClient instanceof \Redis) { + $mode = defined('\Redis::MULTI') ? \Redis::MULTI : 1; + $this->redisClient->multi($mode) + ->rpush($this->redisKey, $record["formatted"]) + ->ltrim($this->redisKey, -$this->capSize, -1) + ->exec(); + } else { + $redisKey = $this->redisKey; + $capSize = $this->capSize; + $this->redisClient->transaction(function ($tx) use ($record, $redisKey, $capSize) { + $tx->rpush($redisKey, $record["formatted"]); + $tx->ltrim($redisKey, -$capSize, -1); + }); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php new file mode 100644 index 0000000000..7789309c1c --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; + +/** + * Sends the message to a Redis Pub/Sub channel using PUBLISH + * + * usage example: + * + * $log = new Logger('application'); + * $redis = new RedisPubSubHandler(new Predis\Client("tcp://localhost:6379"), "logs", Logger::WARNING); + * $log->pushHandler($redis); + * + * @author Gaëtan Faugère + */ +class RedisPubSubHandler extends AbstractProcessingHandler +{ + /** @var \Predis\Client<\Predis\Client>|\Redis */ + private $redisClient; + /** @var string */ + private $channelKey; + + /** + * @param \Predis\Client<\Predis\Client>|\Redis $redis The redis instance + * @param string $key The channel key to publish records to + */ + public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true) + { + if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) { + throw new \InvalidArgumentException('Predis\Client or Redis instance required'); + } + + $this->redisClient = $redis; + $this->channelKey = $key; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->redisClient->publish($this->channelKey, $record["formatted"]); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php new file mode 100644 index 0000000000..adcc9395a5 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php @@ -0,0 +1,131 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Rollbar\RollbarLogger; +use Throwable; +use Monolog\Logger; + +/** + * Sends errors to Rollbar + * + * If the context data contains a `payload` key, that is used as an array + * of payload options to RollbarLogger's log method. + * + * Rollbar's context info will contain the context + extra keys from the log record + * merged, and then on top of that a few keys: + * + * - level (rollbar level name) + * - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8) + * - channel + * - datetime (unix timestamp) + * + * @author Paul Statezny + */ +class RollbarHandler extends AbstractProcessingHandler +{ + /** + * @var RollbarLogger + */ + protected $rollbarLogger; + + /** @var string[] */ + protected $levelMap = [ + Logger::DEBUG => 'debug', + Logger::INFO => 'info', + Logger::NOTICE => 'info', + Logger::WARNING => 'warning', + Logger::ERROR => 'error', + Logger::CRITICAL => 'critical', + Logger::ALERT => 'critical', + Logger::EMERGENCY => 'critical', + ]; + + /** + * Records whether any log records have been added since the last flush of the rollbar notifier + * + * @var bool + */ + private $hasRecords = false; + + /** @var bool */ + protected $initialized = false; + + /** + * @param RollbarLogger $rollbarLogger RollbarLogger object constructed with valid token + */ + public function __construct(RollbarLogger $rollbarLogger, $level = Logger::ERROR, bool $bubble = true) + { + $this->rollbarLogger = $rollbarLogger; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!$this->initialized) { + // __destructor() doesn't get called on Fatal errors + register_shutdown_function(array($this, 'close')); + $this->initialized = true; + } + + $context = $record['context']; + $context = array_merge($context, $record['extra'], [ + 'level' => $this->levelMap[$record['level']], + 'monolog_level' => $record['level_name'], + 'channel' => $record['channel'], + 'datetime' => $record['datetime']->format('U'), + ]); + + if (isset($context['exception']) && $context['exception'] instanceof Throwable) { + $exception = $context['exception']; + unset($context['exception']); + $toLog = $exception; + } else { + $toLog = $record['message']; + } + + // @phpstan-ignore-next-line + $this->rollbarLogger->log($context['level'], $toLog, $context); + + $this->hasRecords = true; + } + + public function flush(): void + { + if ($this->hasRecords) { + $this->rollbarLogger->flush(); + $this->hasRecords = false; + } + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + $this->flush(); + } + + /** + * {@inheritDoc} + */ + public function reset() + { + $this->flush(); + + parent::reset(); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php new file mode 100644 index 0000000000..17745d2215 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php @@ -0,0 +1,207 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use InvalidArgumentException; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Stores logs to files that are rotated every day and a limited number of files are kept. + * + * This rotation is only intended to be used as a workaround. Using logrotate to + * handle the rotation is strongly encouraged when you can use it. + * + * @author Christophe Coevoet + * @author Jordi Boggiano + */ +class RotatingFileHandler extends StreamHandler +{ + public const FILE_PER_DAY = 'Y-m-d'; + public const FILE_PER_MONTH = 'Y-m'; + public const FILE_PER_YEAR = 'Y'; + + /** @var string */ + protected $filename; + /** @var int */ + protected $maxFiles; + /** @var bool */ + protected $mustRotate; + /** @var \DateTimeImmutable */ + protected $nextRotation; + /** @var string */ + protected $filenameFormat; + /** @var string */ + protected $dateFormat; + + /** + * @param string $filename + * @param int $maxFiles The maximal amount of files to keep (0 means unlimited) + * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) + * @param bool $useLocking Try to lock log file before doing any writes + */ + public function __construct(string $filename, int $maxFiles = 0, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false) + { + $this->filename = Utils::canonicalizePath($filename); + $this->maxFiles = $maxFiles; + $this->nextRotation = new \DateTimeImmutable('tomorrow'); + $this->filenameFormat = '{filename}-{date}'; + $this->dateFormat = static::FILE_PER_DAY; + + parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking); + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + parent::close(); + + if (true === $this->mustRotate) { + $this->rotate(); + } + } + + /** + * {@inheritDoc} + */ + public function reset() + { + parent::reset(); + + if (true === $this->mustRotate) { + $this->rotate(); + } + } + + public function setFilenameFormat(string $filenameFormat, string $dateFormat): self + { + if (!preg_match('{^[Yy](([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) { + throw new InvalidArgumentException( + 'Invalid date format - format must be one of '. + 'RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), RotatingFileHandler::FILE_PER_MONTH ("Y-m") '. + 'or RotatingFileHandler::FILE_PER_YEAR ("Y"), or you can set one of the '. + 'date formats using slashes, underscores and/or dots instead of dashes.' + ); + } + if (substr_count($filenameFormat, '{date}') === 0) { + throw new InvalidArgumentException( + 'Invalid filename format - format must contain at least `{date}`, because otherwise rotating is impossible.' + ); + } + $this->filenameFormat = $filenameFormat; + $this->dateFormat = $dateFormat; + $this->url = $this->getTimedFilename(); + $this->close(); + + return $this; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + // on the first record written, if the log is new, we should rotate (once per day) + if (null === $this->mustRotate) { + $this->mustRotate = null === $this->url || !file_exists($this->url); + } + + if ($this->nextRotation <= $record['datetime']) { + $this->mustRotate = true; + $this->close(); + } + + parent::write($record); + } + + /** + * Rotates the files. + */ + protected function rotate(): void + { + // update filename + $this->url = $this->getTimedFilename(); + $this->nextRotation = new \DateTimeImmutable('tomorrow'); + + // skip GC of old logs if files are unlimited + if (0 === $this->maxFiles) { + return; + } + + $logFiles = glob($this->getGlobPattern()); + if (false === $logFiles) { + // failed to glob + return; + } + + if ($this->maxFiles >= count($logFiles)) { + // no files to remove + return; + } + + // Sorting the files by name to remove the older ones + usort($logFiles, function ($a, $b) { + return strcmp($b, $a); + }); + + foreach (array_slice($logFiles, $this->maxFiles) as $file) { + if (is_writable($file)) { + // suppress errors here as unlink() might fail if two processes + // are cleaning up/rotating at the same time + set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline): bool { + return false; + }); + unlink($file); + restore_error_handler(); + } + } + + $this->mustRotate = false; + } + + protected function getTimedFilename(): string + { + $fileInfo = pathinfo($this->filename); + $timedFilename = str_replace( + ['{filename}', '{date}'], + [$fileInfo['filename'], date($this->dateFormat)], + $fileInfo['dirname'] . '/' . $this->filenameFormat + ); + + if (isset($fileInfo['extension'])) { + $timedFilename .= '.'.$fileInfo['extension']; + } + + return $timedFilename; + } + + protected function getGlobPattern(): string + { + $fileInfo = pathinfo($this->filename); + $glob = str_replace( + ['{filename}', '{date}'], + [$fileInfo['filename'], str_replace( + ['Y', 'y', 'm', 'd'], + ['[0-9][0-9][0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]'], + $this->dateFormat) + ], + $fileInfo['dirname'] . '/' . $this->filenameFormat + ); + if (isset($fileInfo['extension'])) { + $glob .= '.'.$fileInfo['extension']; + } + + return $glob; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php new file mode 100644 index 0000000000..c128a32d18 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; + +/** + * Sampling handler + * + * A sampled event stream can be useful for logging high frequency events in + * a production environment where you only need an idea of what is happening + * and are not concerned with capturing every occurrence. Since the decision to + * handle or not handle a particular event is determined randomly, the + * resulting sampled log is not guaranteed to contain 1/N of the events that + * occurred in the application, but based on the Law of large numbers, it will + * tend to be close to this ratio with a large number of attempts. + * + * @author Bryan Davis + * @author Kunal Mehta + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + */ +class SamplingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface +{ + use ProcessableHandlerTrait; + + /** + * @var HandlerInterface|callable + * @phpstan-var HandlerInterface|callable(Record|array{level: Level}|null, HandlerInterface): HandlerInterface + */ + protected $handler; + + /** + * @var int $factor + */ + protected $factor; + + /** + * @psalm-param HandlerInterface|callable(Record|array{level: Level}|null, HandlerInterface): HandlerInterface $handler + * + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $samplingHandler). + * @param int $factor Sample factor (e.g. 10 means every ~10th record is sampled) + */ + public function __construct($handler, int $factor) + { + parent::__construct(); + $this->handler = $handler; + $this->factor = $factor; + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + public function isHandling(array $record): bool + { + return $this->getHandler($record)->isHandling($record); + } + + public function handle(array $record): bool + { + if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) { + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + $this->getHandler($record)->handle($record); + } + + return false === $this->bubble; + } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @phpstan-param Record|array{level: Level}|null $record + * + * @return HandlerInterface + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = ($this->handler)($record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + $handler->setFormatter($formatter); + + return $this; + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + return $handler->getFormatter(); + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php new file mode 100644 index 0000000000..1280ee7039 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * SendGridrHandler uses the SendGrid API v2 function to send Log emails, more information in https://sendgrid.com/docs/API_Reference/Web_API/mail.html + * + * @author Ricardo Fontanelli + */ +class SendGridHandler extends MailHandler +{ + /** + * The SendGrid API User + * @var string + */ + protected $apiUser; + + /** + * The SendGrid API Key + * @var string + */ + protected $apiKey; + + /** + * The email addresses to which the message will be sent + * @var string + */ + protected $from; + + /** + * The email addresses to which the message will be sent + * @var string[] + */ + protected $to; + + /** + * The subject of the email + * @var string + */ + protected $subject; + + /** + * @param string $apiUser The SendGrid API User + * @param string $apiKey The SendGrid API Key + * @param string $from The sender of the email + * @param string|string[] $to The recipients of the email + * @param string $subject The subject of the mail + */ + public function __construct(string $apiUser, string $apiKey, string $from, $to, string $subject, $level = Logger::ERROR, bool $bubble = true) + { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is needed to use the SendGridHandler'); + } + + parent::__construct($level, $bubble); + $this->apiUser = $apiUser; + $this->apiKey = $apiKey; + $this->from = $from; + $this->to = (array) $to; + $this->subject = $subject; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $message = []; + $message['api_user'] = $this->apiUser; + $message['api_key'] = $this->apiKey; + $message['from'] = $this->from; + foreach ($this->to as $recipient) { + $message['to[]'] = $recipient; + } + $message['subject'] = $this->subject; + $message['date'] = date('r'); + + if ($this->isHtmlBody($content)) { + $message['html'] = $content; + } else { + $message['text'] = $content; + } + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, 'https://api.sendgrid.com/api/mail.send.json'); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($message)); + Curl\Util::execute($ch, 2); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php new file mode 100644 index 0000000000..71a4109461 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php @@ -0,0 +1,387 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\Slack; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Slack record utility helping to log to Slack webhooks or API. + * + * @author Greg Kedzierski + * @author Haralan Dobrev + * @see https://api.slack.com/incoming-webhooks + * @see https://api.slack.com/docs/message-attachments + * + * @phpstan-import-type FormattedRecord from \Monolog\Handler\AbstractProcessingHandler + * @phpstan-import-type Record from \Monolog\Logger + */ +class SlackRecord +{ + public const COLOR_DANGER = 'danger'; + + public const COLOR_WARNING = 'warning'; + + public const COLOR_GOOD = 'good'; + + public const COLOR_DEFAULT = '#e3e4e6'; + + /** + * Slack channel (encoded ID or name) + * @var string|null + */ + private $channel; + + /** + * Name of a bot + * @var string|null + */ + private $username; + + /** + * User icon e.g. 'ghost', 'http://example.com/user.png' + * @var string|null + */ + private $userIcon; + + /** + * Whether the message should be added to Slack as attachment (plain text otherwise) + * @var bool + */ + private $useAttachment; + + /** + * Whether the the context/extra messages added to Slack as attachments are in a short style + * @var bool + */ + private $useShortAttachment; + + /** + * Whether the attachment should include context and extra data + * @var bool + */ + private $includeContextAndExtra; + + /** + * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + * @var string[] + */ + private $excludeFields; + + /** + * @var ?FormatterInterface + */ + private $formatter; + + /** + * @var NormalizerFormatter + */ + private $normalizerFormatter; + + /** + * @param string[] $excludeFields + */ + public function __construct( + ?string $channel = null, + ?string $username = null, + bool $useAttachment = true, + ?string $userIcon = null, + bool $useShortAttachment = false, + bool $includeContextAndExtra = false, + array $excludeFields = array(), + FormatterInterface $formatter = null + ) { + $this + ->setChannel($channel) + ->setUsername($username) + ->useAttachment($useAttachment) + ->setUserIcon($userIcon) + ->useShortAttachment($useShortAttachment) + ->includeContextAndExtra($includeContextAndExtra) + ->excludeFields($excludeFields) + ->setFormatter($formatter); + + if ($this->includeContextAndExtra) { + $this->normalizerFormatter = new NormalizerFormatter(); + } + } + + /** + * Returns required data in format that Slack + * is expecting. + * + * @phpstan-param FormattedRecord $record + * @phpstan-return mixed[] + */ + public function getSlackData(array $record): array + { + $dataArray = array(); + $record = $this->removeExcludedFields($record); + + if ($this->username) { + $dataArray['username'] = $this->username; + } + + if ($this->channel) { + $dataArray['channel'] = $this->channel; + } + + if ($this->formatter && !$this->useAttachment) { + /** @phpstan-ignore-next-line */ + $message = $this->formatter->format($record); + } else { + $message = $record['message']; + } + + if ($this->useAttachment) { + $attachment = array( + 'fallback' => $message, + 'text' => $message, + 'color' => $this->getAttachmentColor($record['level']), + 'fields' => array(), + 'mrkdwn_in' => array('fields'), + 'ts' => $record['datetime']->getTimestamp(), + 'footer' => $this->username, + 'footer_icon' => $this->userIcon, + ); + + if ($this->useShortAttachment) { + $attachment['title'] = $record['level_name']; + } else { + $attachment['title'] = 'Message'; + $attachment['fields'][] = $this->generateAttachmentField('Level', $record['level_name']); + } + + if ($this->includeContextAndExtra) { + foreach (array('extra', 'context') as $key) { + if (empty($record[$key])) { + continue; + } + + if ($this->useShortAttachment) { + $attachment['fields'][] = $this->generateAttachmentField( + (string) $key, + $record[$key] + ); + } else { + // Add all extra fields as individual fields in attachment + $attachment['fields'] = array_merge( + $attachment['fields'], + $this->generateAttachmentFields($record[$key]) + ); + } + } + } + + $dataArray['attachments'] = array($attachment); + } else { + $dataArray['text'] = $message; + } + + if ($this->userIcon) { + if (filter_var($this->userIcon, FILTER_VALIDATE_URL)) { + $dataArray['icon_url'] = $this->userIcon; + } else { + $dataArray['icon_emoji'] = ":{$this->userIcon}:"; + } + } + + return $dataArray; + } + + /** + * Returns a Slack message attachment color associated with + * provided level. + */ + public function getAttachmentColor(int $level): string + { + switch (true) { + case $level >= Logger::ERROR: + return static::COLOR_DANGER; + case $level >= Logger::WARNING: + return static::COLOR_WARNING; + case $level >= Logger::INFO: + return static::COLOR_GOOD; + default: + return static::COLOR_DEFAULT; + } + } + + /** + * Stringifies an array of key/value pairs to be used in attachment fields + * + * @param mixed[] $fields + */ + public function stringify(array $fields): string + { + /** @var Record $fields */ + $normalized = $this->normalizerFormatter->format($fields); + + $hasSecondDimension = count(array_filter($normalized, 'is_array')); + $hasNonNumericKeys = !count(array_filter(array_keys($normalized), 'is_numeric')); + + return $hasSecondDimension || $hasNonNumericKeys + ? Utils::jsonEncode($normalized, JSON_PRETTY_PRINT|Utils::DEFAULT_JSON_FLAGS) + : Utils::jsonEncode($normalized, Utils::DEFAULT_JSON_FLAGS); + } + + /** + * Channel used by the bot when posting + * + * @param ?string $channel + * + * @return static + */ + public function setChannel(?string $channel = null): self + { + $this->channel = $channel; + + return $this; + } + + /** + * Username used by the bot when posting + * + * @param ?string $username + * + * @return static + */ + public function setUsername(?string $username = null): self + { + $this->username = $username; + + return $this; + } + + public function useAttachment(bool $useAttachment = true): self + { + $this->useAttachment = $useAttachment; + + return $this; + } + + public function setUserIcon(?string $userIcon = null): self + { + $this->userIcon = $userIcon; + + if (\is_string($userIcon)) { + $this->userIcon = trim($userIcon, ':'); + } + + return $this; + } + + public function useShortAttachment(bool $useShortAttachment = false): self + { + $this->useShortAttachment = $useShortAttachment; + + return $this; + } + + public function includeContextAndExtra(bool $includeContextAndExtra = false): self + { + $this->includeContextAndExtra = $includeContextAndExtra; + + if ($this->includeContextAndExtra) { + $this->normalizerFormatter = new NormalizerFormatter(); + } + + return $this; + } + + /** + * @param string[] $excludeFields + */ + public function excludeFields(array $excludeFields = []): self + { + $this->excludeFields = $excludeFields; + + return $this; + } + + public function setFormatter(?FormatterInterface $formatter = null): self + { + $this->formatter = $formatter; + + return $this; + } + + /** + * Generates attachment field + * + * @param string|mixed[] $value + * + * @return array{title: string, value: string, short: false} + */ + private function generateAttachmentField(string $title, $value): array + { + $value = is_array($value) + ? sprintf('```%s```', substr($this->stringify($value), 0, 1990)) + : $value; + + return array( + 'title' => ucfirst($title), + 'value' => $value, + 'short' => false, + ); + } + + /** + * Generates a collection of attachment fields from array + * + * @param mixed[] $data + * + * @return array + */ + private function generateAttachmentFields(array $data): array + { + /** @var Record $data */ + $normalized = $this->normalizerFormatter->format($data); + + $fields = array(); + foreach ($normalized as $key => $value) { + $fields[] = $this->generateAttachmentField((string) $key, $value); + } + + return $fields; + } + + /** + * Get a copy of record with fields excluded according to $this->excludeFields + * + * @phpstan-param FormattedRecord $record + * + * @return mixed[] + */ + private function removeExcludedFields(array $record): array + { + foreach ($this->excludeFields as $field) { + $keys = explode('.', $field); + $node = &$record; + $lastKey = end($keys); + foreach ($keys as $key) { + if (!isset($node[$key])) { + break; + } + if ($lastKey === $key) { + unset($node[$key]); + break; + } + $node = &$node[$key]; + } + } + + return $record; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php new file mode 100644 index 0000000000..a648513e0e --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php @@ -0,0 +1,256 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Handler\Slack\SlackRecord; + +/** + * Sends notifications through Slack API + * + * @author Greg Kedzierski + * @see https://api.slack.com/ + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class SlackHandler extends SocketHandler +{ + /** + * Slack API token + * @var string + */ + private $token; + + /** + * Instance of the SlackRecord util class preparing data for Slack API. + * @var SlackRecord + */ + private $slackRecord; + + /** + * @param string $token Slack API token + * @param string $channel Slack channel (encoded ID or name) + * @param string|null $username Name of a bot + * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) + * @param string|null $iconEmoji The emoji name to use (or null) + * @param bool $useShortAttachment Whether the context/extra messages added to Slack as attachments are in a short style + * @param bool $includeContextAndExtra Whether the attachment should include context and extra data + * @param string[] $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + * @throws MissingExtensionException If no OpenSSL PHP extension configured + */ + public function __construct( + string $token, + string $channel, + ?string $username = null, + bool $useAttachment = true, + ?string $iconEmoji = null, + $level = Logger::CRITICAL, + bool $bubble = true, + bool $useShortAttachment = false, + bool $includeContextAndExtra = false, + array $excludeFields = array(), + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler'); + } + + parent::__construct( + 'ssl://slack.com:443', + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + + $this->slackRecord = new SlackRecord( + $channel, + $username, + $useAttachment, + $iconEmoji, + $useShortAttachment, + $includeContextAndExtra, + $excludeFields + ); + + $this->token = $token; + } + + public function getSlackRecord(): SlackRecord + { + return $this->slackRecord; + } + + public function getToken(): string + { + return $this->token; + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the body of API call + * + * @phpstan-param FormattedRecord $record + */ + private function buildContent(array $record): string + { + $dataArray = $this->prepareContentData($record); + + return http_build_query($dataArray); + } + + /** + * @phpstan-param FormattedRecord $record + * @return string[] + */ + protected function prepareContentData(array $record): array + { + $dataArray = $this->slackRecord->getSlackData($record); + $dataArray['token'] = $this->token; + + if (!empty($dataArray['attachments'])) { + $dataArray['attachments'] = Utils::jsonEncode($dataArray['attachments']); + } + + return $dataArray; + } + + /** + * Builds the header of the API Call + */ + private function buildHeader(string $content): string + { + $header = "POST /api/chat.postMessage HTTP/1.1\r\n"; + $header .= "Host: slack.com\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + parent::write($record); + $this->finalizeWrite(); + } + + /** + * Finalizes the request by reading some bytes and then closing the socket + * + * If we do not read some but close the socket too early, slack sometimes + * drops the request entirely. + */ + protected function finalizeWrite(): void + { + $res = $this->getResource(); + if (is_resource($res)) { + @fread($res, 2048); + } + $this->closeSocket(); + } + + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + parent::setFormatter($formatter); + $this->slackRecord->setFormatter($formatter); + + return $this; + } + + public function getFormatter(): FormatterInterface + { + $formatter = parent::getFormatter(); + $this->slackRecord->setFormatter($formatter); + + return $formatter; + } + + /** + * Channel used by the bot when posting + */ + public function setChannel(string $channel): self + { + $this->slackRecord->setChannel($channel); + + return $this; + } + + /** + * Username used by the bot when posting + */ + public function setUsername(string $username): self + { + $this->slackRecord->setUsername($username); + + return $this; + } + + public function useAttachment(bool $useAttachment): self + { + $this->slackRecord->useAttachment($useAttachment); + + return $this; + } + + public function setIconEmoji(string $iconEmoji): self + { + $this->slackRecord->setUserIcon($iconEmoji); + + return $this; + } + + public function useShortAttachment(bool $useShortAttachment): self + { + $this->slackRecord->useShortAttachment($useShortAttachment); + + return $this; + } + + public function includeContextAndExtra(bool $includeContextAndExtra): self + { + $this->slackRecord->includeContextAndExtra($includeContextAndExtra); + + return $this; + } + + /** + * @param string[] $excludeFields + */ + public function excludeFields(array $excludeFields): self + { + $this->slackRecord->excludeFields($excludeFields); + + return $this; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php new file mode 100644 index 0000000000..8ae3c78829 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php @@ -0,0 +1,130 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Handler\Slack\SlackRecord; + +/** + * Sends notifications through Slack Webhooks + * + * @author Haralan Dobrev + * @see https://api.slack.com/incoming-webhooks + */ +class SlackWebhookHandler extends AbstractProcessingHandler +{ + /** + * Slack Webhook token + * @var string + */ + private $webhookUrl; + + /** + * Instance of the SlackRecord util class preparing data for Slack API. + * @var SlackRecord + */ + private $slackRecord; + + /** + * @param string $webhookUrl Slack Webhook URL + * @param string|null $channel Slack channel (encoded ID or name) + * @param string|null $username Name of a bot + * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) + * @param string|null $iconEmoji The emoji name to use (or null) + * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style + * @param bool $includeContextAndExtra Whether the attachment should include context and extra data + * @param string[] $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + */ + public function __construct( + string $webhookUrl, + ?string $channel = null, + ?string $username = null, + bool $useAttachment = true, + ?string $iconEmoji = null, + bool $useShortAttachment = false, + bool $includeContextAndExtra = false, + $level = Logger::CRITICAL, + bool $bubble = true, + array $excludeFields = array() + ) { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is needed to use the SlackWebhookHandler'); + } + + parent::__construct($level, $bubble); + + $this->webhookUrl = $webhookUrl; + + $this->slackRecord = new SlackRecord( + $channel, + $username, + $useAttachment, + $iconEmoji, + $useShortAttachment, + $includeContextAndExtra, + $excludeFields + ); + } + + public function getSlackRecord(): SlackRecord + { + return $this->slackRecord; + } + + public function getWebhookUrl(): string + { + return $this->webhookUrl; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $postData = $this->slackRecord->getSlackData($record); + $postString = Utils::jsonEncode($postData); + + $ch = curl_init(); + $options = array( + CURLOPT_URL => $this->webhookUrl, + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => array('Content-type: application/json'), + CURLOPT_POSTFIELDS => $postString, + ); + if (defined('CURLOPT_SAFE_UPLOAD')) { + $options[CURLOPT_SAFE_UPLOAD] = true; + } + + curl_setopt_array($ch, $options); + + Curl\Util::execute($ch); + } + + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + parent::setFormatter($formatter); + $this->slackRecord->setFormatter($formatter); + + return $this; + } + + public function getFormatter(): FormatterInterface + { + $formatter = parent::getFormatter(); + $this->slackRecord->setFormatter($formatter); + + return $formatter; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php new file mode 100644 index 0000000000..21701afa25 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php @@ -0,0 +1,448 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Stores to any socket - uses fsockopen() or pfsockopen(). + * + * @author Pablo de Leon Belloc + * @see http://php.net/manual/en/function.fsockopen.php + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class SocketHandler extends AbstractProcessingHandler +{ + /** @var string */ + private $connectionString; + /** @var float */ + private $connectionTimeout; + /** @var resource|null */ + private $resource; + /** @var float */ + private $timeout; + /** @var float */ + private $writingTimeout; + /** @var ?int */ + private $lastSentBytes = null; + /** @var ?int */ + private $chunkSize; + /** @var bool */ + private $persistent; + /** @var ?int */ + private $errno = null; + /** @var ?string */ + private $errstr = null; + /** @var ?float */ + private $lastWritingAt = null; + + /** + * @param string $connectionString Socket connection string + * @param bool $persistent Flag to enable/disable persistent connections + * @param float $timeout Socket timeout to wait until the request is being aborted + * @param float $writingTimeout Socket timeout to wait until the request should've been sent/written + * @param float|null $connectionTimeout Socket connect timeout to wait until the connection should've been + * established + * @param int|null $chunkSize Sets the chunk size. Only has effect during connection in the writing cycle + * + * @throws \InvalidArgumentException If an invalid timeout value (less than 0) is passed. + */ + public function __construct( + string $connectionString, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + parent::__construct($level, $bubble); + $this->connectionString = $connectionString; + + if ($connectionTimeout !== null) { + $this->validateTimeout($connectionTimeout); + } + + $this->connectionTimeout = $connectionTimeout ?? (float) ini_get('default_socket_timeout'); + $this->persistent = $persistent; + $this->validateTimeout($timeout); + $this->timeout = $timeout; + $this->validateTimeout($writingTimeout); + $this->writingTimeout = $writingTimeout; + $this->chunkSize = $chunkSize; + } + + /** + * Connect (if necessary) and write to the socket + * + * {@inheritDoc} + * + * @throws \UnexpectedValueException + * @throws \RuntimeException + */ + protected function write(array $record): void + { + $this->connectIfNotConnected(); + $data = $this->generateDataStream($record); + $this->writeToSocket($data); + } + + /** + * We will not close a PersistentSocket instance so it can be reused in other requests. + */ + public function close(): void + { + if (!$this->isPersistent()) { + $this->closeSocket(); + } + } + + /** + * Close socket, if open + */ + public function closeSocket(): void + { + if (is_resource($this->resource)) { + fclose($this->resource); + $this->resource = null; + } + } + + /** + * Set socket connection to be persistent. It only has effect before the connection is initiated. + */ + public function setPersistent(bool $persistent): self + { + $this->persistent = $persistent; + + return $this; + } + + /** + * Set connection timeout. Only has effect before we connect. + * + * @see http://php.net/manual/en/function.fsockopen.php + */ + public function setConnectionTimeout(float $seconds): self + { + $this->validateTimeout($seconds); + $this->connectionTimeout = $seconds; + + return $this; + } + + /** + * Set write timeout. Only has effect before we connect. + * + * @see http://php.net/manual/en/function.stream-set-timeout.php + */ + public function setTimeout(float $seconds): self + { + $this->validateTimeout($seconds); + $this->timeout = $seconds; + + return $this; + } + + /** + * Set writing timeout. Only has effect during connection in the writing cycle. + * + * @param float $seconds 0 for no timeout + */ + public function setWritingTimeout(float $seconds): self + { + $this->validateTimeout($seconds); + $this->writingTimeout = $seconds; + + return $this; + } + + /** + * Set chunk size. Only has effect during connection in the writing cycle. + */ + public function setChunkSize(int $bytes): self + { + $this->chunkSize = $bytes; + + return $this; + } + + /** + * Get current connection string + */ + public function getConnectionString(): string + { + return $this->connectionString; + } + + /** + * Get persistent setting + */ + public function isPersistent(): bool + { + return $this->persistent; + } + + /** + * Get current connection timeout setting + */ + public function getConnectionTimeout(): float + { + return $this->connectionTimeout; + } + + /** + * Get current in-transfer timeout + */ + public function getTimeout(): float + { + return $this->timeout; + } + + /** + * Get current local writing timeout + * + * @return float + */ + public function getWritingTimeout(): float + { + return $this->writingTimeout; + } + + /** + * Get current chunk size + */ + public function getChunkSize(): ?int + { + return $this->chunkSize; + } + + /** + * Check to see if the socket is currently available. + * + * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details. + */ + public function isConnected(): bool + { + return is_resource($this->resource) + && !feof($this->resource); // on TCP - other party can close connection. + } + + /** + * Wrapper to allow mocking + * + * @return resource|false + */ + protected function pfsockopen() + { + return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); + } + + /** + * Wrapper to allow mocking + * + * @return resource|false + */ + protected function fsockopen() + { + return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); + } + + /** + * Wrapper to allow mocking + * + * @see http://php.net/manual/en/function.stream-set-timeout.php + * + * @return bool + */ + protected function streamSetTimeout() + { + $seconds = floor($this->timeout); + $microseconds = round(($this->timeout - $seconds) * 1e6); + + if (!is_resource($this->resource)) { + throw new \LogicException('streamSetTimeout called but $this->resource is not a resource'); + } + + return stream_set_timeout($this->resource, (int) $seconds, (int) $microseconds); + } + + /** + * Wrapper to allow mocking + * + * @see http://php.net/manual/en/function.stream-set-chunk-size.php + * + * @return int|bool + */ + protected function streamSetChunkSize() + { + if (!is_resource($this->resource)) { + throw new \LogicException('streamSetChunkSize called but $this->resource is not a resource'); + } + + if (null === $this->chunkSize) { + throw new \LogicException('streamSetChunkSize called but $this->chunkSize is not set'); + } + + return stream_set_chunk_size($this->resource, $this->chunkSize); + } + + /** + * Wrapper to allow mocking + * + * @return int|bool + */ + protected function fwrite(string $data) + { + if (!is_resource($this->resource)) { + throw new \LogicException('fwrite called but $this->resource is not a resource'); + } + + return @fwrite($this->resource, $data); + } + + /** + * Wrapper to allow mocking + * + * @return mixed[]|bool + */ + protected function streamGetMetadata() + { + if (!is_resource($this->resource)) { + throw new \LogicException('streamGetMetadata called but $this->resource is not a resource'); + } + + return stream_get_meta_data($this->resource); + } + + private function validateTimeout(float $value): void + { + if ($value < 0) { + throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got $value)"); + } + } + + private function connectIfNotConnected(): void + { + if ($this->isConnected()) { + return; + } + $this->connect(); + } + + /** + * @phpstan-param FormattedRecord $record + */ + protected function generateDataStream(array $record): string + { + return (string) $record['formatted']; + } + + /** + * @return resource|null + */ + protected function getResource() + { + return $this->resource; + } + + private function connect(): void + { + $this->createSocketResource(); + $this->setSocketTimeout(); + $this->setStreamChunkSize(); + } + + private function createSocketResource(): void + { + if ($this->isPersistent()) { + $resource = $this->pfsockopen(); + } else { + $resource = $this->fsockopen(); + } + if (is_bool($resource)) { + throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)"); + } + $this->resource = $resource; + } + + private function setSocketTimeout(): void + { + if (!$this->streamSetTimeout()) { + throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()"); + } + } + + private function setStreamChunkSize(): void + { + if ($this->chunkSize && !$this->streamSetChunkSize()) { + throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()"); + } + } + + private function writeToSocket(string $data): void + { + $length = strlen($data); + $sent = 0; + $this->lastSentBytes = $sent; + while ($this->isConnected() && $sent < $length) { + if (0 == $sent) { + $chunk = $this->fwrite($data); + } else { + $chunk = $this->fwrite(substr($data, $sent)); + } + if ($chunk === false) { + throw new \RuntimeException("Could not write to socket"); + } + $sent += $chunk; + $socketInfo = $this->streamGetMetadata(); + if (is_array($socketInfo) && $socketInfo['timed_out']) { + throw new \RuntimeException("Write timed-out"); + } + + if ($this->writingIsTimedOut($sent)) { + throw new \RuntimeException("Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent $sent of $length)"); + } + } + if (!$this->isConnected() && $sent < $length) { + throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)"); + } + } + + private function writingIsTimedOut(int $sent): bool + { + // convert to ms + if (0.0 == $this->writingTimeout) { + return false; + } + + if ($sent !== $this->lastSentBytes) { + $this->lastWritingAt = microtime(true); + $this->lastSentBytes = $sent; + + return false; + } else { + usleep(100); + } + + if ((microtime(true) - $this->lastWritingAt) >= $this->writingTimeout) { + $this->closeSocket(); + + return true; + } + + return false; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php new file mode 100644 index 0000000000..dcf282b454 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Aws\Sqs\SqsClient; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Writes to any sqs queue. + * + * @author Martijn van Calker + */ +class SqsHandler extends AbstractProcessingHandler +{ + /** 256 KB in bytes - maximum message size in SQS */ + protected const MAX_MESSAGE_SIZE = 262144; + /** 100 KB in bytes - head message size for new error log */ + protected const HEAD_MESSAGE_SIZE = 102400; + + /** @var SqsClient */ + private $client; + /** @var string */ + private $queueUrl; + + public function __construct(SqsClient $sqsClient, string $queueUrl, $level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + + $this->client = $sqsClient; + $this->queueUrl = $queueUrl; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!isset($record['formatted']) || 'string' !== gettype($record['formatted'])) { + throw new \InvalidArgumentException('SqsHandler accepts only formatted records as a string' . Utils::getRecordMessageForException($record)); + } + + $messageBody = $record['formatted']; + if (strlen($messageBody) >= static::MAX_MESSAGE_SIZE) { + $messageBody = Utils::substr($messageBody, 0, static::HEAD_MESSAGE_SIZE); + } + + $this->client->sendMessage([ + 'QueueUrl' => $this->queueUrl, + 'MessageBody' => $messageBody, + ]); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php new file mode 100644 index 0000000000..651835122e --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php @@ -0,0 +1,221 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Stores to any stream resource + * + * Can be used to store into php://stderr, remote and local files, etc. + * + * @author Jordi Boggiano + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class StreamHandler extends AbstractProcessingHandler +{ + /** @const int */ + protected const MAX_CHUNK_SIZE = 2147483647; + /** @const int 10MB */ + protected const DEFAULT_CHUNK_SIZE = 10 * 1024 * 1024; + /** @var int */ + protected $streamChunkSize; + /** @var resource|null */ + protected $stream; + /** @var ?string */ + protected $url = null; + /** @var ?string */ + private $errorMessage = null; + /** @var ?int */ + protected $filePermission; + /** @var bool */ + protected $useLocking; + /** @var true|null */ + private $dirCreated = null; + + /** + * @param resource|string $stream If a missing path can't be created, an UnexpectedValueException will be thrown on first write + * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) + * @param bool $useLocking Try to lock log file before doing any writes + * + * @throws \InvalidArgumentException If stream is not a resource or string + */ + public function __construct($stream, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false) + { + parent::__construct($level, $bubble); + + if (($phpMemoryLimit = Utils::expandIniShorthandBytes(ini_get('memory_limit'))) !== false) { + if ($phpMemoryLimit > 0) { + // use max 10% of allowed memory for the chunk size, and at least 100KB + $this->streamChunkSize = min(static::MAX_CHUNK_SIZE, max((int) ($phpMemoryLimit / 10), 100 * 1024)); + } else { + // memory is unlimited, set to the default 10MB + $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE; + } + } else { + // no memory limit information, set to the default 10MB + $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE; + } + + if (is_resource($stream)) { + $this->stream = $stream; + + stream_set_chunk_size($this->stream, $this->streamChunkSize); + } elseif (is_string($stream)) { + $this->url = Utils::canonicalizePath($stream); + } else { + throw new \InvalidArgumentException('A stream must either be a resource or a string.'); + } + + $this->filePermission = $filePermission; + $this->useLocking = $useLocking; + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + if ($this->url && is_resource($this->stream)) { + fclose($this->stream); + } + $this->stream = null; + $this->dirCreated = null; + } + + /** + * Return the currently active stream if it is open + * + * @return resource|null + */ + public function getStream() + { + return $this->stream; + } + + /** + * Return the stream URL if it was configured with a URL and not an active resource + * + * @return string|null + */ + public function getUrl(): ?string + { + return $this->url; + } + + /** + * @return int + */ + public function getStreamChunkSize(): int + { + return $this->streamChunkSize; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!is_resource($this->stream)) { + $url = $this->url; + if (null === $url || '' === $url) { + throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().' . Utils::getRecordMessageForException($record)); + } + $this->createDir($url); + $this->errorMessage = null; + set_error_handler([$this, 'customErrorHandler']); + $stream = fopen($url, 'a'); + if ($this->filePermission !== null) { + @chmod($url, $this->filePermission); + } + restore_error_handler(); + if (!is_resource($stream)) { + $this->stream = null; + + throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened in append mode: '.$this->errorMessage, $url) . Utils::getRecordMessageForException($record)); + } + stream_set_chunk_size($stream, $this->streamChunkSize); + $this->stream = $stream; + } + + $stream = $this->stream; + if (!is_resource($stream)) { + throw new \LogicException('No stream was opened yet' . Utils::getRecordMessageForException($record)); + } + + if ($this->useLocking) { + // ignoring errors here, there's not much we can do about them + flock($stream, LOCK_EX); + } + + $this->streamWrite($stream, $record); + + if ($this->useLocking) { + flock($stream, LOCK_UN); + } + } + + /** + * Write to stream + * @param resource $stream + * @param array $record + * + * @phpstan-param FormattedRecord $record + */ + protected function streamWrite($stream, array $record): void + { + fwrite($stream, (string) $record['formatted']); + } + + private function customErrorHandler(int $code, string $msg): bool + { + $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg); + + return true; + } + + private function getDirFromStream(string $stream): ?string + { + $pos = strpos($stream, '://'); + if ($pos === false) { + return dirname($stream); + } + + if ('file://' === substr($stream, 0, 7)) { + return dirname(substr($stream, 7)); + } + + return null; + } + + private function createDir(string $url): void + { + // Do not try to create dir if it has already been tried. + if ($this->dirCreated) { + return; + } + + $dir = $this->getDirFromStream($url); + if (null !== $dir && !is_dir($dir)) { + $this->errorMessage = null; + set_error_handler([$this, 'customErrorHandler']); + $status = mkdir($dir, 0777, true); + restore_error_handler(); + if (false === $status && !is_dir($dir) && strpos((string) $this->errorMessage, 'File exists') === false) { + throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and it could not be created: '.$this->errorMessage, $dir)); + } + } + $this->dirCreated = true; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php new file mode 100644 index 0000000000..fae9251412 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Swift_Message; +use Swift; + +/** + * SwiftMailerHandler uses Swift_Mailer to send the emails + * + * @author Gyula Sallai + * + * @phpstan-import-type Record from \Monolog\Logger + * @deprecated Since Monolog 2.6. Use SymfonyMailerHandler instead. + */ +class SwiftMailerHandler extends MailHandler +{ + /** @var \Swift_Mailer */ + protected $mailer; + /** @var Swift_Message|callable(string, Record[]): Swift_Message */ + private $messageTemplate; + + /** + * @psalm-param Swift_Message|callable(string, Record[]): Swift_Message $message + * + * @param \Swift_Mailer $mailer The mailer to use + * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced + */ + public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, bool $bubble = true) + { + parent::__construct($level, $bubble); + + @trigger_error('The SwiftMailerHandler is deprecated since Monolog 2.6. Use SymfonyMailerHandler instead.', E_USER_DEPRECATED); + + $this->mailer = $mailer; + $this->messageTemplate = $message; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $this->mailer->send($this->buildMessage($content, $records)); + } + + /** + * Gets the formatter for the Swift_Message subject. + * + * @param string|null $format The format of the subject + */ + protected function getSubjectFormatter(?string $format): FormatterInterface + { + return new LineFormatter($format); + } + + /** + * Creates instance of Swift_Message to be sent + * + * @param string $content formatted email body to be sent + * @param array $records Log records that formed the content + * @return Swift_Message + * + * @phpstan-param Record[] $records + */ + protected function buildMessage(string $content, array $records): Swift_Message + { + $message = null; + if ($this->messageTemplate instanceof Swift_Message) { + $message = clone $this->messageTemplate; + $message->generateId(); + } elseif (is_callable($this->messageTemplate)) { + $message = ($this->messageTemplate)($content, $records); + } + + if (!$message instanceof Swift_Message) { + $record = reset($records); + throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it' . ($record ? Utils::getRecordMessageForException($record) : '')); + } + + if ($records) { + $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); + $message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); + } + + $mime = 'text/plain'; + if ($this->isHtmlBody($content)) { + $mime = 'text/html'; + } + + $message->setBody($content, $mime); + /** @phpstan-ignore-next-line */ + if (version_compare(Swift::VERSION, '6.0.0', '>=')) { + $message->setDate(new \DateTimeImmutable()); + } else { + /** @phpstan-ignore-next-line */ + $message->setDate(time()); + } + + return $message; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php new file mode 100644 index 0000000000..130e6f1f36 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mailer\Transport\TransportInterface; +use Symfony\Component\Mime\Email; + +/** + * SymfonyMailerHandler uses Symfony's Mailer component to send the emails + * + * @author Jordi Boggiano + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class SymfonyMailerHandler extends MailHandler +{ + /** @var MailerInterface|TransportInterface */ + protected $mailer; + /** @var Email|callable(string, Record[]): Email */ + private $emailTemplate; + + /** + * @psalm-param Email|callable(string, Record[]): Email $email + * + * @param MailerInterface|TransportInterface $mailer The mailer to use + * @param callable|Email $email An email template, the subject/body will be replaced + */ + public function __construct($mailer, $email, $level = Logger::ERROR, bool $bubble = true) + { + parent::__construct($level, $bubble); + + $this->mailer = $mailer; + $this->emailTemplate = $email; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $this->mailer->send($this->buildMessage($content, $records)); + } + + /** + * Gets the formatter for the Swift_Message subject. + * + * @param string|null $format The format of the subject + */ + protected function getSubjectFormatter(?string $format): FormatterInterface + { + return new LineFormatter($format); + } + + /** + * Creates instance of Email to be sent + * + * @param string $content formatted email body to be sent + * @param array $records Log records that formed the content + * + * @phpstan-param Record[] $records + */ + protected function buildMessage(string $content, array $records): Email + { + $message = null; + if ($this->emailTemplate instanceof Email) { + $message = clone $this->emailTemplate; + } elseif (is_callable($this->emailTemplate)) { + $message = ($this->emailTemplate)($content, $records); + } + + if (!$message instanceof Email) { + $record = reset($records); + throw new \InvalidArgumentException('Could not resolve message as instance of Email or a callable returning it' . ($record ? Utils::getRecordMessageForException($record) : '')); + } + + if ($records) { + $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); + $message->subject($subjectFormatter->format($this->getHighestRecord($records))); + } + + if ($this->isHtmlBody($content)) { + if (null !== ($charset = $message->getHtmlCharset())) { + $message->html($content, $charset); + } else { + $message->html($content); + } + } else { + if (null !== ($charset = $message->getTextCharset())) { + $message->text($content, $charset); + } else { + $message->text($content); + } + } + + return $message->date(new \DateTimeImmutable()); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php new file mode 100644 index 0000000000..1d543b7eca --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Logs to syslog service. + * + * usage example: + * + * $log = new Logger('application'); + * $syslog = new SyslogHandler('myfacility', 'local6'); + * $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%"); + * $syslog->setFormatter($formatter); + * $log->pushHandler($syslog); + * + * @author Sven Paulus + */ +class SyslogHandler extends AbstractSyslogHandler +{ + /** @var string */ + protected $ident; + /** @var int */ + protected $logopts; + + /** + * @param string $ident + * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant + * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID + */ + public function __construct(string $ident, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, int $logopts = LOG_PID) + { + parent::__construct($facility, $level, $bubble); + + $this->ident = $ident; + $this->logopts = $logopts; + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + closelog(); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!openlog($this->ident, $this->logopts, $this->facility)) { + throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"' . Utils::getRecordMessageForException($record)); + } + syslog($this->logLevels[$record['level']], (string) $record['formatted']); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php new file mode 100644 index 0000000000..dbd8ef69d9 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\SyslogUdp; + +use Monolog\Utils; +use Socket; + +class UdpSocket +{ + protected const DATAGRAM_MAX_LENGTH = 65023; + + /** @var string */ + protected $ip; + /** @var int */ + protected $port; + /** @var resource|Socket|null */ + protected $socket = null; + + public function __construct(string $ip, int $port = 514) + { + $this->ip = $ip; + $this->port = $port; + } + + /** + * @param string $line + * @param string $header + * @return void + */ + public function write($line, $header = "") + { + $this->send($this->assembleMessage($line, $header)); + } + + public function close(): void + { + if (is_resource($this->socket) || $this->socket instanceof Socket) { + socket_close($this->socket); + $this->socket = null; + } + } + + /** + * @return resource|Socket + */ + protected function getSocket() + { + if (null !== $this->socket) { + return $this->socket; + } + + $domain = AF_INET; + $protocol = SOL_UDP; + // Check if we are using unix sockets. + if ($this->port === 0) { + $domain = AF_UNIX; + $protocol = IPPROTO_IP; + } + + $this->socket = socket_create($domain, SOCK_DGRAM, $protocol) ?: null; + if (null === $this->socket) { + throw new \RuntimeException('The UdpSocket to '.$this->ip.':'.$this->port.' could not be opened via socket_create'); + } + + return $this->socket; + } + + protected function send(string $chunk): void + { + socket_sendto($this->getSocket(), $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); + } + + protected function assembleMessage(string $line, string $header): string + { + $chunkSize = static::DATAGRAM_MAX_LENGTH - strlen($header); + + return $header . Utils::substr($line, 0, $chunkSize); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php new file mode 100644 index 0000000000..deaa19f80c --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php @@ -0,0 +1,150 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use DateTimeInterface; +use Monolog\Logger; +use Monolog\Handler\SyslogUdp\UdpSocket; +use Monolog\Utils; + +/** + * A Handler for logging to a remote syslogd server. + * + * @author Jesper Skovgaard Nielsen + * @author Dominik Kukacka + */ +class SyslogUdpHandler extends AbstractSyslogHandler +{ + const RFC3164 = 0; + const RFC5424 = 1; + const RFC5424e = 2; + + /** @var array */ + private $dateFormats = array( + self::RFC3164 => 'M d H:i:s', + self::RFC5424 => \DateTime::RFC3339, + self::RFC5424e => \DateTime::RFC3339_EXTENDED, + ); + + /** @var UdpSocket */ + protected $socket; + /** @var string */ + protected $ident; + /** @var self::RFC* */ + protected $rfc; + + /** + * @param string $host Either IP/hostname or a path to a unix socket (port must be 0 then) + * @param int $port Port number, or 0 if $host is a unix socket + * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param string $ident Program name or tag for each log message. + * @param int $rfc RFC to format the message for. + * @throws MissingExtensionException + * + * @phpstan-param self::RFC* $rfc + */ + public function __construct(string $host, int $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, string $ident = 'php', int $rfc = self::RFC5424) + { + if (!extension_loaded('sockets')) { + throw new MissingExtensionException('The sockets extension is required to use the SyslogUdpHandler'); + } + + parent::__construct($facility, $level, $bubble); + + $this->ident = $ident; + $this->rfc = $rfc; + + $this->socket = new UdpSocket($host, $port); + } + + protected function write(array $record): void + { + $lines = $this->splitMessageIntoLines($record['formatted']); + + $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']], $record['datetime']); + + foreach ($lines as $line) { + $this->socket->write($line, $header); + } + } + + public function close(): void + { + $this->socket->close(); + } + + /** + * @param string|string[] $message + * @return string[] + */ + private function splitMessageIntoLines($message): array + { + if (is_array($message)) { + $message = implode("\n", $message); + } + + $lines = preg_split('/$\R?^/m', (string) $message, -1, PREG_SPLIT_NO_EMPTY); + if (false === $lines) { + $pcreErrorCode = preg_last_error(); + throw new \RuntimeException('Could not preg_split: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); + } + + return $lines; + } + + /** + * Make common syslog header (see rfc5424 or rfc3164) + */ + protected function makeCommonSyslogHeader(int $severity, DateTimeInterface $datetime): string + { + $priority = $severity + $this->facility; + + if (!$pid = getmypid()) { + $pid = '-'; + } + + if (!$hostname = gethostname()) { + $hostname = '-'; + } + + if ($this->rfc === self::RFC3164) { + // see https://github.com/phpstan/phpstan/issues/5348 + // @phpstan-ignore-next-line + $dateNew = $datetime->setTimezone(new \DateTimeZone('UTC')); + $date = $dateNew->format($this->dateFormats[$this->rfc]); + + return "<$priority>" . + $date . " " . + $hostname . " " . + $this->ident . "[" . $pid . "]: "; + } + + $date = $datetime->format($this->dateFormats[$this->rfc]); + + return "<$priority>1 " . + $date . " " . + $hostname . " " . + $this->ident . " " . + $pid . " - - "; + } + + /** + * Inject your own socket, mainly used for testing + */ + public function setSocket(UdpSocket $socket): self + { + $this->socket = $socket; + + return $this; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php new file mode 100644 index 0000000000..8912eba510 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php @@ -0,0 +1,274 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use RuntimeException; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Handler send logs to Telegram using Telegram Bot API. + * + * How to use: + * 1) Create telegram bot with https://telegram.me/BotFather + * 2) Create a telegram channel where logs will be recorded. + * 3) Add created bot from step 1 to the created channel from step 2. + * + * Use telegram bot API key from step 1 and channel name with '@' prefix from step 2 to create instance of TelegramBotHandler + * + * @link https://core.telegram.org/bots/api + * + * @author Mazur Alexandr + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class TelegramBotHandler extends AbstractProcessingHandler +{ + private const BOT_API = 'https://api.telegram.org/bot'; + + /** + * The available values of parseMode according to the Telegram api documentation + */ + private const AVAILABLE_PARSE_MODES = [ + 'HTML', + 'MarkdownV2', + 'Markdown', // legacy mode without underline and strikethrough, use MarkdownV2 instead + ]; + + /** + * The maximum number of characters allowed in a message according to the Telegram api documentation + */ + private const MAX_MESSAGE_LENGTH = 4096; + + /** + * Telegram bot access token provided by BotFather. + * Create telegram bot with https://telegram.me/BotFather and use access token from it. + * @var string + */ + private $apiKey; + + /** + * Telegram channel name. + * Since to start with '@' symbol as prefix. + * @var string + */ + private $channel; + + /** + * The kind of formatting that is used for the message. + * See available options at https://core.telegram.org/bots/api#formatting-options + * or in AVAILABLE_PARSE_MODES + * @var ?string + */ + private $parseMode; + + /** + * Disables link previews for links in the message. + * @var ?bool + */ + private $disableWebPagePreview; + + /** + * Sends the message silently. Users will receive a notification with no sound. + * @var ?bool + */ + private $disableNotification; + + /** + * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages. + * False - truncates a message that is too long. + * @var bool + */ + private $splitLongMessages; + + /** + * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests). + * @var bool + */ + private $delayBetweenMessages; + + /** + * @param string $apiKey Telegram bot access token provided by BotFather + * @param string $channel Telegram channel name + * @param bool $splitLongMessages Split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages + * @param bool $delayBetweenMessages Adds delay between sending a split message according to Telegram API + * @throws MissingExtensionException + */ + public function __construct( + string $apiKey, + string $channel, + $level = Logger::DEBUG, + bool $bubble = true, + string $parseMode = null, + bool $disableWebPagePreview = null, + bool $disableNotification = null, + bool $splitLongMessages = false, + bool $delayBetweenMessages = false + ) + { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is needed to use the TelegramBotHandler'); + } + + parent::__construct($level, $bubble); + + $this->apiKey = $apiKey; + $this->channel = $channel; + $this->setParseMode($parseMode); + $this->disableWebPagePreview($disableWebPagePreview); + $this->disableNotification($disableNotification); + $this->splitLongMessages($splitLongMessages); + $this->delayBetweenMessages($delayBetweenMessages); + } + + public function setParseMode(string $parseMode = null): self + { + if ($parseMode !== null && !in_array($parseMode, self::AVAILABLE_PARSE_MODES)) { + throw new \InvalidArgumentException('Unknown parseMode, use one of these: ' . implode(', ', self::AVAILABLE_PARSE_MODES) . '.'); + } + + $this->parseMode = $parseMode; + + return $this; + } + + public function disableWebPagePreview(bool $disableWebPagePreview = null): self + { + $this->disableWebPagePreview = $disableWebPagePreview; + + return $this; + } + + public function disableNotification(bool $disableNotification = null): self + { + $this->disableNotification = $disableNotification; + + return $this; + } + + /** + * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages. + * False - truncates a message that is too long. + * @param bool $splitLongMessages + * @return $this + */ + public function splitLongMessages(bool $splitLongMessages = false): self + { + $this->splitLongMessages = $splitLongMessages; + + return $this; + } + + /** + * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests). + * @param bool $delayBetweenMessages + * @return $this + */ + public function delayBetweenMessages(bool $delayBetweenMessages = false): self + { + $this->delayBetweenMessages = $delayBetweenMessages; + + return $this; + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + /** @var Record[] $messages */ + $messages = []; + + foreach ($records as $record) { + if (!$this->isHandling($record)) { + continue; + } + + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + $messages[] = $record; + } + + if (!empty($messages)) { + $this->send((string)$this->getFormatter()->formatBatch($messages)); + } + } + + /** + * @inheritDoc + */ + protected function write(array $record): void + { + $this->send($record['formatted']); + } + + /** + * Send request to @link https://api.telegram.org/bot on SendMessage action. + * @param string $message + */ + protected function send(string $message): void + { + $messages = $this->handleMessageLength($message); + + foreach ($messages as $key => $msg) { + if ($this->delayBetweenMessages && $key > 0) { + sleep(1); + } + + $this->sendCurl($msg); + } + } + + protected function sendCurl(string $message): void + { + $ch = curl_init(); + $url = self::BOT_API . $this->apiKey . '/SendMessage'; + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'text' => $message, + 'chat_id' => $this->channel, + 'parse_mode' => $this->parseMode, + 'disable_web_page_preview' => $this->disableWebPagePreview, + 'disable_notification' => $this->disableNotification, + ])); + + $result = Curl\Util::execute($ch); + if (!is_string($result)) { + throw new RuntimeException('Telegram API error. Description: No response'); + } + $result = json_decode($result, true); + + if ($result['ok'] === false) { + throw new RuntimeException('Telegram API error. Description: ' . $result['description']); + } + } + + /** + * Handle a message that is too long: truncates or splits into several + * @param string $message + * @return string[] + */ + private function handleMessageLength(string $message): array + { + $truncatedMarker = ' (...truncated)'; + if (!$this->splitLongMessages && strlen($message) > self::MAX_MESSAGE_LENGTH) { + return [Utils::substr($message, 0, self::MAX_MESSAGE_LENGTH - strlen($truncatedMarker)) . $truncatedMarker]; + } + + return str_split($message, self::MAX_MESSAGE_LENGTH); + } +} diff --git a/pandora_console/vendor/psr/log/Psr/Log/Test/TestLogger.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php similarity index 52% rename from pandora_console/vendor/psr/log/Psr/Log/Test/TestLogger.php rename to pandora_console/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php index 1be3230496..0986da2708 100644 --- a/pandora_console/vendor/psr/log/Psr/Log/Test/TestLogger.php +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php @@ -1,14 +1,26 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ -use Psr\Log\AbstractLogger; +namespace Monolog\Handler; + +use Monolog\Logger; +use Psr\Log\LogLevel; /** * Used for testing purposes. * * It records all records and gives you access to them for verification. * + * @author Jordi Boggiano + * * @method bool hasEmergency($record) * @method bool hasAlert($record) * @method bool hasCritical($record) @@ -53,41 +65,80 @@ use Psr\Log\AbstractLogger; * @method bool hasNoticeThatPasses($message) * @method bool hasInfoThatPasses($message) * @method bool hasDebugThatPasses($message) + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger */ -class TestLogger extends AbstractLogger +class TestHandler extends AbstractProcessingHandler { - /** - * @var array - */ - public $records = []; - - public $recordsByLevel = []; + /** @var Record[] */ + protected $records = []; + /** @var array */ + protected $recordsByLevel = []; + /** @var bool */ + private $skipReset = false; /** - * @inheritdoc + * @return array + * + * @phpstan-return Record[] */ - public function log($level, $message, array $context = []) + public function getRecords() { - $record = [ - 'level' => $level, - 'message' => $message, - 'context' => $context, - ]; - - $this->recordsByLevel[$record['level']][] = $record; - $this->records[] = $record; + return $this->records; } - public function hasRecords($level) + /** + * @return void + */ + public function clear() { - return isset($this->recordsByLevel[$level]); + $this->records = []; + $this->recordsByLevel = []; } - public function hasRecord($record, $level) + /** + * @return void + */ + public function reset() + { + if (!$this->skipReset) { + $this->clear(); + } + } + + /** + * @return void + */ + public function setSkipReset(bool $skipReset) + { + $this->skipReset = $skipReset; + } + + /** + * @param string|int $level Logging level value or name + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function hasRecords($level): bool + { + return isset($this->recordsByLevel[Logger::toMonologLevel($level)]); + } + + /** + * @param string|array $record Either a message string or an array containing message and optionally context keys that will be checked against all records + * @param string|int $level Logging level value or name + * + * @phpstan-param array{message: string, context?: mixed[]}|string $record + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function hasRecord($record, $level): bool { if (is_string($record)) { - $record = ['message' => $record]; + $record = array('message' => $record); } + return $this->hasRecordThatPasses(function ($rec) use ($record) { if ($rec['message'] !== $record['message']) { return false; @@ -95,53 +146,86 @@ class TestLogger extends AbstractLogger if (isset($record['context']) && $rec['context'] !== $record['context']) { return false; } + return true; }, $level); } - public function hasRecordThatContains($message, $level) + /** + * @param string|int $level Logging level value or name + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function hasRecordThatContains(string $message, $level): bool { return $this->hasRecordThatPasses(function ($rec) use ($message) { return strpos($rec['message'], $message) !== false; }, $level); } - public function hasRecordThatMatches($regex, $level) + /** + * @param string|int $level Logging level value or name + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function hasRecordThatMatches(string $regex, $level): bool { - return $this->hasRecordThatPasses(function ($rec) use ($regex) { + return $this->hasRecordThatPasses(function (array $rec) use ($regex): bool { return preg_match($regex, $rec['message']) > 0; }, $level); } + /** + * @param string|int $level Logging level value or name + * @return bool + * + * @psalm-param callable(Record, int): mixed $predicate + * @phpstan-param Level|LevelName|LogLevel::* $level + */ public function hasRecordThatPasses(callable $predicate, $level) { + $level = Logger::toMonologLevel($level); + if (!isset($this->recordsByLevel[$level])) { return false; } + foreach ($this->recordsByLevel[$level] as $i => $rec) { - if (call_user_func($predicate, $rec, $i)) { + if ($predicate($rec, $i)) { return true; } } + return false; } + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->recordsByLevel[$record['level']][] = $record; + $this->records[] = $record; + } + + /** + * @param string $method + * @param mixed[] $args + * @return bool + */ public function __call($method, $args) { if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; - $level = strtolower($matches[2]); - if (method_exists($this, $genericMethod)) { + $level = constant('Monolog\Logger::' . strtoupper($matches[2])); + $callback = [$this, $genericMethod]; + if (is_callable($callback)) { $args[] = $level; - return call_user_func_array([$this, $genericMethod], $args); + + return call_user_func_array($callback, $args); } } + throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); } - - public function reset() - { - $this->records = []; - $this->recordsByLevel = []; - } } diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php new file mode 100644 index 0000000000..c81835288e --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +trait WebRequestRecognizerTrait +{ + /** + * Checks if PHP's serving a web request + * @return bool + */ + protected function isWebRequest(): bool + { + return 'cli' !== \PHP_SAPI && 'phpdbg' !== \PHP_SAPI; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php new file mode 100644 index 0000000000..2dd136720e --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Forwards records to multiple handlers suppressing failures of each handler + * and continuing through to give every handler a chance to succeed. + * + * @author Craig D'Amelio + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class WhatFailureGroupHandler extends GroupHandler +{ + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + foreach ($this->handlers as $handler) { + try { + $handler->handle($record); + } catch (\Throwable $e) { + // What failure? + } + } + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + if ($this->processors) { + $processed = array(); + foreach ($records as $record) { + $processed[] = $this->processRecord($record); + } + /** @var Record[] $records */ + $records = $processed; + } + + foreach ($this->handlers as $handler) { + try { + $handler->handleBatch($records); + } catch (\Throwable $e) { + // What failure? + } + } + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php new file mode 100644 index 0000000000..ddd46d8c5c --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Logger; + +/** + * Handler sending logs to Zend Monitor + * + * @author Christian Bergau + * @author Jason Davis + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class ZendMonitorHandler extends AbstractProcessingHandler +{ + /** + * Monolog level / ZendMonitor Custom Event priority map + * + * @var array + */ + protected $levelMap = []; + + /** + * @throws MissingExtensionException + */ + public function __construct($level = Logger::DEBUG, bool $bubble = true) + { + if (!function_exists('zend_monitor_custom_event')) { + throw new MissingExtensionException( + 'You must have Zend Server installed with Zend Monitor enabled in order to use this handler' + ); + } + //zend monitor constants are not defined if zend monitor is not enabled. + $this->levelMap = [ + Logger::DEBUG => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::INFO => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::NOTICE => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::WARNING => \ZEND_MONITOR_EVENT_SEVERITY_WARNING, + Logger::ERROR => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::CRITICAL => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::ALERT => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::EMERGENCY => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + ]; + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->writeZendMonitorCustomEvent( + Logger::getLevelName($record['level']), + $record['message'], + $record['formatted'], + $this->levelMap[$record['level']] + ); + } + + /** + * Write to Zend Monitor Events + * @param string $type Text displayed in "Class Name (custom)" field + * @param string $message Text displayed in "Error String" + * @param array $formatted Displayed in Custom Variables tab + * @param int $severity Set the event severity level (-1,0,1) + * + * @phpstan-param FormattedRecord $formatted + */ + protected function writeZendMonitorCustomEvent(string $type, string $message, array $formatted, int $severity): void + { + zend_monitor_custom_event($type, $message, $formatted, $severity); + } + + /** + * {@inheritDoc} + */ + public function getDefaultFormatter(): FormatterInterface + { + return new NormalizerFormatter(); + } + + /** + * @return array + */ + public function getLevelMap(): array + { + return $this->levelMap; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/LogRecord.php b/pandora_console/vendor/monolog/monolog/src/Monolog/LogRecord.php new file mode 100644 index 0000000000..702807d718 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/LogRecord.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use ArrayAccess; + +/** + * Monolog log record interface for forward compatibility with Monolog 3.0 + * + * This is just present in Monolog 2.4+ to allow interoperable code to be written against + * both versions by type-hinting arguments as `array|\Monolog\LogRecord $record` + * + * Do not rely on this interface for other purposes, and do not implement it. + * + * @author Jordi Boggiano + * @template-extends \ArrayAccess<'message'|'level'|'context'|'level_name'|'channel'|'datetime'|'extra'|'formatted', mixed> + * @phpstan-import-type Record from Logger + */ +interface LogRecord extends \ArrayAccess +{ + /** + * @phpstan-return Record + */ + public function toArray(): array; +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Logger.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Logger.php new file mode 100644 index 0000000000..1ab75b9e09 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Logger.php @@ -0,0 +1,701 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use DateTimeZone; +use Monolog\Handler\HandlerInterface; +use Psr\Log\LoggerInterface; +use Psr\Log\InvalidArgumentException; +use Psr\Log\LogLevel; +use Throwable; +use Stringable; + +/** + * Monolog log channel + * + * It contains a stack of Handlers and a stack of Processors, + * and uses them to store records that are added to it. + * + * @author Jordi Boggiano + * + * @phpstan-type Level Logger::DEBUG|Logger::INFO|Logger::NOTICE|Logger::WARNING|Logger::ERROR|Logger::CRITICAL|Logger::ALERT|Logger::EMERGENCY + * @phpstan-type LevelName 'DEBUG'|'INFO'|'NOTICE'|'WARNING'|'ERROR'|'CRITICAL'|'ALERT'|'EMERGENCY' + * @phpstan-type Record array{message: string, context: mixed[], level: Level, level_name: LevelName, channel: string, datetime: \DateTimeImmutable, extra: mixed[]} + */ +class Logger implements LoggerInterface, ResettableInterface +{ + /** + * Detailed debug information + */ + public const DEBUG = 100; + + /** + * Interesting events + * + * Examples: User logs in, SQL logs. + */ + public const INFO = 200; + + /** + * Uncommon events + */ + public const NOTICE = 250; + + /** + * Exceptional occurrences that are not errors + * + * Examples: Use of deprecated APIs, poor use of an API, + * undesirable things that are not necessarily wrong. + */ + public const WARNING = 300; + + /** + * Runtime errors + */ + public const ERROR = 400; + + /** + * Critical conditions + * + * Example: Application component unavailable, unexpected exception. + */ + public const CRITICAL = 500; + + /** + * Action must be taken immediately + * + * Example: Entire website down, database unavailable, etc. + * This should trigger the SMS alerts and wake you up. + */ + public const ALERT = 550; + + /** + * Urgent alert. + */ + public const EMERGENCY = 600; + + /** + * Monolog API version + * + * This is only bumped when API breaks are done and should + * follow the major version of the library + * + * @var int + */ + public const API = 2; + + /** + * This is a static variable and not a constant to serve as an extension point for custom levels + * + * @var array $levels Logging levels with the levels as key + * + * @phpstan-var array $levels Logging levels with the levels as key + */ + protected static $levels = [ + self::DEBUG => 'DEBUG', + self::INFO => 'INFO', + self::NOTICE => 'NOTICE', + self::WARNING => 'WARNING', + self::ERROR => 'ERROR', + self::CRITICAL => 'CRITICAL', + self::ALERT => 'ALERT', + self::EMERGENCY => 'EMERGENCY', + ]; + + /** + * Mapping between levels numbers defined in RFC 5424 and Monolog ones + * + * @phpstan-var array $rfc_5424_levels + */ + private const RFC_5424_LEVELS = [ + 7 => self::DEBUG, + 6 => self::INFO, + 5 => self::NOTICE, + 4 => self::WARNING, + 3 => self::ERROR, + 2 => self::CRITICAL, + 1 => self::ALERT, + 0 => self::EMERGENCY, + ]; + + /** + * @var string + */ + protected $name; + + /** + * The handler stack + * + * @var HandlerInterface[] + */ + protected $handlers; + + /** + * Processors that will process all log records + * + * To process records of a single handler instead, add the processor on that specific handler + * + * @var callable[] + */ + protected $processors; + + /** + * @var bool + */ + protected $microsecondTimestamps = true; + + /** + * @var DateTimeZone + */ + protected $timezone; + + /** + * @var callable|null + */ + protected $exceptionHandler; + + /** + * @var int Keeps track of depth to prevent infinite logging loops + */ + private $logDepth = 0; + + /** + * @var bool Whether to detect infinite logging loops + * + * This can be disabled via {@see useLoggingLoopDetection} if you have async handlers that do not play well with this + */ + private $detectCycles = true; + + /** + * @psalm-param array $processors + * + * @param string $name The logging channel, a simple descriptive name that is attached to all log records + * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. + * @param callable[] $processors Optional array of processors + * @param DateTimeZone|null $timezone Optional timezone, if not provided date_default_timezone_get() will be used + */ + public function __construct(string $name, array $handlers = [], array $processors = [], ?DateTimeZone $timezone = null) + { + $this->name = $name; + $this->setHandlers($handlers); + $this->processors = $processors; + $this->timezone = $timezone ?: new DateTimeZone(date_default_timezone_get() ?: 'UTC'); + } + + public function getName(): string + { + return $this->name; + } + + /** + * Return a new cloned instance with the name changed + */ + public function withName(string $name): self + { + $new = clone $this; + $new->name = $name; + + return $new; + } + + /** + * Pushes a handler on to the stack. + */ + public function pushHandler(HandlerInterface $handler): self + { + array_unshift($this->handlers, $handler); + + return $this; + } + + /** + * Pops a handler from the stack + * + * @throws \LogicException If empty handler stack + */ + public function popHandler(): HandlerInterface + { + if (!$this->handlers) { + throw new \LogicException('You tried to pop from an empty handler stack.'); + } + + return array_shift($this->handlers); + } + + /** + * Set handlers, replacing all existing ones. + * + * If a map is passed, keys will be ignored. + * + * @param HandlerInterface[] $handlers + */ + public function setHandlers(array $handlers): self + { + $this->handlers = []; + foreach (array_reverse($handlers) as $handler) { + $this->pushHandler($handler); + } + + return $this; + } + + /** + * @return HandlerInterface[] + */ + public function getHandlers(): array + { + return $this->handlers; + } + + /** + * Adds a processor on to the stack. + */ + public function pushProcessor(callable $callback): self + { + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * Removes the processor on top of the stack and returns it. + * + * @throws \LogicException If empty processor stack + * @return callable + */ + public function popProcessor(): callable + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * @return callable[] + */ + public function getProcessors(): array + { + return $this->processors; + } + + /** + * Control the use of microsecond resolution timestamps in the 'datetime' + * member of new records. + * + * As of PHP7.1 microseconds are always included by the engine, so + * there is no performance penalty and Monolog 2 enabled microseconds + * by default. This function lets you disable them though in case you want + * to suppress microseconds from the output. + * + * @param bool $micro True to use microtime() to create timestamps + */ + public function useMicrosecondTimestamps(bool $micro): self + { + $this->microsecondTimestamps = $micro; + + return $this; + } + + public function useLoggingLoopDetection(bool $detectCycles): self + { + $this->detectCycles = $detectCycles; + + return $this; + } + + /** + * Adds a log record. + * + * @param int $level The logging level (a Monolog or RFC 5424 level) + * @param string $message The log message + * @param mixed[] $context The log context + * @param DateTimeImmutable $datetime Optional log date to log into the past or future + * @return bool Whether the record has been processed + * + * @phpstan-param Level $level + */ + public function addRecord(int $level, string $message, array $context = [], DateTimeImmutable $datetime = null): bool + { + if (isset(self::RFC_5424_LEVELS[$level])) { + $level = self::RFC_5424_LEVELS[$level]; + } + + if ($this->detectCycles) { + $this->logDepth += 1; + } + if ($this->logDepth === 3) { + $this->warning('A possible infinite logging loop was detected and aborted. It appears some of your handler code is triggering logging, see the previous log record for a hint as to what may be the cause.'); + return false; + } elseif ($this->logDepth >= 5) { // log depth 4 is let through so we can log the warning above + return false; + } + + try { + $record = null; + + foreach ($this->handlers as $handler) { + if (null === $record) { + // skip creating the record as long as no handler is going to handle it + if (!$handler->isHandling(['level' => $level])) { + continue; + } + + $levelName = static::getLevelName($level); + + $record = [ + 'message' => $message, + 'context' => $context, + 'level' => $level, + 'level_name' => $levelName, + 'channel' => $this->name, + 'datetime' => $datetime ?? new DateTimeImmutable($this->microsecondTimestamps, $this->timezone), + 'extra' => [], + ]; + + try { + foreach ($this->processors as $processor) { + $record = $processor($record); + } + } catch (Throwable $e) { + $this->handleException($e, $record); + + return true; + } + } + + // once the record exists, send it to all handlers as long as the bubbling chain is not interrupted + try { + if (true === $handler->handle($record)) { + break; + } + } catch (Throwable $e) { + $this->handleException($e, $record); + + return true; + } + } + } finally { + if ($this->detectCycles) { + $this->logDepth--; + } + } + + return null !== $record; + } + + /** + * Ends a log cycle and frees all resources used by handlers. + * + * Closing a Handler means flushing all buffers and freeing any open resources/handles. + * Handlers that have been closed should be able to accept log records again and re-open + * themselves on demand, but this may not always be possible depending on implementation. + * + * This is useful at the end of a request and will be called automatically on every handler + * when they get destructed. + */ + public function close(): void + { + foreach ($this->handlers as $handler) { + $handler->close(); + } + } + + /** + * Ends a log cycle and resets all handlers and processors to their initial state. + * + * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal + * state, and getting it back to a state in which it can receive log records again. + * + * This is useful in case you want to avoid logs leaking between two requests or jobs when you + * have a long running process like a worker or an application server serving multiple requests + * in one process. + */ + public function reset(): void + { + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } + } + + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } + + /** + * Gets all supported logging levels. + * + * @return array Assoc array with human-readable level names => level codes. + * @phpstan-return array + */ + public static function getLevels(): array + { + return array_flip(static::$levels); + } + + /** + * Gets the name of the logging level. + * + * @throws \Psr\Log\InvalidArgumentException If level is not defined + * + * @phpstan-param Level $level + * @phpstan-return LevelName + */ + public static function getLevelName(int $level): string + { + if (!isset(static::$levels[$level])) { + throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels))); + } + + return static::$levels[$level]; + } + + /** + * Converts PSR-3 levels to Monolog ones if necessary + * + * @param string|int $level Level number (monolog) or name (PSR-3) + * @throws \Psr\Log\InvalidArgumentException If level is not defined + * + * @phpstan-param Level|LevelName|LogLevel::* $level + * @phpstan-return Level + */ + public static function toMonologLevel($level): int + { + if (is_string($level)) { + if (is_numeric($level)) { + /** @phpstan-ignore-next-line */ + return intval($level); + } + + // Contains chars of all log levels and avoids using strtoupper() which may have + // strange results depending on locale (for example, "i" will become "İ" in Turkish locale) + $upper = strtr($level, 'abcdefgilmnortuwy', 'ABCDEFGILMNORTUWY'); + if (defined(__CLASS__.'::'.$upper)) { + return constant(__CLASS__ . '::' . $upper); + } + + throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels) + static::$levels)); + } + + if (!is_int($level)) { + throw new InvalidArgumentException('Level "'.var_export($level, true).'" is not defined, use one of: '.implode(', ', array_keys(static::$levels) + static::$levels)); + } + + return $level; + } + + /** + * Checks whether the Logger has a handler that listens on the given level + * + * @phpstan-param Level $level + */ + public function isHandling(int $level): bool + { + $record = [ + 'level' => $level, + ]; + + foreach ($this->handlers as $handler) { + if ($handler->isHandling($record)) { + return true; + } + } + + return false; + } + + /** + * Set a custom exception handler that will be called if adding a new record fails + * + * The callable will receive an exception object and the record that failed to be logged + */ + public function setExceptionHandler(?callable $callback): self + { + $this->exceptionHandler = $callback; + + return $this; + } + + public function getExceptionHandler(): ?callable + { + return $this->exceptionHandler; + } + + /** + * Adds a log record at an arbitrary level. + * + * This method allows for compatibility with common interfaces. + * + * @param mixed $level The log level (a Monolog, PSR-3 or RFC 5424 level) + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function log($level, $message, array $context = []): void + { + if (!is_int($level) && !is_string($level)) { + throw new \InvalidArgumentException('$level is expected to be a string or int'); + } + + if (isset(self::RFC_5424_LEVELS[$level])) { + $level = self::RFC_5424_LEVELS[$level]; + } + + $level = static::toMonologLevel($level); + + $this->addRecord($level, (string) $message, $context); + } + + /** + * Adds a log record at the DEBUG level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function debug($message, array $context = []): void + { + $this->addRecord(static::DEBUG, (string) $message, $context); + } + + /** + * Adds a log record at the INFO level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function info($message, array $context = []): void + { + $this->addRecord(static::INFO, (string) $message, $context); + } + + /** + * Adds a log record at the NOTICE level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function notice($message, array $context = []): void + { + $this->addRecord(static::NOTICE, (string) $message, $context); + } + + /** + * Adds a log record at the WARNING level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function warning($message, array $context = []): void + { + $this->addRecord(static::WARNING, (string) $message, $context); + } + + /** + * Adds a log record at the ERROR level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function error($message, array $context = []): void + { + $this->addRecord(static::ERROR, (string) $message, $context); + } + + /** + * Adds a log record at the CRITICAL level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function critical($message, array $context = []): void + { + $this->addRecord(static::CRITICAL, (string) $message, $context); + } + + /** + * Adds a log record at the ALERT level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function alert($message, array $context = []): void + { + $this->addRecord(static::ALERT, (string) $message, $context); + } + + /** + * Adds a log record at the EMERGENCY level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function emergency($message, array $context = []): void + { + $this->addRecord(static::EMERGENCY, (string) $message, $context); + } + + /** + * Sets the timezone to be used for the timestamp of log records. + */ + public function setTimezone(DateTimeZone $tz): self + { + $this->timezone = $tz; + + return $this; + } + + /** + * Returns the timezone to be used for the timestamp of log records. + */ + public function getTimezone(): DateTimeZone + { + return $this->timezone; + } + + /** + * Delegates exception management to the custom exception handler, + * or throws the exception if no custom handler is set. + * + * @param array $record + * @phpstan-param Record $record + */ + protected function handleException(Throwable $e, array $record): void + { + if (!$this->exceptionHandler) { + throw $e; + } + + ($this->exceptionHandler)($e, $record); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php new file mode 100644 index 0000000000..8166bdca29 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Injects Git branch and Git commit SHA in all records + * + * @author Nick Otter + * @author Jordi Boggiano + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class GitProcessor implements ProcessorInterface +{ + /** @var int */ + private $level; + /** @var array{branch: string, commit: string}|array|null */ + private static $cache = null; + + /** + * @param string|int $level The minimum logging level at which this Processor will be triggered + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function __construct($level = Logger::DEBUG) + { + $this->level = Logger::toMonologLevel($level); + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $record['extra']['git'] = self::getGitInfo(); + + return $record; + } + + /** + * @return array{branch: string, commit: string}|array + */ + private static function getGitInfo(): array + { + if (self::$cache) { + return self::$cache; + } + + $branches = `git branch -v --no-abbrev`; + if ($branches && preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { + return self::$cache = [ + 'branch' => $matches[1], + 'commit' => $matches[2], + ]; + } + + return self::$cache = []; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php new file mode 100644 index 0000000000..91fda7d6da --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects value of gethostname in all records + */ +class HostnameProcessor implements ProcessorInterface +{ + /** @var string */ + private static $host; + + public function __construct() + { + self::$host = (string) gethostname(); + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $record['extra']['hostname'] = self::$host; + + return $record; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php new file mode 100644 index 0000000000..a32e76b21a --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php @@ -0,0 +1,123 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Injects line/file:class/function where the log message came from + * + * Warning: This only works if the handler processes the logs directly. + * If you put the processor on a handler that is behind a FingersCrossedHandler + * for example, the processor will only be called once the trigger level is reached, + * and all the log records will have the same file/line/.. data from the call that + * triggered the FingersCrossedHandler. + * + * @author Jordi Boggiano + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class IntrospectionProcessor implements ProcessorInterface +{ + /** @var int */ + private $level; + /** @var string[] */ + private $skipClassesPartials; + /** @var int */ + private $skipStackFramesCount; + /** @var string[] */ + private $skipFunctions = [ + 'call_user_func', + 'call_user_func_array', + ]; + + /** + * @param string|int $level The minimum logging level at which this Processor will be triggered + * @param string[] $skipClassesPartials + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function __construct($level = Logger::DEBUG, array $skipClassesPartials = [], int $skipStackFramesCount = 0) + { + $this->level = Logger::toMonologLevel($level); + $this->skipClassesPartials = array_merge(['Monolog\\'], $skipClassesPartials); + $this->skipStackFramesCount = $skipStackFramesCount; + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + + // skip first since it's always the current method + array_shift($trace); + // the call_user_func call is also skipped + array_shift($trace); + + $i = 0; + + while ($this->isTraceClassOrSkippedFunction($trace, $i)) { + if (isset($trace[$i]['class'])) { + foreach ($this->skipClassesPartials as $part) { + if (strpos($trace[$i]['class'], $part) !== false) { + $i++; + + continue 2; + } + } + } elseif (in_array($trace[$i]['function'], $this->skipFunctions)) { + $i++; + + continue; + } + + break; + } + + $i += $this->skipStackFramesCount; + + // we should have the call source now + $record['extra'] = array_merge( + $record['extra'], + [ + 'file' => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null, + 'line' => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null, + 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null, + 'callType' => isset($trace[$i]['type']) ? $trace[$i]['type'] : null, + 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null, + ] + ); + + return $record; + } + + /** + * @param array[] $trace + */ + private function isTraceClassOrSkippedFunction(array $trace, int $index): bool + { + if (!isset($trace[$index])) { + return false; + } + + return isset($trace[$index]['class']) || in_array($trace[$index]['function'], $this->skipFunctions); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php new file mode 100644 index 0000000000..37c756fcb3 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects memory_get_peak_usage in all records + * + * @see Monolog\Processor\MemoryProcessor::__construct() for options + * @author Rob Jensen + */ +class MemoryPeakUsageProcessor extends MemoryProcessor +{ + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $usage = memory_get_peak_usage($this->realUsage); + + if ($this->useFormatting) { + $usage = $this->formatBytes($usage); + } + + $record['extra']['memory_peak_usage'] = $usage; + + return $record; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php new file mode 100644 index 0000000000..227deb7c86 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Some methods that are common for all memory processors + * + * @author Rob Jensen + */ +abstract class MemoryProcessor implements ProcessorInterface +{ + /** + * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported. + */ + protected $realUsage; + + /** + * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size) + */ + protected $useFormatting; + + /** + * @param bool $realUsage Set this to true to get the real size of memory allocated from system. + * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size) + */ + public function __construct(bool $realUsage = true, bool $useFormatting = true) + { + $this->realUsage = $realUsage; + $this->useFormatting = $useFormatting; + } + + /** + * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is + * + * @param int $bytes + * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as int + */ + protected function formatBytes(int $bytes) + { + if (!$this->useFormatting) { + return $bytes; + } + + if ($bytes > 1024 * 1024) { + return round($bytes / 1024 / 1024, 2).' MB'; + } elseif ($bytes > 1024) { + return round($bytes / 1024, 2).' KB'; + } + + return $bytes . ' B'; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php new file mode 100644 index 0000000000..e141921e95 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects memory_get_usage in all records + * + * @see Monolog\Processor\MemoryProcessor::__construct() for options + * @author Rob Jensen + */ +class MemoryUsageProcessor extends MemoryProcessor +{ + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $usage = memory_get_usage($this->realUsage); + + if ($this->useFormatting) { + $usage = $this->formatBytes($usage); + } + + $record['extra']['memory_usage'] = $usage; + + return $record; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php new file mode 100644 index 0000000000..d4a628f552 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Injects Hg branch and Hg revision number in all records + * + * @author Jonathan A. Schweder + * + * @phpstan-import-type LevelName from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + */ +class MercurialProcessor implements ProcessorInterface +{ + /** @var Level */ + private $level; + /** @var array{branch: string, revision: string}|array|null */ + private static $cache = null; + + /** + * @param int|string $level The minimum logging level at which this Processor will be triggered + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function __construct($level = Logger::DEBUG) + { + $this->level = Logger::toMonologLevel($level); + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $record['extra']['hg'] = self::getMercurialInfo(); + + return $record; + } + + /** + * @return array{branch: string, revision: string}|array + */ + private static function getMercurialInfo(): array + { + if (self::$cache) { + return self::$cache; + } + + $result = explode(' ', trim(`hg id -nb`)); + + if (count($result) >= 3) { + return self::$cache = [ + 'branch' => $result[1], + 'revision' => $result[2], + ]; + } + + return self::$cache = []; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php new file mode 100644 index 0000000000..3b939a951b --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Adds value of getmypid into records + * + * @author Andreas Hörnicke + */ +class ProcessIdProcessor implements ProcessorInterface +{ + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $record['extra']['process_id'] = getmypid(); + + return $record; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php new file mode 100644 index 0000000000..5defb7eb4f --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * An optional interface to allow labelling Monolog processors. + * + * @author Nicolas Grekas + * + * @phpstan-import-type Record from \Monolog\Logger + */ +interface ProcessorInterface +{ + /** + * @return array The processed record + * + * @phpstan-param Record $record + * @phpstan-return Record + */ + public function __invoke(array $record); +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php new file mode 100644 index 0000000000..2c2a00e75f --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php @@ -0,0 +1,86 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Utils; + +/** + * Processes a record's message according to PSR-3 rules + * + * It replaces {foo} with the value from $context['foo'] + * + * @author Jordi Boggiano + */ +class PsrLogMessageProcessor implements ProcessorInterface +{ + public const SIMPLE_DATE = "Y-m-d\TH:i:s.uP"; + + /** @var string|null */ + private $dateFormat; + + /** @var bool */ + private $removeUsedContextFields; + + /** + * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format + * @param bool $removeUsedContextFields If set to true the fields interpolated into message gets unset + */ + public function __construct(?string $dateFormat = null, bool $removeUsedContextFields = false) + { + $this->dateFormat = $dateFormat; + $this->removeUsedContextFields = $removeUsedContextFields; + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + if (false === strpos($record['message'], '{')) { + return $record; + } + + $replacements = []; + foreach ($record['context'] as $key => $val) { + $placeholder = '{' . $key . '}'; + if (strpos($record['message'], $placeholder) === false) { + continue; + } + + if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) { + $replacements[$placeholder] = $val; + } elseif ($val instanceof \DateTimeInterface) { + if (!$this->dateFormat && $val instanceof \Monolog\DateTimeImmutable) { + // handle monolog dates using __toString if no specific dateFormat was asked for + // so that it follows the useMicroseconds flag + $replacements[$placeholder] = (string) $val; + } else { + $replacements[$placeholder] = $val->format($this->dateFormat ?: static::SIMPLE_DATE); + } + } elseif (is_object($val)) { + $replacements[$placeholder] = '[object '.Utils::getClass($val).']'; + } elseif (is_array($val)) { + $replacements[$placeholder] = 'array'.Utils::jsonEncode($val, null, true); + } else { + $replacements[$placeholder] = '['.gettype($val).']'; + } + + if ($this->removeUsedContextFields) { + unset($record['context'][$key]); + } + } + + $record['message'] = strtr($record['message'], $replacements); + + return $record; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php new file mode 100644 index 0000000000..80f18747aa --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Adds a tags array into record + * + * @author Martijn Riemers + */ +class TagProcessor implements ProcessorInterface +{ + /** @var string[] */ + private $tags; + + /** + * @param string[] $tags + */ + public function __construct(array $tags = []) + { + $this->setTags($tags); + } + + /** + * @param string[] $tags + */ + public function addTags(array $tags = []): self + { + $this->tags = array_merge($this->tags, $tags); + + return $this; + } + + /** + * @param string[] $tags + */ + public function setTags(array $tags = []): self + { + $this->tags = $tags; + + return $this; + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $record['extra']['tags'] = $this->tags; + + return $record; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php new file mode 100644 index 0000000000..a27b74dbf2 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\ResettableInterface; + +/** + * Adds a unique identifier into records + * + * @author Simon Mönch + */ +class UidProcessor implements ProcessorInterface, ResettableInterface +{ + /** @var string */ + private $uid; + + public function __construct(int $length = 7) + { + if ($length > 32 || $length < 1) { + throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32'); + } + + $this->uid = $this->generateUid($length); + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $record['extra']['uid'] = $this->uid; + + return $record; + } + + public function getUid(): string + { + return $this->uid; + } + + public function reset() + { + $this->uid = $this->generateUid(strlen($this->uid)); + } + + private function generateUid(int $length): string + { + return substr(bin2hex(random_bytes((int) ceil($length / 2))), 0, $length); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php new file mode 100644 index 0000000000..51850e17f7 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects url/method and remote IP of the current web request in all records + * + * @author Jordi Boggiano + */ +class WebProcessor implements ProcessorInterface +{ + /** + * @var array|\ArrayAccess + */ + protected $serverData; + + /** + * Default fields + * + * Array is structured as [key in record.extra => key in $serverData] + * + * @var array + */ + protected $extraFields = [ + 'url' => 'REQUEST_URI', + 'ip' => 'REMOTE_ADDR', + 'http_method' => 'REQUEST_METHOD', + 'server' => 'SERVER_NAME', + 'referrer' => 'HTTP_REFERER', + 'user_agent' => 'HTTP_USER_AGENT', + ]; + + /** + * @param array|\ArrayAccess|null $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data + * @param array|array|null $extraFields Field names and the related key inside $serverData to be added (or just a list of field names to use the default configured $serverData mapping). If not provided it defaults to: [url, ip, http_method, server, referrer] + unique_id if present in server data + */ + public function __construct($serverData = null, array $extraFields = null) + { + if (null === $serverData) { + $this->serverData = &$_SERVER; + } elseif (is_array($serverData) || $serverData instanceof \ArrayAccess) { + $this->serverData = $serverData; + } else { + throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.'); + } + + $defaultEnabled = ['url', 'ip', 'http_method', 'server', 'referrer']; + if (isset($this->serverData['UNIQUE_ID'])) { + $this->extraFields['unique_id'] = 'UNIQUE_ID'; + $defaultEnabled[] = 'unique_id'; + } + + if (null === $extraFields) { + $extraFields = $defaultEnabled; + } + if (isset($extraFields[0])) { + foreach (array_keys($this->extraFields) as $fieldName) { + if (!in_array($fieldName, $extraFields)) { + unset($this->extraFields[$fieldName]); + } + } + } else { + $this->extraFields = $extraFields; + } + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + // skip processing if for some reason request data + // is not present (CLI or wonky SAPIs) + if (!isset($this->serverData['REQUEST_URI'])) { + return $record; + } + + $record['extra'] = $this->appendExtraFields($record['extra']); + + return $record; + } + + public function addExtraField(string $extraName, string $serverName): self + { + $this->extraFields[$extraName] = $serverName; + + return $this; + } + + /** + * @param mixed[] $extra + * @return mixed[] + */ + private function appendExtraFields(array $extra): array + { + foreach ($this->extraFields as $extraName => $serverName) { + $extra[$extraName] = $this->serverData[$serverName] ?? null; + } + + return $extra; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Registry.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Registry.php new file mode 100644 index 0000000000..ae94ae6cc3 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Registry.php @@ -0,0 +1,134 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use InvalidArgumentException; + +/** + * Monolog log registry + * + * Allows to get `Logger` instances in the global scope + * via static method calls on this class. + * + * + * $application = new Monolog\Logger('application'); + * $api = new Monolog\Logger('api'); + * + * Monolog\Registry::addLogger($application); + * Monolog\Registry::addLogger($api); + * + * function testLogger() + * { + * Monolog\Registry::api()->error('Sent to $api Logger instance'); + * Monolog\Registry::application()->error('Sent to $application Logger instance'); + * } + * + * + * @author Tomas Tatarko + */ +class Registry +{ + /** + * List of all loggers in the registry (by named indexes) + * + * @var Logger[] + */ + private static $loggers = []; + + /** + * Adds new logging channel to the registry + * + * @param Logger $logger Instance of the logging channel + * @param string|null $name Name of the logging channel ($logger->getName() by default) + * @param bool $overwrite Overwrite instance in the registry if the given name already exists? + * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists + * @return void + */ + public static function addLogger(Logger $logger, ?string $name = null, bool $overwrite = false) + { + $name = $name ?: $logger->getName(); + + if (isset(self::$loggers[$name]) && !$overwrite) { + throw new InvalidArgumentException('Logger with the given name already exists'); + } + + self::$loggers[$name] = $logger; + } + + /** + * Checks if such logging channel exists by name or instance + * + * @param string|Logger $logger Name or logger instance + */ + public static function hasLogger($logger): bool + { + if ($logger instanceof Logger) { + $index = array_search($logger, self::$loggers, true); + + return false !== $index; + } + + return isset(self::$loggers[$logger]); + } + + /** + * Removes instance from registry by name or instance + * + * @param string|Logger $logger Name or logger instance + */ + public static function removeLogger($logger): void + { + if ($logger instanceof Logger) { + if (false !== ($idx = array_search($logger, self::$loggers, true))) { + unset(self::$loggers[$idx]); + } + } else { + unset(self::$loggers[$logger]); + } + } + + /** + * Clears the registry + */ + public static function clear(): void + { + self::$loggers = []; + } + + /** + * Gets Logger instance from the registry + * + * @param string $name Name of the requested Logger instance + * @throws \InvalidArgumentException If named Logger instance is not in the registry + */ + public static function getInstance($name): Logger + { + if (!isset(self::$loggers[$name])) { + throw new InvalidArgumentException(sprintf('Requested "%s" logger instance is not in the registry', $name)); + } + + return self::$loggers[$name]; + } + + /** + * Gets Logger instance from the registry via static method call + * + * @param string $name Name of the requested Logger instance + * @param mixed[] $arguments Arguments passed to static method call + * @throws \InvalidArgumentException If named Logger instance is not in the registry + * @return Logger Requested instance of Logger + */ + public static function __callStatic($name, $arguments) + { + return self::getInstance($name); + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/ResettableInterface.php b/pandora_console/vendor/monolog/monolog/src/Monolog/ResettableInterface.php new file mode 100644 index 0000000000..2c5fd78511 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/ResettableInterface.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +/** + * Handler or Processor implementing this interface will be reset when Logger::reset() is called. + * + * Resetting ends a log cycle gets them back to their initial state. + * + * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal + * state, and getting it back to a state in which it can receive log records again. + * + * This is useful in case you want to avoid logs leaking between two requests or jobs when you + * have a long running process like a worker or an application server serving multiple requests + * in one process. + * + * @author Grégoire Pineau + */ +interface ResettableInterface +{ + /** + * @return void + */ + public function reset(); +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/SignalHandler.php b/pandora_console/vendor/monolog/monolog/src/Monolog/SignalHandler.php new file mode 100644 index 0000000000..d730eea3ad --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/SignalHandler.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; +use ReflectionExtension; + +/** + * Monolog POSIX signal handler + * + * @author Robert Gust-Bardon + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class SignalHandler +{ + /** @var LoggerInterface */ + private $logger; + + /** @var array SIG_DFL, SIG_IGN or previous callable */ + private $previousSignalHandler = []; + /** @var array */ + private $signalLevelMap = []; + /** @var array */ + private $signalRestartSyscalls = []; + + public function __construct(LoggerInterface $logger) + { + $this->logger = $logger; + } + + /** + * @param int|string $level Level or level name + * @param bool $callPrevious + * @param bool $restartSyscalls + * @param bool|null $async + * @return $this + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function registerSignalHandler(int $signo, $level = LogLevel::CRITICAL, bool $callPrevious = true, bool $restartSyscalls = true, ?bool $async = true): self + { + if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) { + return $this; + } + + $level = Logger::toMonologLevel($level); + + if ($callPrevious) { + $handler = pcntl_signal_get_handler($signo); + $this->previousSignalHandler[$signo] = $handler; + } else { + unset($this->previousSignalHandler[$signo]); + } + $this->signalLevelMap[$signo] = $level; + $this->signalRestartSyscalls[$signo] = $restartSyscalls; + + if ($async !== null) { + pcntl_async_signals($async); + } + + pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls); + + return $this; + } + + /** + * @param mixed $siginfo + */ + public function handleSignal(int $signo, $siginfo = null): void + { + static $signals = []; + + if (!$signals && extension_loaded('pcntl')) { + $pcntl = new ReflectionExtension('pcntl'); + // HHVM 3.24.2 returns an empty array. + foreach ($pcntl->getConstants() ?: get_defined_constants(true)['Core'] as $name => $value) { + if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) { + $signals[$value] = $name; + } + } + } + + $level = $this->signalLevelMap[$signo] ?? LogLevel::CRITICAL; + $signal = $signals[$signo] ?? $signo; + $context = $siginfo ?? []; + $this->logger->log($level, sprintf('Program received signal %s', $signal), $context); + + if (!isset($this->previousSignalHandler[$signo])) { + return; + } + + if ($this->previousSignalHandler[$signo] === SIG_DFL) { + if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch') + && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill') + ) { + $restartSyscalls = $this->signalRestartSyscalls[$signo] ?? true; + pcntl_signal($signo, SIG_DFL, $restartSyscalls); + pcntl_sigprocmask(SIG_UNBLOCK, [$signo], $oldset); + posix_kill(posix_getpid(), $signo); + pcntl_signal_dispatch(); + pcntl_sigprocmask(SIG_SETMASK, $oldset); + pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls); + } + } elseif (is_callable($this->previousSignalHandler[$signo])) { + $this->previousSignalHandler[$signo]($signo, $siginfo); + } + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Test/TestCase.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Test/TestCase.php new file mode 100644 index 0000000000..bc0b425ea4 --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Test/TestCase.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Test; + +use Monolog\Logger; +use Monolog\DateTimeImmutable; +use Monolog\Formatter\FormatterInterface; + +/** + * Lets you easily generate log records and a dummy formatter for testing purposes + * + * @author Jordi Boggiano + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * + * @internal feel free to reuse this to test your own handlers, this is marked internal to avoid issues with PHPStorm https://github.com/Seldaek/monolog/issues/1677 + */ +class TestCase extends \PHPUnit\Framework\TestCase +{ + public function tearDown(): void + { + parent::tearDown(); + + if (isset($this->handler)) { + unset($this->handler); + } + } + + /** + * @param mixed[] $context + * + * @return array Record + * + * @phpstan-param Level $level + * @phpstan-return Record + */ + protected function getRecord(int $level = Logger::WARNING, string $message = 'test', array $context = []): array + { + return [ + 'message' => (string) $message, + 'context' => $context, + 'level' => $level, + 'level_name' => Logger::getLevelName($level), + 'channel' => 'test', + 'datetime' => new DateTimeImmutable(true), + 'extra' => [], + ]; + } + + /** + * @phpstan-return Record[] + */ + protected function getMultipleRecords(): array + { + return [ + $this->getRecord(Logger::DEBUG, 'debug message 1'), + $this->getRecord(Logger::DEBUG, 'debug message 2'), + $this->getRecord(Logger::INFO, 'information'), + $this->getRecord(Logger::WARNING, 'warning'), + $this->getRecord(Logger::ERROR, 'error'), + ]; + } + + protected function getIdentityFormatter(): FormatterInterface + { + $formatter = $this->createMock(FormatterInterface::class); + $formatter->expects($this->any()) + ->method('format') + ->will($this->returnCallback(function ($record) { + return $record['message']; + })); + + return $formatter; + } +} diff --git a/pandora_console/vendor/monolog/monolog/src/Monolog/Utils.php b/pandora_console/vendor/monolog/monolog/src/Monolog/Utils.php new file mode 100644 index 0000000000..360c42199c --- /dev/null +++ b/pandora_console/vendor/monolog/monolog/src/Monolog/Utils.php @@ -0,0 +1,284 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +final class Utils +{ + const DEFAULT_JSON_FLAGS = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION | JSON_INVALID_UTF8_SUBSTITUTE | JSON_PARTIAL_OUTPUT_ON_ERROR; + + public static function getClass(object $object): string + { + $class = \get_class($object); + + if (false === ($pos = \strpos($class, "@anonymous\0"))) { + return $class; + } + + if (false === ($parent = \get_parent_class($class))) { + return \substr($class, 0, $pos + 10); + } + + return $parent . '@anonymous'; + } + + public static function substr(string $string, int $start, ?int $length = null): string + { + if (extension_loaded('mbstring')) { + return mb_strcut($string, $start, $length); + } + + return substr($string, $start, (null === $length) ? strlen($string) : $length); + } + + /** + * Makes sure if a relative path is passed in it is turned into an absolute path + * + * @param string $streamUrl stream URL or path without protocol + */ + public static function canonicalizePath(string $streamUrl): string + { + $prefix = ''; + if ('file://' === substr($streamUrl, 0, 7)) { + $streamUrl = substr($streamUrl, 7); + $prefix = 'file://'; + } + + // other type of stream, not supported + if (false !== strpos($streamUrl, '://')) { + return $streamUrl; + } + + // already absolute + if (substr($streamUrl, 0, 1) === '/' || substr($streamUrl, 1, 1) === ':' || substr($streamUrl, 0, 2) === '\\\\') { + return $prefix.$streamUrl; + } + + $streamUrl = getcwd() . '/' . $streamUrl; + + return $prefix.$streamUrl; + } + + /** + * Return the JSON representation of a value + * + * @param mixed $data + * @param int $encodeFlags flags to pass to json encode, defaults to DEFAULT_JSON_FLAGS + * @param bool $ignoreErrors whether to ignore encoding errors or to throw on error, when ignored and the encoding fails, "null" is returned which is valid json for null + * @throws \RuntimeException if encoding fails and errors are not ignored + * @return string when errors are ignored and the encoding fails, "null" is returned which is valid json for null + */ + public static function jsonEncode($data, ?int $encodeFlags = null, bool $ignoreErrors = false): string + { + if (null === $encodeFlags) { + $encodeFlags = self::DEFAULT_JSON_FLAGS; + } + + if ($ignoreErrors) { + $json = @json_encode($data, $encodeFlags); + if (false === $json) { + return 'null'; + } + + return $json; + } + + $json = json_encode($data, $encodeFlags); + if (false === $json) { + $json = self::handleJsonError(json_last_error(), $data); + } + + return $json; + } + + /** + * Handle a json_encode failure. + * + * If the failure is due to invalid string encoding, try to clean the + * input and encode again. If the second encoding attempt fails, the + * initial error is not encoding related or the input can't be cleaned then + * raise a descriptive exception. + * + * @param int $code return code of json_last_error function + * @param mixed $data data that was meant to be encoded + * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION + * @throws \RuntimeException if failure can't be corrected + * @return string JSON encoded data after error correction + */ + public static function handleJsonError(int $code, $data, ?int $encodeFlags = null): string + { + if ($code !== JSON_ERROR_UTF8) { + self::throwEncodeError($code, $data); + } + + if (is_string($data)) { + self::detectAndCleanUtf8($data); + } elseif (is_array($data)) { + array_walk_recursive($data, array('Monolog\Utils', 'detectAndCleanUtf8')); + } else { + self::throwEncodeError($code, $data); + } + + if (null === $encodeFlags) { + $encodeFlags = self::DEFAULT_JSON_FLAGS; + } + + $json = json_encode($data, $encodeFlags); + + if ($json === false) { + self::throwEncodeError(json_last_error(), $data); + } + + return $json; + } + + /** + * @internal + */ + public static function pcreLastErrorMessage(int $code): string + { + if (PHP_VERSION_ID >= 80000) { + return preg_last_error_msg(); + } + + $constants = (get_defined_constants(true))['pcre']; + $constants = array_filter($constants, function ($key) { + return substr($key, -6) == '_ERROR'; + }, ARRAY_FILTER_USE_KEY); + + $constants = array_flip($constants); + + return $constants[$code] ?? 'UNDEFINED_ERROR'; + } + + /** + * Throws an exception according to a given code with a customized message + * + * @param int $code return code of json_last_error function + * @param mixed $data data that was meant to be encoded + * @throws \RuntimeException + * + * @return never + */ + private static function throwEncodeError(int $code, $data): void + { + switch ($code) { + case JSON_ERROR_DEPTH: + $msg = 'Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + $msg = 'Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + $msg = 'Unexpected control character found'; + break; + case JSON_ERROR_UTF8: + $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + $msg = 'Unknown error'; + } + + throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true)); + } + + /** + * Detect invalid UTF-8 string characters and convert to valid UTF-8. + * + * Valid UTF-8 input will be left unmodified, but strings containing + * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed + * original encoding of ISO-8859-15. This conversion may result in + * incorrect output if the actual encoding was not ISO-8859-15, but it + * will be clean UTF-8 output and will not rely on expensive and fragile + * detection algorithms. + * + * Function converts the input in place in the passed variable so that it + * can be used as a callback for array_walk_recursive. + * + * @param mixed $data Input to check and convert if needed, passed by ref + */ + private static function detectAndCleanUtf8(&$data): void + { + if (is_string($data) && !preg_match('//u', $data)) { + $data = preg_replace_callback( + '/[\x80-\xFF]+/', + function ($m) { + return function_exists('mb_convert_encoding') ? mb_convert_encoding($m[0], 'UTF-8', 'ISO-8859-1') : utf8_encode($m[0]); + }, + $data + ); + if (!is_string($data)) { + $pcreErrorCode = preg_last_error(); + throw new \RuntimeException('Failed to preg_replace_callback: ' . $pcreErrorCode . ' / ' . self::pcreLastErrorMessage($pcreErrorCode)); + } + $data = str_replace( + ['¤', '¦', '¨', '´', '¸', '¼', '½', '¾'], + ['€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'], + $data + ); + } + } + + /** + * Converts a string with a valid 'memory_limit' format, to bytes. + * + * @param string|false $val + * @return int|false Returns an integer representing bytes. Returns FALSE in case of error. + */ + public static function expandIniShorthandBytes($val) + { + if (!is_string($val)) { + return false; + } + + // support -1 + if ((int) $val < 0) { + return (int) $val; + } + + if (!preg_match('/^\s*(?\d+)(?:\.\d+)?\s*(?[gmk]?)\s*$/i', $val, $match)) { + return false; + } + + $val = (int) $match['val']; + switch (strtolower($match['unit'] ?? '')) { + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } + + return $val; + } + + /** + * @param array $record + */ + public static function getRecordMessageForException(array $record): string + { + $context = ''; + $extra = ''; + try { + if ($record['context']) { + $context = "\nContext: " . json_encode($record['context']); + } + if ($record['extra']) { + $extra = "\nExtra: " . json_encode($record['extra']); + } + } catch (\Throwable $e) { + // noop + } + + return "\nThe exception occurred while attempting to log: " . $record['message'] . $context . $extra; + } +} diff --git a/pandora_console/vendor/mpdf/mpdf/src/Mpdf.php b/pandora_console/vendor/mpdf/mpdf/src/Mpdf.php index 2c60309f83..ffe70a1f64 100644 --- a/pandora_console/vendor/mpdf/mpdf/src/Mpdf.php +++ b/pandora_console/vendor/mpdf/mpdf/src/Mpdf.php @@ -9478,6 +9478,8 @@ class Mpdf implements \Psr\Log\LoggerAwareInterface function Output($name = '', $dest = '') { $this->logger->debug(sprintf('PDF generated in %.6F seconds', microtime(true) - $this->time0), ['context' => LogContext::STATISTICS]); + // Set cokie token to indicate download is ready. + setDownloadCookieToken(); // Finish document if necessary if ($this->state < 3) { diff --git a/pandora_console/vendor/psr/log/Psr/Log/AbstractLogger.php b/pandora_console/vendor/psr/log/Psr/Log/AbstractLogger.php deleted file mode 100644 index e02f9daf3d..0000000000 --- a/pandora_console/vendor/psr/log/Psr/Log/AbstractLogger.php +++ /dev/null @@ -1,128 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function alert($message, array $context = array()) - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function critical($message, array $context = array()) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function error($message, array $context = array()) - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function warning($message, array $context = array()) - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function notice($message, array $context = array()) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function info($message, array $context = array()) - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string $message - * @param mixed[] $context - * - * @return void - */ - public function debug($message, array $context = array()) - { - $this->log(LogLevel::DEBUG, $message, $context); - } -} diff --git a/pandora_console/vendor/psr/log/Psr/Log/Test/DummyTest.php b/pandora_console/vendor/psr/log/Psr/Log/Test/DummyTest.php deleted file mode 100644 index 9638c11018..0000000000 --- a/pandora_console/vendor/psr/log/Psr/Log/Test/DummyTest.php +++ /dev/null @@ -1,18 +0,0 @@ - ". - * - * Example ->error('Foo') would yield "error Foo". - * - * @return string[] - */ - abstract public function getLogs(); - - public function testImplements() - { - $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger()); - } - - /** - * @dataProvider provideLevelsAndMessages - */ - public function testLogsAtAllLevels($level, $message) - { - $logger = $this->getLogger(); - $logger->{$level}($message, array('user' => 'Bob')); - $logger->log($level, $message, array('user' => 'Bob')); - - $expected = array( - $level.' message of level '.$level.' with context: Bob', - $level.' message of level '.$level.' with context: Bob', - ); - $this->assertEquals($expected, $this->getLogs()); - } - - public function provideLevelsAndMessages() - { - return array( - LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), - LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), - LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), - LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), - LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), - LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), - LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), - LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), - ); - } - - /** - * @expectedException \Psr\Log\InvalidArgumentException - */ - public function testThrowsOnInvalidLevel() - { - $logger = $this->getLogger(); - $logger->log('invalid level', 'Foo'); - } - - public function testContextReplacement() - { - $logger = $this->getLogger(); - $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); - - $expected = array('info {Message {nothing} Bob Bar a}'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testObjectCastToString() - { - if (method_exists($this, 'createPartialMock')) { - $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString')); - } else { - $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString')); - } - $dummy->expects($this->once()) - ->method('__toString') - ->will($this->returnValue('DUMMY')); - - $this->getLogger()->warning($dummy); - - $expected = array('warning DUMMY'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testContextCanContainAnything() - { - $closed = fopen('php://memory', 'r'); - fclose($closed); - - $context = array( - 'bool' => true, - 'null' => null, - 'string' => 'Foo', - 'int' => 0, - 'float' => 0.5, - 'nested' => array('with object' => new DummyTest), - 'object' => new \DateTime, - 'resource' => fopen('php://memory', 'r'), - 'closed' => $closed, - ); - - $this->getLogger()->warning('Crazy context data', $context); - - $expected = array('warning Crazy context data'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testContextExceptionKeyCanBeExceptionOrOtherValues() - { - $logger = $this->getLogger(); - $logger->warning('Random message', array('exception' => 'oops')); - $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); - - $expected = array( - 'warning Random message', - 'critical Uncaught Exception!' - ); - $this->assertEquals($expected, $this->getLogs()); - } -} diff --git a/pandora_console/vendor/psr/log/composer.json b/pandora_console/vendor/psr/log/composer.json index ca05695377..f3f066719d 100644 --- a/pandora_console/vendor/psr/log/composer.json +++ b/pandora_console/vendor/psr/log/composer.json @@ -11,16 +11,16 @@ } ], "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } } } diff --git a/pandora_console/vendor/psr/log/src/AbstractLogger.php b/pandora_console/vendor/psr/log/src/AbstractLogger.php new file mode 100644 index 0000000000..d60a091aff --- /dev/null +++ b/pandora_console/vendor/psr/log/src/AbstractLogger.php @@ -0,0 +1,15 @@ +log(LogLevel::EMERGENCY, $message, $context); } @@ -31,12 +31,12 @@ trait LoggerTrait * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * - * @param string $message + * @param string|\Stringable $message * @param array $context * * @return void */ - public function alert($message, array $context = array()) + public function alert(string|\Stringable $message, array $context = []) { $this->log(LogLevel::ALERT, $message, $context); } @@ -46,12 +46,12 @@ trait LoggerTrait * * Example: Application component unavailable, unexpected exception. * - * @param string $message + * @param string|\Stringable $message * @param array $context * * @return void */ - public function critical($message, array $context = array()) + public function critical(string|\Stringable $message, array $context = []) { $this->log(LogLevel::CRITICAL, $message, $context); } @@ -60,12 +60,12 @@ trait LoggerTrait * Runtime errors that do not require immediate action but should typically * be logged and monitored. * - * @param string $message + * @param string|\Stringable $message * @param array $context * * @return void */ - public function error($message, array $context = array()) + public function error(string|\Stringable $message, array $context = []) { $this->log(LogLevel::ERROR, $message, $context); } @@ -76,12 +76,12 @@ trait LoggerTrait * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * - * @param string $message + * @param string|\Stringable $message * @param array $context * * @return void */ - public function warning($message, array $context = array()) + public function warning(string|\Stringable $message, array $context = []) { $this->log(LogLevel::WARNING, $message, $context); } @@ -89,12 +89,12 @@ trait LoggerTrait /** * Normal but significant events. * - * @param string $message + * @param string|\Stringable $message * @param array $context * * @return void */ - public function notice($message, array $context = array()) + public function notice(string|\Stringable $message, array $context = []) { $this->log(LogLevel::NOTICE, $message, $context); } @@ -104,12 +104,12 @@ trait LoggerTrait * * Example: User logs in, SQL logs. * - * @param string $message + * @param string|\Stringable $message * @param array $context * * @return void */ - public function info($message, array $context = array()) + public function info(string|\Stringable $message, array $context = []) { $this->log(LogLevel::INFO, $message, $context); } @@ -117,12 +117,12 @@ trait LoggerTrait /** * Detailed debug information. * - * @param string $message + * @param string|\Stringable $message * @param array $context * * @return void */ - public function debug($message, array $context = array()) + public function debug(string|\Stringable $message, array $context = []) { $this->log(LogLevel::DEBUG, $message, $context); } @@ -131,12 +131,12 @@ trait LoggerTrait * Logs with an arbitrary level. * * @param mixed $level - * @param string $message + * @param string|\Stringable $message * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ - abstract public function log($level, $message, array $context = array()); + abstract public function log($level, string|\Stringable $message, array $context = []); } diff --git a/pandora_console/vendor/psr/log/Psr/Log/NullLogger.php b/pandora_console/vendor/psr/log/src/NullLogger.php similarity index 79% rename from pandora_console/vendor/psr/log/Psr/Log/NullLogger.php rename to pandora_console/vendor/psr/log/src/NullLogger.php index c8f7293b1c..5607705715 100644 --- a/pandora_console/vendor/psr/log/Psr/Log/NullLogger.php +++ b/pandora_console/vendor/psr/log/src/NullLogger.php @@ -16,14 +16,14 @@ class NullLogger extends AbstractLogger * Logs with an arbitrary level. * * @param mixed $level - * @param string $message - * @param array $context + * @param string|\Stringable $message + * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ - public function log($level, $message, array $context = array()) + public function log($level, string|\Stringable $message, array $context = []) { // noop } diff --git a/pandora_console/vendor/symfony/filesystem/CHANGELOG.md b/pandora_console/vendor/symfony/filesystem/CHANGELOG.md new file mode 100644 index 0000000000..fcb7170ca5 --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/CHANGELOG.md @@ -0,0 +1,82 @@ +CHANGELOG +========= + +5.4 +--- + + * Add `Path` class + * Add `$lock` argument to `Filesystem::appendToFile()` + +5.0.0 +----- + + * `Filesystem::dumpFile()` and `appendToFile()` don't accept arrays anymore + +4.4.0 +----- + + * support for passing a `null` value to `Filesystem::isAbsolutePath()` is deprecated and will be removed in 5.0 + * `tempnam()` now accepts a third argument `$suffix`. + +4.3.0 +----- + + * support for passing arrays to `Filesystem::dumpFile()` is deprecated and will be removed in 5.0 + * support for passing arrays to `Filesystem::appendToFile()` is deprecated and will be removed in 5.0 + +4.0.0 +----- + + * removed `LockHandler` + * Support for passing relative paths to `Filesystem::makePathRelative()` has been removed. + +3.4.0 +----- + + * support for passing relative paths to `Filesystem::makePathRelative()` is deprecated and will be removed in 4.0 + +3.3.0 +----- + + * added `appendToFile()` to append contents to existing files + +3.2.0 +----- + + * added `readlink()` as a platform independent method to read links + +3.0.0 +----- + + * removed `$mode` argument from `Filesystem::dumpFile()` + +2.8.0 +----- + + * added tempnam() a stream aware version of PHP's native tempnam() + +2.6.0 +----- + + * added LockHandler + +2.3.12 +------ + + * deprecated dumpFile() file mode argument. + +2.3.0 +----- + + * added the dumpFile() method to atomically write files + +2.2.0 +----- + + * added a delete option for the mirror() method + +2.1.0 +----- + + * 24eb396 : BC Break : mkdir() function now throws exception in case of failure instead of returning Boolean value + * created the component diff --git a/pandora_console/vendor/symfony/filesystem/Exception/ExceptionInterface.php b/pandora_console/vendor/symfony/filesystem/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..fc438d9f31 --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/Exception/ExceptionInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Filesystem\Exception; + +/** + * Exception interface for all exceptions thrown by the component. + * + * @author Romain Neutron + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/pandora_console/vendor/symfony/filesystem/Exception/FileNotFoundException.php b/pandora_console/vendor/symfony/filesystem/Exception/FileNotFoundException.php new file mode 100644 index 0000000000..48b6408095 --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/Exception/FileNotFoundException.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Filesystem\Exception; + +/** + * Exception class thrown when a file couldn't be found. + * + * @author Fabien Potencier + * @author Christian Gärtner + */ +class FileNotFoundException extends IOException +{ + public function __construct(string $message = null, int $code = 0, \Throwable $previous = null, string $path = null) + { + if (null === $message) { + if (null === $path) { + $message = 'File could not be found.'; + } else { + $message = sprintf('File "%s" could not be found.', $path); + } + } + + parent::__construct($message, $code, $previous, $path); + } +} diff --git a/pandora_console/vendor/symfony/filesystem/Exception/IOException.php b/pandora_console/vendor/symfony/filesystem/Exception/IOException.php new file mode 100644 index 0000000000..fea26e4ddc --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/Exception/IOException.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Filesystem\Exception; + +/** + * Exception class thrown when a filesystem operation failure happens. + * + * @author Romain Neutron + * @author Christian Gärtner + * @author Fabien Potencier + */ +class IOException extends \RuntimeException implements IOExceptionInterface +{ + private $path; + + public function __construct(string $message, int $code = 0, \Throwable $previous = null, string $path = null) + { + $this->path = $path; + + parent::__construct($message, $code, $previous); + } + + /** + * {@inheritdoc} + */ + public function getPath() + { + return $this->path; + } +} diff --git a/pandora_console/vendor/symfony/filesystem/Exception/IOExceptionInterface.php b/pandora_console/vendor/symfony/filesystem/Exception/IOExceptionInterface.php new file mode 100644 index 0000000000..42829ab6c2 --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/Exception/IOExceptionInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Filesystem\Exception; + +/** + * IOException interface for file and input/output stream related exceptions thrown by the component. + * + * @author Christian Gärtner + */ +interface IOExceptionInterface extends ExceptionInterface +{ + /** + * Returns the associated path for the exception. + * + * @return string|null + */ + public function getPath(); +} diff --git a/pandora_console/vendor/symfony/filesystem/Exception/InvalidArgumentException.php b/pandora_console/vendor/symfony/filesystem/Exception/InvalidArgumentException.php new file mode 100644 index 0000000000..abadc20029 --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/Exception/InvalidArgumentException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Filesystem\Exception; + +/** + * @author Christian Flothmann + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/pandora_console/vendor/symfony/filesystem/Exception/RuntimeException.php b/pandora_console/vendor/symfony/filesystem/Exception/RuntimeException.php new file mode 100644 index 0000000000..a7512dca73 --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/Exception/RuntimeException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Filesystem\Exception; + +/** + * @author Théo Fidry + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/pandora_console/vendor/symfony/filesystem/Filesystem.php b/pandora_console/vendor/symfony/filesystem/Filesystem.php new file mode 100644 index 0000000000..fafd364925 --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/Filesystem.php @@ -0,0 +1,769 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Filesystem; + +use Symfony\Component\Filesystem\Exception\FileNotFoundException; +use Symfony\Component\Filesystem\Exception\InvalidArgumentException; +use Symfony\Component\Filesystem\Exception\IOException; + +/** + * Provides basic utility to manipulate the file system. + * + * @author Fabien Potencier + */ +class Filesystem +{ + private static $lastError; + + /** + * Copies a file. + * + * If the target file is older than the origin file, it's always overwritten. + * If the target file is newer, it is overwritten only when the + * $overwriteNewerFiles option is set to true. + * + * @throws FileNotFoundException When originFile doesn't exist + * @throws IOException When copy fails + */ + public function copy(string $originFile, string $targetFile, bool $overwriteNewerFiles = false) + { + $originIsLocal = stream_is_local($originFile) || 0 === stripos($originFile, 'file://'); + if ($originIsLocal && !is_file($originFile)) { + throw new FileNotFoundException(sprintf('Failed to copy "%s" because file does not exist.', $originFile), 0, null, $originFile); + } + + $this->mkdir(\dirname($targetFile)); + + $doCopy = true; + if (!$overwriteNewerFiles && null === parse_url($originFile, \PHP_URL_HOST) && is_file($targetFile)) { + $doCopy = filemtime($originFile) > filemtime($targetFile); + } + + if ($doCopy) { + // https://bugs.php.net/64634 + if (!$source = self::box('fopen', $originFile, 'r')) { + throw new IOException(sprintf('Failed to copy "%s" to "%s" because source file could not be opened for reading: ', $originFile, $targetFile).self::$lastError, 0, null, $originFile); + } + + // Stream context created to allow files overwrite when using FTP stream wrapper - disabled by default + if (!$target = self::box('fopen', $targetFile, 'w', false, stream_context_create(['ftp' => ['overwrite' => true]]))) { + throw new IOException(sprintf('Failed to copy "%s" to "%s" because target file could not be opened for writing: ', $originFile, $targetFile).self::$lastError, 0, null, $originFile); + } + + $bytesCopied = stream_copy_to_stream($source, $target); + fclose($source); + fclose($target); + unset($source, $target); + + if (!is_file($targetFile)) { + throw new IOException(sprintf('Failed to copy "%s" to "%s".', $originFile, $targetFile), 0, null, $originFile); + } + + if ($originIsLocal) { + // Like `cp`, preserve executable permission bits + self::box('chmod', $targetFile, fileperms($targetFile) | (fileperms($originFile) & 0111)); + + if ($bytesCopied !== $bytesOrigin = filesize($originFile)) { + throw new IOException(sprintf('Failed to copy the whole content of "%s" to "%s" (%g of %g bytes copied).', $originFile, $targetFile, $bytesCopied, $bytesOrigin), 0, null, $originFile); + } + } + } + } + + /** + * Creates a directory recursively. + * + * @param string|iterable $dirs The directory path + * + * @throws IOException On any directory creation failure + */ + public function mkdir($dirs, int $mode = 0777) + { + foreach ($this->toIterable($dirs) as $dir) { + if (is_dir($dir)) { + continue; + } + + if (!self::box('mkdir', $dir, $mode, true) && !is_dir($dir)) { + throw new IOException(sprintf('Failed to create "%s": ', $dir).self::$lastError, 0, null, $dir); + } + } + } + + /** + * Checks the existence of files or directories. + * + * @param string|iterable $files A filename, an array of files, or a \Traversable instance to check + * + * @return bool + */ + public function exists($files) + { + $maxPathLength = \PHP_MAXPATHLEN - 2; + + foreach ($this->toIterable($files) as $file) { + if (\strlen($file) > $maxPathLength) { + throw new IOException(sprintf('Could not check if file exist because path length exceeds %d characters.', $maxPathLength), 0, null, $file); + } + + if (!file_exists($file)) { + return false; + } + } + + return true; + } + + /** + * Sets access and modification time of file. + * + * @param string|iterable $files A filename, an array of files, or a \Traversable instance to create + * @param int|null $time The touch time as a Unix timestamp, if not supplied the current system time is used + * @param int|null $atime The access time as a Unix timestamp, if not supplied the current system time is used + * + * @throws IOException When touch fails + */ + public function touch($files, int $time = null, int $atime = null) + { + foreach ($this->toIterable($files) as $file) { + if (!($time ? self::box('touch', $file, $time, $atime) : self::box('touch', $file))) { + throw new IOException(sprintf('Failed to touch "%s": ', $file).self::$lastError, 0, null, $file); + } + } + } + + /** + * Removes files or directories. + * + * @param string|iterable $files A filename, an array of files, or a \Traversable instance to remove + * + * @throws IOException When removal fails + */ + public function remove($files) + { + if ($files instanceof \Traversable) { + $files = iterator_to_array($files, false); + } elseif (!\is_array($files)) { + $files = [$files]; + } + + self::doRemove($files, false); + } + + private static function doRemove(array $files, bool $isRecursive): void + { + $files = array_reverse($files); + foreach ($files as $file) { + if (is_link($file)) { + // See https://bugs.php.net/52176 + if (!(self::box('unlink', $file) || '\\' !== \DIRECTORY_SEPARATOR || self::box('rmdir', $file)) && file_exists($file)) { + throw new IOException(sprintf('Failed to remove symlink "%s": ', $file).self::$lastError); + } + } elseif (is_dir($file)) { + if (!$isRecursive) { + $tmpName = \dirname(realpath($file)).'/.'.strrev(strtr(base64_encode(random_bytes(2)), '/=', '-.')); + + if (file_exists($tmpName)) { + try { + self::doRemove([$tmpName], true); + } catch (IOException $e) { + } + } + + if (!file_exists($tmpName) && self::box('rename', $file, $tmpName)) { + $origFile = $file; + $file = $tmpName; + } else { + $origFile = null; + } + } + + $files = new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS); + self::doRemove(iterator_to_array($files, true), true); + + if (!self::box('rmdir', $file) && file_exists($file) && !$isRecursive) { + $lastError = self::$lastError; + + if (null !== $origFile && self::box('rename', $file, $origFile)) { + $file = $origFile; + } + + throw new IOException(sprintf('Failed to remove directory "%s": ', $file).$lastError); + } + } elseif (!self::box('unlink', $file) && (str_contains(self::$lastError, 'Permission denied') || file_exists($file))) { + throw new IOException(sprintf('Failed to remove file "%s": ', $file).self::$lastError); + } + } + } + + /** + * Change mode for an array of files or directories. + * + * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change mode + * @param int $mode The new mode (octal) + * @param int $umask The mode mask (octal) + * @param bool $recursive Whether change the mod recursively or not + * + * @throws IOException When the change fails + */ + public function chmod($files, int $mode, int $umask = 0000, bool $recursive = false) + { + foreach ($this->toIterable($files) as $file) { + if ((\PHP_VERSION_ID < 80000 || \is_int($mode)) && !self::box('chmod', $file, $mode & ~$umask)) { + throw new IOException(sprintf('Failed to chmod file "%s": ', $file).self::$lastError, 0, null, $file); + } + if ($recursive && is_dir($file) && !is_link($file)) { + $this->chmod(new \FilesystemIterator($file), $mode, $umask, true); + } + } + } + + /** + * Change the owner of an array of files or directories. + * + * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change owner + * @param string|int $user A user name or number + * @param bool $recursive Whether change the owner recursively or not + * + * @throws IOException When the change fails + */ + public function chown($files, $user, bool $recursive = false) + { + foreach ($this->toIterable($files) as $file) { + if ($recursive && is_dir($file) && !is_link($file)) { + $this->chown(new \FilesystemIterator($file), $user, true); + } + if (is_link($file) && \function_exists('lchown')) { + if (!self::box('lchown', $file, $user)) { + throw new IOException(sprintf('Failed to chown file "%s": ', $file).self::$lastError, 0, null, $file); + } + } else { + if (!self::box('chown', $file, $user)) { + throw new IOException(sprintf('Failed to chown file "%s": ', $file).self::$lastError, 0, null, $file); + } + } + } + } + + /** + * Change the group of an array of files or directories. + * + * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change group + * @param string|int $group A group name or number + * @param bool $recursive Whether change the group recursively or not + * + * @throws IOException When the change fails + */ + public function chgrp($files, $group, bool $recursive = false) + { + foreach ($this->toIterable($files) as $file) { + if ($recursive && is_dir($file) && !is_link($file)) { + $this->chgrp(new \FilesystemIterator($file), $group, true); + } + if (is_link($file) && \function_exists('lchgrp')) { + if (!self::box('lchgrp', $file, $group)) { + throw new IOException(sprintf('Failed to chgrp file "%s": ', $file).self::$lastError, 0, null, $file); + } + } else { + if (!self::box('chgrp', $file, $group)) { + throw new IOException(sprintf('Failed to chgrp file "%s": ', $file).self::$lastError, 0, null, $file); + } + } + } + } + + /** + * Renames a file or a directory. + * + * @throws IOException When target file or directory already exists + * @throws IOException When origin cannot be renamed + */ + public function rename(string $origin, string $target, bool $overwrite = false) + { + // we check that target does not exist + if (!$overwrite && $this->isReadable($target)) { + throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target); + } + + if (!self::box('rename', $origin, $target)) { + if (is_dir($origin)) { + // See https://bugs.php.net/54097 & https://php.net/rename#113943 + $this->mirror($origin, $target, null, ['override' => $overwrite, 'delete' => $overwrite]); + $this->remove($origin); + + return; + } + throw new IOException(sprintf('Cannot rename "%s" to "%s": ', $origin, $target).self::$lastError, 0, null, $target); + } + } + + /** + * Tells whether a file exists and is readable. + * + * @throws IOException When windows path is longer than 258 characters + */ + private function isReadable(string $filename): bool + { + $maxPathLength = \PHP_MAXPATHLEN - 2; + + if (\strlen($filename) > $maxPathLength) { + throw new IOException(sprintf('Could not check if file is readable because path length exceeds %d characters.', $maxPathLength), 0, null, $filename); + } + + return is_readable($filename); + } + + /** + * Creates a symbolic link or copy a directory. + * + * @throws IOException When symlink fails + */ + public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = false) + { + self::assertFunctionExists('symlink'); + + if ('\\' === \DIRECTORY_SEPARATOR) { + $originDir = strtr($originDir, '/', '\\'); + $targetDir = strtr($targetDir, '/', '\\'); + + if ($copyOnWindows) { + $this->mirror($originDir, $targetDir); + + return; + } + } + + $this->mkdir(\dirname($targetDir)); + + if (is_link($targetDir)) { + if (readlink($targetDir) === $originDir) { + return; + } + $this->remove($targetDir); + } + + if (!self::box('symlink', $originDir, $targetDir)) { + $this->linkException($originDir, $targetDir, 'symbolic'); + } + } + + /** + * Creates a hard link, or several hard links to a file. + * + * @param string|string[] $targetFiles The target file(s) + * + * @throws FileNotFoundException When original file is missing or not a file + * @throws IOException When link fails, including if link already exists + */ + public function hardlink(string $originFile, $targetFiles) + { + self::assertFunctionExists('link'); + + if (!$this->exists($originFile)) { + throw new FileNotFoundException(null, 0, null, $originFile); + } + + if (!is_file($originFile)) { + throw new FileNotFoundException(sprintf('Origin file "%s" is not a file.', $originFile)); + } + + foreach ($this->toIterable($targetFiles) as $targetFile) { + if (is_file($targetFile)) { + if (fileinode($originFile) === fileinode($targetFile)) { + continue; + } + $this->remove($targetFile); + } + + if (!self::box('link', $originFile, $targetFile)) { + $this->linkException($originFile, $targetFile, 'hard'); + } + } + } + + /** + * @param string $linkType Name of the link type, typically 'symbolic' or 'hard' + */ + private function linkException(string $origin, string $target, string $linkType) + { + if (self::$lastError) { + if ('\\' === \DIRECTORY_SEPARATOR && str_contains(self::$lastError, 'error code(1314)')) { + throw new IOException(sprintf('Unable to create "%s" link due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?', $linkType), 0, null, $target); + } + } + throw new IOException(sprintf('Failed to create "%s" link from "%s" to "%s": ', $linkType, $origin, $target).self::$lastError, 0, null, $target); + } + + /** + * Resolves links in paths. + * + * With $canonicalize = false (default) + * - if $path does not exist or is not a link, returns null + * - if $path is a link, returns the next direct target of the link without considering the existence of the target + * + * With $canonicalize = true + * - if $path does not exist, returns null + * - if $path exists, returns its absolute fully resolved final version + * + * @return string|null + */ + public function readlink(string $path, bool $canonicalize = false) + { + if (!$canonicalize && !is_link($path)) { + return null; + } + + if ($canonicalize) { + if (!$this->exists($path)) { + return null; + } + + if ('\\' === \DIRECTORY_SEPARATOR && \PHP_VERSION_ID < 70410) { + $path = readlink($path); + } + + return realpath($path); + } + + if ('\\' === \DIRECTORY_SEPARATOR && \PHP_VERSION_ID < 70400) { + return realpath($path); + } + + return readlink($path); + } + + /** + * Given an existing path, convert it to a path relative to a given starting path. + * + * @return string + */ + public function makePathRelative(string $endPath, string $startPath) + { + if (!$this->isAbsolutePath($startPath)) { + throw new InvalidArgumentException(sprintf('The start path "%s" is not absolute.', $startPath)); + } + + if (!$this->isAbsolutePath($endPath)) { + throw new InvalidArgumentException(sprintf('The end path "%s" is not absolute.', $endPath)); + } + + // Normalize separators on Windows + if ('\\' === \DIRECTORY_SEPARATOR) { + $endPath = str_replace('\\', '/', $endPath); + $startPath = str_replace('\\', '/', $startPath); + } + + $splitDriveLetter = function ($path) { + return (\strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && ctype_alpha($path[0])) + ? [substr($path, 2), strtoupper($path[0])] + : [$path, null]; + }; + + $splitPath = function ($path) { + $result = []; + + foreach (explode('/', trim($path, '/')) as $segment) { + if ('..' === $segment) { + array_pop($result); + } elseif ('.' !== $segment && '' !== $segment) { + $result[] = $segment; + } + } + + return $result; + }; + + [$endPath, $endDriveLetter] = $splitDriveLetter($endPath); + [$startPath, $startDriveLetter] = $splitDriveLetter($startPath); + + $startPathArr = $splitPath($startPath); + $endPathArr = $splitPath($endPath); + + if ($endDriveLetter && $startDriveLetter && $endDriveLetter != $startDriveLetter) { + // End path is on another drive, so no relative path exists + return $endDriveLetter.':/'.($endPathArr ? implode('/', $endPathArr).'/' : ''); + } + + // Find for which directory the common path stops + $index = 0; + while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) { + ++$index; + } + + // Determine how deep the start path is relative to the common path (ie, "web/bundles" = 2 levels) + if (1 === \count($startPathArr) && '' === $startPathArr[0]) { + $depth = 0; + } else { + $depth = \count($startPathArr) - $index; + } + + // Repeated "../" for each level need to reach the common path + $traverser = str_repeat('../', $depth); + + $endPathRemainder = implode('/', \array_slice($endPathArr, $index)); + + // Construct $endPath from traversing to the common path, then to the remaining $endPath + $relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.'/' : ''); + + return '' === $relativePath ? './' : $relativePath; + } + + /** + * Mirrors a directory to another. + * + * Copies files and directories from the origin directory into the target directory. By default: + * + * - existing files in the target directory will be overwritten, except if they are newer (see the `override` option) + * - files in the target directory that do not exist in the source directory will not be deleted (see the `delete` option) + * + * @param \Traversable|null $iterator Iterator that filters which files and directories to copy, if null a recursive iterator is created + * @param array $options An array of boolean options + * Valid options are: + * - $options['override'] If true, target files newer than origin files are overwritten (see copy(), defaults to false) + * - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink(), defaults to false) + * - $options['delete'] Whether to delete files that are not in the source directory (defaults to false) + * + * @throws IOException When file type is unknown + */ + public function mirror(string $originDir, string $targetDir, \Traversable $iterator = null, array $options = []) + { + $targetDir = rtrim($targetDir, '/\\'); + $originDir = rtrim($originDir, '/\\'); + $originDirLen = \strlen($originDir); + + if (!$this->exists($originDir)) { + throw new IOException(sprintf('The origin directory specified "%s" was not found.', $originDir), 0, null, $originDir); + } + + // Iterate in destination folder to remove obsolete entries + if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) { + $deleteIterator = $iterator; + if (null === $deleteIterator) { + $flags = \FilesystemIterator::SKIP_DOTS; + $deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST); + } + $targetDirLen = \strlen($targetDir); + foreach ($deleteIterator as $file) { + $origin = $originDir.substr($file->getPathname(), $targetDirLen); + if (!$this->exists($origin)) { + $this->remove($file); + } + } + } + + $copyOnWindows = $options['copy_on_windows'] ?? false; + + if (null === $iterator) { + $flags = $copyOnWindows ? \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS : \FilesystemIterator::SKIP_DOTS; + $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST); + } + + $this->mkdir($targetDir); + $filesCreatedWhileMirroring = []; + + foreach ($iterator as $file) { + if ($file->getPathname() === $targetDir || $file->getRealPath() === $targetDir || isset($filesCreatedWhileMirroring[$file->getRealPath()])) { + continue; + } + + $target = $targetDir.substr($file->getPathname(), $originDirLen); + $filesCreatedWhileMirroring[$target] = true; + + if (!$copyOnWindows && is_link($file)) { + $this->symlink($file->getLinkTarget(), $target); + } elseif (is_dir($file)) { + $this->mkdir($target); + } elseif (is_file($file)) { + $this->copy($file, $target, $options['override'] ?? false); + } else { + throw new IOException(sprintf('Unable to guess "%s" file type.', $file), 0, null, $file); + } + } + } + + /** + * Returns whether the file path is an absolute path. + * + * @return bool + */ + public function isAbsolutePath(string $file) + { + return '' !== $file && (strspn($file, '/\\', 0, 1) + || (\strlen($file) > 3 && ctype_alpha($file[0]) + && ':' === $file[1] + && strspn($file, '/\\', 2, 1) + ) + || null !== parse_url($file, \PHP_URL_SCHEME) + ); + } + + /** + * Creates a temporary file with support for custom stream wrappers. + * + * @param string $prefix The prefix of the generated temporary filename + * Note: Windows uses only the first three characters of prefix + * @param string $suffix The suffix of the generated temporary filename + * + * @return string The new temporary filename (with path), or throw an exception on failure + */ + public function tempnam(string $dir, string $prefix/* , string $suffix = '' */) + { + $suffix = \func_num_args() > 2 ? func_get_arg(2) : ''; + [$scheme, $hierarchy] = $this->getSchemeAndHierarchy($dir); + + // If no scheme or scheme is "file" or "gs" (Google Cloud) create temp file in local filesystem + if ((null === $scheme || 'file' === $scheme || 'gs' === $scheme) && '' === $suffix) { + // If tempnam failed or no scheme return the filename otherwise prepend the scheme + if ($tmpFile = self::box('tempnam', $hierarchy, $prefix)) { + if (null !== $scheme && 'gs' !== $scheme) { + return $scheme.'://'.$tmpFile; + } + + return $tmpFile; + } + + throw new IOException('A temporary file could not be created: '.self::$lastError); + } + + // Loop until we create a valid temp file or have reached 10 attempts + for ($i = 0; $i < 10; ++$i) { + // Create a unique filename + $tmpFile = $dir.'/'.$prefix.uniqid(mt_rand(), true).$suffix; + + // Use fopen instead of file_exists as some streams do not support stat + // Use mode 'x+' to atomically check existence and create to avoid a TOCTOU vulnerability + if (!$handle = self::box('fopen', $tmpFile, 'x+')) { + continue; + } + + // Close the file if it was successfully opened + self::box('fclose', $handle); + + return $tmpFile; + } + + throw new IOException('A temporary file could not be created: '.self::$lastError); + } + + /** + * Atomically dumps content into a file. + * + * @param string|resource $content The data to write into the file + * + * @throws IOException if the file cannot be written to + */ + public function dumpFile(string $filename, $content) + { + if (\is_array($content)) { + throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); + } + + $dir = \dirname($filename); + + if (!is_dir($dir)) { + $this->mkdir($dir); + } + + // Will create a temp file with 0600 access rights + // when the filesystem supports chmod. + $tmpFile = $this->tempnam($dir, basename($filename)); + + try { + if (false === self::box('file_put_contents', $tmpFile, $content)) { + throw new IOException(sprintf('Failed to write file "%s": ', $filename).self::$lastError, 0, null, $filename); + } + + self::box('chmod', $tmpFile, file_exists($filename) ? fileperms($filename) : 0666 & ~umask()); + + $this->rename($tmpFile, $filename, true); + } finally { + if (file_exists($tmpFile)) { + self::box('unlink', $tmpFile); + } + } + } + + /** + * Appends content to an existing file. + * + * @param string|resource $content The content to append + * @param bool $lock Whether the file should be locked when writing to it + * + * @throws IOException If the file is not writable + */ + public function appendToFile(string $filename, $content/* , bool $lock = false */) + { + if (\is_array($content)) { + throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); + } + + $dir = \dirname($filename); + + if (!is_dir($dir)) { + $this->mkdir($dir); + } + + $lock = \func_num_args() > 2 && func_get_arg(2); + + if (false === self::box('file_put_contents', $filename, $content, \FILE_APPEND | ($lock ? \LOCK_EX : 0))) { + throw new IOException(sprintf('Failed to write file "%s": ', $filename).self::$lastError, 0, null, $filename); + } + } + + private function toIterable($files): iterable + { + return is_iterable($files) ? $files : [$files]; + } + + /** + * Gets a 2-tuple of scheme (may be null) and hierarchical part of a filename (e.g. file:///tmp -> [file, tmp]). + */ + private function getSchemeAndHierarchy(string $filename): array + { + $components = explode('://', $filename, 2); + + return 2 === \count($components) ? [$components[0], $components[1]] : [null, $components[0]]; + } + + private static function assertFunctionExists(string $func): void + { + if (!\function_exists($func)) { + throw new IOException(sprintf('Unable to perform filesystem operation because the "%s()" function has been disabled.', $func)); + } + } + + /** + * @param mixed ...$args + * + * @return mixed + */ + private static function box(string $func, ...$args) + { + self::assertFunctionExists($func); + + self::$lastError = null; + set_error_handler(__CLASS__.'::handleError'); + try { + return $func(...$args); + } finally { + restore_error_handler(); + } + } + + /** + * @internal + */ + public static function handleError(int $type, string $msg) + { + self::$lastError = $msg; + } +} diff --git a/pandora_console/vendor/symfony/filesystem/LICENSE b/pandora_console/vendor/symfony/filesystem/LICENSE new file mode 100644 index 0000000000..88bf75bb4d --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2022 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pandora_console/vendor/symfony/filesystem/Path.php b/pandora_console/vendor/symfony/filesystem/Path.php new file mode 100644 index 0000000000..9aa37355a8 --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/Path.php @@ -0,0 +1,819 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Filesystem; + +use Symfony\Component\Filesystem\Exception\InvalidArgumentException; +use Symfony\Component\Filesystem\Exception\RuntimeException; + +/** + * Contains utility methods for handling path strings. + * + * The methods in this class are able to deal with both UNIX and Windows paths + * with both forward and backward slashes. All methods return normalized parts + * containing only forward slashes and no excess "." and ".." segments. + * + * @author Bernhard Schussek + * @author Thomas Schulz + * @author Théo Fidry + */ +final class Path +{ + /** + * The number of buffer entries that triggers a cleanup operation. + */ + private const CLEANUP_THRESHOLD = 1250; + + /** + * The buffer size after the cleanup operation. + */ + private const CLEANUP_SIZE = 1000; + + /** + * Buffers input/output of {@link canonicalize()}. + * + * @var array + */ + private static $buffer = []; + + /** + * @var int + */ + private static $bufferSize = 0; + + /** + * Canonicalizes the given path. + * + * During normalization, all slashes are replaced by forward slashes ("/"). + * Furthermore, all "." and ".." segments are removed as far as possible. + * ".." segments at the beginning of relative paths are not removed. + * + * ```php + * echo Path::canonicalize("\symfony\puli\..\css\style.css"); + * // => /symfony/css/style.css + * + * echo Path::canonicalize("../css/./style.css"); + * // => ../css/style.css + * ``` + * + * This method is able to deal with both UNIX and Windows paths. + */ + public static function canonicalize(string $path): string + { + if ('' === $path) { + return ''; + } + + // This method is called by many other methods in this class. Buffer + // the canonicalized paths to make up for the severe performance + // decrease. + if (isset(self::$buffer[$path])) { + return self::$buffer[$path]; + } + + // Replace "~" with user's home directory. + if ('~' === $path[0]) { + $path = self::getHomeDirectory().substr($path, 1); + } + + $path = self::normalize($path); + + [$root, $pathWithoutRoot] = self::split($path); + + $canonicalParts = self::findCanonicalParts($root, $pathWithoutRoot); + + // Add the root directory again + self::$buffer[$path] = $canonicalPath = $root.implode('/', $canonicalParts); + ++self::$bufferSize; + + // Clean up regularly to prevent memory leaks + if (self::$bufferSize > self::CLEANUP_THRESHOLD) { + self::$buffer = \array_slice(self::$buffer, -self::CLEANUP_SIZE, null, true); + self::$bufferSize = self::CLEANUP_SIZE; + } + + return $canonicalPath; + } + + /** + * Normalizes the given path. + * + * During normalization, all slashes are replaced by forward slashes ("/"). + * Contrary to {@link canonicalize()}, this method does not remove invalid + * or dot path segments. Consequently, it is much more efficient and should + * be used whenever the given path is known to be a valid, absolute system + * path. + * + * This method is able to deal with both UNIX and Windows paths. + */ + public static function normalize(string $path): string + { + return str_replace('\\', '/', $path); + } + + /** + * Returns the directory part of the path. + * + * This method is similar to PHP's dirname(), but handles various cases + * where dirname() returns a weird result: + * + * - dirname() does not accept backslashes on UNIX + * - dirname("C:/symfony") returns "C:", not "C:/" + * - dirname("C:/") returns ".", not "C:/" + * - dirname("C:") returns ".", not "C:/" + * - dirname("symfony") returns ".", not "" + * - dirname() does not canonicalize the result + * + * This method fixes these shortcomings and behaves like dirname() + * otherwise. + * + * The result is a canonical path. + * + * @return string The canonical directory part. Returns the root directory + * if the root directory is passed. Returns an empty string + * if a relative path is passed that contains no slashes. + * Returns an empty string if an empty string is passed. + */ + public static function getDirectory(string $path): string + { + if ('' === $path) { + return ''; + } + + $path = self::canonicalize($path); + + // Maintain scheme + if (false !== $schemeSeparatorPosition = strpos($path, '://')) { + $scheme = substr($path, 0, $schemeSeparatorPosition + 3); + $path = substr($path, $schemeSeparatorPosition + 3); + } else { + $scheme = ''; + } + + if (false === $dirSeparatorPosition = strrpos($path, '/')) { + return ''; + } + + // Directory equals root directory "/" + if (0 === $dirSeparatorPosition) { + return $scheme.'/'; + } + + // Directory equals Windows root "C:/" + if (2 === $dirSeparatorPosition && ctype_alpha($path[0]) && ':' === $path[1]) { + return $scheme.substr($path, 0, 3); + } + + return $scheme.substr($path, 0, $dirSeparatorPosition); + } + + /** + * Returns canonical path of the user's home directory. + * + * Supported operating systems: + * + * - UNIX + * - Windows8 and upper + * + * If your operating system or environment isn't supported, an exception is thrown. + * + * The result is a canonical path. + * + * @throws RuntimeException If your operating system or environment isn't supported + */ + public static function getHomeDirectory(): string + { + // For UNIX support + if (getenv('HOME')) { + return self::canonicalize(getenv('HOME')); + } + + // For >= Windows8 support + if (getenv('HOMEDRIVE') && getenv('HOMEPATH')) { + return self::canonicalize(getenv('HOMEDRIVE').getenv('HOMEPATH')); + } + + throw new RuntimeException("Cannot find the home directory path: Your environment or operating system isn't supported."); + } + + /** + * Returns the root directory of a path. + * + * The result is a canonical path. + * + * @return string The canonical root directory. Returns an empty string if + * the given path is relative or empty. + */ + public static function getRoot(string $path): string + { + if ('' === $path) { + return ''; + } + + // Maintain scheme + if (false !== $schemeSeparatorPosition = strpos($path, '://')) { + $scheme = substr($path, 0, $schemeSeparatorPosition + 3); + $path = substr($path, $schemeSeparatorPosition + 3); + } else { + $scheme = ''; + } + + $firstCharacter = $path[0]; + + // UNIX root "/" or "\" (Windows style) + if ('/' === $firstCharacter || '\\' === $firstCharacter) { + return $scheme.'/'; + } + + $length = \strlen($path); + + // Windows root + if ($length > 1 && ':' === $path[1] && ctype_alpha($firstCharacter)) { + // Special case: "C:" + if (2 === $length) { + return $scheme.$path.'/'; + } + + // Normal case: "C:/ or "C:\" + if ('/' === $path[2] || '\\' === $path[2]) { + return $scheme.$firstCharacter.$path[1].'/'; + } + } + + return ''; + } + + /** + * Returns the file name without the extension from a file path. + * + * @param string|null $extension if specified, only that extension is cut + * off (may contain leading dot) + */ + public static function getFilenameWithoutExtension(string $path, string $extension = null): string + { + if ('' === $path) { + return ''; + } + + if (null !== $extension) { + // remove extension and trailing dot + return rtrim(basename($path, $extension), '.'); + } + + return pathinfo($path, \PATHINFO_FILENAME); + } + + /** + * Returns the extension from a file path (without leading dot). + * + * @param bool $forceLowerCase forces the extension to be lower-case + */ + public static function getExtension(string $path, bool $forceLowerCase = false): string + { + if ('' === $path) { + return ''; + } + + $extension = pathinfo($path, \PATHINFO_EXTENSION); + + if ($forceLowerCase) { + $extension = self::toLower($extension); + } + + return $extension; + } + + /** + * Returns whether the path has an (or the specified) extension. + * + * @param string $path the path string + * @param string|string[]|null $extensions if null or not provided, checks if + * an extension exists, otherwise + * checks for the specified extension + * or array of extensions (with or + * without leading dot) + * @param bool $ignoreCase whether to ignore case-sensitivity + */ + public static function hasExtension(string $path, $extensions = null, bool $ignoreCase = false): bool + { + if ('' === $path) { + return false; + } + + $actualExtension = self::getExtension($path, $ignoreCase); + + // Only check if path has any extension + if ([] === $extensions || null === $extensions) { + return '' !== $actualExtension; + } + + if (\is_string($extensions)) { + $extensions = [$extensions]; + } + + foreach ($extensions as $key => $extension) { + if ($ignoreCase) { + $extension = self::toLower($extension); + } + + // remove leading '.' in extensions array + $extensions[$key] = ltrim($extension, '.'); + } + + return \in_array($actualExtension, $extensions, true); + } + + /** + * Changes the extension of a path string. + * + * @param string $path The path string with filename.ext to change. + * @param string $extension new extension (with or without leading dot) + * + * @return string the path string with new file extension + */ + public static function changeExtension(string $path, string $extension): string + { + if ('' === $path) { + return ''; + } + + $actualExtension = self::getExtension($path); + $extension = ltrim($extension, '.'); + + // No extension for paths + if ('/' === substr($path, -1)) { + return $path; + } + + // No actual extension in path + if (empty($actualExtension)) { + return $path.('.' === substr($path, -1) ? '' : '.').$extension; + } + + return substr($path, 0, -\strlen($actualExtension)).$extension; + } + + public static function isAbsolute(string $path): bool + { + if ('' === $path) { + return false; + } + + // Strip scheme + if (false !== $schemeSeparatorPosition = strpos($path, '://')) { + $path = substr($path, $schemeSeparatorPosition + 3); + } + + $firstCharacter = $path[0]; + + // UNIX root "/" or "\" (Windows style) + if ('/' === $firstCharacter || '\\' === $firstCharacter) { + return true; + } + + // Windows root + if (\strlen($path) > 1 && ctype_alpha($firstCharacter) && ':' === $path[1]) { + // Special case: "C:" + if (2 === \strlen($path)) { + return true; + } + + // Normal case: "C:/ or "C:\" + if ('/' === $path[2] || '\\' === $path[2]) { + return true; + } + } + + return false; + } + + public static function isRelative(string $path): bool + { + return !self::isAbsolute($path); + } + + /** + * Turns a relative path into an absolute path in canonical form. + * + * Usually, the relative path is appended to the given base path. Dot + * segments ("." and "..") are removed/collapsed and all slashes turned + * into forward slashes. + * + * ```php + * echo Path::makeAbsolute("../style.css", "/symfony/puli/css"); + * // => /symfony/puli/style.css + * ``` + * + * If an absolute path is passed, that path is returned unless its root + * directory is different than the one of the base path. In that case, an + * exception is thrown. + * + * ```php + * Path::makeAbsolute("/style.css", "/symfony/puli/css"); + * // => /style.css + * + * Path::makeAbsolute("C:/style.css", "C:/symfony/puli/css"); + * // => C:/style.css + * + * Path::makeAbsolute("C:/style.css", "/symfony/puli/css"); + * // InvalidArgumentException + * ``` + * + * If the base path is not an absolute path, an exception is thrown. + * + * The result is a canonical path. + * + * @param string $basePath an absolute base path + * + * @throws InvalidArgumentException if the base path is not absolute or if + * the given path is an absolute path with + * a different root than the base path + */ + public static function makeAbsolute(string $path, string $basePath): string + { + if ('' === $basePath) { + throw new InvalidArgumentException(sprintf('The base path must be a non-empty string. Got: "%s".', $basePath)); + } + + if (!self::isAbsolute($basePath)) { + throw new InvalidArgumentException(sprintf('The base path "%s" is not an absolute path.', $basePath)); + } + + if (self::isAbsolute($path)) { + return self::canonicalize($path); + } + + if (false !== $schemeSeparatorPosition = strpos($basePath, '://')) { + $scheme = substr($basePath, 0, $schemeSeparatorPosition + 3); + $basePath = substr($basePath, $schemeSeparatorPosition + 3); + } else { + $scheme = ''; + } + + return $scheme.self::canonicalize(rtrim($basePath, '/\\').'/'.$path); + } + + /** + * Turns a path into a relative path. + * + * The relative path is created relative to the given base path: + * + * ```php + * echo Path::makeRelative("/symfony/style.css", "/symfony/puli"); + * // => ../style.css + * ``` + * + * If a relative path is passed and the base path is absolute, the relative + * path is returned unchanged: + * + * ```php + * Path::makeRelative("style.css", "/symfony/puli/css"); + * // => style.css + * ``` + * + * If both paths are relative, the relative path is created with the + * assumption that both paths are relative to the same directory: + * + * ```php + * Path::makeRelative("style.css", "symfony/puli/css"); + * // => ../../../style.css + * ``` + * + * If both paths are absolute, their root directory must be the same, + * otherwise an exception is thrown: + * + * ```php + * Path::makeRelative("C:/symfony/style.css", "/symfony/puli"); + * // InvalidArgumentException + * ``` + * + * If the passed path is absolute, but the base path is not, an exception + * is thrown as well: + * + * ```php + * Path::makeRelative("/symfony/style.css", "symfony/puli"); + * // InvalidArgumentException + * ``` + * + * If the base path is not an absolute path, an exception is thrown. + * + * The result is a canonical path. + * + * @throws InvalidArgumentException if the base path is not absolute or if + * the given path has a different root + * than the base path + */ + public static function makeRelative(string $path, string $basePath): string + { + $path = self::canonicalize($path); + $basePath = self::canonicalize($basePath); + + [$root, $relativePath] = self::split($path); + [$baseRoot, $relativeBasePath] = self::split($basePath); + + // If the base path is given as absolute path and the path is already + // relative, consider it to be relative to the given absolute path + // already + if ('' === $root && '' !== $baseRoot) { + // If base path is already in its root + if ('' === $relativeBasePath) { + $relativePath = ltrim($relativePath, './\\'); + } + + return $relativePath; + } + + // If the passed path is absolute, but the base path is not, we + // cannot generate a relative path + if ('' !== $root && '' === $baseRoot) { + throw new InvalidArgumentException(sprintf('The absolute path "%s" cannot be made relative to the relative path "%s". You should provide an absolute base path instead.', $path, $basePath)); + } + + // Fail if the roots of the two paths are different + if ($baseRoot && $root !== $baseRoot) { + throw new InvalidArgumentException(sprintf('The path "%s" cannot be made relative to "%s", because they have different roots ("%s" and "%s").', $path, $basePath, $root, $baseRoot)); + } + + if ('' === $relativeBasePath) { + return $relativePath; + } + + // Build a "../../" prefix with as many "../" parts as necessary + $parts = explode('/', $relativePath); + $baseParts = explode('/', $relativeBasePath); + $dotDotPrefix = ''; + + // Once we found a non-matching part in the prefix, we need to add + // "../" parts for all remaining parts + $match = true; + + foreach ($baseParts as $index => $basePart) { + if ($match && isset($parts[$index]) && $basePart === $parts[$index]) { + unset($parts[$index]); + + continue; + } + + $match = false; + $dotDotPrefix .= '../'; + } + + return rtrim($dotDotPrefix.implode('/', $parts), '/'); + } + + /** + * Returns whether the given path is on the local filesystem. + */ + public static function isLocal(string $path): bool + { + return '' !== $path && false === strpos($path, '://'); + } + + /** + * Returns the longest common base path in canonical form of a set of paths or + * `null` if the paths are on different Windows partitions. + * + * Dot segments ("." and "..") are removed/collapsed and all slashes turned + * into forward slashes. + * + * ```php + * $basePath = Path::getLongestCommonBasePath( + * '/symfony/css/style.css', + * '/symfony/css/..' + * ); + * // => /symfony + * ``` + * + * The root is returned if no common base path can be found: + * + * ```php + * $basePath = Path::getLongestCommonBasePath( + * '/symfony/css/style.css', + * '/puli/css/..' + * ); + * // => / + * ``` + * + * If the paths are located on different Windows partitions, `null` is + * returned. + * + * ```php + * $basePath = Path::getLongestCommonBasePath( + * 'C:/symfony/css/style.css', + * 'D:/symfony/css/..' + * ); + * // => null + * ``` + */ + public static function getLongestCommonBasePath(string ...$paths): ?string + { + [$bpRoot, $basePath] = self::split(self::canonicalize(reset($paths))); + + for (next($paths); null !== key($paths) && '' !== $basePath; next($paths)) { + [$root, $path] = self::split(self::canonicalize(current($paths))); + + // If we deal with different roots (e.g. C:/ vs. D:/), it's time + // to quit + if ($root !== $bpRoot) { + return null; + } + + // Make the base path shorter until it fits into path + while (true) { + if ('.' === $basePath) { + // No more base paths + $basePath = ''; + + // next path + continue 2; + } + + // Prevent false positives for common prefixes + // see isBasePath() + if (0 === strpos($path.'/', $basePath.'/')) { + // next path + continue 2; + } + + $basePath = \dirname($basePath); + } + } + + return $bpRoot.$basePath; + } + + /** + * Joins two or more path strings into a canonical path. + */ + public static function join(string ...$paths): string + { + $finalPath = null; + $wasScheme = false; + + foreach ($paths as $path) { + if ('' === $path) { + continue; + } + + if (null === $finalPath) { + // For first part we keep slashes, like '/top', 'C:\' or 'phar://' + $finalPath = $path; + $wasScheme = (false !== strpos($path, '://')); + continue; + } + + // Only add slash if previous part didn't end with '/' or '\' + if (!\in_array(substr($finalPath, -1), ['/', '\\'])) { + $finalPath .= '/'; + } + + // If first part included a scheme like 'phar://' we allow \current part to start with '/', otherwise trim + $finalPath .= $wasScheme ? $path : ltrim($path, '/'); + $wasScheme = false; + } + + if (null === $finalPath) { + return ''; + } + + return self::canonicalize($finalPath); + } + + /** + * Returns whether a path is a base path of another path. + * + * Dot segments ("." and "..") are removed/collapsed and all slashes turned + * into forward slashes. + * + * ```php + * Path::isBasePath('/symfony', '/symfony/css'); + * // => true + * + * Path::isBasePath('/symfony', '/symfony'); + * // => true + * + * Path::isBasePath('/symfony', '/symfony/..'); + * // => false + * + * Path::isBasePath('/symfony', '/puli'); + * // => false + * ``` + */ + public static function isBasePath(string $basePath, string $ofPath): bool + { + $basePath = self::canonicalize($basePath); + $ofPath = self::canonicalize($ofPath); + + // Append slashes to prevent false positives when two paths have + // a common prefix, for example /base/foo and /base/foobar. + // Don't append a slash for the root "/", because then that root + // won't be discovered as common prefix ("//" is not a prefix of + // "/foobar/"). + return 0 === strpos($ofPath.'/', rtrim($basePath, '/').'/'); + } + + /** + * @return string[] + */ + private static function findCanonicalParts(string $root, string $pathWithoutRoot): array + { + $parts = explode('/', $pathWithoutRoot); + + $canonicalParts = []; + + // Collapse "." and "..", if possible + foreach ($parts as $part) { + if ('.' === $part || '' === $part) { + continue; + } + + // Collapse ".." with the previous part, if one exists + // Don't collapse ".." if the previous part is also ".." + if ('..' === $part && \count($canonicalParts) > 0 && '..' !== $canonicalParts[\count($canonicalParts) - 1]) { + array_pop($canonicalParts); + + continue; + } + + // Only add ".." prefixes for relative paths + if ('..' !== $part || '' === $root) { + $canonicalParts[] = $part; + } + } + + return $canonicalParts; + } + + /** + * Splits a canonical path into its root directory and the remainder. + * + * If the path has no root directory, an empty root directory will be + * returned. + * + * If the root directory is a Windows style partition, the resulting root + * will always contain a trailing slash. + * + * list ($root, $path) = Path::split("C:/symfony") + * // => ["C:/", "symfony"] + * + * list ($root, $path) = Path::split("C:") + * // => ["C:/", ""] + * + * @return array{string, string} an array with the root directory and the remaining relative path + */ + private static function split(string $path): array + { + if ('' === $path) { + return ['', '']; + } + + // Remember scheme as part of the root, if any + if (false !== $schemeSeparatorPosition = strpos($path, '://')) { + $root = substr($path, 0, $schemeSeparatorPosition + 3); + $path = substr($path, $schemeSeparatorPosition + 3); + } else { + $root = ''; + } + + $length = \strlen($path); + + // Remove and remember root directory + if (0 === strpos($path, '/')) { + $root .= '/'; + $path = $length > 1 ? substr($path, 1) : ''; + } elseif ($length > 1 && ctype_alpha($path[0]) && ':' === $path[1]) { + if (2 === $length) { + // Windows special case: "C:" + $root .= $path.'/'; + $path = ''; + } elseif ('/' === $path[2]) { + // Windows normal case: "C:/".. + $root .= substr($path, 0, 3); + $path = $length > 3 ? substr($path, 3) : ''; + } + } + + return [$root, $path]; + } + + private static function toLower(string $string): string + { + if (false !== $encoding = mb_detect_encoding($string, null, true)) { + return mb_strtolower($string, $encoding); + } + + return strtolower($string); + } + + private function __construct() + { + } +} diff --git a/pandora_console/vendor/symfony/filesystem/README.md b/pandora_console/vendor/symfony/filesystem/README.md new file mode 100644 index 0000000000..f2f6d45f73 --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/README.md @@ -0,0 +1,13 @@ +Filesystem Component +==================== + +The Filesystem component provides basic utilities for the filesystem. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/filesystem.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/pandora_console/vendor/symfony/filesystem/composer.json b/pandora_console/vendor/symfony/filesystem/composer.json new file mode 100644 index 0000000000..e756104cd5 --- /dev/null +++ b/pandora_console/vendor/symfony/filesystem/composer.json @@ -0,0 +1,31 @@ +{ + "name": "symfony/filesystem", + "type": "library", + "description": "Provides basic utilities for the filesystem", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Filesystem\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev" +} diff --git a/pandora_console/vendor/symfony/polyfill-ctype/Ctype.php b/pandora_console/vendor/symfony/polyfill-ctype/Ctype.php new file mode 100644 index 0000000000..ba75a2c95f --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-ctype/Ctype.php @@ -0,0 +1,232 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Ctype; + +/** + * Ctype implementation through regex. + * + * @internal + * + * @author Gert de Pagter + */ +final class Ctype +{ + /** + * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. + * + * @see https://php.net/ctype-alnum + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_alnum($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is a letter, FALSE otherwise. + * + * @see https://php.net/ctype-alpha + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_alpha($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); + } + + /** + * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. + * + * @see https://php.net/ctype-cntrl + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_cntrl($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); + } + + /** + * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. + * + * @see https://php.net/ctype-digit + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_digit($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. + * + * @see https://php.net/ctype-graph + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_graph($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); + } + + /** + * Returns TRUE if every character in text is a lowercase letter. + * + * @see https://php.net/ctype-lower + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_lower($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); + } + + /** + * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. + * + * @see https://php.net/ctype-print + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_print($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); + } + + /** + * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. + * + * @see https://php.net/ctype-punct + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_punct($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); + } + + /** + * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. + * + * @see https://php.net/ctype-space + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_space($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); + } + + /** + * Returns TRUE if every character in text is an uppercase letter. + * + * @see https://php.net/ctype-upper + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_upper($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); + } + + /** + * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. + * + * @see https://php.net/ctype-xdigit + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_xdigit($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); + } + + /** + * Converts integers to their char versions according to normal ctype behaviour, if needed. + * + * If an integer between -128 and 255 inclusive is provided, + * it is interpreted as the ASCII value of a single character + * (negative values have 256 added in order to allow characters in the Extended ASCII range). + * Any other integer is interpreted as a string containing the decimal digits of the integer. + * + * @param mixed $int + * @param string $function + * + * @return mixed + */ + private static function convert_int_to_char_for_ctype($int, $function) + { + if (!\is_int($int)) { + return $int; + } + + if ($int < -128 || $int > 255) { + return (string) $int; + } + + if (\PHP_VERSION_ID >= 80100) { + @trigger_error($function.'(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED); + } + + if ($int < 0) { + $int += 256; + } + + return \chr($int); + } +} diff --git a/pandora_console/vendor/symfony/polyfill-ctype/LICENSE b/pandora_console/vendor/symfony/polyfill-ctype/LICENSE new file mode 100644 index 0000000000..3f853aaf35 --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-ctype/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pandora_console/vendor/symfony/polyfill-ctype/README.md b/pandora_console/vendor/symfony/polyfill-ctype/README.md new file mode 100644 index 0000000000..b144d03c3c --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-ctype/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Ctype +======================== + +This component provides `ctype_*` functions to users who run php versions without the ctype extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/pandora_console/vendor/symfony/polyfill-ctype/bootstrap.php b/pandora_console/vendor/symfony/polyfill-ctype/bootstrap.php new file mode 100644 index 0000000000..d54524b31b --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-ctype/bootstrap.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit($text) { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph($text) { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower($text) { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print($text) { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct($text) { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space($text) { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper($text) { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } +} diff --git a/pandora_console/vendor/symfony/polyfill-ctype/bootstrap80.php b/pandora_console/vendor/symfony/polyfill-ctype/bootstrap80.php new file mode 100644 index 0000000000..ab2f8611da --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-ctype/bootstrap80.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (!function_exists('ctype_alnum')) { + function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); } +} diff --git a/pandora_console/vendor/symfony/polyfill-ctype/composer.json b/pandora_console/vendor/symfony/polyfill-ctype/composer.json new file mode 100644 index 0000000000..1b3efff572 --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-ctype/composer.json @@ -0,0 +1,41 @@ +{ + "name": "symfony/polyfill-ctype", + "type": "library", + "description": "Symfony polyfill for ctype functions", + "keywords": ["polyfill", "compatibility", "portable", "ctype"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/pandora_console/vendor/symfony/polyfill-mbstring/Mbstring.php b/pandora_console/vendor/symfony/polyfill-mbstring/Mbstring.php index b65c54a6b5..bce5c4a84a 100644 --- a/pandora_console/vendor/symfony/polyfill-mbstring/Mbstring.php +++ b/pandora_console/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -80,7 +80,7 @@ final class Mbstring public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) { - if (\is_array($fromEncoding) || ($fromEncoding !== null && false !== strpos($fromEncoding, ','))) { + if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) { $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); } else { $fromEncoding = self::getEncoding($fromEncoding); @@ -102,7 +102,7 @@ final class Mbstring $fromEncoding = 'Windows-1252'; } if ('UTF-8' !== $fromEncoding) { - $s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s); + $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); } return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); @@ -113,7 +113,7 @@ final class Mbstring $fromEncoding = 'UTF-8'; } - return \iconv($fromEncoding, $toEncoding.'//IGNORE', $s); + return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); } public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) @@ -130,7 +130,7 @@ final class Mbstring public static function mb_decode_mimeheader($s) { - return \iconv_mime_decode($s, 2, self::$internalEncoding); + return iconv_mime_decode($s, 2, self::$internalEncoding); } public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) @@ -140,7 +140,7 @@ final class Mbstring public static function mb_decode_numericentity($s, $convmap, $encoding = null) { - if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; @@ -150,7 +150,7 @@ final class Mbstring return false; } - if (null !== $encoding && !is_scalar($encoding)) { + if (null !== $encoding && !\is_scalar($encoding)) { trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); return ''; // Instead of null (cf. mb_encode_numericentity). @@ -166,10 +166,10 @@ final class Mbstring if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + $s = iconv($encoding, 'UTF-8//IGNORE', $s); } $cnt = floor(\count($convmap) / 4) * 4; @@ -195,12 +195,12 @@ final class Mbstring return $s; } - return \iconv('UTF-8', $encoding.'//IGNORE', $s); + return iconv('UTF-8', $encoding.'//IGNORE', $s); } public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) { - if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; @@ -210,13 +210,13 @@ final class Mbstring return false; } - if (null !== $encoding && !is_scalar($encoding)) { + if (null !== $encoding && !\is_scalar($encoding)) { trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); return null; // Instead of '' (cf. mb_decode_numericentity). } - if (null !== $is_hex && !is_scalar($is_hex)) { + if (null !== $is_hex && !\is_scalar($is_hex)) { trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); return null; @@ -232,10 +232,10 @@ final class Mbstring if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + $s = iconv($encoding, 'UTF-8//IGNORE', $s); } static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; @@ -265,7 +265,7 @@ final class Mbstring return $result; } - return \iconv('UTF-8', $encoding.'//IGNORE', $result); + return iconv('UTF-8', $encoding.'//IGNORE', $result); } public static function mb_convert_case($s, $mode, $encoding = null) @@ -280,10 +280,10 @@ final class Mbstring if ('UTF-8' === $encoding) { $encoding = null; if (!preg_match('//u', $s)) { - $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + $s = iconv($encoding, 'UTF-8//IGNORE', $s); } if (\MB_CASE_TITLE == $mode) { @@ -343,7 +343,7 @@ final class Mbstring return $s; } - return \iconv('UTF-8', $encoding.'//IGNORE', $s); + return iconv('UTF-8', $encoding.'//IGNORE', $s); } public static function mb_internal_encoding($encoding = null) @@ -354,7 +354,7 @@ final class Mbstring $normalizedEncoding = self::getEncoding($encoding); - if ('UTF-8' === $normalizedEncoding || false !== @\iconv($normalizedEncoding, $normalizedEncoding, ' ')) { + if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) { self::$internalEncoding = $normalizedEncoding; return true; @@ -413,7 +413,7 @@ final class Mbstring $encoding = self::$internalEncoding; } - return self::mb_detect_encoding($var, [$encoding]) || false !== @\iconv($encoding, $encoding, $var); + return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); } public static function mb_detect_encoding($str, $encodingList = null, $strict = false) @@ -488,7 +488,7 @@ final class Mbstring return \strlen($s); } - return @\iconv_strlen($s, $encoding); + return @iconv_strlen($s, $encoding); } public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) @@ -509,7 +509,7 @@ final class Mbstring return 0; } - return \iconv_strpos($haystack, $needle, $offset, $encoding); + return iconv_strpos($haystack, $needle, $offset, $encoding); } public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) @@ -533,7 +533,7 @@ final class Mbstring } $pos = '' !== $needle || 80000 > \PHP_VERSION_ID - ? \iconv_strrpos($haystack, $needle, $encoding) + ? iconv_strrpos($haystack, $needle, $encoding) : self::mb_strlen($haystack, $encoding); return false !== $pos ? $offset + $pos : false; @@ -541,7 +541,7 @@ final class Mbstring public static function mb_str_split($string, $split_length = 1, $encoding = null) { - if (null !== $string && !is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { + if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); return null; @@ -550,6 +550,7 @@ final class Mbstring if (1 > $split_length = (int) $split_length) { if (80000 > \PHP_VERSION_ID) { trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); + return false; } @@ -568,7 +569,7 @@ final class Mbstring } $rx .= '.{'.$split_length.'})/us'; - return preg_split($rx, $string, null, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); + return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); } $result = []; @@ -617,7 +618,7 @@ final class Mbstring } if ($start < 0) { - $start = \iconv_strlen($s, $encoding) + $start; + $start = iconv_strlen($s, $encoding) + $start; if ($start < 0) { $start = 0; } @@ -626,13 +627,13 @@ final class Mbstring if (null === $length) { $length = 2147483647; } elseif ($length < 0) { - $length = \iconv_strlen($s, $encoding) + $length - $start; + $length = iconv_strlen($s, $encoding) + $length - $start; if ($length < 0) { return ''; } } - return (string) \iconv_substr($s, $start, $length, $encoding); + return (string) iconv_substr($s, $start, $length, $encoding); } public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) @@ -657,7 +658,7 @@ final class Mbstring $pos = strrpos($haystack, $needle); } else { $needle = self::mb_substr($needle, 0, 1, $encoding); - $pos = \iconv_strrpos($haystack, $needle, $encoding); + $pos = iconv_strrpos($haystack, $needle, $encoding); } return self::getSubpart($pos, $part, $haystack, $encoding); @@ -736,12 +737,12 @@ final class Mbstring $encoding = self::getEncoding($encoding); if ('UTF-8' !== $encoding) { - $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + $s = iconv($encoding, 'UTF-8//IGNORE', $s); } $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); - return ($wide << 1) + \iconv_strlen($s, 'UTF-8'); + return ($wide << 1) + iconv_strlen($s, 'UTF-8'); } public static function mb_substr_count($haystack, $needle, $encoding = null) diff --git a/pandora_console/vendor/symfony/polyfill-mbstring/README.md b/pandora_console/vendor/symfony/polyfill-mbstring/README.md index 4efb599d81..478b40da25 100644 --- a/pandora_console/vendor/symfony/polyfill-mbstring/README.md +++ b/pandora_console/vendor/symfony/polyfill-mbstring/README.md @@ -5,7 +5,7 @@ This component provides a partial, native PHP implementation for the [Mbstring](https://php.net/mbstring) extension. More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/pandora_console/vendor/symfony/polyfill-mbstring/bootstrap80.php b/pandora_console/vendor/symfony/polyfill-mbstring/bootstrap80.php index e0a1eadcc3..82f5ac4d0f 100644 --- a/pandora_console/vendor/symfony/polyfill-mbstring/bootstrap80.php +++ b/pandora_console/vendor/symfony/polyfill-mbstring/bootstrap80.php @@ -122,7 +122,7 @@ if (!function_exists('mb_chr')) { function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } } if (!function_exists('mb_scrub')) { - function mb_scrub(?string $string, ?string $encoding = null): string { $encoding = ($encoding ?? mb_internal_encoding()); return mb_convert_encoding((string) $string, $encoding, $encoding); } + function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); } } if (!function_exists('mb_str_split')) { function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } diff --git a/pandora_console/vendor/symfony/polyfill-mbstring/composer.json b/pandora_console/vendor/symfony/polyfill-mbstring/composer.json index 1fa21ca16c..44895536ba 100644 --- a/pandora_console/vendor/symfony/polyfill-mbstring/composer.json +++ b/pandora_console/vendor/symfony/polyfill-mbstring/composer.json @@ -31,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/pandora_console/vendor/symfony/polyfill-php80/LICENSE b/pandora_console/vendor/symfony/polyfill-php80/LICENSE new file mode 100644 index 0000000000..5593b1d84f --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pandora_console/vendor/symfony/polyfill-php80/Php80.php b/pandora_console/vendor/symfony/polyfill-php80/Php80.php new file mode 100644 index 0000000000..362dd1a959 --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/Php80.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Ion Bazan + * @author Nico Oelgart + * @author Nicolas Grekas + * + * @internal + */ +final class Php80 +{ + public static function fdiv(float $dividend, float $divisor): float + { + return @($dividend / $divisor); + } + + public static function get_debug_type($value): string + { + switch (true) { + case null === $value: return 'null'; + case \is_bool($value): return 'bool'; + case \is_string($value): return 'string'; + case \is_array($value): return 'array'; + case \is_int($value): return 'int'; + case \is_float($value): return 'float'; + case \is_object($value): break; + case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; + default: + if (null === $type = @get_resource_type($value)) { + return 'unknown'; + } + + if ('Unknown' === $type) { + $type = 'closed'; + } + + return "resource ($type)"; + } + + $class = \get_class($value); + + if (false === strpos($class, '@')) { + return $class; + } + + return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; + } + + public static function get_resource_id($res): int + { + if (!\is_resource($res) && null === @get_resource_type($res)) { + throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); + } + + return (int) $res; + } + + public static function preg_last_error_msg(): string + { + switch (preg_last_error()) { + case \PREG_INTERNAL_ERROR: + return 'Internal error'; + case \PREG_BAD_UTF8_ERROR: + return 'Malformed UTF-8 characters, possibly incorrectly encoded'; + case \PREG_BAD_UTF8_OFFSET_ERROR: + return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; + case \PREG_BACKTRACK_LIMIT_ERROR: + return 'Backtrack limit exhausted'; + case \PREG_RECURSION_LIMIT_ERROR: + return 'Recursion limit exhausted'; + case \PREG_JIT_STACKLIMIT_ERROR: + return 'JIT stack limit exhausted'; + case \PREG_NO_ERROR: + return 'No error'; + default: + return 'Unknown error'; + } + } + + public static function str_contains(string $haystack, string $needle): bool + { + return '' === $needle || false !== strpos($haystack, $needle); + } + + public static function str_starts_with(string $haystack, string $needle): bool + { + return 0 === strncmp($haystack, $needle, \strlen($needle)); + } + + public static function str_ends_with(string $haystack, string $needle): bool + { + if ('' === $needle || $needle === $haystack) { + return true; + } + + if ('' === $haystack) { + return false; + } + + $needleLength = \strlen($needle); + + return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength); + } +} diff --git a/pandora_console/vendor/symfony/polyfill-php80/PhpToken.php b/pandora_console/vendor/symfony/polyfill-php80/PhpToken.php new file mode 100644 index 0000000000..fe6e691056 --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/PhpToken.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Fedonyuk Anton + * + * @internal + */ +class PhpToken implements \Stringable +{ + /** + * @var int + */ + public $id; + + /** + * @var string + */ + public $text; + + /** + * @var int + */ + public $line; + + /** + * @var int + */ + public $pos; + + public function __construct(int $id, string $text, int $line = -1, int $position = -1) + { + $this->id = $id; + $this->text = $text; + $this->line = $line; + $this->pos = $position; + } + + public function getTokenName(): ?string + { + if ('UNKNOWN' === $name = token_name($this->id)) { + $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text; + } + + return $name; + } + + /** + * @param int|string|array $kind + */ + public function is($kind): bool + { + foreach ((array) $kind as $value) { + if (\in_array($value, [$this->id, $this->text], true)) { + return true; + } + } + + return false; + } + + public function isIgnorable(): bool + { + return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true); + } + + public function __toString(): string + { + return (string) $this->text; + } + + /** + * @return static[] + */ + public static function tokenize(string $code, int $flags = 0): array + { + $line = 1; + $position = 0; + $tokens = token_get_all($code, $flags); + foreach ($tokens as $index => $token) { + if (\is_string($token)) { + $id = \ord($token); + $text = $token; + } else { + [$id, $text, $line] = $token; + } + $tokens[$index] = new static($id, $text, $line, $position); + $position += \strlen($text); + } + + return $tokens; + } +} diff --git a/pandora_console/vendor/symfony/polyfill-php80/README.md b/pandora_console/vendor/symfony/polyfill-php80/README.md new file mode 100644 index 0000000000..3816c559d5 --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/README.md @@ -0,0 +1,25 @@ +Symfony Polyfill / Php80 +======================== + +This component provides features added to PHP 8.0 core: + +- [`Stringable`](https://php.net/stringable) interface +- [`fdiv`](https://php.net/fdiv) +- [`ValueError`](https://php.net/valueerror) class +- [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class +- `FILTER_VALIDATE_BOOL` constant +- [`get_debug_type`](https://php.net/get_debug_type) +- [`PhpToken`](https://php.net/phptoken) class +- [`preg_last_error_msg`](https://php.net/preg_last_error_msg) +- [`str_contains`](https://php.net/str_contains) +- [`str_starts_with`](https://php.net/str_starts_with) +- [`str_ends_with`](https://php.net/str_ends_with) +- [`get_resource_id`](https://php.net/get_resource_id) + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php new file mode 100644 index 0000000000..2b955423fc --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#[Attribute(Attribute::TARGET_CLASS)] +final class Attribute +{ + public const TARGET_CLASS = 1; + public const TARGET_FUNCTION = 2; + public const TARGET_METHOD = 4; + public const TARGET_PROPERTY = 8; + public const TARGET_CLASS_CONSTANT = 16; + public const TARGET_PARAMETER = 32; + public const TARGET_ALL = 63; + public const IS_REPEATABLE = 64; + + /** @var int */ + public $flags; + + public function __construct(int $flags = self::TARGET_ALL) + { + $this->flags = $flags; + } +} diff --git a/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php new file mode 100644 index 0000000000..bd1212f6e4 --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) { + class PhpToken extends Symfony\Polyfill\Php80\PhpToken + { + } +} diff --git a/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php new file mode 100644 index 0000000000..7c62d7508b --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + interface Stringable + { + /** + * @return string + */ + public function __toString(); + } +} diff --git a/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php b/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php new file mode 100644 index 0000000000..01c6c6c8ab --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + class UnhandledMatchError extends Error + { + } +} diff --git a/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php b/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php new file mode 100644 index 0000000000..783dbc28c7 --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + class ValueError extends Error + { + } +} diff --git a/pandora_console/vendor/symfony/polyfill-php80/bootstrap.php b/pandora_console/vendor/symfony/polyfill-php80/bootstrap.php new file mode 100644 index 0000000000..e5f7dbc1a4 --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/bootstrap.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Php80 as p; + +if (\PHP_VERSION_ID >= 80000) { + return; +} + +if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) { + define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN); +} + +if (!function_exists('fdiv')) { + function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); } +} +if (!function_exists('preg_last_error_msg')) { + function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); } +} +if (!function_exists('str_contains')) { + function str_contains(?string $haystack, ?string $needle): bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('str_starts_with')) { + function str_starts_with(?string $haystack, ?string $needle): bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('str_ends_with')) { + function str_ends_with(?string $haystack, ?string $needle): bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('get_debug_type')) { + function get_debug_type($value): string { return p\Php80::get_debug_type($value); } +} +if (!function_exists('get_resource_id')) { + function get_resource_id($resource): int { return p\Php80::get_resource_id($resource); } +} diff --git a/pandora_console/vendor/symfony/polyfill-php80/composer.json b/pandora_console/vendor/symfony/polyfill-php80/composer.json new file mode 100644 index 0000000000..bd9a3262a9 --- /dev/null +++ b/pandora_console/vendor/symfony/polyfill-php80/composer.json @@ -0,0 +1,40 @@ +{ + "name": "symfony/polyfill-php80", + "type": "library", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "keywords": ["polyfill", "shim", "compatibility", "portable"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, + "files": [ "bootstrap.php" ], + "classmap": [ "Resources/stubs" ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/pandora_console/vendor/symfony/process/CHANGELOG.md b/pandora_console/vendor/symfony/process/CHANGELOG.md new file mode 100644 index 0000000000..31b9ee6a25 --- /dev/null +++ b/pandora_console/vendor/symfony/process/CHANGELOG.md @@ -0,0 +1,116 @@ +CHANGELOG +========= + +5.2.0 +----- + + * added `Process::setOptions()` to set `Process` specific options + * added option `create_new_console` to allow a subprocess to continue + to run after the main script exited, both on Linux and on Windows + +5.1.0 +----- + + * added `Process::getStartTime()` to retrieve the start time of the process as float + +5.0.0 +----- + + * removed `Process::inheritEnvironmentVariables()` + * removed `PhpProcess::setPhpBinary()` + * `Process` must be instantiated with a command array, use `Process::fromShellCommandline()` when the command should be parsed by the shell + * removed `Process::setCommandLine()` + +4.4.0 +----- + + * deprecated `Process::inheritEnvironmentVariables()`: env variables are always inherited. + * added `Process::getLastOutputTime()` method + +4.2.0 +----- + + * added the `Process::fromShellCommandline()` to run commands in a shell wrapper + * deprecated passing a command as string when creating a `Process` instance + * deprecated the `Process::setCommandline()` and the `PhpProcess::setPhpBinary()` methods + * added the `Process::waitUntil()` method to wait for the process only for a + specific output, then continue the normal execution of your application + +4.1.0 +----- + + * added the `Process::isTtySupported()` method that allows to check for TTY support + * made `PhpExecutableFinder` look for the `PHP_BINARY` env var when searching the php binary + * added the `ProcessSignaledException` class to properly catch signaled process errors + +4.0.0 +----- + + * environment variables will always be inherited + * added a second `array $env = []` argument to the `start()`, `run()`, + `mustRun()`, and `restart()` methods of the `Process` class + * added a second `array $env = []` argument to the `start()` method of the + `PhpProcess` class + * the `ProcessUtils::escapeArgument()` method has been removed + * the `areEnvironmentVariablesInherited()`, `getOptions()`, and `setOptions()` + methods of the `Process` class have been removed + * support for passing `proc_open()` options has been removed + * removed the `ProcessBuilder` class, use the `Process` class instead + * removed the `getEnhanceWindowsCompatibility()` and `setEnhanceWindowsCompatibility()` methods of the `Process` class + * passing a not existing working directory to the constructor of the `Symfony\Component\Process\Process` class is not + supported anymore + +3.4.0 +----- + + * deprecated the ProcessBuilder class + * deprecated calling `Process::start()` without setting a valid working directory beforehand (via `setWorkingDirectory()` or constructor) + +3.3.0 +----- + + * added command line arrays in the `Process` class + * added `$env` argument to `Process::start()`, `run()`, `mustRun()` and `restart()` methods + * deprecated the `ProcessUtils::escapeArgument()` method + * deprecated not inheriting environment variables + * deprecated configuring `proc_open()` options + * deprecated configuring enhanced Windows compatibility + * deprecated configuring enhanced sigchild compatibility + +2.5.0 +----- + + * added support for PTY mode + * added the convenience method "mustRun" + * deprecation: Process::setStdin() is deprecated in favor of Process::setInput() + * deprecation: Process::getStdin() is deprecated in favor of Process::getInput() + * deprecation: Process::setInput() and ProcessBuilder::setInput() do not accept non-scalar types + +2.4.0 +----- + + * added the ability to define an idle timeout + +2.3.0 +----- + + * added ProcessUtils::escapeArgument() to fix the bug in escapeshellarg() function on Windows + * added Process::signal() + * added Process::getPid() + * added support for a TTY mode + +2.2.0 +----- + + * added ProcessBuilder::setArguments() to reset the arguments on a builder + * added a way to retrieve the standard and error output incrementally + * added Process:restart() + +2.1.0 +----- + + * added support for non-blocking processes (start(), wait(), isRunning(), stop()) + * enhanced Windows compatibility + * added Process::getExitCodeText() that returns a string representation for + the exit code returned by the process + * added ProcessBuilder diff --git a/pandora_console/vendor/symfony/process/Exception/ExceptionInterface.php b/pandora_console/vendor/symfony/process/Exception/ExceptionInterface.php new file mode 100644 index 0000000000..bd4a60403b --- /dev/null +++ b/pandora_console/vendor/symfony/process/Exception/ExceptionInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +/** + * Marker Interface for the Process Component. + * + * @author Johannes M. Schmitt + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/pandora_console/vendor/symfony/process/Exception/InvalidArgumentException.php b/pandora_console/vendor/symfony/process/Exception/InvalidArgumentException.php new file mode 100644 index 0000000000..926ee2118b --- /dev/null +++ b/pandora_console/vendor/symfony/process/Exception/InvalidArgumentException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +/** + * InvalidArgumentException for the Process Component. + * + * @author Romain Neutron + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/pandora_console/vendor/symfony/process/Exception/LogicException.php b/pandora_console/vendor/symfony/process/Exception/LogicException.php new file mode 100644 index 0000000000..be3d490dde --- /dev/null +++ b/pandora_console/vendor/symfony/process/Exception/LogicException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +/** + * LogicException for the Process Component. + * + * @author Romain Neutron + */ +class LogicException extends \LogicException implements ExceptionInterface +{ +} diff --git a/pandora_console/vendor/symfony/process/Exception/ProcessFailedException.php b/pandora_console/vendor/symfony/process/Exception/ProcessFailedException.php new file mode 100644 index 0000000000..328acfde5e --- /dev/null +++ b/pandora_console/vendor/symfony/process/Exception/ProcessFailedException.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +use Symfony\Component\Process\Process; + +/** + * Exception for failed processes. + * + * @author Johannes M. Schmitt + */ +class ProcessFailedException extends RuntimeException +{ + private $process; + + public function __construct(Process $process) + { + if ($process->isSuccessful()) { + throw new InvalidArgumentException('Expected a failed process, but the given process was successful.'); + } + + $error = sprintf('The command "%s" failed.'."\n\nExit Code: %s(%s)\n\nWorking directory: %s", + $process->getCommandLine(), + $process->getExitCode(), + $process->getExitCodeText(), + $process->getWorkingDirectory() + ); + + if (!$process->isOutputDisabled()) { + $error .= sprintf("\n\nOutput:\n================\n%s\n\nError Output:\n================\n%s", + $process->getOutput(), + $process->getErrorOutput() + ); + } + + parent::__construct($error); + + $this->process = $process; + } + + public function getProcess() + { + return $this->process; + } +} diff --git a/pandora_console/vendor/symfony/process/Exception/ProcessSignaledException.php b/pandora_console/vendor/symfony/process/Exception/ProcessSignaledException.php new file mode 100644 index 0000000000..d4d322756f --- /dev/null +++ b/pandora_console/vendor/symfony/process/Exception/ProcessSignaledException.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +use Symfony\Component\Process\Process; + +/** + * Exception that is thrown when a process has been signaled. + * + * @author Sullivan Senechal + */ +final class ProcessSignaledException extends RuntimeException +{ + private $process; + + public function __construct(Process $process) + { + $this->process = $process; + + parent::__construct(sprintf('The process has been signaled with signal "%s".', $process->getTermSignal())); + } + + public function getProcess(): Process + { + return $this->process; + } + + public function getSignal(): int + { + return $this->getProcess()->getTermSignal(); + } +} diff --git a/pandora_console/vendor/symfony/process/Exception/ProcessTimedOutException.php b/pandora_console/vendor/symfony/process/Exception/ProcessTimedOutException.php new file mode 100644 index 0000000000..94391a4596 --- /dev/null +++ b/pandora_console/vendor/symfony/process/Exception/ProcessTimedOutException.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +use Symfony\Component\Process\Process; + +/** + * Exception that is thrown when a process times out. + * + * @author Johannes M. Schmitt + */ +class ProcessTimedOutException extends RuntimeException +{ + public const TYPE_GENERAL = 1; + public const TYPE_IDLE = 2; + + private $process; + private $timeoutType; + + public function __construct(Process $process, int $timeoutType) + { + $this->process = $process; + $this->timeoutType = $timeoutType; + + parent::__construct(sprintf( + 'The process "%s" exceeded the timeout of %s seconds.', + $process->getCommandLine(), + $this->getExceededTimeout() + )); + } + + public function getProcess() + { + return $this->process; + } + + public function isGeneralTimeout() + { + return self::TYPE_GENERAL === $this->timeoutType; + } + + public function isIdleTimeout() + { + return self::TYPE_IDLE === $this->timeoutType; + } + + public function getExceededTimeout() + { + switch ($this->timeoutType) { + case self::TYPE_GENERAL: + return $this->process->getTimeout(); + + case self::TYPE_IDLE: + return $this->process->getIdleTimeout(); + + default: + throw new \LogicException(sprintf('Unknown timeout type "%d".', $this->timeoutType)); + } + } +} diff --git a/pandora_console/vendor/symfony/process/Exception/RuntimeException.php b/pandora_console/vendor/symfony/process/Exception/RuntimeException.php new file mode 100644 index 0000000000..adead2536b --- /dev/null +++ b/pandora_console/vendor/symfony/process/Exception/RuntimeException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Exception; + +/** + * RuntimeException for the Process Component. + * + * @author Johannes M. Schmitt + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/pandora_console/vendor/symfony/process/ExecutableFinder.php b/pandora_console/vendor/symfony/process/ExecutableFinder.php new file mode 100644 index 0000000000..eb8f062924 --- /dev/null +++ b/pandora_console/vendor/symfony/process/ExecutableFinder.php @@ -0,0 +1,86 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +/** + * Generic executable finder. + * + * @author Fabien Potencier + * @author Johannes M. Schmitt + */ +class ExecutableFinder +{ + private $suffixes = ['.exe', '.bat', '.cmd', '.com']; + + /** + * Replaces default suffixes of executable. + */ + public function setSuffixes(array $suffixes) + { + $this->suffixes = $suffixes; + } + + /** + * Adds new possible suffix to check for executable. + */ + public function addSuffix(string $suffix) + { + $this->suffixes[] = $suffix; + } + + /** + * Finds an executable by name. + * + * @param string $name The executable name (without the extension) + * @param string|null $default The default to return if no executable is found + * @param array $extraDirs Additional dirs to check into + * + * @return string|null + */ + public function find(string $name, string $default = null, array $extraDirs = []) + { + if (\ini_get('open_basedir')) { + $searchPath = array_merge(explode(\PATH_SEPARATOR, \ini_get('open_basedir')), $extraDirs); + $dirs = []; + foreach ($searchPath as $path) { + // Silencing against https://bugs.php.net/69240 + if (@is_dir($path)) { + $dirs[] = $path; + } else { + if (basename($path) == $name && @is_executable($path)) { + return $path; + } + } + } + } else { + $dirs = array_merge( + explode(\PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')), + $extraDirs + ); + } + + $suffixes = ['']; + if ('\\' === \DIRECTORY_SEPARATOR) { + $pathExt = getenv('PATHEXT'); + $suffixes = array_merge($pathExt ? explode(\PATH_SEPARATOR, $pathExt) : $this->suffixes, $suffixes); + } + foreach ($suffixes as $suffix) { + foreach ($dirs as $dir) { + if (@is_file($file = $dir.\DIRECTORY_SEPARATOR.$name.$suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) { + return $file; + } + } + } + + return $default; + } +} diff --git a/pandora_console/vendor/symfony/process/InputStream.php b/pandora_console/vendor/symfony/process/InputStream.php new file mode 100644 index 0000000000..240665f32a --- /dev/null +++ b/pandora_console/vendor/symfony/process/InputStream.php @@ -0,0 +1,96 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +use Symfony\Component\Process\Exception\RuntimeException; + +/** + * Provides a way to continuously write to the input of a Process until the InputStream is closed. + * + * @author Nicolas Grekas + * + * @implements \IteratorAggregate + */ +class InputStream implements \IteratorAggregate +{ + /** @var callable|null */ + private $onEmpty = null; + private $input = []; + private $open = true; + + /** + * Sets a callback that is called when the write buffer becomes empty. + */ + public function onEmpty(callable $onEmpty = null) + { + $this->onEmpty = $onEmpty; + } + + /** + * Appends an input to the write buffer. + * + * @param resource|string|int|float|bool|\Traversable|null $input The input to append as scalar, + * stream resource or \Traversable + */ + public function write($input) + { + if (null === $input) { + return; + } + if ($this->isClosed()) { + throw new RuntimeException(sprintf('"%s" is closed.', static::class)); + } + $this->input[] = ProcessUtils::validateInput(__METHOD__, $input); + } + + /** + * Closes the write buffer. + */ + public function close() + { + $this->open = false; + } + + /** + * Tells whether the write buffer is closed or not. + */ + public function isClosed() + { + return !$this->open; + } + + /** + * @return \Traversable + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + $this->open = true; + + while ($this->open || $this->input) { + if (!$this->input) { + yield ''; + continue; + } + $current = array_shift($this->input); + + if ($current instanceof \Iterator) { + yield from $current; + } else { + yield $current; + } + if (!$this->input && $this->open && null !== $onEmpty = $this->onEmpty) { + $this->write($onEmpty($this)); + } + } + } +} diff --git a/pandora_console/vendor/symfony/process/LICENSE b/pandora_console/vendor/symfony/process/LICENSE new file mode 100644 index 0000000000..88bf75bb4d --- /dev/null +++ b/pandora_console/vendor/symfony/process/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2022 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pandora_console/vendor/symfony/process/PhpExecutableFinder.php b/pandora_console/vendor/symfony/process/PhpExecutableFinder.php new file mode 100644 index 0000000000..998808b66f --- /dev/null +++ b/pandora_console/vendor/symfony/process/PhpExecutableFinder.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +/** + * An executable finder specifically designed for the PHP executable. + * + * @author Fabien Potencier + * @author Johannes M. Schmitt + */ +class PhpExecutableFinder +{ + private $executableFinder; + + public function __construct() + { + $this->executableFinder = new ExecutableFinder(); + } + + /** + * Finds The PHP executable. + * + * @return string|false + */ + public function find(bool $includeArgs = true) + { + if ($php = getenv('PHP_BINARY')) { + if (!is_executable($php)) { + $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v'; + if ($php = strtok(exec($command.' '.escapeshellarg($php)), \PHP_EOL)) { + if (!is_executable($php)) { + return false; + } + } else { + return false; + } + } + + if (@is_dir($php)) { + return false; + } + + return $php; + } + + $args = $this->findArguments(); + $args = $includeArgs && $args ? ' '.implode(' ', $args) : ''; + + // PHP_BINARY return the current sapi executable + if (\PHP_BINARY && \in_array(\PHP_SAPI, ['cgi-fcgi', 'cli', 'cli-server', 'phpdbg'], true)) { + return \PHP_BINARY.$args; + } + + if ($php = getenv('PHP_PATH')) { + if (!@is_executable($php) || @is_dir($php)) { + return false; + } + + return $php; + } + + if ($php = getenv('PHP_PEAR_PHP_BIN')) { + if (@is_executable($php) && !@is_dir($php)) { + return $php; + } + } + + if (@is_executable($php = \PHP_BINDIR.('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php')) && !@is_dir($php)) { + return $php; + } + + $dirs = [\PHP_BINDIR]; + if ('\\' === \DIRECTORY_SEPARATOR) { + $dirs[] = 'C:\xampp\php\\'; + } + + return $this->executableFinder->find('php', false, $dirs); + } + + /** + * Finds the PHP executable arguments. + * + * @return array + */ + public function findArguments() + { + $arguments = []; + if ('phpdbg' === \PHP_SAPI) { + $arguments[] = '-qrr'; + } + + return $arguments; + } +} diff --git a/pandora_console/vendor/symfony/process/PhpProcess.php b/pandora_console/vendor/symfony/process/PhpProcess.php new file mode 100644 index 0000000000..2bc338e5e2 --- /dev/null +++ b/pandora_console/vendor/symfony/process/PhpProcess.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +use Symfony\Component\Process\Exception\LogicException; +use Symfony\Component\Process\Exception\RuntimeException; + +/** + * PhpProcess runs a PHP script in an independent process. + * + * $p = new PhpProcess(''); + * $p->run(); + * print $p->getOutput()."\n"; + * + * @author Fabien Potencier + */ +class PhpProcess extends Process +{ + /** + * @param string $script The PHP script to run (as a string) + * @param string|null $cwd The working directory or null to use the working dir of the current PHP process + * @param array|null $env The environment variables or null to use the same environment as the current PHP process + * @param int $timeout The timeout in seconds + * @param array|null $php Path to the PHP binary to use with any additional arguments + */ + public function __construct(string $script, string $cwd = null, array $env = null, int $timeout = 60, array $php = null) + { + if (null === $php) { + $executableFinder = new PhpExecutableFinder(); + $php = $executableFinder->find(false); + $php = false === $php ? null : array_merge([$php], $executableFinder->findArguments()); + } + if ('phpdbg' === \PHP_SAPI) { + $file = tempnam(sys_get_temp_dir(), 'dbg'); + file_put_contents($file, $script); + register_shutdown_function('unlink', $file); + $php[] = $file; + $script = null; + } + + parent::__construct($php, $cwd, $env, $script, $timeout); + } + + /** + * {@inheritdoc} + */ + public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) + { + throw new LogicException(sprintf('The "%s()" method cannot be called when using "%s".', __METHOD__, self::class)); + } + + /** + * {@inheritdoc} + */ + public function start(callable $callback = null, array $env = []) + { + if (null === $this->getCommandLine()) { + throw new RuntimeException('Unable to find the PHP executable.'); + } + + parent::start($callback, $env); + } +} diff --git a/pandora_console/vendor/symfony/process/Pipes/AbstractPipes.php b/pandora_console/vendor/symfony/process/Pipes/AbstractPipes.php new file mode 100644 index 0000000000..656dc03280 --- /dev/null +++ b/pandora_console/vendor/symfony/process/Pipes/AbstractPipes.php @@ -0,0 +1,180 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Pipes; + +use Symfony\Component\Process\Exception\InvalidArgumentException; + +/** + * @author Romain Neutron + * + * @internal + */ +abstract class AbstractPipes implements PipesInterface +{ + public $pipes = []; + + private $inputBuffer = ''; + private $input; + private $blocked = true; + private $lastError; + + /** + * @param resource|string|int|float|bool|\Iterator|null $input + */ + public function __construct($input) + { + if (\is_resource($input) || $input instanceof \Iterator) { + $this->input = $input; + } elseif (\is_string($input)) { + $this->inputBuffer = $input; + } else { + $this->inputBuffer = (string) $input; + } + } + + /** + * {@inheritdoc} + */ + public function close() + { + foreach ($this->pipes as $pipe) { + if (\is_resource($pipe)) { + fclose($pipe); + } + } + $this->pipes = []; + } + + /** + * Returns true if a system call has been interrupted. + */ + protected function hasSystemCallBeenInterrupted(): bool + { + $lastError = $this->lastError; + $this->lastError = null; + + // stream_select returns false when the `select` system call is interrupted by an incoming signal + return null !== $lastError && false !== stripos($lastError, 'interrupted system call'); + } + + /** + * Unblocks streams. + */ + protected function unblock() + { + if (!$this->blocked) { + return; + } + + foreach ($this->pipes as $pipe) { + stream_set_blocking($pipe, 0); + } + if (\is_resource($this->input)) { + stream_set_blocking($this->input, 0); + } + + $this->blocked = false; + } + + /** + * Writes input to stdin. + * + * @throws InvalidArgumentException When an input iterator yields a non supported value + */ + protected function write(): ?array + { + if (!isset($this->pipes[0])) { + return null; + } + $input = $this->input; + + if ($input instanceof \Iterator) { + if (!$input->valid()) { + $input = null; + } elseif (\is_resource($input = $input->current())) { + stream_set_blocking($input, 0); + } elseif (!isset($this->inputBuffer[0])) { + if (!\is_string($input)) { + if (!\is_scalar($input)) { + throw new InvalidArgumentException(sprintf('"%s" yielded a value of type "%s", but only scalars and stream resources are supported.', get_debug_type($this->input), get_debug_type($input))); + } + $input = (string) $input; + } + $this->inputBuffer = $input; + $this->input->next(); + $input = null; + } else { + $input = null; + } + } + + $r = $e = []; + $w = [$this->pipes[0]]; + + // let's have a look if something changed in streams + if (false === @stream_select($r, $w, $e, 0, 0)) { + return null; + } + + foreach ($w as $stdin) { + if (isset($this->inputBuffer[0])) { + $written = fwrite($stdin, $this->inputBuffer); + $this->inputBuffer = substr($this->inputBuffer, $written); + if (isset($this->inputBuffer[0])) { + return [$this->pipes[0]]; + } + } + + if ($input) { + while (true) { + $data = fread($input, self::CHUNK_SIZE); + if (!isset($data[0])) { + break; + } + $written = fwrite($stdin, $data); + $data = substr($data, $written); + if (isset($data[0])) { + $this->inputBuffer = $data; + + return [$this->pipes[0]]; + } + } + if (feof($input)) { + if ($this->input instanceof \Iterator) { + $this->input->next(); + } else { + $this->input = null; + } + } + } + } + + // no input to read on resource, buffer is empty + if (!isset($this->inputBuffer[0]) && !($this->input instanceof \Iterator ? $this->input->valid() : $this->input)) { + $this->input = null; + fclose($this->pipes[0]); + unset($this->pipes[0]); + } elseif (!$w) { + return [$this->pipes[0]]; + } + + return null; + } + + /** + * @internal + */ + public function handleError(int $type, string $msg) + { + $this->lastError = $msg; + } +} diff --git a/pandora_console/vendor/symfony/process/Pipes/PipesInterface.php b/pandora_console/vendor/symfony/process/Pipes/PipesInterface.php new file mode 100644 index 0000000000..50eb5c47e1 --- /dev/null +++ b/pandora_console/vendor/symfony/process/Pipes/PipesInterface.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Pipes; + +/** + * PipesInterface manages descriptors and pipes for the use of proc_open. + * + * @author Romain Neutron + * + * @internal + */ +interface PipesInterface +{ + public const CHUNK_SIZE = 16384; + + /** + * Returns an array of descriptors for the use of proc_open. + */ + public function getDescriptors(): array; + + /** + * Returns an array of filenames indexed by their related stream in case these pipes use temporary files. + * + * @return string[] + */ + public function getFiles(): array; + + /** + * Reads data in file handles and pipes. + * + * @param bool $blocking Whether to use blocking calls or not + * @param bool $close Whether to close pipes if they've reached EOF + * + * @return string[] An array of read data indexed by their fd + */ + public function readAndWrite(bool $blocking, bool $close = false): array; + + /** + * Returns if the current state has open file handles or pipes. + */ + public function areOpen(): bool; + + /** + * Returns if pipes are able to read output. + */ + public function haveReadSupport(): bool; + + /** + * Closes file handles and pipes. + */ + public function close(); +} diff --git a/pandora_console/vendor/symfony/process/Pipes/UnixPipes.php b/pandora_console/vendor/symfony/process/Pipes/UnixPipes.php new file mode 100644 index 0000000000..5a0e9d47fe --- /dev/null +++ b/pandora_console/vendor/symfony/process/Pipes/UnixPipes.php @@ -0,0 +1,163 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Pipes; + +use Symfony\Component\Process\Process; + +/** + * UnixPipes implementation uses unix pipes as handles. + * + * @author Romain Neutron + * + * @internal + */ +class UnixPipes extends AbstractPipes +{ + private $ttyMode; + private $ptyMode; + private $haveReadSupport; + + public function __construct(?bool $ttyMode, bool $ptyMode, $input, bool $haveReadSupport) + { + $this->ttyMode = $ttyMode; + $this->ptyMode = $ptyMode; + $this->haveReadSupport = $haveReadSupport; + + parent::__construct($input); + } + + public function __sleep(): array + { + throw new \BadMethodCallException('Cannot serialize '.__CLASS__); + } + + public function __wakeup() + { + throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); + } + + public function __destruct() + { + $this->close(); + } + + /** + * {@inheritdoc} + */ + public function getDescriptors(): array + { + if (!$this->haveReadSupport) { + $nullstream = fopen('/dev/null', 'c'); + + return [ + ['pipe', 'r'], + $nullstream, + $nullstream, + ]; + } + + if ($this->ttyMode) { + return [ + ['file', '/dev/tty', 'r'], + ['file', '/dev/tty', 'w'], + ['file', '/dev/tty', 'w'], + ]; + } + + if ($this->ptyMode && Process::isPtySupported()) { + return [ + ['pty'], + ['pty'], + ['pty'], + ]; + } + + return [ + ['pipe', 'r'], + ['pipe', 'w'], // stdout + ['pipe', 'w'], // stderr + ]; + } + + /** + * {@inheritdoc} + */ + public function getFiles(): array + { + return []; + } + + /** + * {@inheritdoc} + */ + public function readAndWrite(bool $blocking, bool $close = false): array + { + $this->unblock(); + $w = $this->write(); + + $read = $e = []; + $r = $this->pipes; + unset($r[0]); + + // let's have a look if something changed in streams + set_error_handler([$this, 'handleError']); + if (($r || $w) && false === stream_select($r, $w, $e, 0, $blocking ? Process::TIMEOUT_PRECISION * 1E6 : 0)) { + restore_error_handler(); + // if a system call has been interrupted, forget about it, let's try again + // otherwise, an error occurred, let's reset pipes + if (!$this->hasSystemCallBeenInterrupted()) { + $this->pipes = []; + } + + return $read; + } + restore_error_handler(); + + foreach ($r as $pipe) { + // prior PHP 5.4 the array passed to stream_select is modified and + // lose key association, we have to find back the key + $read[$type = array_search($pipe, $this->pipes, true)] = ''; + + do { + $data = @fread($pipe, self::CHUNK_SIZE); + $read[$type] .= $data; + } while (isset($data[0]) && ($close || isset($data[self::CHUNK_SIZE - 1]))); + + if (!isset($read[$type][0])) { + unset($read[$type]); + } + + if ($close && feof($pipe)) { + fclose($pipe); + unset($this->pipes[$type]); + } + } + + return $read; + } + + /** + * {@inheritdoc} + */ + public function haveReadSupport(): bool + { + return $this->haveReadSupport; + } + + /** + * {@inheritdoc} + */ + public function areOpen(): bool + { + return (bool) $this->pipes; + } +} diff --git a/pandora_console/vendor/symfony/process/Pipes/WindowsPipes.php b/pandora_console/vendor/symfony/process/Pipes/WindowsPipes.php new file mode 100644 index 0000000000..bca84f574d --- /dev/null +++ b/pandora_console/vendor/symfony/process/Pipes/WindowsPipes.php @@ -0,0 +1,204 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Pipes; + +use Symfony\Component\Process\Exception\RuntimeException; +use Symfony\Component\Process\Process; + +/** + * WindowsPipes implementation uses temporary files as handles. + * + * @see https://bugs.php.net/51800 + * @see https://bugs.php.net/65650 + * + * @author Romain Neutron + * + * @internal + */ +class WindowsPipes extends AbstractPipes +{ + private $files = []; + private $fileHandles = []; + private $lockHandles = []; + private $readBytes = [ + Process::STDOUT => 0, + Process::STDERR => 0, + ]; + private $haveReadSupport; + + public function __construct($input, bool $haveReadSupport) + { + $this->haveReadSupport = $haveReadSupport; + + if ($this->haveReadSupport) { + // Fix for PHP bug #51800: reading from STDOUT pipe hangs forever on Windows if the output is too big. + // Workaround for this problem is to use temporary files instead of pipes on Windows platform. + // + // @see https://bugs.php.net/51800 + $pipes = [ + Process::STDOUT => Process::OUT, + Process::STDERR => Process::ERR, + ]; + $tmpDir = sys_get_temp_dir(); + $lastError = 'unknown reason'; + set_error_handler(function ($type, $msg) use (&$lastError) { $lastError = $msg; }); + for ($i = 0;; ++$i) { + foreach ($pipes as $pipe => $name) { + $file = sprintf('%s\\sf_proc_%02X.%s', $tmpDir, $i, $name); + + if (!$h = fopen($file.'.lock', 'w')) { + if (file_exists($file.'.lock')) { + continue 2; + } + restore_error_handler(); + throw new RuntimeException('A temporary file could not be opened to write the process output: '.$lastError); + } + if (!flock($h, \LOCK_EX | \LOCK_NB)) { + continue 2; + } + if (isset($this->lockHandles[$pipe])) { + flock($this->lockHandles[$pipe], \LOCK_UN); + fclose($this->lockHandles[$pipe]); + } + $this->lockHandles[$pipe] = $h; + + if (!($h = fopen($file, 'w')) || !fclose($h) || !$h = fopen($file, 'r')) { + flock($this->lockHandles[$pipe], \LOCK_UN); + fclose($this->lockHandles[$pipe]); + unset($this->lockHandles[$pipe]); + continue 2; + } + $this->fileHandles[$pipe] = $h; + $this->files[$pipe] = $file; + } + break; + } + restore_error_handler(); + } + + parent::__construct($input); + } + + public function __sleep(): array + { + throw new \BadMethodCallException('Cannot serialize '.__CLASS__); + } + + public function __wakeup() + { + throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); + } + + public function __destruct() + { + $this->close(); + } + + /** + * {@inheritdoc} + */ + public function getDescriptors(): array + { + if (!$this->haveReadSupport) { + $nullstream = fopen('NUL', 'c'); + + return [ + ['pipe', 'r'], + $nullstream, + $nullstream, + ]; + } + + // We're not using pipe on Windows platform as it hangs (https://bugs.php.net/51800) + // We're not using file handles as it can produce corrupted output https://bugs.php.net/65650 + // So we redirect output within the commandline and pass the nul device to the process + return [ + ['pipe', 'r'], + ['file', 'NUL', 'w'], + ['file', 'NUL', 'w'], + ]; + } + + /** + * {@inheritdoc} + */ + public function getFiles(): array + { + return $this->files; + } + + /** + * {@inheritdoc} + */ + public function readAndWrite(bool $blocking, bool $close = false): array + { + $this->unblock(); + $w = $this->write(); + $read = $r = $e = []; + + if ($blocking) { + if ($w) { + @stream_select($r, $w, $e, 0, Process::TIMEOUT_PRECISION * 1E6); + } elseif ($this->fileHandles) { + usleep(Process::TIMEOUT_PRECISION * 1E6); + } + } + foreach ($this->fileHandles as $type => $fileHandle) { + $data = stream_get_contents($fileHandle, -1, $this->readBytes[$type]); + + if (isset($data[0])) { + $this->readBytes[$type] += \strlen($data); + $read[$type] = $data; + } + if ($close) { + ftruncate($fileHandle, 0); + fclose($fileHandle); + flock($this->lockHandles[$type], \LOCK_UN); + fclose($this->lockHandles[$type]); + unset($this->fileHandles[$type], $this->lockHandles[$type]); + } + } + + return $read; + } + + /** + * {@inheritdoc} + */ + public function haveReadSupport(): bool + { + return $this->haveReadSupport; + } + + /** + * {@inheritdoc} + */ + public function areOpen(): bool + { + return $this->pipes && $this->fileHandles; + } + + /** + * {@inheritdoc} + */ + public function close() + { + parent::close(); + foreach ($this->fileHandles as $type => $handle) { + ftruncate($handle, 0); + fclose($handle); + flock($this->lockHandles[$type], \LOCK_UN); + fclose($this->lockHandles[$type]); + } + $this->fileHandles = $this->lockHandles = []; + } +} diff --git a/pandora_console/vendor/symfony/process/Process.php b/pandora_console/vendor/symfony/process/Process.php new file mode 100644 index 0000000000..14e1777465 --- /dev/null +++ b/pandora_console/vendor/symfony/process/Process.php @@ -0,0 +1,1652 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +use Symfony\Component\Process\Exception\InvalidArgumentException; +use Symfony\Component\Process\Exception\LogicException; +use Symfony\Component\Process\Exception\ProcessFailedException; +use Symfony\Component\Process\Exception\ProcessSignaledException; +use Symfony\Component\Process\Exception\ProcessTimedOutException; +use Symfony\Component\Process\Exception\RuntimeException; +use Symfony\Component\Process\Pipes\PipesInterface; +use Symfony\Component\Process\Pipes\UnixPipes; +use Symfony\Component\Process\Pipes\WindowsPipes; + +/** + * Process is a thin wrapper around proc_* functions to easily + * start independent PHP processes. + * + * @author Fabien Potencier + * @author Romain Neutron + * + * @implements \IteratorAggregate + */ +class Process implements \IteratorAggregate +{ + public const ERR = 'err'; + public const OUT = 'out'; + + public const STATUS_READY = 'ready'; + public const STATUS_STARTED = 'started'; + public const STATUS_TERMINATED = 'terminated'; + + public const STDIN = 0; + public const STDOUT = 1; + public const STDERR = 2; + + // Timeout Precision in seconds. + public const TIMEOUT_PRECISION = 0.2; + + public const ITER_NON_BLOCKING = 1; // By default, iterating over outputs is a blocking call, use this flag to make it non-blocking + public const ITER_KEEP_OUTPUT = 2; // By default, outputs are cleared while iterating, use this flag to keep them in memory + public const ITER_SKIP_OUT = 4; // Use this flag to skip STDOUT while iterating + public const ITER_SKIP_ERR = 8; // Use this flag to skip STDERR while iterating + + private $callback; + private $hasCallback = false; + private $commandline; + private $cwd; + private $env = []; + private $input; + private $starttime; + private $lastOutputTime; + private $timeout; + private $idleTimeout; + private $exitcode; + private $fallbackStatus = []; + private $processInformation; + private $outputDisabled = false; + private $stdout; + private $stderr; + private $process; + private $status = self::STATUS_READY; + private $incrementalOutputOffset = 0; + private $incrementalErrorOutputOffset = 0; + private $tty = false; + private $pty; + private $options = ['suppress_errors' => true, 'bypass_shell' => true]; + + private $useFileHandles = false; + /** @var PipesInterface */ + private $processPipes; + + private $latestSignal; + + private static $sigchild; + + /** + * Exit codes translation table. + * + * User-defined errors must use exit codes in the 64-113 range. + */ + public static $exitCodes = [ + 0 => 'OK', + 1 => 'General error', + 2 => 'Misuse of shell builtins', + + 126 => 'Invoked command cannot execute', + 127 => 'Command not found', + 128 => 'Invalid exit argument', + + // signals + 129 => 'Hangup', + 130 => 'Interrupt', + 131 => 'Quit and dump core', + 132 => 'Illegal instruction', + 133 => 'Trace/breakpoint trap', + 134 => 'Process aborted', + 135 => 'Bus error: "access to undefined portion of memory object"', + 136 => 'Floating point exception: "erroneous arithmetic operation"', + 137 => 'Kill (terminate immediately)', + 138 => 'User-defined 1', + 139 => 'Segmentation violation', + 140 => 'User-defined 2', + 141 => 'Write to pipe with no one reading', + 142 => 'Signal raised by alarm', + 143 => 'Termination (request to terminate)', + // 144 - not defined + 145 => 'Child process terminated, stopped (or continued*)', + 146 => 'Continue if stopped', + 147 => 'Stop executing temporarily', + 148 => 'Terminal stop signal', + 149 => 'Background process attempting to read from tty ("in")', + 150 => 'Background process attempting to write to tty ("out")', + 151 => 'Urgent data available on socket', + 152 => 'CPU time limit exceeded', + 153 => 'File size limit exceeded', + 154 => 'Signal raised by timer counting virtual time: "virtual timer expired"', + 155 => 'Profiling timer expired', + // 156 - not defined + 157 => 'Pollable event', + // 158 - not defined + 159 => 'Bad syscall', + ]; + + /** + * @param array $command The command to run and its arguments listed as separate entries + * @param string|null $cwd The working directory or null to use the working dir of the current PHP process + * @param array|null $env The environment variables or null to use the same environment as the current PHP process + * @param mixed $input The input as stream resource, scalar or \Traversable, or null for no input + * @param int|float|null $timeout The timeout in seconds or null to disable + * + * @throws LogicException When proc_open is not installed + */ + public function __construct(array $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) + { + if (!\function_exists('proc_open')) { + throw new LogicException('The Process class relies on proc_open, which is not available on your PHP installation.'); + } + + $this->commandline = $command; + $this->cwd = $cwd; + + // on Windows, if the cwd changed via chdir(), proc_open defaults to the dir where PHP was started + // on Gnu/Linux, PHP builds with --enable-maintainer-zts are also affected + // @see : https://bugs.php.net/51800 + // @see : https://bugs.php.net/50524 + if (null === $this->cwd && (\defined('ZEND_THREAD_SAFE') || '\\' === \DIRECTORY_SEPARATOR)) { + $this->cwd = getcwd(); + } + if (null !== $env) { + $this->setEnv($env); + } + + $this->setInput($input); + $this->setTimeout($timeout); + $this->useFileHandles = '\\' === \DIRECTORY_SEPARATOR; + $this->pty = false; + } + + /** + * Creates a Process instance as a command-line to be run in a shell wrapper. + * + * Command-lines are parsed by the shell of your OS (/bin/sh on Unix-like, cmd.exe on Windows.) + * This allows using e.g. pipes or conditional execution. In this mode, signals are sent to the + * shell wrapper and not to your commands. + * + * In order to inject dynamic values into command-lines, we strongly recommend using placeholders. + * This will save escaping values, which is not portable nor secure anyway: + * + * $process = Process::fromShellCommandline('my_command "${:MY_VAR}"'); + * $process->run(null, ['MY_VAR' => $theValue]); + * + * @param string $command The command line to pass to the shell of the OS + * @param string|null $cwd The working directory or null to use the working dir of the current PHP process + * @param array|null $env The environment variables or null to use the same environment as the current PHP process + * @param mixed $input The input as stream resource, scalar or \Traversable, or null for no input + * @param int|float|null $timeout The timeout in seconds or null to disable + * + * @return static + * + * @throws LogicException When proc_open is not installed + */ + public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) + { + $process = new static([], $cwd, $env, $input, $timeout); + $process->commandline = $command; + + return $process; + } + + /** + * @return array + */ + public function __sleep() + { + throw new \BadMethodCallException('Cannot serialize '.__CLASS__); + } + + public function __wakeup() + { + throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); + } + + public function __destruct() + { + if ($this->options['create_new_console'] ?? false) { + $this->processPipes->close(); + } else { + $this->stop(0); + } + } + + public function __clone() + { + $this->resetProcessData(); + } + + /** + * Runs the process. + * + * The callback receives the type of output (out or err) and + * some bytes from the output in real-time. It allows to have feedback + * from the independent process during execution. + * + * The STDOUT and STDERR are also available after the process is finished + * via the getOutput() and getErrorOutput() methods. + * + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + * + * @return int The exit status code + * + * @throws RuntimeException When process can't be launched + * @throws RuntimeException When process is already running + * @throws ProcessTimedOutException When process timed out + * @throws ProcessSignaledException When process stopped after receiving signal + * @throws LogicException In case a callback is provided and output has been disabled + * + * @final + */ + public function run(callable $callback = null, array $env = []): int + { + $this->start($callback, $env); + + return $this->wait(); + } + + /** + * Runs the process. + * + * This is identical to run() except that an exception is thrown if the process + * exits with a non-zero exit code. + * + * @return $this + * + * @throws ProcessFailedException if the process didn't terminate successfully + * + * @final + */ + public function mustRun(callable $callback = null, array $env = []): self + { + if (0 !== $this->run($callback, $env)) { + throw new ProcessFailedException($this); + } + + return $this; + } + + /** + * Starts the process and returns after writing the input to STDIN. + * + * This method blocks until all STDIN data is sent to the process then it + * returns while the process runs in the background. + * + * The termination of the process can be awaited with wait(). + * + * The callback receives the type of output (out or err) and some bytes from + * the output in real-time while writing the standard input to the process. + * It allows to have feedback from the independent process during execution. + * + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + * + * @throws RuntimeException When process can't be launched + * @throws RuntimeException When process is already running + * @throws LogicException In case a callback is provided and output has been disabled + */ + public function start(callable $callback = null, array $env = []) + { + if ($this->isRunning()) { + throw new RuntimeException('Process is already running.'); + } + + $this->resetProcessData(); + $this->starttime = $this->lastOutputTime = microtime(true); + $this->callback = $this->buildCallback($callback); + $this->hasCallback = null !== $callback; + $descriptors = $this->getDescriptors(); + + if ($this->env) { + $env += '\\' === \DIRECTORY_SEPARATOR ? array_diff_ukey($this->env, $env, 'strcasecmp') : $this->env; + } + + $env += '\\' === \DIRECTORY_SEPARATOR ? array_diff_ukey($this->getDefaultEnv(), $env, 'strcasecmp') : $this->getDefaultEnv(); + + if (\is_array($commandline = $this->commandline)) { + $commandline = implode(' ', array_map([$this, 'escapeArgument'], $commandline)); + + if ('\\' !== \DIRECTORY_SEPARATOR) { + // exec is mandatory to deal with sending a signal to the process + $commandline = 'exec '.$commandline; + } + } else { + $commandline = $this->replacePlaceholders($commandline, $env); + } + + if ('\\' === \DIRECTORY_SEPARATOR) { + $commandline = $this->prepareWindowsCommandLine($commandline, $env); + } elseif (!$this->useFileHandles && $this->isSigchildEnabled()) { + // last exit code is output on the fourth pipe and caught to work around --enable-sigchild + $descriptors[3] = ['pipe', 'w']; + + // See https://unix.stackexchange.com/questions/71205/background-process-pipe-input + $commandline = '{ ('.$commandline.') <&3 3<&- 3>/dev/null & } 3<&0;'; + $commandline .= 'pid=$!; echo $pid >&3; wait $pid; code=$?; echo $code >&3; exit $code'; + + // Workaround for the bug, when PTS functionality is enabled. + // @see : https://bugs.php.net/69442 + $ptsWorkaround = fopen(__FILE__, 'r'); + } + + $envPairs = []; + foreach ($env as $k => $v) { + if (false !== $v && false === \in_array($k, ['argc', 'argv', 'ARGC', 'ARGV'], true)) { + $envPairs[] = $k.'='.$v; + } + } + + if (!is_dir($this->cwd)) { + throw new RuntimeException(sprintf('The provided cwd "%s" does not exist.', $this->cwd)); + } + + $this->process = @proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $envPairs, $this->options); + + if (!\is_resource($this->process)) { + throw new RuntimeException('Unable to launch a new process.'); + } + $this->status = self::STATUS_STARTED; + + if (isset($descriptors[3])) { + $this->fallbackStatus['pid'] = (int) fgets($this->processPipes->pipes[3]); + } + + if ($this->tty) { + return; + } + + $this->updateStatus(false); + $this->checkTimeout(); + } + + /** + * Restarts the process. + * + * Be warned that the process is cloned before being started. + * + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + * + * @return static + * + * @throws RuntimeException When process can't be launched + * @throws RuntimeException When process is already running + * + * @see start() + * + * @final + */ + public function restart(callable $callback = null, array $env = []): self + { + if ($this->isRunning()) { + throw new RuntimeException('Process is already running.'); + } + + $process = clone $this; + $process->start($callback, $env); + + return $process; + } + + /** + * Waits for the process to terminate. + * + * The callback receives the type of output (out or err) and some bytes + * from the output in real-time while writing the standard input to the process. + * It allows to have feedback from the independent process during execution. + * + * @param callable|null $callback A valid PHP callback + * + * @return int The exitcode of the process + * + * @throws ProcessTimedOutException When process timed out + * @throws ProcessSignaledException When process stopped after receiving signal + * @throws LogicException When process is not yet started + */ + public function wait(callable $callback = null) + { + $this->requireProcessIsStarted(__FUNCTION__); + + $this->updateStatus(false); + + if (null !== $callback) { + if (!$this->processPipes->haveReadSupport()) { + $this->stop(0); + throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::wait".'); + } + $this->callback = $this->buildCallback($callback); + } + + do { + $this->checkTimeout(); + $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); + $this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); + } while ($running); + + while ($this->isRunning()) { + $this->checkTimeout(); + usleep(1000); + } + + if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) { + throw new ProcessSignaledException($this); + } + + return $this->exitcode; + } + + /** + * Waits until the callback returns true. + * + * The callback receives the type of output (out or err) and some bytes + * from the output in real-time while writing the standard input to the process. + * It allows to have feedback from the independent process during execution. + * + * @throws RuntimeException When process timed out + * @throws LogicException When process is not yet started + * @throws ProcessTimedOutException In case the timeout was reached + */ + public function waitUntil(callable $callback): bool + { + $this->requireProcessIsStarted(__FUNCTION__); + $this->updateStatus(false); + + if (!$this->processPipes->haveReadSupport()) { + $this->stop(0); + throw new LogicException('Pass the callback to the "Process::start" method or call enableOutput to use a callback with "Process::waitUntil".'); + } + $callback = $this->buildCallback($callback); + + $ready = false; + while (true) { + $this->checkTimeout(); + $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); + $output = $this->processPipes->readAndWrite($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); + + foreach ($output as $type => $data) { + if (3 !== $type) { + $ready = $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data) || $ready; + } elseif (!isset($this->fallbackStatus['signaled'])) { + $this->fallbackStatus['exitcode'] = (int) $data; + } + } + if ($ready) { + return true; + } + if (!$running) { + return false; + } + + usleep(1000); + } + } + + /** + * Returns the Pid (process identifier), if applicable. + * + * @return int|null The process id if running, null otherwise + */ + public function getPid() + { + return $this->isRunning() ? $this->processInformation['pid'] : null; + } + + /** + * Sends a POSIX signal to the process. + * + * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants) + * + * @return $this + * + * @throws LogicException In case the process is not running + * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed + * @throws RuntimeException In case of failure + */ + public function signal(int $signal) + { + $this->doSignal($signal, true); + + return $this; + } + + /** + * Disables fetching output and error output from the underlying process. + * + * @return $this + * + * @throws RuntimeException In case the process is already running + * @throws LogicException if an idle timeout is set + */ + public function disableOutput() + { + if ($this->isRunning()) { + throw new RuntimeException('Disabling output while the process is running is not possible.'); + } + if (null !== $this->idleTimeout) { + throw new LogicException('Output cannot be disabled while an idle timeout is set.'); + } + + $this->outputDisabled = true; + + return $this; + } + + /** + * Enables fetching output and error output from the underlying process. + * + * @return $this + * + * @throws RuntimeException In case the process is already running + */ + public function enableOutput() + { + if ($this->isRunning()) { + throw new RuntimeException('Enabling output while the process is running is not possible.'); + } + + $this->outputDisabled = false; + + return $this; + } + + /** + * Returns true in case the output is disabled, false otherwise. + * + * @return bool + */ + public function isOutputDisabled() + { + return $this->outputDisabled; + } + + /** + * Returns the current output of the process (STDOUT). + * + * @return string + * + * @throws LogicException in case the output has been disabled + * @throws LogicException In case the process is not started + */ + public function getOutput() + { + $this->readPipesForOutput(__FUNCTION__); + + if (false === $ret = stream_get_contents($this->stdout, -1, 0)) { + return ''; + } + + return $ret; + } + + /** + * Returns the output incrementally. + * + * In comparison with the getOutput method which always return the whole + * output, this one returns the new output since the last call. + * + * @return string + * + * @throws LogicException in case the output has been disabled + * @throws LogicException In case the process is not started + */ + public function getIncrementalOutput() + { + $this->readPipesForOutput(__FUNCTION__); + + $latest = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset); + $this->incrementalOutputOffset = ftell($this->stdout); + + if (false === $latest) { + return ''; + } + + return $latest; + } + + /** + * Returns an iterator to the output of the process, with the output type as keys (Process::OUT/ERR). + * + * @param int $flags A bit field of Process::ITER_* flags + * + * @throws LogicException in case the output has been disabled + * @throws LogicException In case the process is not started + * + * @return \Generator + */ + #[\ReturnTypeWillChange] + public function getIterator(int $flags = 0) + { + $this->readPipesForOutput(__FUNCTION__, false); + + $clearOutput = !(self::ITER_KEEP_OUTPUT & $flags); + $blocking = !(self::ITER_NON_BLOCKING & $flags); + $yieldOut = !(self::ITER_SKIP_OUT & $flags); + $yieldErr = !(self::ITER_SKIP_ERR & $flags); + + while (null !== $this->callback || ($yieldOut && !feof($this->stdout)) || ($yieldErr && !feof($this->stderr))) { + if ($yieldOut) { + $out = stream_get_contents($this->stdout, -1, $this->incrementalOutputOffset); + + if (isset($out[0])) { + if ($clearOutput) { + $this->clearOutput(); + } else { + $this->incrementalOutputOffset = ftell($this->stdout); + } + + yield self::OUT => $out; + } + } + + if ($yieldErr) { + $err = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset); + + if (isset($err[0])) { + if ($clearOutput) { + $this->clearErrorOutput(); + } else { + $this->incrementalErrorOutputOffset = ftell($this->stderr); + } + + yield self::ERR => $err; + } + } + + if (!$blocking && !isset($out[0]) && !isset($err[0])) { + yield self::OUT => ''; + } + + $this->checkTimeout(); + $this->readPipesForOutput(__FUNCTION__, $blocking); + } + } + + /** + * Clears the process output. + * + * @return $this + */ + public function clearOutput() + { + ftruncate($this->stdout, 0); + fseek($this->stdout, 0); + $this->incrementalOutputOffset = 0; + + return $this; + } + + /** + * Returns the current error output of the process (STDERR). + * + * @return string + * + * @throws LogicException in case the output has been disabled + * @throws LogicException In case the process is not started + */ + public function getErrorOutput() + { + $this->readPipesForOutput(__FUNCTION__); + + if (false === $ret = stream_get_contents($this->stderr, -1, 0)) { + return ''; + } + + return $ret; + } + + /** + * Returns the errorOutput incrementally. + * + * In comparison with the getErrorOutput method which always return the + * whole error output, this one returns the new error output since the last + * call. + * + * @return string + * + * @throws LogicException in case the output has been disabled + * @throws LogicException In case the process is not started + */ + public function getIncrementalErrorOutput() + { + $this->readPipesForOutput(__FUNCTION__); + + $latest = stream_get_contents($this->stderr, -1, $this->incrementalErrorOutputOffset); + $this->incrementalErrorOutputOffset = ftell($this->stderr); + + if (false === $latest) { + return ''; + } + + return $latest; + } + + /** + * Clears the process output. + * + * @return $this + */ + public function clearErrorOutput() + { + ftruncate($this->stderr, 0); + fseek($this->stderr, 0); + $this->incrementalErrorOutputOffset = 0; + + return $this; + } + + /** + * Returns the exit code returned by the process. + * + * @return int|null The exit status code, null if the Process is not terminated + */ + public function getExitCode() + { + $this->updateStatus(false); + + return $this->exitcode; + } + + /** + * Returns a string representation for the exit code returned by the process. + * + * This method relies on the Unix exit code status standardization + * and might not be relevant for other operating systems. + * + * @return string|null A string representation for the exit status code, null if the Process is not terminated + * + * @see http://tldp.org/LDP/abs/html/exitcodes.html + * @see http://en.wikipedia.org/wiki/Unix_signal + */ + public function getExitCodeText() + { + if (null === $exitcode = $this->getExitCode()) { + return null; + } + + return self::$exitCodes[$exitcode] ?? 'Unknown error'; + } + + /** + * Checks if the process ended successfully. + * + * @return bool + */ + public function isSuccessful() + { + return 0 === $this->getExitCode(); + } + + /** + * Returns true if the child process has been terminated by an uncaught signal. + * + * It always returns false on Windows. + * + * @return bool + * + * @throws LogicException In case the process is not terminated + */ + public function hasBeenSignaled() + { + $this->requireProcessIsTerminated(__FUNCTION__); + + return $this->processInformation['signaled']; + } + + /** + * Returns the number of the signal that caused the child process to terminate its execution. + * + * It is only meaningful if hasBeenSignaled() returns true. + * + * @return int + * + * @throws RuntimeException In case --enable-sigchild is activated + * @throws LogicException In case the process is not terminated + */ + public function getTermSignal() + { + $this->requireProcessIsTerminated(__FUNCTION__); + + if ($this->isSigchildEnabled() && -1 === $this->processInformation['termsig']) { + throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal cannot be retrieved.'); + } + + return $this->processInformation['termsig']; + } + + /** + * Returns true if the child process has been stopped by a signal. + * + * It always returns false on Windows. + * + * @return bool + * + * @throws LogicException In case the process is not terminated + */ + public function hasBeenStopped() + { + $this->requireProcessIsTerminated(__FUNCTION__); + + return $this->processInformation['stopped']; + } + + /** + * Returns the number of the signal that caused the child process to stop its execution. + * + * It is only meaningful if hasBeenStopped() returns true. + * + * @return int + * + * @throws LogicException In case the process is not terminated + */ + public function getStopSignal() + { + $this->requireProcessIsTerminated(__FUNCTION__); + + return $this->processInformation['stopsig']; + } + + /** + * Checks if the process is currently running. + * + * @return bool + */ + public function isRunning() + { + if (self::STATUS_STARTED !== $this->status) { + return false; + } + + $this->updateStatus(false); + + return $this->processInformation['running']; + } + + /** + * Checks if the process has been started with no regard to the current state. + * + * @return bool + */ + public function isStarted() + { + return self::STATUS_READY != $this->status; + } + + /** + * Checks if the process is terminated. + * + * @return bool + */ + public function isTerminated() + { + $this->updateStatus(false); + + return self::STATUS_TERMINATED == $this->status; + } + + /** + * Gets the process status. + * + * The status is one of: ready, started, terminated. + * + * @return string + */ + public function getStatus() + { + $this->updateStatus(false); + + return $this->status; + } + + /** + * Stops the process. + * + * @param int|float $timeout The timeout in seconds + * @param int $signal A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL (9) + * + * @return int|null The exit-code of the process or null if it's not running + */ + public function stop(float $timeout = 10, int $signal = null) + { + $timeoutMicro = microtime(true) + $timeout; + if ($this->isRunning()) { + // given SIGTERM may not be defined and that "proc_terminate" uses the constant value and not the constant itself, we use the same here + $this->doSignal(15, false); + do { + usleep(1000); + } while ($this->isRunning() && microtime(true) < $timeoutMicro); + + if ($this->isRunning()) { + // Avoid exception here: process is supposed to be running, but it might have stopped just + // after this line. In any case, let's silently discard the error, we cannot do anything. + $this->doSignal($signal ?: 9, false); + } + } + + if ($this->isRunning()) { + if (isset($this->fallbackStatus['pid'])) { + unset($this->fallbackStatus['pid']); + + return $this->stop(0, $signal); + } + $this->close(); + } + + return $this->exitcode; + } + + /** + * Adds a line to the STDOUT stream. + * + * @internal + */ + public function addOutput(string $line) + { + $this->lastOutputTime = microtime(true); + + fseek($this->stdout, 0, \SEEK_END); + fwrite($this->stdout, $line); + fseek($this->stdout, $this->incrementalOutputOffset); + } + + /** + * Adds a line to the STDERR stream. + * + * @internal + */ + public function addErrorOutput(string $line) + { + $this->lastOutputTime = microtime(true); + + fseek($this->stderr, 0, \SEEK_END); + fwrite($this->stderr, $line); + fseek($this->stderr, $this->incrementalErrorOutputOffset); + } + + /** + * Gets the last output time in seconds. + */ + public function getLastOutputTime(): ?float + { + return $this->lastOutputTime; + } + + /** + * Gets the command line to be executed. + * + * @return string + */ + public function getCommandLine() + { + return \is_array($this->commandline) ? implode(' ', array_map([$this, 'escapeArgument'], $this->commandline)) : $this->commandline; + } + + /** + * Gets the process timeout in seconds (max. runtime). + * + * @return float|null + */ + public function getTimeout() + { + return $this->timeout; + } + + /** + * Gets the process idle timeout in seconds (max. time since last output). + * + * @return float|null + */ + public function getIdleTimeout() + { + return $this->idleTimeout; + } + + /** + * Sets the process timeout (max. runtime) in seconds. + * + * To disable the timeout, set this value to null. + * + * @return $this + * + * @throws InvalidArgumentException if the timeout is negative + */ + public function setTimeout(?float $timeout) + { + $this->timeout = $this->validateTimeout($timeout); + + return $this; + } + + /** + * Sets the process idle timeout (max. time since last output) in seconds. + * + * To disable the timeout, set this value to null. + * + * @return $this + * + * @throws LogicException if the output is disabled + * @throws InvalidArgumentException if the timeout is negative + */ + public function setIdleTimeout(?float $timeout) + { + if (null !== $timeout && $this->outputDisabled) { + throw new LogicException('Idle timeout cannot be set while the output is disabled.'); + } + + $this->idleTimeout = $this->validateTimeout($timeout); + + return $this; + } + + /** + * Enables or disables the TTY mode. + * + * @return $this + * + * @throws RuntimeException In case the TTY mode is not supported + */ + public function setTty(bool $tty) + { + if ('\\' === \DIRECTORY_SEPARATOR && $tty) { + throw new RuntimeException('TTY mode is not supported on Windows platform.'); + } + + if ($tty && !self::isTtySupported()) { + throw new RuntimeException('TTY mode requires /dev/tty to be read/writable.'); + } + + $this->tty = $tty; + + return $this; + } + + /** + * Checks if the TTY mode is enabled. + * + * @return bool + */ + public function isTty() + { + return $this->tty; + } + + /** + * Sets PTY mode. + * + * @return $this + */ + public function setPty(bool $bool) + { + $this->pty = $bool; + + return $this; + } + + /** + * Returns PTY state. + * + * @return bool + */ + public function isPty() + { + return $this->pty; + } + + /** + * Gets the working directory. + * + * @return string|null + */ + public function getWorkingDirectory() + { + if (null === $this->cwd) { + // getcwd() will return false if any one of the parent directories does not have + // the readable or search mode set, even if the current directory does + return getcwd() ?: null; + } + + return $this->cwd; + } + + /** + * Sets the current working directory. + * + * @return $this + */ + public function setWorkingDirectory(string $cwd) + { + $this->cwd = $cwd; + + return $this; + } + + /** + * Gets the environment variables. + * + * @return array + */ + public function getEnv() + { + return $this->env; + } + + /** + * Sets the environment variables. + * + * @param array $env The new environment variables + * + * @return $this + */ + public function setEnv(array $env) + { + $this->env = $env; + + return $this; + } + + /** + * Gets the Process input. + * + * @return resource|string|\Iterator|null + */ + public function getInput() + { + return $this->input; + } + + /** + * Sets the input. + * + * This content will be passed to the underlying process standard input. + * + * @param string|int|float|bool|resource|\Traversable|null $input The content + * + * @return $this + * + * @throws LogicException In case the process is running + */ + public function setInput($input) + { + if ($this->isRunning()) { + throw new LogicException('Input cannot be set while the process is running.'); + } + + $this->input = ProcessUtils::validateInput(__METHOD__, $input); + + return $this; + } + + /** + * Performs a check between the timeout definition and the time the process started. + * + * In case you run a background process (with the start method), you should + * trigger this method regularly to ensure the process timeout + * + * @throws ProcessTimedOutException In case the timeout was reached + */ + public function checkTimeout() + { + if (self::STATUS_STARTED !== $this->status) { + return; + } + + if (null !== $this->timeout && $this->timeout < microtime(true) - $this->starttime) { + $this->stop(0); + + throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_GENERAL); + } + + if (null !== $this->idleTimeout && $this->idleTimeout < microtime(true) - $this->lastOutputTime) { + $this->stop(0); + + throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_IDLE); + } + } + + /** + * @throws LogicException in case process is not started + */ + public function getStartTime(): float + { + if (!$this->isStarted()) { + throw new LogicException('Start time is only available after process start.'); + } + + return $this->starttime; + } + + /** + * Defines options to pass to the underlying proc_open(). + * + * @see https://php.net/proc_open for the options supported by PHP. + * + * Enabling the "create_new_console" option allows a subprocess to continue + * to run after the main process exited, on both Windows and *nix + */ + public function setOptions(array $options) + { + if ($this->isRunning()) { + throw new RuntimeException('Setting options while the process is running is not possible.'); + } + + $defaultOptions = $this->options; + $existingOptions = ['blocking_pipes', 'create_process_group', 'create_new_console']; + + foreach ($options as $key => $value) { + if (!\in_array($key, $existingOptions)) { + $this->options = $defaultOptions; + throw new LogicException(sprintf('Invalid option "%s" passed to "%s()". Supported options are "%s".', $key, __METHOD__, implode('", "', $existingOptions))); + } + $this->options[$key] = $value; + } + } + + /** + * Returns whether TTY is supported on the current operating system. + */ + public static function isTtySupported(): bool + { + static $isTtySupported; + + if (null === $isTtySupported) { + $isTtySupported = (bool) @proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); + } + + return $isTtySupported; + } + + /** + * Returns whether PTY is supported on the current operating system. + * + * @return bool + */ + public static function isPtySupported() + { + static $result; + + if (null !== $result) { + return $result; + } + + if ('\\' === \DIRECTORY_SEPARATOR) { + return $result = false; + } + + return $result = (bool) @proc_open('echo 1 >/dev/null', [['pty'], ['pty'], ['pty']], $pipes); + } + + /** + * Creates the descriptors needed by the proc_open. + */ + private function getDescriptors(): array + { + if ($this->input instanceof \Iterator) { + $this->input->rewind(); + } + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->processPipes = new WindowsPipes($this->input, !$this->outputDisabled || $this->hasCallback); + } else { + $this->processPipes = new UnixPipes($this->isTty(), $this->isPty(), $this->input, !$this->outputDisabled || $this->hasCallback); + } + + return $this->processPipes->getDescriptors(); + } + + /** + * Builds up the callback used by wait(). + * + * The callbacks adds all occurred output to the specific buffer and calls + * the user callback (if present) with the received output. + * + * @param callable|null $callback The user defined PHP callback + * + * @return \Closure + */ + protected function buildCallback(callable $callback = null) + { + if ($this->outputDisabled) { + return function ($type, $data) use ($callback): bool { + return null !== $callback && $callback($type, $data); + }; + } + + $out = self::OUT; + + return function ($type, $data) use ($callback, $out): bool { + if ($out == $type) { + $this->addOutput($data); + } else { + $this->addErrorOutput($data); + } + + return null !== $callback && $callback($type, $data); + }; + } + + /** + * Updates the status of the process, reads pipes. + * + * @param bool $blocking Whether to use a blocking read call + */ + protected function updateStatus(bool $blocking) + { + if (self::STATUS_STARTED !== $this->status) { + return; + } + + $this->processInformation = proc_get_status($this->process); + $running = $this->processInformation['running']; + + $this->readPipes($running && $blocking, '\\' !== \DIRECTORY_SEPARATOR || !$running); + + if ($this->fallbackStatus && $this->isSigchildEnabled()) { + $this->processInformation = $this->fallbackStatus + $this->processInformation; + } + + if (!$running) { + $this->close(); + } + } + + /** + * Returns whether PHP has been compiled with the '--enable-sigchild' option or not. + * + * @return bool + */ + protected function isSigchildEnabled() + { + if (null !== self::$sigchild) { + return self::$sigchild; + } + + if (!\function_exists('phpinfo')) { + return self::$sigchild = false; + } + + ob_start(); + phpinfo(\INFO_GENERAL); + + return self::$sigchild = str_contains(ob_get_clean(), '--enable-sigchild'); + } + + /** + * Reads pipes for the freshest output. + * + * @param string $caller The name of the method that needs fresh outputs + * @param bool $blocking Whether to use blocking calls or not + * + * @throws LogicException in case output has been disabled or process is not started + */ + private function readPipesForOutput(string $caller, bool $blocking = false) + { + if ($this->outputDisabled) { + throw new LogicException('Output has been disabled.'); + } + + $this->requireProcessIsStarted($caller); + + $this->updateStatus($blocking); + } + + /** + * Validates and returns the filtered timeout. + * + * @throws InvalidArgumentException if the given timeout is a negative number + */ + private function validateTimeout(?float $timeout): ?float + { + $timeout = (float) $timeout; + + if (0.0 === $timeout) { + $timeout = null; + } elseif ($timeout < 0) { + throw new InvalidArgumentException('The timeout value must be a valid positive integer or float number.'); + } + + return $timeout; + } + + /** + * Reads pipes, executes callback. + * + * @param bool $blocking Whether to use blocking calls or not + * @param bool $close Whether to close file handles or not + */ + private function readPipes(bool $blocking, bool $close) + { + $result = $this->processPipes->readAndWrite($blocking, $close); + + $callback = $this->callback; + foreach ($result as $type => $data) { + if (3 !== $type) { + $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data); + } elseif (!isset($this->fallbackStatus['signaled'])) { + $this->fallbackStatus['exitcode'] = (int) $data; + } + } + } + + /** + * Closes process resource, closes file handles, sets the exitcode. + * + * @return int The exitcode + */ + private function close(): int + { + $this->processPipes->close(); + if (\is_resource($this->process)) { + proc_close($this->process); + } + $this->exitcode = $this->processInformation['exitcode']; + $this->status = self::STATUS_TERMINATED; + + if (-1 === $this->exitcode) { + if ($this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) { + // if process has been signaled, no exitcode but a valid termsig, apply Unix convention + $this->exitcode = 128 + $this->processInformation['termsig']; + } elseif ($this->isSigchildEnabled()) { + $this->processInformation['signaled'] = true; + $this->processInformation['termsig'] = -1; + } + } + + // Free memory from self-reference callback created by buildCallback + // Doing so in other contexts like __destruct or by garbage collector is ineffective + // Now pipes are closed, so the callback is no longer necessary + $this->callback = null; + + return $this->exitcode; + } + + /** + * Resets data related to the latest run of the process. + */ + private function resetProcessData() + { + $this->starttime = null; + $this->callback = null; + $this->exitcode = null; + $this->fallbackStatus = []; + $this->processInformation = null; + $this->stdout = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+'); + $this->stderr = fopen('php://temp/maxmemory:'.(1024 * 1024), 'w+'); + $this->process = null; + $this->latestSignal = null; + $this->status = self::STATUS_READY; + $this->incrementalOutputOffset = 0; + $this->incrementalErrorOutputOffset = 0; + } + + /** + * Sends a POSIX signal to the process. + * + * @param int $signal A valid POSIX signal (see https://php.net/pcntl.constants) + * @param bool $throwException Whether to throw exception in case signal failed + * + * @throws LogicException In case the process is not running + * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed + * @throws RuntimeException In case of failure + */ + private function doSignal(int $signal, bool $throwException): bool + { + if (null === $pid = $this->getPid()) { + if ($throwException) { + throw new LogicException('Cannot send signal on a non running process.'); + } + + return false; + } + + if ('\\' === \DIRECTORY_SEPARATOR) { + exec(sprintf('taskkill /F /T /PID %d 2>&1', $pid), $output, $exitCode); + if ($exitCode && $this->isRunning()) { + if ($throwException) { + throw new RuntimeException(sprintf('Unable to kill the process (%s).', implode(' ', $output))); + } + + return false; + } + } else { + if (!$this->isSigchildEnabled()) { + $ok = @proc_terminate($this->process, $signal); + } elseif (\function_exists('posix_kill')) { + $ok = @posix_kill($pid, $signal); + } elseif ($ok = proc_open(sprintf('kill -%d %d', $signal, $pid), [2 => ['pipe', 'w']], $pipes)) { + $ok = false === fgets($pipes[2]); + } + if (!$ok) { + if ($throwException) { + throw new RuntimeException(sprintf('Error while sending signal "%s".', $signal)); + } + + return false; + } + } + + $this->latestSignal = $signal; + $this->fallbackStatus['signaled'] = true; + $this->fallbackStatus['exitcode'] = -1; + $this->fallbackStatus['termsig'] = $this->latestSignal; + + return true; + } + + private function prepareWindowsCommandLine(string $cmd, array &$env): string + { + $uid = uniqid('', true); + $varCount = 0; + $varCache = []; + $cmd = preg_replace_callback( + '/"(?:( + [^"%!^]*+ + (?: + (?: !LF! | "(?:\^[%!^])?+" ) + [^"%!^]*+ + )++ + ) | [^"]*+ )"/x', + function ($m) use (&$env, &$varCache, &$varCount, $uid) { + if (!isset($m[1])) { + return $m[0]; + } + if (isset($varCache[$m[0]])) { + return $varCache[$m[0]]; + } + if (str_contains($value = $m[1], "\0")) { + $value = str_replace("\0", '?', $value); + } + if (false === strpbrk($value, "\"%!\n")) { + return '"'.$value.'"'; + } + + $value = str_replace(['!LF!', '"^!"', '"^%"', '"^^"', '""'], ["\n", '!', '%', '^', '"'], $value); + $value = '"'.preg_replace('/(\\\\*)"/', '$1$1\\"', $value).'"'; + $var = $uid.++$varCount; + + $env[$var] = $value; + + return $varCache[$m[0]] = '!'.$var.'!'; + }, + $cmd + ); + + $cmd = 'cmd /V:ON /E:ON /D /C ('.str_replace("\n", ' ', $cmd).')'; + foreach ($this->processPipes->getFiles() as $offset => $filename) { + $cmd .= ' '.$offset.'>"'.$filename.'"'; + } + + return $cmd; + } + + /** + * Ensures the process is running or terminated, throws a LogicException if the process has a not started. + * + * @throws LogicException if the process has not run + */ + private function requireProcessIsStarted(string $functionName) + { + if (!$this->isStarted()) { + throw new LogicException(sprintf('Process must be started before calling "%s()".', $functionName)); + } + } + + /** + * Ensures the process is terminated, throws a LogicException if the process has a status different than "terminated". + * + * @throws LogicException if the process is not yet terminated + */ + private function requireProcessIsTerminated(string $functionName) + { + if (!$this->isTerminated()) { + throw new LogicException(sprintf('Process must be terminated before calling "%s()".', $functionName)); + } + } + + /** + * Escapes a string to be used as a shell argument. + */ + private function escapeArgument(?string $argument): string + { + if ('' === $argument || null === $argument) { + return '""'; + } + if ('\\' !== \DIRECTORY_SEPARATOR) { + return "'".str_replace("'", "'\\''", $argument)."'"; + } + if (str_contains($argument, "\0")) { + $argument = str_replace("\0", '?', $argument); + } + if (!preg_match('/[\/()%!^"<>&|\s]/', $argument)) { + return $argument; + } + $argument = preg_replace('/(\\\\+)$/', '$1$1', $argument); + + return '"'.str_replace(['"', '^', '%', '!', "\n"], ['""', '"^^"', '"^%"', '"^!"', '!LF!'], $argument).'"'; + } + + private function replacePlaceholders(string $commandline, array $env) + { + return preg_replace_callback('/"\$\{:([_a-zA-Z]++[_a-zA-Z0-9]*+)\}"/', function ($matches) use ($commandline, $env) { + if (!isset($env[$matches[1]]) || false === $env[$matches[1]]) { + throw new InvalidArgumentException(sprintf('Command line is missing a value for parameter "%s": ', $matches[1]).$commandline); + } + + return $this->escapeArgument($env[$matches[1]]); + }, $commandline); + } + + private function getDefaultEnv(): array + { + $env = getenv(); + $env = ('\\' === \DIRECTORY_SEPARATOR ? array_intersect_ukey($env, $_SERVER, 'strcasecmp') : array_intersect_key($env, $_SERVER)) ?: $env; + + return $_ENV + ('\\' === \DIRECTORY_SEPARATOR ? array_diff_ukey($env, $_ENV, 'strcasecmp') : $env); + } +} diff --git a/pandora_console/vendor/symfony/process/ProcessUtils.php b/pandora_console/vendor/symfony/process/ProcessUtils.php new file mode 100644 index 0000000000..2a7aff71b6 --- /dev/null +++ b/pandora_console/vendor/symfony/process/ProcessUtils.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process; + +use Symfony\Component\Process\Exception\InvalidArgumentException; + +/** + * ProcessUtils is a bunch of utility methods. + * + * This class contains static methods only and is not meant to be instantiated. + * + * @author Martin Hasoň + */ +class ProcessUtils +{ + /** + * This class should not be instantiated. + */ + private function __construct() + { + } + + /** + * Validates and normalizes a Process input. + * + * @param string $caller The name of method call that validates the input + * @param mixed $input The input to validate + * + * @return mixed + * + * @throws InvalidArgumentException In case the input is not valid + */ + public static function validateInput(string $caller, $input) + { + if (null !== $input) { + if (\is_resource($input)) { + return $input; + } + if (\is_string($input)) { + return $input; + } + if (\is_scalar($input)) { + return (string) $input; + } + if ($input instanceof Process) { + return $input->getIterator($input::ITER_SKIP_ERR); + } + if ($input instanceof \Iterator) { + return $input; + } + if ($input instanceof \Traversable) { + return new \IteratorIterator($input); + } + + throw new InvalidArgumentException(sprintf('"%s" only accepts strings, Traversable objects or stream resources.', $caller)); + } + + return $input; + } +} diff --git a/pandora_console/vendor/symfony/process/README.md b/pandora_console/vendor/symfony/process/README.md new file mode 100644 index 0000000000..8777de4a65 --- /dev/null +++ b/pandora_console/vendor/symfony/process/README.md @@ -0,0 +1,28 @@ +Process Component +================= + +The Process component executes commands in sub-processes. + +Sponsor +------- + +The Process component for Symfony 5.4/6.0 is [backed][1] by [SensioLabs][2]. + +As the creator of Symfony, SensioLabs supports companies using Symfony, with an +offering encompassing consultancy, expertise, services, training, and technical +assistance to ensure the success of web application development projects. + +Help Symfony by [sponsoring][3] its development! + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/process.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) + +[1]: https://symfony.com/backers +[2]: https://sensiolabs.com +[3]: https://symfony.com/sponsor diff --git a/pandora_console/vendor/symfony/process/composer.json b/pandora_console/vendor/symfony/process/composer.json new file mode 100644 index 0000000000..1669eba576 --- /dev/null +++ b/pandora_console/vendor/symfony/process/composer.json @@ -0,0 +1,29 @@ +{ + "name": "symfony/process", + "type": "library", + "description": "Executes commands in sub-processes", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Process\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev" +} diff --git a/pandora_console/vendor/symfony/var-dumper/.gitignore b/pandora_console/vendor/symfony/var-dumper/.gitignore new file mode 100644 index 0000000000..5414c2c655 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/.gitignore @@ -0,0 +1,3 @@ +composer.lock +phpunit.xml +vendor/ diff --git a/pandora_console/vendor/symfony/var-dumper/CHANGELOG.md b/pandora_console/vendor/symfony/var-dumper/CHANGELOG.md new file mode 100644 index 0000000000..2d44cad225 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/CHANGELOG.md @@ -0,0 +1,13 @@ +CHANGELOG +========= + +3.4.0 +----- + + * added `AbstractCloner::setMinDepth()` function to ensure minimum tree depth + * deprecated `MongoCaster` + +2.7.0 +----- + + * deprecated Cloner\Data::getLimitedClone(). Use withMaxDepth, withMaxItemsPerDepth or withRefHandles instead. diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/AmqpCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/AmqpCaster.php new file mode 100644 index 0000000000..dc7a6414fc --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/AmqpCaster.php @@ -0,0 +1,210 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Amqp related classes to array representation. + * + * @author Grégoire Pineau + */ +class AmqpCaster +{ + private static $flags = [ + \AMQP_DURABLE => 'AMQP_DURABLE', + \AMQP_PASSIVE => 'AMQP_PASSIVE', + \AMQP_EXCLUSIVE => 'AMQP_EXCLUSIVE', + \AMQP_AUTODELETE => 'AMQP_AUTODELETE', + \AMQP_INTERNAL => 'AMQP_INTERNAL', + \AMQP_NOLOCAL => 'AMQP_NOLOCAL', + \AMQP_AUTOACK => 'AMQP_AUTOACK', + \AMQP_IFEMPTY => 'AMQP_IFEMPTY', + \AMQP_IFUNUSED => 'AMQP_IFUNUSED', + \AMQP_MANDATORY => 'AMQP_MANDATORY', + \AMQP_IMMEDIATE => 'AMQP_IMMEDIATE', + \AMQP_MULTIPLE => 'AMQP_MULTIPLE', + \AMQP_NOWAIT => 'AMQP_NOWAIT', + \AMQP_REQUEUE => 'AMQP_REQUEUE', + ]; + + private static $exchangeTypes = [ + \AMQP_EX_TYPE_DIRECT => 'AMQP_EX_TYPE_DIRECT', + \AMQP_EX_TYPE_FANOUT => 'AMQP_EX_TYPE_FANOUT', + \AMQP_EX_TYPE_TOPIC => 'AMQP_EX_TYPE_TOPIC', + \AMQP_EX_TYPE_HEADERS => 'AMQP_EX_TYPE_HEADERS', + ]; + + public static function castConnection(\AMQPConnection $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'is_connected' => $c->isConnected(), + ]; + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPConnection\x00login"])) { + return $a; + } + + // BC layer in the amqp lib + if (method_exists($c, 'getReadTimeout')) { + $timeout = $c->getReadTimeout(); + } else { + $timeout = $c->getTimeout(); + } + + $a += [ + $prefix.'is_connected' => $c->isConnected(), + $prefix.'login' => $c->getLogin(), + $prefix.'password' => $c->getPassword(), + $prefix.'host' => $c->getHost(), + $prefix.'vhost' => $c->getVhost(), + $prefix.'port' => $c->getPort(), + $prefix.'read_timeout' => $timeout, + ]; + + return $a; + } + + public static function castChannel(\AMQPChannel $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'is_connected' => $c->isConnected(), + $prefix.'channel_id' => $c->getChannelId(), + ]; + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPChannel\x00connection"])) { + return $a; + } + + $a += [ + $prefix.'connection' => $c->getConnection(), + $prefix.'prefetch_size' => $c->getPrefetchSize(), + $prefix.'prefetch_count' => $c->getPrefetchCount(), + ]; + + return $a; + } + + public static function castQueue(\AMQPQueue $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'flags' => self::extractFlags($c->getFlags()), + ]; + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPQueue\x00name"])) { + return $a; + } + + $a += [ + $prefix.'connection' => $c->getConnection(), + $prefix.'channel' => $c->getChannel(), + $prefix.'name' => $c->getName(), + $prefix.'arguments' => $c->getArguments(), + ]; + + return $a; + } + + public static function castExchange(\AMQPExchange $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'flags' => self::extractFlags($c->getFlags()), + ]; + + $type = isset(self::$exchangeTypes[$c->getType()]) ? new ConstStub(self::$exchangeTypes[$c->getType()], $c->getType()) : $c->getType(); + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPExchange\x00name"])) { + $a["\x00AMQPExchange\x00type"] = $type; + + return $a; + } + + $a += [ + $prefix.'connection' => $c->getConnection(), + $prefix.'channel' => $c->getChannel(), + $prefix.'name' => $c->getName(), + $prefix.'type' => $type, + $prefix.'arguments' => $c->getArguments(), + ]; + + return $a; + } + + public static function castEnvelope(\AMQPEnvelope $c, array $a, Stub $stub, $isNested, $filter = 0) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $deliveryMode = new ConstStub($c->getDeliveryMode().(2 === $c->getDeliveryMode() ? ' (persistent)' : ' (non-persistent)'), $c->getDeliveryMode()); + + // Recent version of the extension already expose private properties + if (isset($a["\x00AMQPEnvelope\x00body"])) { + $a["\0AMQPEnvelope\0delivery_mode"] = $deliveryMode; + + return $a; + } + + if (!($filter & Caster::EXCLUDE_VERBOSE)) { + $a += [$prefix.'body' => $c->getBody()]; + } + + $a += [ + $prefix.'delivery_tag' => $c->getDeliveryTag(), + $prefix.'is_redelivery' => $c->isRedelivery(), + $prefix.'exchange_name' => $c->getExchangeName(), + $prefix.'routing_key' => $c->getRoutingKey(), + $prefix.'content_type' => $c->getContentType(), + $prefix.'content_encoding' => $c->getContentEncoding(), + $prefix.'headers' => $c->getHeaders(), + $prefix.'delivery_mode' => $deliveryMode, + $prefix.'priority' => $c->getPriority(), + $prefix.'correlation_id' => $c->getCorrelationId(), + $prefix.'reply_to' => $c->getReplyTo(), + $prefix.'expiration' => $c->getExpiration(), + $prefix.'message_id' => $c->getMessageId(), + $prefix.'timestamp' => $c->getTimeStamp(), + $prefix.'type' => $c->getType(), + $prefix.'user_id' => $c->getUserId(), + $prefix.'app_id' => $c->getAppId(), + ]; + + return $a; + } + + private static function extractFlags($flags) + { + $flagsArray = []; + + foreach (self::$flags as $value => $name) { + if ($flags & $value) { + $flagsArray[] = $name; + } + } + + if (!$flagsArray) { + $flagsArray = ['AMQP_NOPARAM']; + } + + return new ConstStub(implode('|', $flagsArray), $flags); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/ArgsStub.php b/pandora_console/vendor/symfony/var-dumper/Caster/ArgsStub.php new file mode 100644 index 0000000000..081fb47e99 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/ArgsStub.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a list of function arguments. + * + * @author Nicolas Grekas + */ +class ArgsStub extends EnumStub +{ + private static $parameters = []; + + public function __construct(array $args, $function, $class) + { + list($variadic, $params) = self::getParameters($function, $class); + + $values = []; + foreach ($args as $k => $v) { + $values[$k] = !is_scalar($v) && !$v instanceof Stub ? new CutStub($v) : $v; + } + if (null === $params) { + parent::__construct($values, false); + + return; + } + if (\count($values) < \count($params)) { + $params = \array_slice($params, 0, \count($values)); + } elseif (\count($values) > \count($params)) { + $values[] = new EnumStub(array_splice($values, \count($params)), false); + $params[] = $variadic; + } + if (['...'] === $params) { + $this->dumpKeys = false; + $this->value = $values[0]->value; + } else { + $this->value = array_combine($params, $values); + } + } + + private static function getParameters($function, $class) + { + if (isset(self::$parameters[$k = $class.'::'.$function])) { + return self::$parameters[$k]; + } + + try { + $r = null !== $class ? new \ReflectionMethod($class, $function) : new \ReflectionFunction($function); + } catch (\ReflectionException $e) { + return [null, null]; + } + + $variadic = '...'; + $params = []; + foreach ($r->getParameters() as $v) { + $k = '$'.$v->name; + if ($v->isPassedByReference()) { + $k = '&'.$k; + } + if (method_exists($v, 'isVariadic') && $v->isVariadic()) { + $variadic .= $k; + } else { + $params[] = $k; + } + } + + return self::$parameters[$k] = [$variadic, $params]; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/Caster.php b/pandora_console/vendor/symfony/var-dumper/Caster/Caster.php new file mode 100644 index 0000000000..a6ebc25bdd --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/Caster.php @@ -0,0 +1,192 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Helper for filtering out properties in casters. + * + * @author Nicolas Grekas + * + * @final + */ +class Caster +{ + const EXCLUDE_VERBOSE = 1; + const EXCLUDE_VIRTUAL = 2; + const EXCLUDE_DYNAMIC = 4; + const EXCLUDE_PUBLIC = 8; + const EXCLUDE_PROTECTED = 16; + const EXCLUDE_PRIVATE = 32; + const EXCLUDE_NULL = 64; + const EXCLUDE_EMPTY = 128; + const EXCLUDE_NOT_IMPORTANT = 256; + const EXCLUDE_STRICT = 512; + + const PREFIX_VIRTUAL = "\0~\0"; + const PREFIX_DYNAMIC = "\0+\0"; + const PREFIX_PROTECTED = "\0*\0"; + + /** + * Casts objects to arrays and adds the dynamic property prefix. + * + * @param object $obj The object to cast + * @param string $class The class of the object + * @param bool $hasDebugInfo Whether the __debugInfo method exists on $obj or not + * + * @return array The array-cast of the object, with prefixed dynamic properties + */ + public static function castObject($obj, $class, $hasDebugInfo = false, $debugClass = null) + { + if ($class instanceof \ReflectionClass) { + @trigger_error(sprintf('Passing a ReflectionClass to "%s()" is deprecated since Symfony 3.3 and will be unsupported in 4.0. Pass the class name as string instead.', __METHOD__), \E_USER_DEPRECATED); + $hasDebugInfo = $class->hasMethod('__debugInfo'); + $class = $class->name; + } + + if ($hasDebugInfo) { + try { + $debugInfo = $obj->__debugInfo(); + } catch (\Exception $e) { + // ignore failing __debugInfo() + $hasDebugInfo = false; + } + } + + $a = $obj instanceof \Closure ? [] : (array) $obj; + + if ($obj instanceof \__PHP_Incomplete_Class) { + return $a; + } + + if ($a) { + static $publicProperties = []; + if (null === $debugClass) { + if (\PHP_VERSION_ID >= 80000) { + $debugClass = get_debug_type($obj); + } else { + $debugClass = $class; + + if (isset($debugClass[15]) && "\0" === $debugClass[15]) { + $debugClass = (get_parent_class($debugClass) ?: key(class_implements($debugClass)) ?: 'class').'@anonymous'; + } + } + } + + $i = 0; + $prefixedKeys = []; + foreach ($a as $k => $v) { + if (isset($k[0]) ? "\0" !== $k[0] : \PHP_VERSION_ID >= 70200) { + if (!isset($publicProperties[$class])) { + foreach ((new \ReflectionClass($class))->getProperties(\ReflectionProperty::IS_PUBLIC) as $prop) { + $publicProperties[$class][$prop->name] = true; + } + } + if (!isset($publicProperties[$class][$k])) { + $prefixedKeys[$i] = self::PREFIX_DYNAMIC.$k; + } + } elseif ($debugClass !== $class && 1 === strpos($k, $class)) { + $prefixedKeys[$i] = "\0".$debugClass.strrchr($k, "\0"); + } + ++$i; + } + if ($prefixedKeys) { + $keys = array_keys($a); + foreach ($prefixedKeys as $i => $k) { + $keys[$i] = $k; + } + $a = array_combine($keys, $a); + } + } + + if ($hasDebugInfo && \is_array($debugInfo)) { + foreach ($debugInfo as $k => $v) { + if (!isset($k[0]) || "\0" !== $k[0]) { + if (\array_key_exists(self::PREFIX_DYNAMIC.$k, $a)) { + continue; + } + $k = self::PREFIX_VIRTUAL.$k; + } + + unset($a[$k]); + $a[$k] = $v; + } + } + + return $a; + } + + /** + * Filters out the specified properties. + * + * By default, a single match in the $filter bit field filters properties out, following an "or" logic. + * When EXCLUDE_STRICT is set, an "and" logic is applied: all bits must match for a property to be removed. + * + * @param array $a The array containing the properties to filter + * @param int $filter A bit field of Caster::EXCLUDE_* constants specifying which properties to filter out + * @param string[] $listedProperties List of properties to exclude when Caster::EXCLUDE_VERBOSE is set, and to preserve when Caster::EXCLUDE_NOT_IMPORTANT is set + * @param int &$count Set to the number of removed properties + * + * @return array The filtered array + */ + public static function filter(array $a, $filter, array $listedProperties = [], &$count = 0) + { + $count = 0; + + foreach ($a as $k => $v) { + $type = self::EXCLUDE_STRICT & $filter; + + if (null === $v) { + $type |= self::EXCLUDE_NULL & $filter; + $type |= self::EXCLUDE_EMPTY & $filter; + } elseif (false === $v || '' === $v || '0' === $v || 0 === $v || 0.0 === $v || [] === $v) { + $type |= self::EXCLUDE_EMPTY & $filter; + } + if ((self::EXCLUDE_NOT_IMPORTANT & $filter) && !\in_array($k, $listedProperties, true)) { + $type |= self::EXCLUDE_NOT_IMPORTANT; + } + if ((self::EXCLUDE_VERBOSE & $filter) && \in_array($k, $listedProperties, true)) { + $type |= self::EXCLUDE_VERBOSE; + } + + if (!isset($k[1]) || "\0" !== $k[0]) { + $type |= self::EXCLUDE_PUBLIC & $filter; + } elseif ('~' === $k[1]) { + $type |= self::EXCLUDE_VIRTUAL & $filter; + } elseif ('+' === $k[1]) { + $type |= self::EXCLUDE_DYNAMIC & $filter; + } elseif ('*' === $k[1]) { + $type |= self::EXCLUDE_PROTECTED & $filter; + } else { + $type |= self::EXCLUDE_PRIVATE & $filter; + } + + if ((self::EXCLUDE_STRICT & $filter) ? $type === $filter : $type) { + unset($a[$k]); + ++$count; + } + } + + return $a; + } + + public static function castPhpIncompleteClass(\__PHP_Incomplete_Class $c, array $a, Stub $stub, $isNested) + { + if (isset($a['__PHP_Incomplete_Class_Name'])) { + $stub->class .= '('.$a['__PHP_Incomplete_Class_Name'].')'; + unset($a['__PHP_Incomplete_Class_Name']); + } + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/ClassStub.php b/pandora_console/vendor/symfony/var-dumper/Caster/ClassStub.php new file mode 100644 index 0000000000..1a85098e15 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/ClassStub.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents a PHP class identifier. + * + * @author Nicolas Grekas + */ +class ClassStub extends ConstStub +{ + /** + * @param string $identifier A PHP identifier, e.g. a class, method, interface, etc. name + * @param callable $callable The callable targeted by the identifier when it is ambiguous or not a real PHP identifier + */ + public function __construct($identifier, $callable = null) + { + $this->value = $identifier; + + if (0 < $i = strrpos($identifier, '\\')) { + $this->attr['ellipsis'] = \strlen($identifier) - $i; + $this->attr['ellipsis-type'] = 'class'; + $this->attr['ellipsis-tail'] = 1; + } + + try { + if (null !== $callable) { + if ($callable instanceof \Closure) { + $r = new \ReflectionFunction($callable); + } elseif (\is_object($callable)) { + $r = [$callable, '__invoke']; + } elseif (\is_array($callable)) { + $r = $callable; + } elseif (false !== $i = strpos($callable, '::')) { + $r = [substr($callable, 0, $i), substr($callable, 2 + $i)]; + } else { + $r = new \ReflectionFunction($callable); + } + } elseif (0 < $i = strpos($identifier, '::') ?: strpos($identifier, '->')) { + $r = [substr($identifier, 0, $i), substr($identifier, 2 + $i)]; + } else { + $r = new \ReflectionClass($identifier); + } + + if (\is_array($r)) { + try { + $r = new \ReflectionMethod($r[0], $r[1]); + } catch (\ReflectionException $e) { + $r = new \ReflectionClass($r[0]); + } + } + } catch (\ReflectionException $e) { + return; + } + + if ($f = $r->getFileName()) { + $this->attr['file'] = $f; + $this->attr['line'] = $r->getStartLine(); + } + } + + public static function wrapCallable($callable) + { + if (\is_object($callable) || !\is_callable($callable)) { + return $callable; + } + + if (!\is_array($callable)) { + $callable = new static($callable); + } elseif (\is_string($callable[0])) { + $callable[0] = new static($callable[0]); + } else { + $callable[1] = new static($callable[1], $callable); + } + + return $callable; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/ConstStub.php b/pandora_console/vendor/symfony/var-dumper/Caster/ConstStub.php new file mode 100644 index 0000000000..26c0010b66 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/ConstStub.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a PHP constant and its value. + * + * @author Nicolas Grekas + */ +class ConstStub extends Stub +{ + public function __construct($name, $value) + { + $this->class = $name; + $this->value = $value; + } + + public function __toString() + { + return (string) $this->value; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/CutArrayStub.php b/pandora_console/vendor/symfony/var-dumper/Caster/CutArrayStub.php new file mode 100644 index 0000000000..0e4fb363d2 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/CutArrayStub.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents a cut array. + * + * @author Nicolas Grekas + */ +class CutArrayStub extends CutStub +{ + public $preservedSubset; + + public function __construct(array $value, array $preservedKeys) + { + parent::__construct($value); + + $this->preservedSubset = array_intersect_key($value, array_flip($preservedKeys)); + $this->cut -= \count($this->preservedSubset); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/CutStub.php b/pandora_console/vendor/symfony/var-dumper/Caster/CutStub.php new file mode 100644 index 0000000000..690338f542 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/CutStub.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents the main properties of a PHP variable, pre-casted by a caster. + * + * @author Nicolas Grekas + */ +class CutStub extends Stub +{ + public function __construct($value) + { + $this->value = $value; + + switch (\gettype($value)) { + case 'object': + $this->type = self::TYPE_OBJECT; + $this->class = \get_class($value); + $this->cut = -1; + break; + + case 'array': + $this->type = self::TYPE_ARRAY; + $this->class = self::ARRAY_ASSOC; + $this->cut = $this->value = \count($value); + break; + + case 'resource': + case 'unknown type': + case 'resource (closed)': + $this->type = self::TYPE_RESOURCE; + $this->handle = (int) $value; + if ('Unknown' === $this->class = @get_resource_type($value)) { + $this->class = 'Closed'; + } + $this->cut = -1; + break; + + case 'string': + $this->type = self::TYPE_STRING; + $this->class = preg_match('//u', $value) ? self::STRING_UTF8 : self::STRING_BINARY; + $this->cut = self::STRING_BINARY === $this->class ? \strlen($value) : mb_strlen($value, 'UTF-8'); + $this->value = ''; + break; + } + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/DOMCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/DOMCaster.php new file mode 100644 index 0000000000..fef3d432a7 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/DOMCaster.php @@ -0,0 +1,302 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts DOM related classes to array representation. + * + * @author Nicolas Grekas + */ +class DOMCaster +{ + private static $errorCodes = [ + \DOM_PHP_ERR => 'DOM_PHP_ERR', + \DOM_INDEX_SIZE_ERR => 'DOM_INDEX_SIZE_ERR', + \DOMSTRING_SIZE_ERR => 'DOMSTRING_SIZE_ERR', + \DOM_HIERARCHY_REQUEST_ERR => 'DOM_HIERARCHY_REQUEST_ERR', + \DOM_WRONG_DOCUMENT_ERR => 'DOM_WRONG_DOCUMENT_ERR', + \DOM_INVALID_CHARACTER_ERR => 'DOM_INVALID_CHARACTER_ERR', + \DOM_NO_DATA_ALLOWED_ERR => 'DOM_NO_DATA_ALLOWED_ERR', + \DOM_NO_MODIFICATION_ALLOWED_ERR => 'DOM_NO_MODIFICATION_ALLOWED_ERR', + \DOM_NOT_FOUND_ERR => 'DOM_NOT_FOUND_ERR', + \DOM_NOT_SUPPORTED_ERR => 'DOM_NOT_SUPPORTED_ERR', + \DOM_INUSE_ATTRIBUTE_ERR => 'DOM_INUSE_ATTRIBUTE_ERR', + \DOM_INVALID_STATE_ERR => 'DOM_INVALID_STATE_ERR', + \DOM_SYNTAX_ERR => 'DOM_SYNTAX_ERR', + \DOM_INVALID_MODIFICATION_ERR => 'DOM_INVALID_MODIFICATION_ERR', + \DOM_NAMESPACE_ERR => 'DOM_NAMESPACE_ERR', + \DOM_INVALID_ACCESS_ERR => 'DOM_INVALID_ACCESS_ERR', + \DOM_VALIDATION_ERR => 'DOM_VALIDATION_ERR', + ]; + + private static $nodeTypes = [ + \XML_ELEMENT_NODE => 'XML_ELEMENT_NODE', + \XML_ATTRIBUTE_NODE => 'XML_ATTRIBUTE_NODE', + \XML_TEXT_NODE => 'XML_TEXT_NODE', + \XML_CDATA_SECTION_NODE => 'XML_CDATA_SECTION_NODE', + \XML_ENTITY_REF_NODE => 'XML_ENTITY_REF_NODE', + \XML_ENTITY_NODE => 'XML_ENTITY_NODE', + \XML_PI_NODE => 'XML_PI_NODE', + \XML_COMMENT_NODE => 'XML_COMMENT_NODE', + \XML_DOCUMENT_NODE => 'XML_DOCUMENT_NODE', + \XML_DOCUMENT_TYPE_NODE => 'XML_DOCUMENT_TYPE_NODE', + \XML_DOCUMENT_FRAG_NODE => 'XML_DOCUMENT_FRAG_NODE', + \XML_NOTATION_NODE => 'XML_NOTATION_NODE', + \XML_HTML_DOCUMENT_NODE => 'XML_HTML_DOCUMENT_NODE', + \XML_DTD_NODE => 'XML_DTD_NODE', + \XML_ELEMENT_DECL_NODE => 'XML_ELEMENT_DECL_NODE', + \XML_ATTRIBUTE_DECL_NODE => 'XML_ATTRIBUTE_DECL_NODE', + \XML_ENTITY_DECL_NODE => 'XML_ENTITY_DECL_NODE', + \XML_NAMESPACE_DECL_NODE => 'XML_NAMESPACE_DECL_NODE', + ]; + + public static function castException(\DOMException $e, array $a, Stub $stub, $isNested) + { + $k = Caster::PREFIX_PROTECTED.'code'; + if (isset($a[$k], self::$errorCodes[$a[$k]])) { + $a[$k] = new ConstStub(self::$errorCodes[$a[$k]], $a[$k]); + } + + return $a; + } + + public static function castLength($dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'length' => $dom->length, + ]; + + return $a; + } + + public static function castImplementation($dom, array $a, Stub $stub, $isNested) + { + $a += [ + Caster::PREFIX_VIRTUAL.'Core' => '1.0', + Caster::PREFIX_VIRTUAL.'XML' => '2.0', + ]; + + return $a; + } + + public static function castNode(\DOMNode $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'nodeName' => $dom->nodeName, + 'nodeValue' => new CutStub($dom->nodeValue), + 'nodeType' => new ConstStub(self::$nodeTypes[$dom->nodeType], $dom->nodeType), + 'parentNode' => new CutStub($dom->parentNode), + 'childNodes' => $dom->childNodes, + 'firstChild' => new CutStub($dom->firstChild), + 'lastChild' => new CutStub($dom->lastChild), + 'previousSibling' => new CutStub($dom->previousSibling), + 'nextSibling' => new CutStub($dom->nextSibling), + 'attributes' => $dom->attributes, + 'ownerDocument' => new CutStub($dom->ownerDocument), + 'namespaceURI' => $dom->namespaceURI, + 'prefix' => $dom->prefix, + 'localName' => $dom->localName, + 'baseURI' => $dom->baseURI ? new LinkStub($dom->baseURI) : $dom->baseURI, + 'textContent' => new CutStub($dom->textContent), + ]; + + return $a; + } + + public static function castNameSpaceNode(\DOMNameSpaceNode $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'nodeName' => $dom->nodeName, + 'nodeValue' => new CutStub($dom->nodeValue), + 'nodeType' => new ConstStub(self::$nodeTypes[$dom->nodeType], $dom->nodeType), + 'prefix' => $dom->prefix, + 'localName' => $dom->localName, + 'namespaceURI' => $dom->namespaceURI, + 'ownerDocument' => new CutStub($dom->ownerDocument), + 'parentNode' => new CutStub($dom->parentNode), + ]; + + return $a; + } + + public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, $isNested, $filter = 0) + { + $a += [ + 'doctype' => $dom->doctype, + 'implementation' => $dom->implementation, + 'documentElement' => new CutStub($dom->documentElement), + 'actualEncoding' => $dom->actualEncoding, + 'encoding' => $dom->encoding, + 'xmlEncoding' => $dom->xmlEncoding, + 'standalone' => $dom->standalone, + 'xmlStandalone' => $dom->xmlStandalone, + 'version' => $dom->version, + 'xmlVersion' => $dom->xmlVersion, + 'strictErrorChecking' => $dom->strictErrorChecking, + 'documentURI' => $dom->documentURI ? new LinkStub($dom->documentURI) : $dom->documentURI, + 'config' => $dom->config, + 'formatOutput' => $dom->formatOutput, + 'validateOnParse' => $dom->validateOnParse, + 'resolveExternals' => $dom->resolveExternals, + 'preserveWhiteSpace' => $dom->preserveWhiteSpace, + 'recover' => $dom->recover, + 'substituteEntities' => $dom->substituteEntities, + ]; + + if (!($filter & Caster::EXCLUDE_VERBOSE)) { + $formatOutput = $dom->formatOutput; + $dom->formatOutput = true; + $a += [Caster::PREFIX_VIRTUAL.'xml' => $dom->saveXML()]; + $dom->formatOutput = $formatOutput; + } + + return $a; + } + + public static function castCharacterData(\DOMCharacterData $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'data' => $dom->data, + 'length' => $dom->length, + ]; + + return $a; + } + + public static function castAttr(\DOMAttr $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'name' => $dom->name, + 'specified' => $dom->specified, + 'value' => $dom->value, + 'ownerElement' => $dom->ownerElement, + 'schemaTypeInfo' => $dom->schemaTypeInfo, + ]; + + return $a; + } + + public static function castElement(\DOMElement $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'tagName' => $dom->tagName, + 'schemaTypeInfo' => $dom->schemaTypeInfo, + ]; + + return $a; + } + + public static function castText(\DOMText $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'wholeText' => $dom->wholeText, + ]; + + return $a; + } + + public static function castTypeinfo(\DOMTypeinfo $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'typeName' => $dom->typeName, + 'typeNamespace' => $dom->typeNamespace, + ]; + + return $a; + } + + public static function castDomError(\DOMDomError $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'severity' => $dom->severity, + 'message' => $dom->message, + 'type' => $dom->type, + 'relatedException' => $dom->relatedException, + 'related_data' => $dom->related_data, + 'location' => $dom->location, + ]; + + return $a; + } + + public static function castLocator(\DOMLocator $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'lineNumber' => $dom->lineNumber, + 'columnNumber' => $dom->columnNumber, + 'offset' => $dom->offset, + 'relatedNode' => $dom->relatedNode, + 'uri' => $dom->uri ? new LinkStub($dom->uri, $dom->lineNumber) : $dom->uri, + ]; + + return $a; + } + + public static function castDocumentType(\DOMDocumentType $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'name' => $dom->name, + 'entities' => $dom->entities, + 'notations' => $dom->notations, + 'publicId' => $dom->publicId, + 'systemId' => $dom->systemId, + 'internalSubset' => $dom->internalSubset, + ]; + + return $a; + } + + public static function castNotation(\DOMNotation $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'publicId' => $dom->publicId, + 'systemId' => $dom->systemId, + ]; + + return $a; + } + + public static function castEntity(\DOMEntity $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'publicId' => $dom->publicId, + 'systemId' => $dom->systemId, + 'notationName' => $dom->notationName, + 'actualEncoding' => $dom->actualEncoding, + 'encoding' => $dom->encoding, + 'version' => $dom->version, + ]; + + return $a; + } + + public static function castProcessingInstruction(\DOMProcessingInstruction $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'target' => $dom->target, + 'data' => $dom->data, + ]; + + return $a; + } + + public static function castXPath(\DOMXPath $dom, array $a, Stub $stub, $isNested) + { + $a += [ + 'document' => $dom->document, + ]; + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/DateCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/DateCaster.php new file mode 100644 index 0000000000..70f229a0d8 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/DateCaster.php @@ -0,0 +1,133 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts DateTimeInterface related classes to array representation. + * + * @author Dany Maillard + */ +class DateCaster +{ + public static function castDateTime(\DateTimeInterface $d, array $a, Stub $stub, $isNested, $filter) + { + $prefix = Caster::PREFIX_VIRTUAL; + $location = $d->getTimezone()->getLocation(); + $fromNow = (new \DateTime())->diff($d); + + $title = $d->format('l, F j, Y') + ."\n".self::formatInterval($fromNow).' from now' + .($location ? ($d->format('I') ? "\nDST On" : "\nDST Off") : '') + ; + + unset( + $a[Caster::PREFIX_DYNAMIC.'date'], + $a[Caster::PREFIX_DYNAMIC.'timezone'], + $a[Caster::PREFIX_DYNAMIC.'timezone_type'] + ); + $a[$prefix.'date'] = new ConstStub(self::formatDateTime($d, $location ? ' e (P)' : ' P'), $title); + + $stub->class .= $d->format(' @U'); + + return $a; + } + + public static function castInterval(\DateInterval $interval, array $a, Stub $stub, $isNested, $filter) + { + $now = new \DateTimeImmutable(); + $numberOfSeconds = $now->add($interval)->getTimestamp() - $now->getTimestamp(); + $title = number_format($numberOfSeconds, 0, '.', ' ').'s'; + + $i = [Caster::PREFIX_VIRTUAL.'interval' => new ConstStub(self::formatInterval($interval), $title)]; + + return $filter & Caster::EXCLUDE_VERBOSE ? $i : $i + $a; + } + + private static function formatInterval(\DateInterval $i) + { + $format = '%R '; + + if (0 === $i->y && 0 === $i->m && ($i->h >= 24 || $i->i >= 60 || $i->s >= 60)) { + $i = date_diff($d = new \DateTime(), date_add(clone $d, $i)); // recalculate carry over points + $format .= 0 < $i->days ? '%ad ' : ''; + } else { + $format .= ($i->y ? '%yy ' : '').($i->m ? '%mm ' : '').($i->d ? '%dd ' : ''); + } + + if (\PHP_VERSION_ID >= 70100 && isset($i->f)) { + $format .= $i->h || $i->i || $i->s || $i->f ? '%H:%I:'.self::formatSeconds($i->s, substr($i->f, 2)) : ''; + } else { + $format .= $i->h || $i->i || $i->s ? '%H:%I:%S' : ''; + } + + $format = '%R ' === $format ? '0s' : $format; + + return $i->format(rtrim($format)); + } + + public static function castTimeZone(\DateTimeZone $timeZone, array $a, Stub $stub, $isNested, $filter) + { + $location = $timeZone->getLocation(); + $formatted = (new \DateTime('now', $timeZone))->format($location ? 'e (P)' : 'P'); + $title = $location && \extension_loaded('intl') ? \Locale::getDisplayRegion('-'.$location['country_code'], \Locale::getDefault()) : ''; + + $z = [Caster::PREFIX_VIRTUAL.'timezone' => new ConstStub($formatted, $title)]; + + return $filter & Caster::EXCLUDE_VERBOSE ? $z : $z + $a; + } + + public static function castPeriod(\DatePeriod $p, array $a, Stub $stub, $isNested, $filter) + { + if (\defined('HHVM_VERSION_ID') || \PHP_VERSION_ID < 50620 || (\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70005)) { // see https://bugs.php.net/71635 + return $a; + } + + $dates = []; + if (\PHP_VERSION_ID >= 70107) { // see https://bugs.php.net/74639 + foreach (clone $p as $i => $d) { + if (3 === $i) { + $now = new \DateTimeImmutable(); + $dates[] = sprintf('%s more', ($end = $p->getEndDate()) + ? ceil(($end->format('U.u') - $d->format('U.u')) / ((int) $now->add($p->getDateInterval())->format('U.u') - (int) $now->format('U.u'))) + : $p->recurrences - $i + ); + break; + } + $dates[] = sprintf('%s) %s', $i + 1, self::formatDateTime($d)); + } + } + + $period = sprintf( + 'every %s, from %s (%s) %s', + self::formatInterval($p->getDateInterval()), + self::formatDateTime($p->getStartDate()), + $p->include_start_date ? 'included' : 'excluded', + ($end = $p->getEndDate()) ? 'to '.self::formatDateTime($end) : 'recurring '.$p->recurrences.' time/s' + ); + + $p = [Caster::PREFIX_VIRTUAL.'period' => new ConstStub($period, implode("\n", $dates))]; + + return $filter & Caster::EXCLUDE_VERBOSE ? $p : $p + $a; + } + + private static function formatDateTime(\DateTimeInterface $d, $extra = '') + { + return $d->format('Y-m-d H:i:'.self::formatSeconds($d->format('s'), $d->format('u')).$extra); + } + + private static function formatSeconds($s, $us) + { + return sprintf('%02d.%s', $s, 0 === ($len = \strlen($t = rtrim($us, '0'))) ? '0' : ($len <= 3 ? str_pad($t, 3, '0') : $us)); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/DoctrineCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/DoctrineCaster.php new file mode 100644 index 0000000000..696b87816e --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/DoctrineCaster.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Doctrine\Common\Proxy\Proxy as CommonProxy; +use Doctrine\ORM\PersistentCollection; +use Doctrine\ORM\Proxy\Proxy as OrmProxy; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Doctrine related classes to array representation. + * + * @author Nicolas Grekas + */ +class DoctrineCaster +{ + public static function castCommonProxy(CommonProxy $proxy, array $a, Stub $stub, $isNested) + { + foreach (['__cloner__', '__initializer__'] as $k) { + if (\array_key_exists($k, $a)) { + unset($a[$k]); + ++$stub->cut; + } + } + + return $a; + } + + public static function castOrmProxy(OrmProxy $proxy, array $a, Stub $stub, $isNested) + { + foreach (['_entityPersister', '_identifier'] as $k) { + if (\array_key_exists($k = "\0Doctrine\\ORM\\Proxy\\Proxy\0".$k, $a)) { + unset($a[$k]); + ++$stub->cut; + } + } + + return $a; + } + + public static function castPersistentCollection(PersistentCollection $coll, array $a, Stub $stub, $isNested) + { + foreach (['snapshot', 'association', 'typeClass'] as $k) { + if (\array_key_exists($k = "\0Doctrine\\ORM\\PersistentCollection\0".$k, $a)) { + $a[$k] = new CutStub($a[$k]); + } + } + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/EnumStub.php b/pandora_console/vendor/symfony/var-dumper/Caster/EnumStub.php new file mode 100644 index 0000000000..3cee23eac2 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/EnumStub.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents an enumeration of values. + * + * @author Nicolas Grekas + */ +class EnumStub extends Stub +{ + public $dumpKeys = true; + + public function __construct(array $values, $dumpKeys = true) + { + $this->value = $values; + $this->dumpKeys = $dumpKeys; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/ExceptionCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/ExceptionCaster.php new file mode 100644 index 0000000000..62b57402f8 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/ExceptionCaster.php @@ -0,0 +1,349 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\Debug\Exception\SilencedErrorContext; +use Symfony\Component\VarDumper\Cloner\Stub; +use Symfony\Component\VarDumper\Exception\ThrowingCasterException; + +/** + * Casts common Exception classes to array representation. + * + * @author Nicolas Grekas + */ +class ExceptionCaster +{ + public static $srcContext = 1; + public static $traceArgs = true; + public static $errorTypes = [ + \E_DEPRECATED => 'E_DEPRECATED', + \E_USER_DEPRECATED => 'E_USER_DEPRECATED', + \E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR', + \E_ERROR => 'E_ERROR', + \E_WARNING => 'E_WARNING', + \E_PARSE => 'E_PARSE', + \E_NOTICE => 'E_NOTICE', + \E_CORE_ERROR => 'E_CORE_ERROR', + \E_CORE_WARNING => 'E_CORE_WARNING', + \E_COMPILE_ERROR => 'E_COMPILE_ERROR', + \E_COMPILE_WARNING => 'E_COMPILE_WARNING', + \E_USER_ERROR => 'E_USER_ERROR', + \E_USER_WARNING => 'E_USER_WARNING', + \E_USER_NOTICE => 'E_USER_NOTICE', + \E_STRICT => 'E_STRICT', + ]; + + private static $framesCache = []; + + public static function castError(\Error $e, array $a, Stub $stub, $isNested, $filter = 0) + { + return self::filterExceptionArray($stub->class, $a, "\0Error\0", $filter); + } + + public static function castException(\Exception $e, array $a, Stub $stub, $isNested, $filter = 0) + { + return self::filterExceptionArray($stub->class, $a, "\0Exception\0", $filter); + } + + public static function castErrorException(\ErrorException $e, array $a, Stub $stub, $isNested) + { + if (isset($a[$s = Caster::PREFIX_PROTECTED.'severity'], self::$errorTypes[$a[$s]])) { + $a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]); + } + + return $a; + } + + public static function castThrowingCasterException(ThrowingCasterException $e, array $a, Stub $stub, $isNested) + { + $trace = Caster::PREFIX_VIRTUAL.'trace'; + $prefix = Caster::PREFIX_PROTECTED; + $xPrefix = "\0Exception\0"; + + if (isset($a[$xPrefix.'previous'], $a[$trace]) && $a[$xPrefix.'previous'] instanceof \Exception) { + $b = (array) $a[$xPrefix.'previous']; + self::traceUnshift($b[$xPrefix.'trace'], \get_class($a[$xPrefix.'previous']), $b[$prefix.'file'], $b[$prefix.'line']); + $a[$trace] = new TraceStub($b[$xPrefix.'trace'], false, 0, -\count($a[$trace]->value)); + } + + unset($a[$xPrefix.'previous'], $a[$prefix.'code'], $a[$prefix.'file'], $a[$prefix.'line']); + + return $a; + } + + public static function castSilencedErrorContext(SilencedErrorContext $e, array $a, Stub $stub, $isNested) + { + $sPrefix = "\0".SilencedErrorContext::class."\0"; + + if (!isset($a[$s = $sPrefix.'severity'])) { + return $a; + } + + if (isset(self::$errorTypes[$a[$s]])) { + $a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]); + } + + $trace = [[ + 'file' => $a[$sPrefix.'file'], + 'line' => $a[$sPrefix.'line'], + ]]; + + if (isset($a[$sPrefix.'trace'])) { + $trace = array_merge($trace, $a[$sPrefix.'trace']); + } + + unset($a[$sPrefix.'file'], $a[$sPrefix.'line'], $a[$sPrefix.'trace']); + $a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs); + + return $a; + } + + public static function castTraceStub(TraceStub $trace, array $a, Stub $stub, $isNested) + { + if (!$isNested) { + return $a; + } + $stub->class = ''; + $stub->handle = 0; + $frames = $trace->value; + $prefix = Caster::PREFIX_VIRTUAL; + + $a = []; + $j = \count($frames); + if (0 > $i = $trace->sliceOffset) { + $i = max(0, $j + $i); + } + if (!isset($trace->value[$i])) { + return []; + } + $lastCall = isset($frames[$i]['function']) ? (isset($frames[$i]['class']) ? $frames[0]['class'].$frames[$i]['type'] : '').$frames[$i]['function'].'()' : ''; + $frames[] = ['function' => '']; + $collapse = false; + + for ($j += $trace->numberingOffset - $i++; isset($frames[$i]); ++$i, --$j) { + $f = $frames[$i]; + $call = isset($f['function']) ? (isset($f['class']) ? $f['class'].$f['type'] : '').$f['function'] : '???'; + + $frame = new FrameStub( + [ + 'object' => isset($f['object']) ? $f['object'] : null, + 'class' => isset($f['class']) ? $f['class'] : null, + 'type' => isset($f['type']) ? $f['type'] : null, + 'function' => isset($f['function']) ? $f['function'] : null, + ] + $frames[$i - 1], + false, + true + ); + $f = self::castFrameStub($frame, [], $frame, true); + if (isset($f[$prefix.'src'])) { + foreach ($f[$prefix.'src']->value as $label => $frame) { + if (0 === strpos($label, "\0~collapse=0")) { + if ($collapse) { + $label = substr_replace($label, '1', 11, 1); + } else { + $collapse = true; + } + } + $label = substr_replace($label, "title=Stack level $j.&", 2, 0); + } + $f = $frames[$i - 1]; + if ($trace->keepArgs && !empty($f['args']) && $frame instanceof EnumStub) { + $frame->value['arguments'] = new ArgsStub($f['args'], isset($f['function']) ? $f['function'] : null, isset($f['class']) ? $f['class'] : null); + } + } elseif ('???' !== $lastCall) { + $label = new ClassStub($lastCall); + if (isset($label->attr['ellipsis'])) { + $label->attr['ellipsis'] += 2; + $label = substr_replace($prefix, "ellipsis-type=class&ellipsis={$label->attr['ellipsis']}&ellipsis-tail=1&title=Stack level $j.", 2, 0).$label->value.'()'; + } else { + $label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$label->value.'()'; + } + } else { + $label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$lastCall; + } + $a[substr_replace($label, sprintf('separator=%s&', $frame instanceof EnumStub ? ' ' : ':'), 2, 0)] = $frame; + + $lastCall = $call; + } + if (null !== $trace->sliceLength) { + $a = \array_slice($a, 0, $trace->sliceLength, true); + } + + return $a; + } + + public static function castFrameStub(FrameStub $frame, array $a, Stub $stub, $isNested) + { + if (!$isNested) { + return $a; + } + $f = $frame->value; + $prefix = Caster::PREFIX_VIRTUAL; + + if (isset($f['file'], $f['line'])) { + $cacheKey = $f; + unset($cacheKey['object'], $cacheKey['args']); + $cacheKey[] = self::$srcContext; + $cacheKey = implode('-', $cacheKey); + + if (isset(self::$framesCache[$cacheKey])) { + $a[$prefix.'src'] = self::$framesCache[$cacheKey]; + } else { + if (preg_match('/\((\d+)\)(?:\([\da-f]{32}\))? : (?:eval\(\)\'d code|runtime-created function)$/', $f['file'], $match)) { + $f['file'] = substr($f['file'], 0, -\strlen($match[0])); + $f['line'] = (int) $match[1]; + } + $caller = isset($f['function']) ? sprintf('in %s() on line %d', (isset($f['class']) ? $f['class'].$f['type'] : '').$f['function'], $f['line']) : null; + $src = $f['line']; + $srcKey = $f['file']; + $ellipsis = new LinkStub($srcKey, 0); + $srcAttr = 'collapse='.(int) $ellipsis->inVendor; + $ellipsisTail = isset($ellipsis->attr['ellipsis-tail']) ? $ellipsis->attr['ellipsis-tail'] : 0; + $ellipsis = isset($ellipsis->attr['ellipsis']) ? $ellipsis->attr['ellipsis'] : 0; + + if (file_exists($f['file']) && 0 <= self::$srcContext) { + if (!empty($f['class']) && (is_subclass_of($f['class'], 'Twig\Template') || is_subclass_of($f['class'], 'Twig_Template')) && method_exists($f['class'], 'getDebugInfo')) { + $template = isset($f['object']) ? $f['object'] : unserialize(sprintf('O:%d:"%s":0:{}', \strlen($f['class']), $f['class'])); + + $ellipsis = 0; + $templateSrc = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : ''); + $templateInfo = $template->getDebugInfo(); + if (isset($templateInfo[$f['line']])) { + if (!method_exists($template, 'getSourceContext') || !file_exists($templatePath = $template->getSourceContext()->getPath())) { + $templatePath = null; + } + if ($templateSrc) { + $src = self::extractSource($templateSrc, $templateInfo[$f['line']], self::$srcContext, $caller, 'twig', $templatePath); + $srcKey = ($templatePath ?: $template->getTemplateName()).':'.$templateInfo[$f['line']]; + } + } + } + if ($srcKey == $f['file']) { + $src = self::extractSource(file_get_contents($f['file']), $f['line'], self::$srcContext, $caller, 'php', $f['file']); + $srcKey .= ':'.$f['line']; + if ($ellipsis) { + $ellipsis += 1 + \strlen($f['line']); + } + } + $srcAttr .= '&separator= '; + } else { + $srcAttr .= '&separator=:'; + } + $srcAttr .= $ellipsis ? '&ellipsis-type=path&ellipsis='.$ellipsis.'&ellipsis-tail='.$ellipsisTail : ''; + self::$framesCache[$cacheKey] = $a[$prefix.'src'] = new EnumStub(["\0~$srcAttr\0$srcKey" => $src]); + } + } + + unset($a[$prefix.'args'], $a[$prefix.'line'], $a[$prefix.'file']); + if ($frame->inTraceStub) { + unset($a[$prefix.'class'], $a[$prefix.'type'], $a[$prefix.'function']); + } + foreach ($a as $k => $v) { + if (!$v) { + unset($a[$k]); + } + } + if ($frame->keepArgs && !empty($f['args'])) { + $a[$prefix.'arguments'] = new ArgsStub($f['args'], $f['function'], $f['class']); + } + + return $a; + } + + private static function filterExceptionArray($xClass, array $a, $xPrefix, $filter) + { + if (isset($a[$xPrefix.'trace'])) { + $trace = $a[$xPrefix.'trace']; + unset($a[$xPrefix.'trace']); // Ensures the trace is always last + } else { + $trace = []; + } + + if (!($filter & Caster::EXCLUDE_VERBOSE) && $trace) { + if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) { + self::traceUnshift($trace, $xClass, $a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']); + } + $a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs); + } + if (empty($a[$xPrefix.'previous'])) { + unset($a[$xPrefix.'previous']); + } + unset($a[$xPrefix.'string'], $a[Caster::PREFIX_DYNAMIC.'xdebug_message'], $a[Caster::PREFIX_DYNAMIC.'__destructorException']); + + if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) { + $a[Caster::PREFIX_PROTECTED.'file'] = new LinkStub($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']); + } + + return $a; + } + + private static function traceUnshift(&$trace, $class, $file, $line) + { + if (isset($trace[0]['file'], $trace[0]['line']) && $trace[0]['file'] === $file && $trace[0]['line'] === $line) { + return; + } + array_unshift($trace, [ + 'function' => $class ? 'new '.$class : null, + 'file' => $file, + 'line' => $line, + ]); + } + + private static function extractSource($srcLines, $line, $srcContext, $title, $lang, $file = null) + { + $srcLines = explode("\n", $srcLines); + $src = []; + + for ($i = $line - 1 - $srcContext; $i <= $line - 1 + $srcContext; ++$i) { + $src[] = (isset($srcLines[$i]) ? $srcLines[$i] : '')."\n"; + } + + $srcLines = []; + $ltrim = 0; + do { + $pad = null; + for ($i = $srcContext << 1; $i >= 0; --$i) { + if (isset($src[$i][$ltrim]) && "\r" !== ($c = $src[$i][$ltrim]) && "\n" !== $c) { + if (null === $pad) { + $pad = $c; + } + if ((' ' !== $c && "\t" !== $c) || $pad !== $c) { + break; + } + } + } + ++$ltrim; + } while (0 > $i && null !== $pad); + + --$ltrim; + + foreach ($src as $i => $c) { + if ($ltrim) { + $c = isset($c[$ltrim]) && "\r" !== $c[$ltrim] ? substr($c, $ltrim) : ltrim($c, " \t"); + } + $c = substr($c, 0, -1); + if ($i !== $srcContext) { + $c = new ConstStub('default', $c); + } else { + $c = new ConstStub($c, $title); + if (null !== $file) { + $c->attr['file'] = $file; + $c->attr['line'] = $line; + } + } + $c->attr['lang'] = $lang; + $srcLines[sprintf("\0~separator=› &%d\0", $i + $line - $srcContext)] = $c; + } + + return new EnumStub($srcLines); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/FrameStub.php b/pandora_console/vendor/symfony/var-dumper/Caster/FrameStub.php new file mode 100644 index 0000000000..1e1194dc85 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/FrameStub.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents a single backtrace frame as returned by debug_backtrace() or Exception->getTrace(). + * + * @author Nicolas Grekas + */ +class FrameStub extends EnumStub +{ + public $keepArgs; + public $inTraceStub; + + public function __construct(array $frame, $keepArgs = true, $inTraceStub = false) + { + $this->value = $frame; + $this->keepArgs = $keepArgs; + $this->inTraceStub = $inTraceStub; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/LinkStub.php b/pandora_console/vendor/symfony/var-dumper/Caster/LinkStub.php new file mode 100644 index 0000000000..b589b502d4 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/LinkStub.php @@ -0,0 +1,108 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +/** + * Represents a file or a URL. + * + * @author Nicolas Grekas + */ +class LinkStub extends ConstStub +{ + public $inVendor = false; + + private static $vendorRoots; + private static $composerRoots; + + public function __construct($label, $line = 0, $href = null) + { + $this->value = $label; + + if (null === $href) { + $href = $label; + } + if (!\is_string($href)) { + return; + } + if (0 === strpos($href, 'file://')) { + if ($href === $label) { + $label = substr($label, 7); + } + $href = substr($href, 7); + } elseif (false !== strpos($href, '://')) { + $this->attr['href'] = $href; + + return; + } + if (!file_exists($href)) { + return; + } + if ($line) { + $this->attr['line'] = $line; + } + if ($label !== $this->attr['file'] = realpath($href) ?: $href) { + return; + } + if ($composerRoot = $this->getComposerRoot($href, $this->inVendor)) { + $this->attr['ellipsis'] = \strlen($href) - \strlen($composerRoot) + 1; + $this->attr['ellipsis-type'] = 'path'; + $this->attr['ellipsis-tail'] = 1 + ($this->inVendor ? 2 + \strlen(implode('', \array_slice(explode(\DIRECTORY_SEPARATOR, substr($href, 1 - $this->attr['ellipsis'])), 0, 2))) : 0); + } elseif (3 < \count($ellipsis = explode(\DIRECTORY_SEPARATOR, $href))) { + $this->attr['ellipsis'] = 2 + \strlen(implode('', \array_slice($ellipsis, -2))); + $this->attr['ellipsis-type'] = 'path'; + $this->attr['ellipsis-tail'] = 1; + } + } + + private function getComposerRoot($file, &$inVendor) + { + if (null === self::$vendorRoots) { + self::$vendorRoots = []; + + foreach (get_declared_classes() as $class) { + if ('C' === $class[0] && 0 === strpos($class, 'ComposerAutoloaderInit')) { + $r = new \ReflectionClass($class); + $v = \dirname(\dirname($r->getFileName())); + if (file_exists($v.'/composer/installed.json')) { + self::$vendorRoots[] = $v.\DIRECTORY_SEPARATOR; + } + } + } + } + $inVendor = false; + + if (isset(self::$composerRoots[$dir = \dirname($file)])) { + return self::$composerRoots[$dir]; + } + + foreach (self::$vendorRoots as $root) { + if ($inVendor = 0 === strpos($file, $root)) { + return $root; + } + } + + $parent = $dir; + while (!@file_exists($parent.'/composer.json')) { + if (!@file_exists($parent)) { + // open_basedir restriction in effect + break; + } + if ($parent === \dirname($parent)) { + return self::$composerRoots[$dir] = false; + } + + $parent = \dirname($parent); + } + + return self::$composerRoots[$dir] = $parent.\DIRECTORY_SEPARATOR; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/MongoCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/MongoCaster.php new file mode 100644 index 0000000000..98f1b8e25d --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/MongoCaster.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +@trigger_error('The '.__NAMESPACE__.'\MongoCaster class is deprecated since Symfony 3.4 and will be removed in 4.0.', \E_USER_DEPRECATED); + +/** + * Casts classes from the MongoDb extension to array representation. + * + * @author Nicolas Grekas + * + * @deprecated since version 3.4, to be removed in 4.0. + */ +class MongoCaster +{ + public static function castCursor(\MongoCursorInterface $cursor, array $a, Stub $stub, $isNested) + { + if ($info = $cursor->info()) { + foreach ($info as $k => $v) { + $a[Caster::PREFIX_VIRTUAL.$k] = $v; + } + } + $a[Caster::PREFIX_VIRTUAL.'dead'] = $cursor->dead(); + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/PdoCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/PdoCaster.php new file mode 100644 index 0000000000..8af51829a9 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/PdoCaster.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts PDO related classes to array representation. + * + * @author Nicolas Grekas + */ +class PdoCaster +{ + private static $pdoAttributes = [ + 'CASE' => [ + \PDO::CASE_LOWER => 'LOWER', + \PDO::CASE_NATURAL => 'NATURAL', + \PDO::CASE_UPPER => 'UPPER', + ], + 'ERRMODE' => [ + \PDO::ERRMODE_SILENT => 'SILENT', + \PDO::ERRMODE_WARNING => 'WARNING', + \PDO::ERRMODE_EXCEPTION => 'EXCEPTION', + ], + 'TIMEOUT', + 'PREFETCH', + 'AUTOCOMMIT', + 'PERSISTENT', + 'DRIVER_NAME', + 'SERVER_INFO', + 'ORACLE_NULLS' => [ + \PDO::NULL_NATURAL => 'NATURAL', + \PDO::NULL_EMPTY_STRING => 'EMPTY_STRING', + \PDO::NULL_TO_STRING => 'TO_STRING', + ], + 'CLIENT_VERSION', + 'SERVER_VERSION', + 'STATEMENT_CLASS', + 'EMULATE_PREPARES', + 'CONNECTION_STATUS', + 'STRINGIFY_FETCHES', + 'DEFAULT_FETCH_MODE' => [ + \PDO::FETCH_ASSOC => 'ASSOC', + \PDO::FETCH_BOTH => 'BOTH', + \PDO::FETCH_LAZY => 'LAZY', + \PDO::FETCH_NUM => 'NUM', + \PDO::FETCH_OBJ => 'OBJ', + ], + ]; + + public static function castPdo(\PDO $c, array $a, Stub $stub, $isNested) + { + $attr = []; + $errmode = $c->getAttribute(\PDO::ATTR_ERRMODE); + $c->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + + foreach (self::$pdoAttributes as $k => $v) { + if (!isset($k[0])) { + $k = $v; + $v = []; + } + + try { + $attr[$k] = 'ERRMODE' === $k ? $errmode : $c->getAttribute(\constant('PDO::ATTR_'.$k)); + if ($v && isset($v[$attr[$k]])) { + $attr[$k] = new ConstStub($v[$attr[$k]], $attr[$k]); + } + } catch (\Exception $e) { + } + } + if (isset($attr[$k = 'STATEMENT_CLASS'][1])) { + if ($attr[$k][1]) { + $attr[$k][1] = new ArgsStub($attr[$k][1], '__construct', $attr[$k][0]); + } + $attr[$k][0] = new ClassStub($attr[$k][0]); + } + + $prefix = Caster::PREFIX_VIRTUAL; + $a += [ + $prefix.'inTransaction' => method_exists($c, 'inTransaction'), + $prefix.'errorInfo' => $c->errorInfo(), + $prefix.'attributes' => new EnumStub($attr), + ]; + + if ($a[$prefix.'inTransaction']) { + $a[$prefix.'inTransaction'] = $c->inTransaction(); + } else { + unset($a[$prefix.'inTransaction']); + } + + if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) { + unset($a[$prefix.'errorInfo']); + } + + $c->setAttribute(\PDO::ATTR_ERRMODE, $errmode); + + return $a; + } + + public static function castPdoStatement(\PDOStatement $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + $a[$prefix.'errorInfo'] = $c->errorInfo(); + + if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) { + unset($a[$prefix.'errorInfo']); + } + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/PgSqlCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/PgSqlCaster.php new file mode 100644 index 0000000000..fe1f0cc8d9 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/PgSqlCaster.php @@ -0,0 +1,154 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts pqsql resources to array representation. + * + * @author Nicolas Grekas + */ +class PgSqlCaster +{ + private static $paramCodes = [ + 'server_encoding', + 'client_encoding', + 'is_superuser', + 'session_authorization', + 'DateStyle', + 'TimeZone', + 'IntervalStyle', + 'integer_datetimes', + 'application_name', + 'standard_conforming_strings', + ]; + + private static $transactionStatus = [ + \PGSQL_TRANSACTION_IDLE => 'PGSQL_TRANSACTION_IDLE', + \PGSQL_TRANSACTION_ACTIVE => 'PGSQL_TRANSACTION_ACTIVE', + \PGSQL_TRANSACTION_INTRANS => 'PGSQL_TRANSACTION_INTRANS', + \PGSQL_TRANSACTION_INERROR => 'PGSQL_TRANSACTION_INERROR', + \PGSQL_TRANSACTION_UNKNOWN => 'PGSQL_TRANSACTION_UNKNOWN', + ]; + + private static $resultStatus = [ + \PGSQL_EMPTY_QUERY => 'PGSQL_EMPTY_QUERY', + \PGSQL_COMMAND_OK => 'PGSQL_COMMAND_OK', + \PGSQL_TUPLES_OK => 'PGSQL_TUPLES_OK', + \PGSQL_COPY_OUT => 'PGSQL_COPY_OUT', + \PGSQL_COPY_IN => 'PGSQL_COPY_IN', + \PGSQL_BAD_RESPONSE => 'PGSQL_BAD_RESPONSE', + \PGSQL_NONFATAL_ERROR => 'PGSQL_NONFATAL_ERROR', + \PGSQL_FATAL_ERROR => 'PGSQL_FATAL_ERROR', + ]; + + private static $diagCodes = [ + 'severity' => \PGSQL_DIAG_SEVERITY, + 'sqlstate' => \PGSQL_DIAG_SQLSTATE, + 'message' => \PGSQL_DIAG_MESSAGE_PRIMARY, + 'detail' => \PGSQL_DIAG_MESSAGE_DETAIL, + 'hint' => \PGSQL_DIAG_MESSAGE_HINT, + 'statement position' => \PGSQL_DIAG_STATEMENT_POSITION, + 'internal position' => \PGSQL_DIAG_INTERNAL_POSITION, + 'internal query' => \PGSQL_DIAG_INTERNAL_QUERY, + 'context' => \PGSQL_DIAG_CONTEXT, + 'file' => \PGSQL_DIAG_SOURCE_FILE, + 'line' => \PGSQL_DIAG_SOURCE_LINE, + 'function' => \PGSQL_DIAG_SOURCE_FUNCTION, + ]; + + public static function castLargeObject($lo, array $a, Stub $stub, $isNested) + { + $a['seek position'] = pg_lo_tell($lo); + + return $a; + } + + public static function castLink($link, array $a, Stub $stub, $isNested) + { + $a['status'] = pg_connection_status($link); + $a['status'] = new ConstStub(\PGSQL_CONNECTION_OK === $a['status'] ? 'PGSQL_CONNECTION_OK' : 'PGSQL_CONNECTION_BAD', $a['status']); + $a['busy'] = pg_connection_busy($link); + + $a['transaction'] = pg_transaction_status($link); + if (isset(self::$transactionStatus[$a['transaction']])) { + $a['transaction'] = new ConstStub(self::$transactionStatus[$a['transaction']], $a['transaction']); + } + + $a['pid'] = pg_get_pid($link); + $a['last error'] = pg_last_error($link); + $a['last notice'] = pg_last_notice($link); + $a['host'] = pg_host($link); + $a['port'] = pg_port($link); + $a['dbname'] = pg_dbname($link); + $a['options'] = pg_options($link); + $a['version'] = pg_version($link); + + foreach (self::$paramCodes as $v) { + if (false !== $s = pg_parameter_status($link, $v)) { + $a['param'][$v] = $s; + } + } + + $a['param']['client_encoding'] = pg_client_encoding($link); + $a['param'] = new EnumStub($a['param']); + + return $a; + } + + public static function castResult($result, array $a, Stub $stub, $isNested) + { + $a['num rows'] = pg_num_rows($result); + $a['status'] = pg_result_status($result); + if (isset(self::$resultStatus[$a['status']])) { + $a['status'] = new ConstStub(self::$resultStatus[$a['status']], $a['status']); + } + $a['command-completion tag'] = pg_result_status($result, \PGSQL_STATUS_STRING); + + if (-1 === $a['num rows']) { + foreach (self::$diagCodes as $k => $v) { + $a['error'][$k] = pg_result_error_field($result, $v); + } + } + + $a['affected rows'] = pg_affected_rows($result); + $a['last OID'] = pg_last_oid($result); + + $fields = pg_num_fields($result); + + for ($i = 0; $i < $fields; ++$i) { + $field = [ + 'name' => pg_field_name($result, $i), + 'table' => sprintf('%s (OID: %s)', pg_field_table($result, $i), pg_field_table($result, $i, true)), + 'type' => sprintf('%s (OID: %s)', pg_field_type($result, $i), pg_field_type_oid($result, $i)), + 'nullable' => (bool) pg_field_is_null($result, $i), + 'storage' => pg_field_size($result, $i).' bytes', + 'display' => pg_field_prtlen($result, $i).' chars', + ]; + if (' (OID: )' === $field['table']) { + $field['table'] = null; + } + if ('-1 bytes' === $field['storage']) { + $field['storage'] = 'variable size'; + } elseif ('1 bytes' === $field['storage']) { + $field['storage'] = '1 byte'; + } + if ('1 chars' === $field['display']) { + $field['display'] = '1 char'; + } + $a['fields'][] = new EnumStub($field); + } + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/RedisCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/RedisCaster.php new file mode 100644 index 0000000000..1e2fb39916 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/RedisCaster.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Redis class from ext-redis to array representation. + * + * @author Nicolas Grekas + */ +class RedisCaster +{ + private static $serializer = [ + \Redis::SERIALIZER_NONE => 'NONE', + \Redis::SERIALIZER_PHP => 'PHP', + 2 => 'IGBINARY', // Optional Redis::SERIALIZER_IGBINARY + ]; + + public static function castRedis(\Redis $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + if (\defined('HHVM_VERSION_ID')) { + if (isset($a[Caster::PREFIX_PROTECTED.'serializer'])) { + $ser = $a[Caster::PREFIX_PROTECTED.'serializer']; + $a[Caster::PREFIX_PROTECTED.'serializer'] = isset(self::$serializer[$ser]) ? new ConstStub(self::$serializer[$ser], $ser) : $ser; + } + + return $a; + } + + if (!$connected = $c->isConnected()) { + return $a + [ + $prefix.'isConnected' => $connected, + ]; + } + + $ser = $c->getOption(\Redis::OPT_SERIALIZER); + $retry = \defined('Redis::OPT_SCAN') ? $c->getOption(\Redis::OPT_SCAN) : 0; + + return $a + [ + $prefix.'isConnected' => $connected, + $prefix.'host' => $c->getHost(), + $prefix.'port' => $c->getPort(), + $prefix.'auth' => $c->getAuth(), + $prefix.'dbNum' => $c->getDbNum(), + $prefix.'timeout' => $c->getTimeout(), + $prefix.'persistentId' => $c->getPersistentID(), + $prefix.'options' => new EnumStub([ + 'READ_TIMEOUT' => $c->getOption(\Redis::OPT_READ_TIMEOUT), + 'SERIALIZER' => isset(self::$serializer[$ser]) ? new ConstStub(self::$serializer[$ser], $ser) : $ser, + 'PREFIX' => $c->getOption(\Redis::OPT_PREFIX), + 'SCAN' => new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry), + ]), + ]; + } + + public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + return $a + [ + $prefix.'hosts' => $c->_hosts(), + $prefix.'function' => ClassStub::wrapCallable($c->_function()), + ]; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/ReflectionCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/ReflectionCaster.php new file mode 100644 index 0000000000..f19886172a --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/ReflectionCaster.php @@ -0,0 +1,345 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts Reflector related classes to array representation. + * + * @author Nicolas Grekas + */ +class ReflectionCaster +{ + private static $extraMap = [ + 'docComment' => 'getDocComment', + 'extension' => 'getExtensionName', + 'isDisabled' => 'isDisabled', + 'isDeprecated' => 'isDeprecated', + 'isInternal' => 'isInternal', + 'isUserDefined' => 'isUserDefined', + 'isGenerator' => 'isGenerator', + 'isVariadic' => 'isVariadic', + ]; + + public static function castClosure(\Closure $c, array $a, Stub $stub, $isNested, $filter = 0) + { + $prefix = Caster::PREFIX_VIRTUAL; + $c = new \ReflectionFunction($c); + + $stub->class = 'Closure'; // HHVM generates unique class names for closures + $a = static::castFunctionAbstract($c, $a, $stub, $isNested, $filter); + + if (false === strpos($c->name, '{closure}')) { + $stub->class = isset($a[$prefix.'class']) ? $a[$prefix.'class']->value.'::'.$c->name : $c->name; + unset($a[$prefix.'class']); + } + + if (isset($a[$prefix.'parameters'])) { + foreach ($a[$prefix.'parameters']->value as &$v) { + $param = $v; + $v = new EnumStub([]); + foreach (static::castParameter($param, [], $stub, true) as $k => $param) { + if ("\0" === $k[0]) { + $v->value[substr($k, 3)] = $param; + } + } + unset($v->value['position'], $v->value['isVariadic'], $v->value['byReference'], $v); + } + } + + if (!($filter & Caster::EXCLUDE_VERBOSE) && $f = $c->getFileName()) { + $a[$prefix.'file'] = new LinkStub($f, $c->getStartLine()); + $a[$prefix.'line'] = $c->getStartLine().' to '.$c->getEndLine(); + } + + $prefix = Caster::PREFIX_DYNAMIC; + unset($a['name'], $a[$prefix.'this'], $a[$prefix.'parameter'], $a[Caster::PREFIX_VIRTUAL.'extra']); + + return $a; + } + + public static function castGenerator(\Generator $c, array $a, Stub $stub, $isNested) + { + if (!class_exists('ReflectionGenerator', false)) { + return $a; + } + + // Cannot create ReflectionGenerator based on a terminated Generator + try { + $reflectionGenerator = new \ReflectionGenerator($c); + } catch (\Exception $e) { + $a[Caster::PREFIX_VIRTUAL.'closed'] = true; + + return $a; + } + + return self::castReflectionGenerator($reflectionGenerator, $a, $stub, $isNested); + } + + public static function castType(\ReflectionType $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + $a += [ + $prefix.'name' => $c instanceof \ReflectionNamedType ? $c->getName() : (string) $c, + $prefix.'allowsNull' => $c->allowsNull(), + $prefix.'isBuiltin' => $c->isBuiltin(), + ]; + + return $a; + } + + public static function castReflectionGenerator(\ReflectionGenerator $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + if ($c->getThis()) { + $a[$prefix.'this'] = new CutStub($c->getThis()); + } + $function = $c->getFunction(); + $frame = [ + 'class' => isset($function->class) ? $function->class : null, + 'type' => isset($function->class) ? ($function->isStatic() ? '::' : '->') : null, + 'function' => $function->name, + 'file' => $c->getExecutingFile(), + 'line' => $c->getExecutingLine(), + ]; + if ($trace = $c->getTrace(\DEBUG_BACKTRACE_IGNORE_ARGS)) { + $function = new \ReflectionGenerator($c->getExecutingGenerator()); + array_unshift($trace, [ + 'function' => 'yield', + 'file' => $function->getExecutingFile(), + 'line' => $function->getExecutingLine() - 1, + ]); + $trace[] = $frame; + $a[$prefix.'trace'] = new TraceStub($trace, false, 0, -1, -1); + } else { + $function = new FrameStub($frame, false, true); + $function = ExceptionCaster::castFrameStub($function, [], $function, true); + $a[$prefix.'executing'] = new EnumStub([ + "\0~separator= \0".$frame['class'].$frame['type'].$frame['function'].'()' => $function[$prefix.'src'], + ]); + } + + $a[Caster::PREFIX_VIRTUAL.'closed'] = false; + + return $a; + } + + public static function castClass(\ReflectionClass $c, array $a, Stub $stub, $isNested, $filter = 0) + { + $prefix = Caster::PREFIX_VIRTUAL; + + if ($n = \Reflection::getModifierNames($c->getModifiers())) { + $a[$prefix.'modifiers'] = implode(' ', $n); + } + + self::addMap($a, $c, [ + 'extends' => 'getParentClass', + 'implements' => 'getInterfaceNames', + 'constants' => 'getConstants', + ]); + + foreach ($c->getProperties() as $n) { + $a[$prefix.'properties'][$n->name] = $n; + } + + foreach ($c->getMethods() as $n) { + $a[$prefix.'methods'][$n->name] = $n; + } + + if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) { + self::addExtra($a, $c); + } + + return $a; + } + + public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, array $a, Stub $stub, $isNested, $filter = 0) + { + $prefix = Caster::PREFIX_VIRTUAL; + + self::addMap($a, $c, [ + 'returnsReference' => 'returnsReference', + 'returnType' => 'getReturnType', + 'class' => 'getClosureScopeClass', + 'this' => 'getClosureThis', + ]); + + if (isset($a[$prefix.'returnType'])) { + $v = $a[$prefix.'returnType']; + $v = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v; + $a[$prefix.'returnType'] = new ClassStub($a[$prefix.'returnType']->allowsNull() ? '?'.$v : $v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']); + } + if (isset($a[$prefix.'class'])) { + $a[$prefix.'class'] = new ClassStub($a[$prefix.'class']); + } + if (isset($a[$prefix.'this'])) { + $a[$prefix.'this'] = new CutStub($a[$prefix.'this']); + } + + foreach ($c->getParameters() as $v) { + $k = '$'.$v->name; + if (method_exists($v, 'isVariadic') && $v->isVariadic()) { + $k = '...'.$k; + } + if ($v->isPassedByReference()) { + $k = '&'.$k; + } + $a[$prefix.'parameters'][$k] = $v; + } + if (isset($a[$prefix.'parameters'])) { + $a[$prefix.'parameters'] = new EnumStub($a[$prefix.'parameters']); + } + + if ($v = $c->getStaticVariables()) { + foreach ($v as $k => &$v) { + if (\is_object($v)) { + $a[$prefix.'use']['$'.$k] = new CutStub($v); + } else { + $a[$prefix.'use']['$'.$k] = &$v; + } + } + unset($v); + $a[$prefix.'use'] = new EnumStub($a[$prefix.'use']); + } + + if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) { + self::addExtra($a, $c); + } + + // Added by HHVM + unset($a[Caster::PREFIX_DYNAMIC.'static']); + + return $a; + } + + public static function castMethod(\ReflectionMethod $c, array $a, Stub $stub, $isNested) + { + $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); + + return $a; + } + + public static function castParameter(\ReflectionParameter $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + + // Added by HHVM + unset($a['info']); + + self::addMap($a, $c, [ + 'position' => 'getPosition', + 'isVariadic' => 'isVariadic', + 'byReference' => 'isPassedByReference', + 'allowsNull' => 'allowsNull', + ]); + + if (method_exists($c, 'getType')) { + if ($v = $c->getType()) { + $a[$prefix.'typeHint'] = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v; + } + } elseif (preg_match('/^(?:[^ ]++ ){4}([a-zA-Z_\x7F-\xFF][^ ]++)/', $c, $v)) { + $a[$prefix.'typeHint'] = $v[1]; + } + + if (isset($a[$prefix.'typeHint'])) { + $v = $a[$prefix.'typeHint']; + $a[$prefix.'typeHint'] = new ClassStub($v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']); + } else { + unset($a[$prefix.'allowsNull']); + } + + try { + $a[$prefix.'default'] = $v = $c->getDefaultValue(); + if (method_exists($c, 'isDefaultValueConstant') && $c->isDefaultValueConstant()) { + $a[$prefix.'default'] = new ConstStub($c->getDefaultValueConstantName(), $v); + } + if (null === $v) { + unset($a[$prefix.'allowsNull']); + } + } catch (\ReflectionException $e) { + if (isset($a[$prefix.'typeHint']) && $c->allowsNull() && !class_exists('ReflectionNamedType', false)) { + $a[$prefix.'default'] = null; + unset($a[$prefix.'allowsNull']); + } + } + + return $a; + } + + public static function castProperty(\ReflectionProperty $c, array $a, Stub $stub, $isNested) + { + $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); + self::addExtra($a, $c); + + return $a; + } + + public static function castExtension(\ReflectionExtension $c, array $a, Stub $stub, $isNested) + { + self::addMap($a, $c, [ + 'version' => 'getVersion', + 'dependencies' => 'getDependencies', + 'iniEntries' => 'getIniEntries', + 'isPersistent' => 'isPersistent', + 'isTemporary' => 'isTemporary', + 'constants' => 'getConstants', + 'functions' => 'getFunctions', + 'classes' => 'getClasses', + ]); + + return $a; + } + + public static function castZendExtension(\ReflectionZendExtension $c, array $a, Stub $stub, $isNested) + { + self::addMap($a, $c, [ + 'version' => 'getVersion', + 'author' => 'getAuthor', + 'copyright' => 'getCopyright', + 'url' => 'getURL', + ]); + + return $a; + } + + private static function addExtra(&$a, \Reflector $c) + { + $x = isset($a[Caster::PREFIX_VIRTUAL.'extra']) ? $a[Caster::PREFIX_VIRTUAL.'extra']->value : []; + + if (method_exists($c, 'getFileName') && $m = $c->getFileName()) { + $x['file'] = new LinkStub($m, $c->getStartLine()); + $x['line'] = $c->getStartLine().' to '.$c->getEndLine(); + } + + self::addMap($x, $c, self::$extraMap, ''); + + if ($x) { + $a[Caster::PREFIX_VIRTUAL.'extra'] = new EnumStub($x); + } + } + + private static function addMap(&$a, \Reflector $c, $map, $prefix = Caster::PREFIX_VIRTUAL) + { + foreach ($map as $k => $m) { + if (\PHP_VERSION_ID >= 80000 && 'isDisabled' === $k) { + continue; + } + + if (method_exists($c, $m) && false !== ($m = $c->$m()) && null !== $m) { + $a[$prefix.$k] = $m instanceof \Reflector ? $m->name : $m; + } + } + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/ResourceCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/ResourceCaster.php new file mode 100644 index 0000000000..eb11aee1f0 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/ResourceCaster.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts common resource types to array representation. + * + * @author Nicolas Grekas + */ +class ResourceCaster +{ + /** + * @param \CurlHandle|resource $h + * + * @return array + */ + public static function castCurl($h, array $a, Stub $stub, $isNested) + { + return curl_getinfo($h); + } + + public static function castDba($dba, array $a, Stub $stub, $isNested) + { + $list = dba_list(); + $a['file'] = $list[(int) $dba]; + + return $a; + } + + public static function castProcess($process, array $a, Stub $stub, $isNested) + { + return proc_get_status($process); + } + + public static function castStream($stream, array $a, Stub $stub, $isNested) + { + $a = stream_get_meta_data($stream) + static::castStreamContext($stream, $a, $stub, $isNested); + if (isset($a['uri'])) { + $a['uri'] = new LinkStub($a['uri']); + } + + return $a; + } + + public static function castStreamContext($stream, array $a, Stub $stub, $isNested) + { + return @stream_context_get_params($stream) ?: $a; + } + + public static function castGd($gd, array $a, Stub $stub, $isNested) + { + $a['size'] = imagesx($gd).'x'.imagesy($gd); + $a['trueColor'] = imageistruecolor($gd); + + return $a; + } + + public static function castMysqlLink($h, array $a, Stub $stub, $isNested) + { + $a['host'] = mysql_get_host_info($h); + $a['protocol'] = mysql_get_proto_info($h); + $a['server'] = mysql_get_server_info($h); + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/SplCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/SplCaster.php new file mode 100644 index 0000000000..360a1a416e --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/SplCaster.php @@ -0,0 +1,236 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts SPL related classes to array representation. + * + * @author Nicolas Grekas + */ +class SplCaster +{ + private static $splFileObjectFlags = [ + \SplFileObject::DROP_NEW_LINE => 'DROP_NEW_LINE', + \SplFileObject::READ_AHEAD => 'READ_AHEAD', + \SplFileObject::SKIP_EMPTY => 'SKIP_EMPTY', + \SplFileObject::READ_CSV => 'READ_CSV', + ]; + + public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, $isNested) + { + return self::castSplArray($c, $a, $stub, $isNested); + } + + public static function castArrayIterator(\ArrayIterator $c, array $a, Stub $stub, $isNested) + { + return self::castSplArray($c, $a, $stub, $isNested); + } + + public static function castHeap(\Iterator $c, array $a, Stub $stub, $isNested) + { + $a += [ + Caster::PREFIX_VIRTUAL.'heap' => iterator_to_array(clone $c), + ]; + + return $a; + } + + public static function castDoublyLinkedList(\SplDoublyLinkedList $c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + $mode = $c->getIteratorMode(); + $c->setIteratorMode(\SplDoublyLinkedList::IT_MODE_KEEP | $mode & ~\SplDoublyLinkedList::IT_MODE_DELETE); + + $a += [ + $prefix.'mode' => new ConstStub((($mode & \SplDoublyLinkedList::IT_MODE_LIFO) ? 'IT_MODE_LIFO' : 'IT_MODE_FIFO').' | '.(($mode & \SplDoublyLinkedList::IT_MODE_DELETE) ? 'IT_MODE_DELETE' : 'IT_MODE_KEEP'), $mode), + $prefix.'dllist' => iterator_to_array($c), + ]; + $c->setIteratorMode($mode); + + return $a; + } + + public static function castFileInfo(\SplFileInfo $c, array $a, Stub $stub, $isNested) + { + static $map = [ + 'path' => 'getPath', + 'filename' => 'getFilename', + 'basename' => 'getBasename', + 'pathname' => 'getPathname', + 'extension' => 'getExtension', + 'realPath' => 'getRealPath', + 'aTime' => 'getATime', + 'mTime' => 'getMTime', + 'cTime' => 'getCTime', + 'inode' => 'getInode', + 'size' => 'getSize', + 'perms' => 'getPerms', + 'owner' => 'getOwner', + 'group' => 'getGroup', + 'type' => 'getType', + 'writable' => 'isWritable', + 'readable' => 'isReadable', + 'executable' => 'isExecutable', + 'file' => 'isFile', + 'dir' => 'isDir', + 'link' => 'isLink', + 'linkTarget' => 'getLinkTarget', + ]; + + $prefix = Caster::PREFIX_VIRTUAL; + unset($a["\0SplFileInfo\0fileName"]); + unset($a["\0SplFileInfo\0pathName"]); + + if (\PHP_VERSION_ID < 80000) { + if (false === $c->getPathname()) { + $a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state'; + + return $a; + } + } else { + try { + $c->isReadable(); + } catch (\RuntimeException $e) { + if ('Object not initialized' !== $e->getMessage()) { + throw $e; + } + + $a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state'; + + return $a; + } catch (\Error $e) { + if ('Object not initialized' !== $e->getMessage()) { + throw $e; + } + + $a[$prefix.'⚠'] = 'The parent constructor was not called: the object is in an invalid state'; + + return $a; + } + } + + foreach ($map as $key => $accessor) { + try { + $a[$prefix.$key] = $c->$accessor(); + } catch (\Exception $e) { + } + } + + if (isset($a[$prefix.'realPath'])) { + $a[$prefix.'realPath'] = new LinkStub($a[$prefix.'realPath']); + } + + if (isset($a[$prefix.'perms'])) { + $a[$prefix.'perms'] = new ConstStub(sprintf('0%o', $a[$prefix.'perms']), $a[$prefix.'perms']); + } + + static $mapDate = ['aTime', 'mTime', 'cTime']; + foreach ($mapDate as $key) { + if (isset($a[$prefix.$key])) { + $a[$prefix.$key] = new ConstStub(date('Y-m-d H:i:s', $a[$prefix.$key]), $a[$prefix.$key]); + } + } + + return $a; + } + + public static function castFileObject(\SplFileObject $c, array $a, Stub $stub, $isNested) + { + static $map = [ + 'csvControl' => 'getCsvControl', + 'flags' => 'getFlags', + 'maxLineLen' => 'getMaxLineLen', + 'fstat' => 'fstat', + 'eof' => 'eof', + 'key' => 'key', + ]; + + $prefix = Caster::PREFIX_VIRTUAL; + + foreach ($map as $key => $accessor) { + try { + $a[$prefix.$key] = $c->$accessor(); + } catch (\Exception $e) { + } + } + + if (isset($a[$prefix.'flags'])) { + $flagsArray = []; + foreach (self::$splFileObjectFlags as $value => $name) { + if ($a[$prefix.'flags'] & $value) { + $flagsArray[] = $name; + } + } + $a[$prefix.'flags'] = new ConstStub(implode('|', $flagsArray), $a[$prefix.'flags']); + } + + if (isset($a[$prefix.'fstat'])) { + $a[$prefix.'fstat'] = new CutArrayStub($a[$prefix.'fstat'], ['dev', 'ino', 'nlink', 'rdev', 'blksize', 'blocks']); + } + + return $a; + } + + public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $stub, $isNested) + { + $storage = []; + unset($a[Caster::PREFIX_DYNAMIC."\0gcdata"]); // Don't hit https://bugs.php.net/65967 + unset($a["\0SplObjectStorage\0storage"]); + + $clone = clone $c; + foreach ($clone as $obj) { + $storage[] = [ + 'object' => $obj, + 'info' => $clone->getInfo(), + ]; + } + + $a += [ + Caster::PREFIX_VIRTUAL.'storage' => $storage, + ]; + + return $a; + } + + public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub, $isNested) + { + $a[Caster::PREFIX_VIRTUAL.'innerIterator'] = $c->getInnerIterator(); + + return $a; + } + + private static function castSplArray($c, array $a, Stub $stub, $isNested) + { + $prefix = Caster::PREFIX_VIRTUAL; + $flags = $c->getFlags(); + + if (!($flags & \ArrayObject::STD_PROP_LIST)) { + $c->setFlags(\ArrayObject::STD_PROP_LIST); + $a = Caster::castObject($c, \get_class($c), method_exists($c, '__debugInfo'), $stub->class); + $c->setFlags($flags); + } + if (\PHP_VERSION_ID < 70400) { + $a[$prefix.'storage'] = $c->getArrayCopy(); + } + $a += [ + $prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST), + $prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS), + ]; + if ($c instanceof \ArrayObject) { + $a[$prefix.'iteratorClass'] = new ClassStub($c->getIteratorClass()); + } + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/StubCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/StubCaster.php new file mode 100644 index 0000000000..9927d42610 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/StubCaster.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts a caster's Stub. + * + * @author Nicolas Grekas + */ +class StubCaster +{ + public static function castStub(Stub $c, array $a, Stub $stub, $isNested) + { + if ($isNested) { + $stub->type = $c->type; + $stub->class = $c->class; + $stub->value = $c->value; + $stub->handle = $c->handle; + $stub->cut = $c->cut; + $stub->attr = $c->attr; + + if (Stub::TYPE_REF === $c->type && !$c->class && \is_string($c->value) && !preg_match('//u', $c->value)) { + $stub->type = Stub::TYPE_STRING; + $stub->class = Stub::STRING_BINARY; + } + + $a = []; + } + + return $a; + } + + public static function castCutArray(CutArrayStub $c, array $a, Stub $stub, $isNested) + { + return $isNested ? $c->preservedSubset : $a; + } + + public static function cutInternals($obj, array $a, Stub $stub, $isNested) + { + if ($isNested) { + $stub->cut += \count($a); + + return []; + } + + return $a; + } + + public static function castEnum(EnumStub $c, array $a, Stub $stub, $isNested) + { + if ($isNested) { + $stub->class = $c->dumpKeys ? '' : null; + $stub->handle = 0; + $stub->value = null; + $stub->cut = $c->cut; + $stub->attr = $c->attr; + + $a = []; + + if ($c->value) { + foreach (array_keys($c->value) as $k) { + $keys[] = !isset($k[0]) || "\0" !== $k[0] ? Caster::PREFIX_VIRTUAL.$k : $k; + } + // Preserve references with array_combine() + $a = array_combine($keys, $c->value); + } + } + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/SymfonyCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/SymfonyCaster.php new file mode 100644 index 0000000000..ae7134f55b --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/SymfonyCaster.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\VarDumper\Cloner\Stub; + +class SymfonyCaster +{ + private static $requestGetters = [ + 'pathInfo' => 'getPathInfo', + 'requestUri' => 'getRequestUri', + 'baseUrl' => 'getBaseUrl', + 'basePath' => 'getBasePath', + 'method' => 'getMethod', + 'format' => 'getRequestFormat', + ]; + + public static function castRequest(Request $request, array $a, Stub $stub, $isNested) + { + $clone = null; + + foreach (self::$requestGetters as $prop => $getter) { + if (null === $a[Caster::PREFIX_PROTECTED.$prop]) { + if (null === $clone) { + $clone = clone $request; + } + $a[Caster::PREFIX_VIRTUAL.$prop] = $clone->{$getter}(); + } + } + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/TraceStub.php b/pandora_console/vendor/symfony/var-dumper/Caster/TraceStub.php new file mode 100644 index 0000000000..59548acaee --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/TraceStub.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents a backtrace as returned by debug_backtrace() or Exception->getTrace(). + * + * @author Nicolas Grekas + */ +class TraceStub extends Stub +{ + public $keepArgs; + public $sliceOffset; + public $sliceLength; + public $numberingOffset; + + public function __construct(array $trace, $keepArgs = true, $sliceOffset = 0, $sliceLength = null, $numberingOffset = 0) + { + $this->value = $trace; + $this->keepArgs = $keepArgs; + $this->sliceOffset = $sliceOffset; + $this->sliceLength = $sliceLength; + $this->numberingOffset = $numberingOffset; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php new file mode 100644 index 0000000000..3ae9ec0ba1 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts XmlReader class to array representation. + * + * @author Baptiste Clavié + */ +class XmlReaderCaster +{ + private static $nodeTypes = [ + \XMLReader::NONE => 'NONE', + \XMLReader::ELEMENT => 'ELEMENT', + \XMLReader::ATTRIBUTE => 'ATTRIBUTE', + \XMLReader::TEXT => 'TEXT', + \XMLReader::CDATA => 'CDATA', + \XMLReader::ENTITY_REF => 'ENTITY_REF', + \XMLReader::ENTITY => 'ENTITY', + \XMLReader::PI => 'PI (Processing Instruction)', + \XMLReader::COMMENT => 'COMMENT', + \XMLReader::DOC => 'DOC', + \XMLReader::DOC_TYPE => 'DOC_TYPE', + \XMLReader::DOC_FRAGMENT => 'DOC_FRAGMENT', + \XMLReader::NOTATION => 'NOTATION', + \XMLReader::WHITESPACE => 'WHITESPACE', + \XMLReader::SIGNIFICANT_WHITESPACE => 'SIGNIFICANT_WHITESPACE', + \XMLReader::END_ELEMENT => 'END_ELEMENT', + \XMLReader::END_ENTITY => 'END_ENTITY', + \XMLReader::XML_DECLARATION => 'XML_DECLARATION', + ]; + + public static function castXmlReader(\XMLReader $reader, array $a, Stub $stub, $isNested) + { + $props = Caster::PREFIX_VIRTUAL.'parserProperties'; + $info = [ + 'localName' => $reader->localName, + 'prefix' => $reader->prefix, + 'nodeType' => new ConstStub(self::$nodeTypes[$reader->nodeType], $reader->nodeType), + 'depth' => $reader->depth, + 'isDefault' => $reader->isDefault, + 'isEmptyElement' => \XMLReader::NONE === $reader->nodeType ? null : $reader->isEmptyElement, + 'xmlLang' => $reader->xmlLang, + 'attributeCount' => $reader->attributeCount, + 'value' => $reader->value, + 'namespaceURI' => $reader->namespaceURI, + 'baseURI' => $reader->baseURI ? new LinkStub($reader->baseURI) : $reader->baseURI, + $props => [ + 'LOADDTD' => $reader->getParserProperty(\XMLReader::LOADDTD), + 'DEFAULTATTRS' => $reader->getParserProperty(\XMLReader::DEFAULTATTRS), + 'VALIDATE' => $reader->getParserProperty(\XMLReader::VALIDATE), + 'SUBST_ENTITIES' => $reader->getParserProperty(\XMLReader::SUBST_ENTITIES), + ], + ]; + + if ($info[$props] = Caster::filter($info[$props], Caster::EXCLUDE_EMPTY, [], $count)) { + $info[$props] = new EnumStub($info[$props]); + $info[$props]->cut = $count; + } + + $info = Caster::filter($info, Caster::EXCLUDE_EMPTY, [], $count); + // +2 because hasValue and hasAttributes are always filtered + $stub->cut += $count + 2; + + return $a + $info; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php b/pandora_console/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php new file mode 100644 index 0000000000..99c1486483 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Casts XML resources to array representation. + * + * @author Nicolas Grekas + */ +class XmlResourceCaster +{ + private static $xmlErrors = [ + \XML_ERROR_NONE => 'XML_ERROR_NONE', + \XML_ERROR_NO_MEMORY => 'XML_ERROR_NO_MEMORY', + \XML_ERROR_SYNTAX => 'XML_ERROR_SYNTAX', + \XML_ERROR_NO_ELEMENTS => 'XML_ERROR_NO_ELEMENTS', + \XML_ERROR_INVALID_TOKEN => 'XML_ERROR_INVALID_TOKEN', + \XML_ERROR_UNCLOSED_TOKEN => 'XML_ERROR_UNCLOSED_TOKEN', + \XML_ERROR_PARTIAL_CHAR => 'XML_ERROR_PARTIAL_CHAR', + \XML_ERROR_TAG_MISMATCH => 'XML_ERROR_TAG_MISMATCH', + \XML_ERROR_DUPLICATE_ATTRIBUTE => 'XML_ERROR_DUPLICATE_ATTRIBUTE', + \XML_ERROR_JUNK_AFTER_DOC_ELEMENT => 'XML_ERROR_JUNK_AFTER_DOC_ELEMENT', + \XML_ERROR_PARAM_ENTITY_REF => 'XML_ERROR_PARAM_ENTITY_REF', + \XML_ERROR_UNDEFINED_ENTITY => 'XML_ERROR_UNDEFINED_ENTITY', + \XML_ERROR_RECURSIVE_ENTITY_REF => 'XML_ERROR_RECURSIVE_ENTITY_REF', + \XML_ERROR_ASYNC_ENTITY => 'XML_ERROR_ASYNC_ENTITY', + \XML_ERROR_BAD_CHAR_REF => 'XML_ERROR_BAD_CHAR_REF', + \XML_ERROR_BINARY_ENTITY_REF => 'XML_ERROR_BINARY_ENTITY_REF', + \XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF => 'XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF', + \XML_ERROR_MISPLACED_XML_PI => 'XML_ERROR_MISPLACED_XML_PI', + \XML_ERROR_UNKNOWN_ENCODING => 'XML_ERROR_UNKNOWN_ENCODING', + \XML_ERROR_INCORRECT_ENCODING => 'XML_ERROR_INCORRECT_ENCODING', + \XML_ERROR_UNCLOSED_CDATA_SECTION => 'XML_ERROR_UNCLOSED_CDATA_SECTION', + \XML_ERROR_EXTERNAL_ENTITY_HANDLING => 'XML_ERROR_EXTERNAL_ENTITY_HANDLING', + ]; + + public static function castXml($h, array $a, Stub $stub, $isNested) + { + $a['current_byte_index'] = xml_get_current_byte_index($h); + $a['current_column_number'] = xml_get_current_column_number($h); + $a['current_line_number'] = xml_get_current_line_number($h); + $a['error_code'] = xml_get_error_code($h); + + if (isset(self::$xmlErrors[$a['error_code']])) { + $a['error_code'] = new ConstStub(self::$xmlErrors[$a['error_code']], $a['error_code']); + } + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Cloner/AbstractCloner.php b/pandora_console/vendor/symfony/var-dumper/Cloner/AbstractCloner.php new file mode 100644 index 0000000000..76b55b478b --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Cloner/AbstractCloner.php @@ -0,0 +1,336 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +use Symfony\Component\VarDumper\Caster\Caster; +use Symfony\Component\VarDumper\Exception\ThrowingCasterException; + +/** + * AbstractCloner implements a generic caster mechanism for objects and resources. + * + * @author Nicolas Grekas + */ +abstract class AbstractCloner implements ClonerInterface +{ + public static $defaultCasters = [ + '__PHP_Incomplete_Class' => ['Symfony\Component\VarDumper\Caster\Caster', 'castPhpIncompleteClass'], + + 'Symfony\Component\VarDumper\Caster\CutStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'], + 'Symfony\Component\VarDumper\Caster\CutArrayStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castCutArray'], + 'Symfony\Component\VarDumper\Caster\ConstStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'], + 'Symfony\Component\VarDumper\Caster\EnumStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castEnum'], + + 'Closure' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClosure'], + 'Generator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castGenerator'], + 'ReflectionType' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castType'], + 'ReflectionGenerator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReflectionGenerator'], + 'ReflectionClass' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClass'], + 'ReflectionFunctionAbstract' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castFunctionAbstract'], + 'ReflectionMethod' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castMethod'], + 'ReflectionParameter' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castParameter'], + 'ReflectionProperty' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castProperty'], + 'ReflectionExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castExtension'], + 'ReflectionZendExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castZendExtension'], + + 'Doctrine\Common\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Doctrine\Common\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castCommonProxy'], + 'Doctrine\ORM\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castOrmProxy'], + 'Doctrine\ORM\PersistentCollection' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castPersistentCollection'], + 'Doctrine\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + + 'DOMException' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'], + 'DOMStringList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], + 'DOMNameList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], + 'DOMImplementation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'], + 'DOMImplementationList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], + 'DOMNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNode'], + 'DOMNameSpaceNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNameSpaceNode'], + 'DOMDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocument'], + 'DOMNodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], + 'DOMNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'], + 'DOMCharacterData' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castCharacterData'], + 'DOMAttr' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castAttr'], + 'DOMElement' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castElement'], + 'DOMText' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castText'], + 'DOMTypeinfo' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castTypeinfo'], + 'DOMDomError' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDomError'], + 'DOMLocator' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLocator'], + 'DOMDocumentType' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocumentType'], + 'DOMNotation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNotation'], + 'DOMEntity' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castEntity'], + 'DOMProcessingInstruction' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castProcessingInstruction'], + 'DOMXPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castXPath'], + + 'XmlReader' => ['Symfony\Component\VarDumper\Caster\XmlReaderCaster', 'castXmlReader'], + + 'ErrorException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castErrorException'], + 'Exception' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castException'], + 'Error' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castError'], + 'Symfony\Component\DependencyInjection\ContainerInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Symfony\Component\HttpFoundation\Request' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castRequest'], + 'Symfony\Component\VarDumper\Exception\ThrowingCasterException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castThrowingCasterException'], + 'Symfony\Component\VarDumper\Caster\TraceStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castTraceStub'], + 'Symfony\Component\VarDumper\Caster\FrameStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFrameStub'], + 'Symfony\Component\Debug\Exception\SilencedErrorContext' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castSilencedErrorContext'], + + 'PHPUnit_Framework_MockObject_MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'PHPUnit\Framework\MockObject\MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'PHPUnit\Framework\MockObject\Stub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Prophecy\Prophecy\ProphecySubjectInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Mockery\MockInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + + 'PDO' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdo'], + 'PDOStatement' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdoStatement'], + + 'AMQPConnection' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castConnection'], + 'AMQPChannel' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castChannel'], + 'AMQPQueue' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castQueue'], + 'AMQPExchange' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castExchange'], + 'AMQPEnvelope' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castEnvelope'], + + 'ArrayObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayObject'], + 'ArrayIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayIterator'], + 'SplDoublyLinkedList' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castDoublyLinkedList'], + 'SplFileInfo' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileInfo'], + 'SplFileObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileObject'], + 'SplHeap' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'], + 'SplObjectStorage' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castObjectStorage'], + 'SplPriorityQueue' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'], + 'OuterIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castOuterIterator'], + + 'MongoCursorInterface' => ['Symfony\Component\VarDumper\Caster\MongoCaster', 'castCursor'], + + 'Redis' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'], + 'RedisArray' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisArray'], + + 'DateTimeInterface' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castDateTime'], + 'DateInterval' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castInterval'], + 'DateTimeZone' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castTimeZone'], + 'DatePeriod' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castPeriod'], + + 'CurlHandle' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'], + ':curl' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'], + + ':dba' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'], + ':dba persistent' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'], + ':gd' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castGd'], + ':mysql link' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castMysqlLink'], + ':pgsql large object' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLargeObject'], + ':pgsql link' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'], + ':pgsql link persistent' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'], + ':pgsql result' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castResult'], + ':process' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castProcess'], + ':stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'], + ':persistent stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'], + ':stream-context' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStreamContext'], + ':xml' => ['Symfony\Component\VarDumper\Caster\XmlResourceCaster', 'castXml'], + ]; + + protected $maxItems = 2500; + protected $maxString = -1; + protected $minDepth = 1; + protected $useExt; + + private $casters = []; + private $prevErrorHandler; + private $classInfo = []; + private $filter = 0; + + /** + * @param callable[]|null $casters A map of casters + * + * @see addCasters + */ + public function __construct(array $casters = null) + { + if (null === $casters) { + $casters = static::$defaultCasters; + } + $this->addCasters($casters); + $this->useExt = \extension_loaded('symfony_debug'); + } + + /** + * Adds casters for resources and objects. + * + * Maps resources or objects types to a callback. + * Types are in the key, with a callable caster for value. + * Resource types are to be prefixed with a `:`, + * see e.g. static::$defaultCasters. + * + * @param callable[] $casters A map of casters + */ + public function addCasters(array $casters) + { + foreach ($casters as $type => $callback) { + $this->casters[strtolower($type)][] = \is_string($callback) && false !== strpos($callback, '::') ? explode('::', $callback, 2) : $callback; + } + } + + /** + * Sets the maximum number of items to clone past the minimum depth in nested structures. + * + * @param int $maxItems + */ + public function setMaxItems($maxItems) + { + $this->maxItems = (int) $maxItems; + } + + /** + * Sets the maximum cloned length for strings. + * + * @param int $maxString + */ + public function setMaxString($maxString) + { + $this->maxString = (int) $maxString; + } + + /** + * Sets the minimum tree depth where we are guaranteed to clone all the items. After this + * depth is reached, only setMaxItems items will be cloned. + * + * @param int $minDepth + */ + public function setMinDepth($minDepth) + { + $this->minDepth = (int) $minDepth; + } + + /** + * Clones a PHP variable. + * + * @param mixed $var Any PHP variable + * @param int $filter A bit field of Caster::EXCLUDE_* constants + * + * @return Data The cloned variable represented by a Data object + */ + public function cloneVar($var, $filter = 0) + { + $this->prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) { + if (\E_RECOVERABLE_ERROR === $type || \E_USER_ERROR === $type) { + // Cloner never dies + throw new \ErrorException($msg, 0, $type, $file, $line); + } + + if ($this->prevErrorHandler) { + return \call_user_func($this->prevErrorHandler, $type, $msg, $file, $line, $context); + } + + return false; + }); + $this->filter = $filter; + + if ($gc = gc_enabled()) { + gc_disable(); + } + try { + return new Data($this->doClone($var)); + } finally { + if ($gc) { + gc_enable(); + } + restore_error_handler(); + $this->prevErrorHandler = null; + } + } + + /** + * Effectively clones the PHP variable. + * + * @param mixed $var Any PHP variable + * + * @return array The cloned variable represented in an array + */ + abstract protected function doClone($var); + + /** + * Casts an object to an array representation. + * + * @param Stub $stub The Stub for the casted object + * @param bool $isNested True if the object is nested in the dumped structure + * + * @return array The object casted as array + */ + protected function castObject(Stub $stub, $isNested) + { + $obj = $stub->value; + $class = $stub->class; + + if ((\PHP_VERSION_ID >= 80000 || (isset($class[15]) && "\0" === $class[15])) && false !== strpos($class, "@anonymous\0")) { + $stub->class = \PHP_VERSION_ID < 80000 ? (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous' : get_debug_type($obj); + } + if (isset($this->classInfo[$class])) { + list($i, $parents, $hasDebugInfo) = $this->classInfo[$class]; + } else { + $i = 2; + $parents = [strtolower($class)]; + $hasDebugInfo = method_exists($class, '__debugInfo'); + + foreach (class_parents($class) as $p) { + $parents[] = strtolower($p); + ++$i; + } + foreach (class_implements($class) as $p) { + $parents[] = strtolower($p); + ++$i; + } + $parents[] = '*'; + + $this->classInfo[$class] = [$i, $parents, $hasDebugInfo]; + } + + $a = Caster::castObject($obj, $class, $hasDebugInfo, $stub->class); + + try { + while ($i--) { + if (!empty($this->casters[$p = $parents[$i]])) { + foreach ($this->casters[$p] as $callback) { + $a = $callback($obj, $a, $stub, $isNested, $this->filter); + } + } + } + } catch (\Exception $e) { + $a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)] + $a; + } + + return $a; + } + + /** + * Casts a resource to an array representation. + * + * @param Stub $stub The Stub for the casted resource + * @param bool $isNested True if the object is nested in the dumped structure + * + * @return array The resource casted as array + */ + protected function castResource(Stub $stub, $isNested) + { + $a = []; + $res = $stub->value; + $type = $stub->class; + + try { + if (!empty($this->casters[':'.$type])) { + foreach ($this->casters[':'.$type] as $callback) { + $a = $callback($res, $a, $stub, $isNested, $this->filter); + } + } + } catch (\Exception $e) { + $a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'⚠' => new ThrowingCasterException($e)] + $a; + } + + return $a; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Cloner/ClonerInterface.php b/pandora_console/vendor/symfony/var-dumper/Cloner/ClonerInterface.php new file mode 100644 index 0000000000..7ed287a2dd --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Cloner/ClonerInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * @author Nicolas Grekas + */ +interface ClonerInterface +{ + /** + * Clones a PHP variable. + * + * @param mixed $var Any PHP variable + * + * @return Data The cloned variable represented by a Data object + */ + public function cloneVar($var); +} diff --git a/pandora_console/vendor/symfony/var-dumper/Cloner/Cursor.php b/pandora_console/vendor/symfony/var-dumper/Cloner/Cursor.php new file mode 100644 index 0000000000..5b0542f6c2 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Cloner/Cursor.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * Represents the current state of a dumper while dumping. + * + * @author Nicolas Grekas + */ +class Cursor +{ + const HASH_INDEXED = Stub::ARRAY_INDEXED; + const HASH_ASSOC = Stub::ARRAY_ASSOC; + const HASH_OBJECT = Stub::TYPE_OBJECT; + const HASH_RESOURCE = Stub::TYPE_RESOURCE; + + public $depth = 0; + public $refIndex = 0; + public $softRefTo = 0; + public $softRefCount = 0; + public $softRefHandle = 0; + public $hardRefTo = 0; + public $hardRefCount = 0; + public $hardRefHandle = 0; + public $hashType; + public $hashKey; + public $hashKeyIsBinary; + public $hashIndex = 0; + public $hashLength = 0; + public $hashCut = 0; + public $stop = false; + public $attr = []; + public $skipChildren = false; +} diff --git a/pandora_console/vendor/symfony/var-dumper/Cloner/Data.php b/pandora_console/vendor/symfony/var-dumper/Cloner/Data.php new file mode 100644 index 0000000000..3973720794 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Cloner/Data.php @@ -0,0 +1,441 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +use Symfony\Component\VarDumper\Caster\Caster; + +/** + * @author Nicolas Grekas + */ +class Data implements \ArrayAccess, \Countable, \IteratorAggregate +{ + private $data; + private $position = 0; + private $key = 0; + private $maxDepth = 20; + private $maxItemsPerDepth = -1; + private $useRefHandles = -1; + + /** + * @param array $data An array as returned by ClonerInterface::cloneVar() + */ + public function __construct(array $data) + { + $this->data = $data; + } + + /** + * @return string|null The type of the value + */ + public function getType() + { + $item = $this->data[$this->position][$this->key]; + + if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { + $item = $item->value; + } + if (!$item instanceof Stub) { + return \gettype($item); + } + if (Stub::TYPE_STRING === $item->type) { + return 'string'; + } + if (Stub::TYPE_ARRAY === $item->type) { + return 'array'; + } + if (Stub::TYPE_OBJECT === $item->type) { + return $item->class; + } + if (Stub::TYPE_RESOURCE === $item->type) { + return $item->class.' resource'; + } + + return null; + } + + /** + * @param array|bool $recursive Whether values should be resolved recursively or not + * + * @return string|int|float|bool|array|Data[]|null A native representation of the original value + */ + public function getValue($recursive = false) + { + $item = $this->data[$this->position][$this->key]; + + if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { + $item = $item->value; + } + if (!($item = $this->getStub($item)) instanceof Stub) { + return $item; + } + if (Stub::TYPE_STRING === $item->type) { + return $item->value; + } + + $children = $item->position ? $this->data[$item->position] : []; + + foreach ($children as $k => $v) { + if ($recursive && !($v = $this->getStub($v)) instanceof Stub) { + continue; + } + $children[$k] = clone $this; + $children[$k]->key = $k; + $children[$k]->position = $item->position; + + if ($recursive) { + if (Stub::TYPE_REF === $v->type && ($v = $this->getStub($v->value)) instanceof Stub) { + $recursive = (array) $recursive; + if (isset($recursive[$v->position])) { + continue; + } + $recursive[$v->position] = true; + } + $children[$k] = $children[$k]->getValue($recursive); + } + } + + return $children; + } + + public function count() + { + return \count($this->getValue()); + } + + public function getIterator() + { + if (!\is_array($value = $this->getValue())) { + throw new \LogicException(sprintf('"%s" object holds non-iterable type "%s".', self::class, \gettype($value))); + } + + foreach ($value as $k => $v) { + yield $k => $v; + } + } + + public function __get($key) + { + if (null !== $data = $this->seek($key)) { + $item = $this->getStub($data->data[$data->position][$data->key]); + + return $item instanceof Stub || [] === $item ? $data : $item; + } + + return null; + } + + public function __isset($key) + { + return null !== $this->seek($key); + } + + public function offsetExists($key) + { + return $this->__isset($key); + } + + public function offsetGet($key) + { + return $this->__get($key); + } + + public function offsetSet($key, $value) + { + throw new \BadMethodCallException(self::class.' objects are immutable.'); + } + + public function offsetUnset($key) + { + throw new \BadMethodCallException(self::class.' objects are immutable.'); + } + + public function __toString() + { + $value = $this->getValue(); + + if (!\is_array($value)) { + return (string) $value; + } + + return sprintf('%s (count=%d)', $this->getType(), \count($value)); + } + + /** + * @return array The raw data structure + * + * @deprecated since version 3.3. Use array or object access instead. + */ + public function getRawData() + { + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the array or object access instead.', __METHOD__)); + + return $this->data; + } + + /** + * Returns a depth limited clone of $this. + * + * @param int $maxDepth The max dumped depth level + * + * @return static + */ + public function withMaxDepth($maxDepth) + { + $data = clone $this; + $data->maxDepth = (int) $maxDepth; + + return $data; + } + + /** + * Limits the number of elements per depth level. + * + * @param int $maxItemsPerDepth The max number of items dumped per depth level + * + * @return static + */ + public function withMaxItemsPerDepth($maxItemsPerDepth) + { + $data = clone $this; + $data->maxItemsPerDepth = (int) $maxItemsPerDepth; + + return $data; + } + + /** + * Enables/disables objects' identifiers tracking. + * + * @param bool $useRefHandles False to hide global ref. handles + * + * @return static + */ + public function withRefHandles($useRefHandles) + { + $data = clone $this; + $data->useRefHandles = $useRefHandles ? -1 : 0; + + return $data; + } + + /** + * Seeks to a specific key in nested data structures. + * + * @param string|int $key The key to seek to + * + * @return static|null Null if the key is not set + */ + public function seek($key) + { + $item = $this->data[$this->position][$this->key]; + + if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) { + $item = $item->value; + } + if (!($item = $this->getStub($item)) instanceof Stub || !$item->position) { + return null; + } + $keys = [$key]; + + switch ($item->type) { + case Stub::TYPE_OBJECT: + $keys[] = Caster::PREFIX_DYNAMIC.$key; + $keys[] = Caster::PREFIX_PROTECTED.$key; + $keys[] = Caster::PREFIX_VIRTUAL.$key; + $keys[] = "\0$item->class\0$key"; + // no break + case Stub::TYPE_ARRAY: + case Stub::TYPE_RESOURCE: + break; + default: + return null; + } + + $data = null; + $children = $this->data[$item->position]; + + foreach ($keys as $key) { + if (isset($children[$key]) || \array_key_exists($key, $children)) { + $data = clone $this; + $data->key = $key; + $data->position = $item->position; + break; + } + } + + return $data; + } + + /** + * Dumps data with a DumperInterface dumper. + */ + public function dump(DumperInterface $dumper) + { + $refs = [0]; + $this->dumpItem($dumper, new Cursor(), $refs, $this->data[$this->position][$this->key]); + } + + /** + * Depth-first dumping of items. + * + * @param DumperInterface $dumper The dumper being used for dumping + * @param Cursor $cursor A cursor used for tracking dumper state position + * @param array &$refs A map of all references discovered while dumping + * @param mixed $item A Stub object or the original value being dumped + */ + private function dumpItem($dumper, $cursor, &$refs, $item) + { + $cursor->refIndex = 0; + $cursor->softRefTo = $cursor->softRefHandle = $cursor->softRefCount = 0; + $cursor->hardRefTo = $cursor->hardRefHandle = $cursor->hardRefCount = 0; + $firstSeen = true; + + if (!$item instanceof Stub) { + $cursor->attr = []; + $type = \gettype($item); + if ($item && 'array' === $type) { + $item = $this->getStub($item); + } + } elseif (Stub::TYPE_REF === $item->type) { + if ($item->handle) { + if (!isset($refs[$r = $item->handle - (\PHP_INT_MAX >> 1)])) { + $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0]; + } else { + $firstSeen = false; + } + $cursor->hardRefTo = $refs[$r]; + $cursor->hardRefHandle = $this->useRefHandles & $item->handle; + $cursor->hardRefCount = $item->refCount; + } + $cursor->attr = $item->attr; + $type = $item->class ?: \gettype($item->value); + $item = $this->getStub($item->value); + } + if ($item instanceof Stub) { + if ($item->refCount) { + if (!isset($refs[$r = $item->handle])) { + $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0]; + } else { + $firstSeen = false; + } + $cursor->softRefTo = $refs[$r]; + } + $cursor->softRefHandle = $this->useRefHandles & $item->handle; + $cursor->softRefCount = $item->refCount; + $cursor->attr = $item->attr; + $cut = $item->cut; + + if ($item->position && $firstSeen) { + $children = $this->data[$item->position]; + + if ($cursor->stop) { + if ($cut >= 0) { + $cut += \count($children); + } + $children = []; + } + } else { + $children = []; + } + switch ($item->type) { + case Stub::TYPE_STRING: + $dumper->dumpString($cursor, $item->value, Stub::STRING_BINARY === $item->class, $cut); + break; + + case Stub::TYPE_ARRAY: + $item = clone $item; + $item->type = $item->class; + $item->class = $item->value; + // no break + case Stub::TYPE_OBJECT: + case Stub::TYPE_RESOURCE: + $withChildren = $children && $cursor->depth !== $this->maxDepth && $this->maxItemsPerDepth; + $dumper->enterHash($cursor, $item->type, $item->class, $withChildren); + if ($withChildren) { + if ($cursor->skipChildren) { + $withChildren = false; + $cut = -1; + } else { + $cut = $this->dumpChildren($dumper, $cursor, $refs, $children, $cut, $item->type, null !== $item->class); + } + } elseif ($children && 0 <= $cut) { + $cut += \count($children); + } + $cursor->skipChildren = false; + $dumper->leaveHash($cursor, $item->type, $item->class, $withChildren, $cut); + break; + + default: + throw new \RuntimeException(sprintf('Unexpected Stub type: "%s".', $item->type)); + } + } elseif ('array' === $type) { + $dumper->enterHash($cursor, Cursor::HASH_INDEXED, 0, false); + $dumper->leaveHash($cursor, Cursor::HASH_INDEXED, 0, false, 0); + } elseif ('string' === $type) { + $dumper->dumpString($cursor, $item, false, 0); + } else { + $dumper->dumpScalar($cursor, $type, $item); + } + } + + /** + * Dumps children of hash structures. + * + * @param DumperInterface $dumper + * @param Cursor $parentCursor The cursor of the parent hash + * @param array &$refs A map of all references discovered while dumping + * @param array $children The children to dump + * @param int $hashCut The number of items removed from the original hash + * @param string $hashType A Cursor::HASH_* const + * @param bool $dumpKeys Whether keys should be dumped or not + * + * @return int The final number of removed items + */ + private function dumpChildren($dumper, $parentCursor, &$refs, $children, $hashCut, $hashType, $dumpKeys) + { + $cursor = clone $parentCursor; + ++$cursor->depth; + $cursor->hashType = $hashType; + $cursor->hashIndex = 0; + $cursor->hashLength = \count($children); + $cursor->hashCut = $hashCut; + foreach ($children as $key => $child) { + $cursor->hashKeyIsBinary = isset($key[0]) && !preg_match('//u', $key); + $cursor->hashKey = $dumpKeys ? $key : null; + $this->dumpItem($dumper, $cursor, $refs, $child); + if (++$cursor->hashIndex === $this->maxItemsPerDepth || $cursor->stop) { + $parentCursor->stop = true; + + return $hashCut >= 0 ? $hashCut + $cursor->hashLength - $cursor->hashIndex : $hashCut; + } + } + + return $hashCut; + } + + private function getStub($item) + { + if (!$item || !\is_array($item)) { + return $item; + } + + $stub = new Stub(); + $stub->type = Stub::TYPE_ARRAY; + foreach ($item as $stub->class => $stub->position) { + } + if (isset($item[0])) { + $stub->cut = $item[0]; + } + $stub->value = $stub->cut + ($stub->position ? \count($this->data[$stub->position]) : 0); + + return $stub; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Cloner/DumperInterface.php b/pandora_console/vendor/symfony/var-dumper/Cloner/DumperInterface.php new file mode 100644 index 0000000000..912bb52139 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Cloner/DumperInterface.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * DumperInterface used by Data objects. + * + * @author Nicolas Grekas + */ +interface DumperInterface +{ + /** + * Dumps a scalar value. + * + * @param Cursor $cursor The Cursor position in the dump + * @param string $type The PHP type of the value being dumped + * @param string|int|float|bool $value The scalar value being dumped + */ + public function dumpScalar(Cursor $cursor, $type, $value); + + /** + * Dumps a string. + * + * @param Cursor $cursor The Cursor position in the dump + * @param string $str The string being dumped + * @param bool $bin Whether $str is UTF-8 or binary encoded + * @param int $cut The number of characters $str has been cut by + */ + public function dumpString(Cursor $cursor, $str, $bin, $cut); + + /** + * Dumps while entering an hash. + * + * @param Cursor $cursor The Cursor position in the dump + * @param int $type A Cursor::HASH_* const for the type of hash + * @param string|int $class The object class, resource type or array count + * @param bool $hasChild When the dump of the hash has child item + */ + public function enterHash(Cursor $cursor, $type, $class, $hasChild); + + /** + * Dumps while leaving an hash. + * + * @param Cursor $cursor The Cursor position in the dump + * @param int $type A Cursor::HASH_* const for the type of hash + * @param string|int $class The object class, resource type or array count + * @param bool $hasChild When the dump of the hash has child item + * @param int $cut The number of items the hash has been cut by + */ + public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut); +} diff --git a/pandora_console/vendor/symfony/var-dumper/Cloner/Stub.php b/pandora_console/vendor/symfony/var-dumper/Cloner/Stub.php new file mode 100644 index 0000000000..a56120ce36 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Cloner/Stub.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * Represents the main properties of a PHP variable. + * + * @author Nicolas Grekas + */ +class Stub +{ + const TYPE_REF = 1; + const TYPE_STRING = 2; + const TYPE_ARRAY = 3; + const TYPE_OBJECT = 4; + const TYPE_RESOURCE = 5; + + const STRING_BINARY = 1; + const STRING_UTF8 = 2; + + const ARRAY_ASSOC = 1; + const ARRAY_INDEXED = 2; + + public $type = self::TYPE_REF; + public $class = ''; + public $value; + public $cut = 0; + public $handle = 0; + public $refCount = 0; + public $position = 0; + public $attr = []; + + private static $defaultProperties = []; + + /** + * @internal + */ + public function __sleep() + { + $properties = []; + + if (!isset(self::$defaultProperties[$c = static::class])) { + self::$defaultProperties[$c] = get_class_vars($c); + + foreach ((new \ReflectionClass($c))->getStaticProperties() as $k => $v) { + unset(self::$defaultProperties[$c][$k]); + } + } + + foreach (self::$defaultProperties[$c] as $k => $v) { + if ($this->$k !== $v) { + $properties[] = $k; + } + } + + return $properties; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Cloner/VarCloner.php b/pandora_console/vendor/symfony/var-dumper/Cloner/VarCloner.php new file mode 100644 index 0000000000..8c4221220e --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Cloner/VarCloner.php @@ -0,0 +1,335 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Cloner; + +/** + * @author Nicolas Grekas + */ +class VarCloner extends AbstractCloner +{ + private static $gid; + private static $hashMask = 0; + private static $hashOffset = 0; + private static $arrayCache = []; + + /** + * {@inheritdoc} + */ + protected function doClone($var) + { + $len = 1; // Length of $queue + $pos = 0; // Number of cloned items past the minimum depth + $refsCounter = 0; // Hard references counter + $queue = [[$var]]; // This breadth-first queue is the return value + $indexedArrays = []; // Map of queue indexes that hold numerically indexed arrays + $hardRefs = []; // Map of original zval hashes to stub objects + $objRefs = []; // Map of original object handles to their stub object counterpart + $objects = []; // Keep a ref to objects to ensure their handle cannot be reused while cloning + $resRefs = []; // Map of original resource handles to their stub object counterpart + $values = []; // Map of stub objects' hashes to original values + $maxItems = $this->maxItems; + $maxString = $this->maxString; + $minDepth = $this->minDepth; + $currentDepth = 0; // Current tree depth + $currentDepthFinalIndex = 0; // Final $queue index for current tree depth + $minimumDepthReached = 0 === $minDepth; // Becomes true when minimum tree depth has been reached + $cookie = (object) []; // Unique object used to detect hard references + $a = null; // Array cast for nested structures + $stub = null; // Stub capturing the main properties of an original item value + // or null if the original value is used directly + + if (!self::$hashMask) { + self::initHashMask(); + self::$gid = md5(dechex(self::$hashMask)); // Unique string used to detect the special $GLOBALS variable + } + $gid = self::$gid; + $hashMask = self::$hashMask; + $hashOffset = self::$hashOffset; + $arrayStub = new Stub(); + $arrayStub->type = Stub::TYPE_ARRAY; + $fromObjCast = false; + + for ($i = 0; $i < $len; ++$i) { + // Detect when we move on to the next tree depth + if ($i > $currentDepthFinalIndex) { + ++$currentDepth; + $currentDepthFinalIndex = $len - 1; + if ($currentDepth >= $minDepth) { + $minimumDepthReached = true; + } + } + + $refs = $vals = $queue[$i]; + if (\PHP_VERSION_ID < 70200 && empty($indexedArrays[$i])) { + // see https://wiki.php.net/rfc/convert_numeric_keys_in_object_array_casts + foreach ($vals as $k => $v) { + if (\is_int($k)) { + continue; + } + foreach ([$k => true] as $gk => $gv) { + } + if ($gk !== $k) { + $fromObjCast = true; + $refs = $vals = array_values($queue[$i]); + break; + } + } + } + foreach ($vals as $k => $v) { + // $v is the original value or a stub object in case of hard references + + if (\PHP_VERSION_ID >= 70400) { + $zvalIsRef = null !== \ReflectionReference::fromArrayElement($vals, $k); + } else { + $refs[$k] = $cookie; + $zvalIsRef = $vals[$k] === $cookie; + } + + if ($zvalIsRef) { + $vals[$k] = &$stub; // Break hard references to make $queue completely + unset($stub); // independent from the original structure + if ($v instanceof Stub && isset($hardRefs[spl_object_hash($v)])) { + $vals[$k] = $refs[$k] = $v; + if ($v->value instanceof Stub && (Stub::TYPE_OBJECT === $v->value->type || Stub::TYPE_RESOURCE === $v->value->type)) { + ++$v->value->refCount; + } + ++$v->refCount; + continue; + } + $refs[$k] = $vals[$k] = new Stub(); + $refs[$k]->value = $v; + $h = spl_object_hash($refs[$k]); + $hardRefs[$h] = &$refs[$k]; + $values[$h] = $v; + $vals[$k]->handle = ++$refsCounter; + } + // Create $stub when the original value $v can not be used directly + // If $v is a nested structure, put that structure in array $a + switch (true) { + case null === $v: + case \is_bool($v): + case \is_int($v): + case \is_float($v): + continue 2; + case \is_string($v): + if ('' === $v) { + continue 2; + } + if (!preg_match('//u', $v)) { + $stub = new Stub(); + $stub->type = Stub::TYPE_STRING; + $stub->class = Stub::STRING_BINARY; + if (0 <= $maxString && 0 < $cut = \strlen($v) - $maxString) { + $stub->cut = $cut; + $stub->value = substr($v, 0, -$cut); + } else { + $stub->value = $v; + } + } elseif (0 <= $maxString && isset($v[1 + ($maxString >> 2)]) && 0 < $cut = mb_strlen($v, 'UTF-8') - $maxString) { + $stub = new Stub(); + $stub->type = Stub::TYPE_STRING; + $stub->class = Stub::STRING_UTF8; + $stub->cut = $cut; + $stub->value = mb_substr($v, 0, $maxString, 'UTF-8'); + } else { + continue 2; + } + $a = null; + break; + + case \is_array($v): + if (!$v) { + continue 2; + } + $stub = $arrayStub; + $stub->class = Stub::ARRAY_INDEXED; + + $j = -1; + foreach ($v as $gk => $gv) { + if ($gk !== ++$j) { + $stub->class = Stub::ARRAY_ASSOC; + break; + } + } + $a = $v; + + if (Stub::ARRAY_ASSOC === $stub->class) { + // Copies of $GLOBALS have very strange behavior, + // let's detect them with some black magic + $a[$gid] = true; + + // Happens with copies of $GLOBALS + if (isset($v[$gid])) { + unset($v[$gid]); + $a = []; + foreach ($v as $gk => &$gv) { + $a[$gk] = &$gv; + } + unset($gv); + } else { + $a = $v; + } + } elseif (\PHP_VERSION_ID < 70200) { + $indexedArrays[$len] = true; + } + break; + + case \is_object($v): + case $v instanceof \__PHP_Incomplete_Class: + if (empty($objRefs[$h = $hashMask ^ hexdec(substr(spl_object_hash($v), $hashOffset, \PHP_INT_SIZE))])) { + $stub = new Stub(); + $stub->type = Stub::TYPE_OBJECT; + $stub->class = \get_class($v); + $stub->value = $v; + $stub->handle = $h; + $a = $this->castObject($stub, 0 < $i); + if ($v !== $stub->value) { + if (Stub::TYPE_OBJECT !== $stub->type || null === $stub->value) { + break; + } + $h = $hashMask ^ hexdec(substr(spl_object_hash($stub->value), $hashOffset, \PHP_INT_SIZE)); + $stub->handle = $h; + } + $stub->value = null; + if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) { + $stub->cut = \count($a); + $a = null; + } + } + if (empty($objRefs[$h])) { + $objRefs[$h] = $stub; + $objects[] = $v; + } else { + $stub = $objRefs[$h]; + ++$stub->refCount; + $a = null; + } + break; + + default: // resource + if (empty($resRefs[$h = (int) $v])) { + $stub = new Stub(); + $stub->type = Stub::TYPE_RESOURCE; + if ('Unknown' === $stub->class = @get_resource_type($v)) { + $stub->class = 'Closed'; + } + $stub->value = $v; + $stub->handle = $h; + $a = $this->castResource($stub, 0 < $i); + $stub->value = null; + if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) { + $stub->cut = \count($a); + $a = null; + } + } + if (empty($resRefs[$h])) { + $resRefs[$h] = $stub; + } else { + $stub = $resRefs[$h]; + ++$stub->refCount; + $a = null; + } + break; + } + + if ($a) { + if (!$minimumDepthReached || 0 > $maxItems) { + $queue[$len] = $a; + $stub->position = $len++; + } elseif ($pos < $maxItems) { + if ($maxItems < $pos += \count($a)) { + $a = \array_slice($a, 0, $maxItems - $pos, true); + if ($stub->cut >= 0) { + $stub->cut += $pos - $maxItems; + } + } + $queue[$len] = $a; + $stub->position = $len++; + } elseif ($stub->cut >= 0) { + $stub->cut += \count($a); + $stub->position = 0; + } + } + + if ($arrayStub === $stub) { + if ($arrayStub->cut) { + $stub = [$arrayStub->cut, $arrayStub->class => $arrayStub->position]; + $arrayStub->cut = 0; + } elseif (isset(self::$arrayCache[$arrayStub->class][$arrayStub->position])) { + $stub = self::$arrayCache[$arrayStub->class][$arrayStub->position]; + } else { + self::$arrayCache[$arrayStub->class][$arrayStub->position] = $stub = [$arrayStub->class => $arrayStub->position]; + } + } + + if ($zvalIsRef) { + $refs[$k]->value = $stub; + } else { + $vals[$k] = $stub; + } + } + + if ($fromObjCast) { + $fromObjCast = false; + $refs = $vals; + $vals = []; + $j = -1; + foreach ($queue[$i] as $k => $v) { + foreach ([$k => true] as $gk => $gv) { + } + if ($gk !== $k) { + $vals = (object) $vals; + $vals->{$k} = $refs[++$j]; + $vals = (array) $vals; + } else { + $vals[$k] = $refs[++$j]; + } + } + } + + $queue[$i] = $vals; + } + + foreach ($values as $h => $v) { + $hardRefs[$h] = $v; + } + + return $queue; + } + + private static function initHashMask() + { + $obj = (object) []; + self::$hashOffset = 16 - \PHP_INT_SIZE; + self::$hashMask = -1; + + if (\defined('HHVM_VERSION')) { + self::$hashOffset += 16; + } else { + // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below + $obFuncs = ['ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush']; + foreach (debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS) as $frame) { + if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) { + $frame['line'] = 0; + break; + } + } + if (!empty($frame['line'])) { + ob_start(); + debug_zval_dump($obj); + self::$hashMask = (int) substr(ob_get_clean(), 17); + } + } + + self::$hashMask ^= hexdec(substr(spl_object_hash($obj), self::$hashOffset, \PHP_INT_SIZE)); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Dumper/AbstractDumper.php b/pandora_console/vendor/symfony/var-dumper/Dumper/AbstractDumper.php new file mode 100644 index 0000000000..5ea6294f3d --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Dumper/AbstractDumper.php @@ -0,0 +1,213 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Cloner\DumperInterface; + +/** + * Abstract mechanism for dumping a Data object. + * + * @author Nicolas Grekas + */ +abstract class AbstractDumper implements DataDumperInterface, DumperInterface +{ + const DUMP_LIGHT_ARRAY = 1; + const DUMP_STRING_LENGTH = 2; + const DUMP_COMMA_SEPARATOR = 4; + const DUMP_TRAILING_COMMA = 8; + + public static $defaultOutput = 'php://output'; + + protected $line = ''; + protected $lineDumper; + protected $outputStream; + protected $decimalPoint; // This is locale dependent + protected $indentPad = ' '; + protected $flags; + + private $charset = ''; + + /** + * @param callable|resource|string|null $output A line dumper callable, an opened stream or an output path, defaults to static::$defaultOutput + * @param string|null $charset The default character encoding to use for non-UTF8 strings + * @param int $flags A bit field of static::DUMP_* constants to fine tune dumps representation + */ + public function __construct($output = null, $charset = null, $flags = 0) + { + $this->flags = (int) $flags; + $this->setCharset($charset ?: ini_get('php.output_encoding') ?: ini_get('default_charset') ?: 'UTF-8'); + $this->decimalPoint = localeconv(); + $this->decimalPoint = $this->decimalPoint['decimal_point']; + $this->setOutput($output ?: static::$defaultOutput); + if (!$output && \is_string(static::$defaultOutput)) { + static::$defaultOutput = $this->outputStream; + } + } + + /** + * Sets the output destination of the dumps. + * + * @param callable|resource|string $output A line dumper callable, an opened stream or an output path + * + * @return callable|resource|string The previous output destination + */ + public function setOutput($output) + { + $prev = null !== $this->outputStream ? $this->outputStream : $this->lineDumper; + + if (\is_callable($output)) { + $this->outputStream = null; + $this->lineDumper = $output; + } else { + if (\is_string($output)) { + $output = fopen($output, 'wb'); + } + $this->outputStream = $output; + $this->lineDumper = [$this, 'echoLine']; + } + + return $prev; + } + + /** + * Sets the default character encoding to use for non-UTF8 strings. + * + * @param string $charset The default character encoding to use for non-UTF8 strings + * + * @return string The previous charset + */ + public function setCharset($charset) + { + $prev = $this->charset; + + $charset = strtoupper($charset); + $charset = null === $charset || 'UTF-8' === $charset || 'UTF8' === $charset ? 'CP1252' : $charset; + + $this->charset = $charset; + + return $prev; + } + + /** + * Sets the indentation pad string. + * + * @param string $pad A string that will be prepended to dumped lines, repeated by nesting level + * + * @return string The previous indent pad + */ + public function setIndentPad($pad) + { + $prev = $this->indentPad; + $this->indentPad = $pad; + + return $prev; + } + + /** + * Dumps a Data object. + * + * @param Data $data A Data object + * @param callable|resource|string|true|null $output A line dumper callable, an opened stream, an output path or true to return the dump + * + * @return string|null The dump as string when $output is true + */ + public function dump(Data $data, $output = null) + { + $this->decimalPoint = localeconv(); + $this->decimalPoint = $this->decimalPoint['decimal_point']; + + if ($locale = $this->flags & (self::DUMP_COMMA_SEPARATOR | self::DUMP_TRAILING_COMMA) ? setlocale(\LC_NUMERIC, 0) : null) { + setlocale(\LC_NUMERIC, 'C'); + } + + if ($returnDump = true === $output) { + $output = fopen('php://memory', 'r+b'); + } + if ($output) { + $prevOutput = $this->setOutput($output); + } + try { + $data->dump($this); + $this->dumpLine(-1); + + if ($returnDump) { + $result = stream_get_contents($output, -1, 0); + fclose($output); + + return $result; + } + } finally { + if ($output) { + $this->setOutput($prevOutput); + } + if ($locale) { + setlocale(\LC_NUMERIC, $locale); + } + } + + return null; + } + + /** + * Dumps the current line. + * + * @param int $depth The recursive depth in the dumped structure for the line being dumped, + * or -1 to signal the end-of-dump to the line dumper callable + */ + protected function dumpLine($depth) + { + \call_user_func($this->lineDumper, $this->line, $depth, $this->indentPad); + $this->line = ''; + } + + /** + * Generic line dumper callback. + * + * @param string $line The line to write + * @param int $depth The recursive depth in the dumped structure + * @param string $indentPad The line indent pad + */ + protected function echoLine($line, $depth, $indentPad) + { + if (-1 !== $depth) { + fwrite($this->outputStream, str_repeat($indentPad, $depth).$line."\n"); + } + } + + /** + * Converts a non-UTF-8 string to UTF-8. + * + * @param string|null $s The non-UTF-8 string to convert + * + * @return string|null The string converted to UTF-8 + */ + protected function utf8Encode($s) + { + if (null === $s || preg_match('//u', $s)) { + return $s; + } + + if (!\function_exists('iconv')) { + throw new \RuntimeException('Unable to convert a non-UTF-8 string to UTF-8: required function iconv() does not exist. You should install ext-iconv or symfony/polyfill-iconv.'); + } + + if (false !== $c = @iconv($this->charset, 'UTF-8', $s)) { + return $c; + } + if ('CP1252' !== $this->charset && false !== $c = @iconv('CP1252', 'UTF-8', $s)) { + return $c; + } + + return iconv('CP850', 'UTF-8', $s); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Dumper/CliDumper.php b/pandora_console/vendor/symfony/var-dumper/Dumper/CliDumper.php new file mode 100644 index 0000000000..4c48ab7cc8 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Dumper/CliDumper.php @@ -0,0 +1,601 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Cursor; +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * CliDumper dumps variables for command line output. + * + * @author Nicolas Grekas + */ +class CliDumper extends AbstractDumper +{ + public static $defaultColors; + public static $defaultOutput = 'php://stdout'; + + protected $colors; + protected $maxStringWidth = 0; + protected $styles = [ + // See http://en.wikipedia.org/wiki/ANSI_escape_code#graphics + 'default' => '0;38;5;208', + 'num' => '1;38;5;38', + 'const' => '1;38;5;208', + 'str' => '1;38;5;113', + 'note' => '38;5;38', + 'ref' => '38;5;247', + 'public' => '', + 'protected' => '', + 'private' => '', + 'meta' => '38;5;170', + 'key' => '38;5;113', + 'index' => '38;5;38', + ]; + + protected static $controlCharsRx = '/[\x00-\x1F\x7F]+/'; + protected static $controlCharsMap = [ + "\t" => '\t', + "\n" => '\n', + "\v" => '\v', + "\f" => '\f', + "\r" => '\r', + "\033" => '\e', + ]; + + protected $collapseNextHash = false; + protected $expandNextHash = false; + + /** + * {@inheritdoc} + */ + public function __construct($output = null, $charset = null, $flags = 0) + { + parent::__construct($output, $charset, $flags); + + if ('\\' === \DIRECTORY_SEPARATOR && !$this->isWindowsTrueColor()) { + // Use only the base 16 xterm colors when using ANSICON or standard Windows 10 CLI + $this->setStyles([ + 'default' => '31', + 'num' => '1;34', + 'const' => '1;31', + 'str' => '1;32', + 'note' => '34', + 'ref' => '1;30', + 'meta' => '35', + 'key' => '32', + 'index' => '34', + ]); + } + } + + /** + * Enables/disables colored output. + * + * @param bool $colors + */ + public function setColors($colors) + { + $this->colors = (bool) $colors; + } + + /** + * Sets the maximum number of characters per line for dumped strings. + * + * @param int $maxStringWidth + */ + public function setMaxStringWidth($maxStringWidth) + { + $this->maxStringWidth = (int) $maxStringWidth; + } + + /** + * Configures styles. + * + * @param array $styles A map of style names to style definitions + */ + public function setStyles(array $styles) + { + $this->styles = $styles + $this->styles; + } + + /** + * {@inheritdoc} + */ + public function dumpScalar(Cursor $cursor, $type, $value) + { + $this->dumpKey($cursor); + + $style = 'const'; + $attr = $cursor->attr; + + switch ($type) { + case 'default': + $style = 'default'; + break; + + case 'integer': + $style = 'num'; + break; + + case 'double': + $style = 'num'; + + switch (true) { + case \INF === $value: $value = 'INF'; break; + case -\INF === $value: $value = '-INF'; break; + case is_nan($value): $value = 'NAN'; break; + default: + $value = (string) $value; + if (false === strpos($value, $this->decimalPoint)) { + $value .= $this->decimalPoint.'0'; + } + break; + } + break; + + case 'NULL': + $value = 'null'; + break; + + case 'boolean': + $value = $value ? 'true' : 'false'; + break; + + default: + $attr += ['value' => $this->utf8Encode($value)]; + $value = $this->utf8Encode($type); + break; + } + + $this->line .= $this->style($style, $value, $attr); + + $this->endValue($cursor); + } + + /** + * {@inheritdoc} + */ + public function dumpString(Cursor $cursor, $str, $bin, $cut) + { + $this->dumpKey($cursor); + $attr = $cursor->attr; + + if ($bin) { + $str = $this->utf8Encode($str); + } + if ('' === $str) { + $this->line .= '""'; + $this->endValue($cursor); + } else { + $attr += [ + 'length' => 0 <= $cut ? mb_strlen($str, 'UTF-8') + $cut : 0, + 'binary' => $bin, + ]; + $str = explode("\n", $str); + if (isset($str[1]) && !isset($str[2]) && !isset($str[1][0])) { + unset($str[1]); + $str[0] .= "\n"; + } + $m = \count($str) - 1; + $i = $lineCut = 0; + + if (self::DUMP_STRING_LENGTH & $this->flags) { + $this->line .= '('.$attr['length'].') '; + } + if ($bin) { + $this->line .= 'b'; + } + + if ($m) { + $this->line .= '"""'; + $this->dumpLine($cursor->depth); + } else { + $this->line .= '"'; + } + + foreach ($str as $str) { + if ($i < $m) { + $str .= "\n"; + } + if (0 < $this->maxStringWidth && $this->maxStringWidth < $len = mb_strlen($str, 'UTF-8')) { + $str = mb_substr($str, 0, $this->maxStringWidth, 'UTF-8'); + $lineCut = $len - $this->maxStringWidth; + } + if ($m && 0 < $cursor->depth) { + $this->line .= $this->indentPad; + } + if ('' !== $str) { + $this->line .= $this->style('str', $str, $attr); + } + if ($i++ == $m) { + if ($m) { + if ('' !== $str) { + $this->dumpLine($cursor->depth); + if (0 < $cursor->depth) { + $this->line .= $this->indentPad; + } + } + $this->line .= '"""'; + } else { + $this->line .= '"'; + } + if ($cut < 0) { + $this->line .= '…'; + $lineCut = 0; + } elseif ($cut) { + $lineCut += $cut; + } + } + if ($lineCut) { + $this->line .= '…'.$lineCut; + $lineCut = 0; + } + + if ($i > $m) { + $this->endValue($cursor); + } else { + $this->dumpLine($cursor->depth); + } + } + } + } + + /** + * {@inheritdoc} + */ + public function enterHash(Cursor $cursor, $type, $class, $hasChild) + { + if (null === $this->colors) { + $this->colors = $this->supportsColors(); + } + + $this->dumpKey($cursor); + + if ($this->collapseNextHash) { + $cursor->skipChildren = true; + $this->collapseNextHash = $hasChild = false; + } + + $class = $this->utf8Encode($class); + if (Cursor::HASH_OBJECT === $type) { + $prefix = $class && 'stdClass' !== $class ? $this->style('note', $class).' {' : '{'; + } elseif (Cursor::HASH_RESOURCE === $type) { + $prefix = $this->style('note', $class.' resource').($hasChild ? ' {' : ' '); + } else { + $prefix = $class && !(self::DUMP_LIGHT_ARRAY & $this->flags) ? $this->style('note', 'array:'.$class).' [' : '['; + } + + if ($cursor->softRefCount || 0 < $cursor->softRefHandle) { + $prefix .= $this->style('ref', (Cursor::HASH_RESOURCE === $type ? '@' : '#').(0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->softRefTo), ['count' => $cursor->softRefCount]); + } elseif ($cursor->hardRefTo && !$cursor->refIndex && $class) { + $prefix .= $this->style('ref', '&'.$cursor->hardRefTo, ['count' => $cursor->hardRefCount]); + } elseif (!$hasChild && Cursor::HASH_RESOURCE === $type) { + $prefix = substr($prefix, 0, -1); + } + + $this->line .= $prefix; + + if ($hasChild) { + $this->dumpLine($cursor->depth); + } + } + + /** + * {@inheritdoc} + */ + public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut) + { + $this->dumpEllipsis($cursor, $hasChild, $cut); + $this->line .= Cursor::HASH_OBJECT === $type ? '}' : (Cursor::HASH_RESOURCE !== $type ? ']' : ($hasChild ? '}' : '')); + $this->endValue($cursor); + } + + /** + * Dumps an ellipsis for cut children. + * + * @param Cursor $cursor The Cursor position in the dump + * @param bool $hasChild When the dump of the hash has child item + * @param int $cut The number of items the hash has been cut by + */ + protected function dumpEllipsis(Cursor $cursor, $hasChild, $cut) + { + if ($cut) { + $this->line .= ' …'; + if (0 < $cut) { + $this->line .= $cut; + } + if ($hasChild) { + $this->dumpLine($cursor->depth + 1); + } + } + } + + /** + * Dumps a key in a hash structure. + * + * @param Cursor $cursor The Cursor position in the dump + */ + protected function dumpKey(Cursor $cursor) + { + if (null !== $key = $cursor->hashKey) { + if ($cursor->hashKeyIsBinary) { + $key = $this->utf8Encode($key); + } + $attr = ['binary' => $cursor->hashKeyIsBinary]; + $bin = $cursor->hashKeyIsBinary ? 'b' : ''; + $style = 'key'; + switch ($cursor->hashType) { + default: + case Cursor::HASH_INDEXED: + if (self::DUMP_LIGHT_ARRAY & $this->flags) { + break; + } + $style = 'index'; + // no break + case Cursor::HASH_ASSOC: + if (\is_int($key)) { + $this->line .= $this->style($style, $key).' => '; + } else { + $this->line .= $bin.'"'.$this->style($style, $key).'" => '; + } + break; + + case Cursor::HASH_RESOURCE: + $key = "\0~\0".$key; + // no break + case Cursor::HASH_OBJECT: + if (!isset($key[0]) || "\0" !== $key[0]) { + $this->line .= '+'.$bin.$this->style('public', $key).': '; + } elseif (0 < strpos($key, "\0", 1)) { + $key = explode("\0", substr($key, 1), 2); + + switch ($key[0][0]) { + case '+': // User inserted keys + $attr['dynamic'] = true; + $this->line .= '+'.$bin.'"'.$this->style('public', $key[1], $attr).'": '; + break 2; + case '~': + $style = 'meta'; + if (isset($key[0][1])) { + parse_str(substr($key[0], 1), $attr); + $attr += ['binary' => $cursor->hashKeyIsBinary]; + } + break; + case '*': + $style = 'protected'; + $bin = '#'.$bin; + break; + default: + $attr['class'] = $key[0]; + $style = 'private'; + $bin = '-'.$bin; + break; + } + + if (isset($attr['collapse'])) { + if ($attr['collapse']) { + $this->collapseNextHash = true; + } else { + $this->expandNextHash = true; + } + } + + $this->line .= $bin.$this->style($style, $key[1], $attr).(isset($attr['separator']) ? $attr['separator'] : ': '); + } else { + // This case should not happen + $this->line .= '-'.$bin.'"'.$this->style('private', $key, ['class' => '']).'": '; + } + break; + } + + if ($cursor->hardRefTo) { + $this->line .= $this->style('ref', '&'.($cursor->hardRefCount ? $cursor->hardRefTo : ''), ['count' => $cursor->hardRefCount]).' '; + } + } + } + + /** + * Decorates a value with some style. + * + * @param string $style The type of style being applied + * @param string $value The value being styled + * @param array $attr Optional context information + * + * @return string The value with style decoration + */ + protected function style($style, $value, $attr = []) + { + if (null === $this->colors) { + $this->colors = $this->supportsColors(); + } + + if (isset($attr['ellipsis'], $attr['ellipsis-type'])) { + $prefix = substr($value, 0, -$attr['ellipsis']); + if ('cli' === \PHP_SAPI && 'path' === $attr['ellipsis-type'] && isset($_SERVER[$pwd = '\\' === \DIRECTORY_SEPARATOR ? 'CD' : 'PWD']) && 0 === strpos($prefix, $_SERVER[$pwd])) { + $prefix = '.'.substr($prefix, \strlen($_SERVER[$pwd])); + } + if (!empty($attr['ellipsis-tail'])) { + $prefix .= substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']); + $value = substr($value, -$attr['ellipsis'] + $attr['ellipsis-tail']); + } else { + $value = substr($value, -$attr['ellipsis']); + } + + return $this->style('default', $prefix).$this->style($style, $value); + } + + $style = $this->styles[$style]; + + $map = static::$controlCharsMap; + $startCchr = $this->colors ? "\033[m\033[{$this->styles['default']}m" : ''; + $endCchr = $this->colors ? "\033[m\033[{$style}m" : ''; + $value = preg_replace_callback(static::$controlCharsRx, function ($c) use ($map, $startCchr, $endCchr) { + $s = $startCchr; + $c = $c[$i = 0]; + do { + $s .= isset($map[$c[$i]]) ? $map[$c[$i]] : sprintf('\x%02X', \ord($c[$i])); + } while (isset($c[++$i])); + + return $s.$endCchr; + }, $value, -1, $cchrCount); + + if ($this->colors) { + if ($cchrCount && "\033" === $value[0]) { + $value = substr($value, \strlen($startCchr)); + } else { + $value = "\033[{$style}m".$value; + } + if ($cchrCount && $endCchr === substr($value, -\strlen($endCchr))) { + $value = substr($value, 0, -\strlen($endCchr)); + } else { + $value .= "\033[{$this->styles['default']}m"; + } + } + + return $value; + } + + /** + * @return bool Tells if the current output stream supports ANSI colors or not + */ + protected function supportsColors() + { + if ($this->outputStream !== static::$defaultOutput) { + return $this->hasColorSupport($this->outputStream); + } + if (null !== static::$defaultColors) { + return static::$defaultColors; + } + if (isset($_SERVER['argv'][1])) { + $colors = $_SERVER['argv']; + $i = \count($colors); + while (--$i > 0) { + if (isset($colors[$i][5])) { + switch ($colors[$i]) { + case '--ansi': + case '--color': + case '--color=yes': + case '--color=force': + case '--color=always': + return static::$defaultColors = true; + + case '--no-ansi': + case '--color=no': + case '--color=none': + case '--color=never': + return static::$defaultColors = false; + } + } + } + } + + $h = stream_get_meta_data($this->outputStream) + ['wrapper_type' => null]; + $h = 'Output' === $h['stream_type'] && 'PHP' === $h['wrapper_type'] ? fopen('php://stdout', 'wb') : $this->outputStream; + + return static::$defaultColors = $this->hasColorSupport($h); + } + + /** + * {@inheritdoc} + */ + protected function dumpLine($depth, $endOfValue = false) + { + if ($this->colors) { + $this->line = sprintf("\033[%sm%s\033[m", $this->styles['default'], $this->line); + } + parent::dumpLine($depth); + } + + protected function endValue(Cursor $cursor) + { + if (Stub::ARRAY_INDEXED === $cursor->hashType || Stub::ARRAY_ASSOC === $cursor->hashType) { + if (self::DUMP_TRAILING_COMMA & $this->flags && 0 < $cursor->depth) { + $this->line .= ','; + } elseif (self::DUMP_COMMA_SEPARATOR & $this->flags && 1 < $cursor->hashLength - $cursor->hashIndex) { + $this->line .= ','; + } + } + + $this->dumpLine($cursor->depth, true); + } + + /** + * Returns true if the stream supports colorization. + * + * Reference: Composer\XdebugHandler\Process::supportsColor + * https://github.com/composer/xdebug-handler + * + * @param mixed $stream A CLI output stream + * + * @return bool + */ + private function hasColorSupport($stream) + { + if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) { + return false; + } + + if ('Hyper' === getenv('TERM_PROGRAM')) { + return true; + } + + if (\DIRECTORY_SEPARATOR === '\\') { + return (\function_exists('sapi_windows_vt100_support') + && @sapi_windows_vt100_support($stream)) + || false !== getenv('ANSICON') + || 'ON' === getenv('ConEmuANSI') + || 'xterm' === getenv('TERM'); + } + + if (\function_exists('stream_isatty')) { + return @stream_isatty($stream); + } + + if (\function_exists('posix_isatty')) { + return @posix_isatty($stream); + } + + $stat = @fstat($stream); + // Check if formatted mode is S_IFCHR + return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; + } + + /** + * Returns true if the Windows terminal supports true color. + * + * Note that this does not check an output stream, but relies on environment + * variables from known implementations, or a PHP and Windows version that + * supports true color. + * + * @return bool + */ + private function isWindowsTrueColor() + { + $result = 183 <= getenv('ANSICON_VER') + || 'ON' === getenv('ConEmuANSI') + || 'xterm' === getenv('TERM') + || 'Hyper' === getenv('TERM_PROGRAM'); + + if (!$result && \PHP_VERSION_ID >= 70200) { + $version = sprintf( + '%s.%s.%s', + PHP_WINDOWS_VERSION_MAJOR, + PHP_WINDOWS_VERSION_MINOR, + PHP_WINDOWS_VERSION_BUILD + ); + $result = $version >= '10.0.15063'; + } + + return $result; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php b/pandora_console/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php new file mode 100644 index 0000000000..b173bccf38 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Data; + +/** + * DataDumperInterface for dumping Data objects. + * + * @author Nicolas Grekas + */ +interface DataDumperInterface +{ + public function dump(Data $data); +} diff --git a/pandora_console/vendor/symfony/var-dumper/Dumper/HtmlDumper.php b/pandora_console/vendor/symfony/var-dumper/Dumper/HtmlDumper.php new file mode 100644 index 0000000000..ccbdc96f23 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Dumper/HtmlDumper.php @@ -0,0 +1,904 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Dumper; + +use Symfony\Component\VarDumper\Cloner\Cursor; +use Symfony\Component\VarDumper\Cloner\Data; + +/** + * HtmlDumper dumps variables as HTML. + * + * @author Nicolas Grekas + */ +class HtmlDumper extends CliDumper +{ + public static $defaultOutput = 'php://output'; + + protected $dumpHeader; + protected $dumpPrefix = '
';
+    protected $dumpSuffix = '
'; + protected $dumpId = 'sf-dump'; + protected $colors = true; + protected $headerIsDumped = false; + protected $lastDepth = -1; + protected $styles = [ + 'default' => 'background-color:#18171B; color:#FF8400; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all', + 'num' => 'font-weight:bold; color:#1299DA', + 'const' => 'font-weight:bold', + 'str' => 'font-weight:bold; color:#56DB3A', + 'note' => 'color:#1299DA', + 'ref' => 'color:#A0A0A0', + 'public' => 'color:#FFFFFF', + 'protected' => 'color:#FFFFFF', + 'private' => 'color:#FFFFFF', + 'meta' => 'color:#B729D9', + 'key' => 'color:#56DB3A', + 'index' => 'color:#1299DA', + 'ellipsis' => 'color:#FF8400', + ]; + + private $displayOptions = [ + 'maxDepth' => 1, + 'maxStringLength' => 160, + 'fileLinkFormat' => null, + ]; + private $extraDisplayOptions = []; + + /** + * {@inheritdoc} + */ + public function __construct($output = null, $charset = null, $flags = 0) + { + AbstractDumper::__construct($output, $charset, $flags); + $this->dumpId = 'sf-dump-'.mt_rand(); + $this->displayOptions['fileLinkFormat'] = ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format'); + } + + /** + * {@inheritdoc} + */ + public function setStyles(array $styles) + { + $this->headerIsDumped = false; + $this->styles = $styles + $this->styles; + } + + /** + * Configures display options. + * + * @param array $displayOptions A map of display options to customize the behavior + */ + public function setDisplayOptions(array $displayOptions) + { + $this->headerIsDumped = false; + $this->displayOptions = $displayOptions + $this->displayOptions; + } + + /** + * Sets an HTML header that will be dumped once in the output stream. + * + * @param string $header An HTML string + */ + public function setDumpHeader($header) + { + $this->dumpHeader = $header; + } + + /** + * Sets an HTML prefix and suffix that will encapse every single dump. + * + * @param string $prefix The prepended HTML string + * @param string $suffix The appended HTML string + */ + public function setDumpBoundaries($prefix, $suffix) + { + $this->dumpPrefix = $prefix; + $this->dumpSuffix = $suffix; + } + + /** + * {@inheritdoc} + */ + public function dump(Data $data, $output = null, array $extraDisplayOptions = []) + { + $this->extraDisplayOptions = $extraDisplayOptions; + $result = parent::dump($data, $output); + $this->dumpId = 'sf-dump-'.mt_rand(); + + return $result; + } + + /** + * Dumps the HTML header. + */ + protected function getDumpHeader() + { + $this->headerIsDumped = null !== $this->outputStream ? $this->outputStream : $this->lineDumper; + + if (null !== $this->dumpHeader) { + return $this->dumpHeader; + } + + $line = str_replace('{$options}', json_encode($this->displayOptions, \JSON_FORCE_OBJECT), <<<'EOHTML' +'.$this->dumpHeader; + } + + /** + * {@inheritdoc} + */ + public function enterHash(Cursor $cursor, $type, $class, $hasChild) + { + parent::enterHash($cursor, $type, $class, false); + + if ($cursor->skipChildren) { + $cursor->skipChildren = false; + $eol = ' class=sf-dump-compact>'; + } elseif ($this->expandNextHash) { + $this->expandNextHash = false; + $eol = ' class=sf-dump-expanded>'; + } else { + $eol = '>'; + } + + if ($hasChild) { + $this->line .= 'refIndex) { + $r = Cursor::HASH_OBJECT !== $type ? 1 - (Cursor::HASH_RESOURCE !== $type) : 2; + $r .= $r && 0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->refIndex; + + $this->line .= sprintf(' id=%s-ref%s', $this->dumpId, $r); + } + $this->line .= $eol; + $this->dumpLine($cursor->depth); + } + } + + /** + * {@inheritdoc} + */ + public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut) + { + $this->dumpEllipsis($cursor, $hasChild, $cut); + if ($hasChild) { + $this->line .= ''; + } + parent::leaveHash($cursor, $type, $class, $hasChild, 0); + } + + /** + * {@inheritdoc} + */ + protected function style($style, $value, $attr = []) + { + if ('' === $value) { + return ''; + } + + $v = esc($value); + + if ('ref' === $style) { + if (empty($attr['count'])) { + return sprintf('%s', $v); + } + $r = ('#' !== $v[0] ? 1 - ('@' !== $v[0]) : 2).substr($value, 1); + + return sprintf('%s', $this->dumpId, $r, 1 + $attr['count'], $v); + } + + if ('const' === $style && isset($attr['value'])) { + $style .= sprintf(' title="%s"', esc(is_scalar($attr['value']) ? $attr['value'] : json_encode($attr['value']))); + } elseif ('public' === $style) { + $style .= sprintf(' title="%s"', empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property'); + } elseif ('str' === $style && 1 < $attr['length']) { + $style .= sprintf(' title="%d%s characters"', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : ''); + } elseif ('note' === $style && false !== $c = strrpos($v, '\\')) { + return sprintf('%s', $v, $style, substr($v, $c + 1)); + } elseif ('protected' === $style) { + $style .= ' title="Protected property"'; + } elseif ('meta' === $style && isset($attr['title'])) { + $style .= sprintf(' title="%s"', esc($this->utf8Encode($attr['title']))); + } elseif ('private' === $style) { + $style .= sprintf(' title="Private property defined in class: `%s`"', esc($this->utf8Encode($attr['class']))); + } + $map = static::$controlCharsMap; + + if (isset($attr['ellipsis'])) { + $class = 'sf-dump-ellipsis'; + if (isset($attr['ellipsis-type'])) { + $class = sprintf('"%s sf-dump-ellipsis-%s"', $class, $attr['ellipsis-type']); + } + $label = esc(substr($value, -$attr['ellipsis'])); + $style = str_replace(' title="', " title=\"$v\n", $style); + $v = sprintf('%s', $class, substr($v, 0, -\strlen($label))); + + if (!empty($attr['ellipsis-tail'])) { + $tail = \strlen(esc(substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']))); + $v .= sprintf('%s%s', substr($label, 0, $tail), substr($label, $tail)); + } else { + $v .= $label; + } + } + + $v = "".preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) { + $s = ''; + $c = $c[$i = 0]; + do { + $s .= isset($map[$c[$i]]) ? $map[$c[$i]] : sprintf('\x%02X', \ord($c[$i])); + } while (isset($c[++$i])); + + return $s.''; + }, $v).''; + + if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], isset($attr['line']) ? $attr['line'] : 0)) { + $attr['href'] = $href; + } + if (isset($attr['href'])) { + $target = isset($attr['file']) ? '' : ' target="_blank"'; + $v = sprintf('%s', esc($this->utf8Encode($attr['href'])), $target, $v); + } + if (isset($attr['lang'])) { + $v = sprintf('%s', esc($attr['lang']), $v); + } + + return $v; + } + + /** + * {@inheritdoc} + */ + protected function dumpLine($depth, $endOfValue = false) + { + if (-1 === $this->lastDepth) { + $this->line = sprintf($this->dumpPrefix, $this->dumpId, $this->indentPad).$this->line; + } + if ($this->headerIsDumped !== (null !== $this->outputStream ? $this->outputStream : $this->lineDumper)) { + $this->line = $this->getDumpHeader().$this->line; + } + + if (-1 === $depth) { + $args = ['"'.$this->dumpId.'"']; + if ($this->extraDisplayOptions) { + $args[] = json_encode($this->extraDisplayOptions, \JSON_FORCE_OBJECT); + } + // Replace is for BC + $this->line .= sprintf(str_replace('"%s"', '%s', $this->dumpSuffix), implode(', ', $args)); + } + $this->lastDepth = $depth; + + $this->line = mb_convert_encoding($this->line, 'HTML-ENTITIES', 'UTF-8'); + + if (-1 === $depth) { + AbstractDumper::dumpLine(0); + } + AbstractDumper::dumpLine($depth); + } + + private function getSourceLink($file, $line) + { + $options = $this->extraDisplayOptions + $this->displayOptions; + + if ($fmt = $options['fileLinkFormat']) { + return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line); + } + + return false; + } +} + +function esc($str) +{ + return htmlspecialchars($str, \ENT_QUOTES, 'UTF-8'); +} diff --git a/pandora_console/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php b/pandora_console/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php new file mode 100644 index 0000000000..af47753ad5 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Exception; + +/** + * @author Nicolas Grekas + */ +class ThrowingCasterException extends \Exception +{ + /** + * @param \Exception $prev The exception thrown from the caster + */ + public function __construct(\Exception $prev) + { + parent::__construct('Unexpected '.\get_class($prev).' thrown from a caster: '.$prev->getMessage(), 0, $prev); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/LICENSE b/pandora_console/vendor/symfony/var-dumper/LICENSE new file mode 100644 index 0000000000..684fbf94df --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pandora_console/vendor/symfony/var-dumper/README.md b/pandora_console/vendor/symfony/var-dumper/README.md new file mode 100644 index 0000000000..339f73eba3 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/README.md @@ -0,0 +1,15 @@ +VarDumper Component +=================== + +The VarDumper component provides mechanisms for walking through any arbitrary +PHP variable. It provides a better `dump()` function that you can use instead +of `var_dump`. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/var_dumper/introduction.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/pandora_console/vendor/symfony/var-dumper/Resources/functions/dump.php b/pandora_console/vendor/symfony/var-dumper/Resources/functions/dump.php new file mode 100644 index 0000000000..0e0e4d0435 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Resources/functions/dump.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Component\VarDumper\VarDumper; + +if (!function_exists('dump')) { + /** + * @author Nicolas Grekas + */ + function dump($var) + { + foreach (func_get_args() as $v) { + VarDumper::dump($v); + } + + if (1 < func_num_args()) { + return func_get_args(); + } + + return $var; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php b/pandora_console/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php new file mode 100644 index 0000000000..b8f12c5e45 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Test/VarDumperTestTrait.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Test; + +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\CliDumper; + +/** + * @author Nicolas Grekas + */ +trait VarDumperTestTrait +{ + public function assertDumpEquals($dump, $data, $filter = 0, $message = '') + { + if (\is_string($filter)) { + @trigger_error(sprintf('The $message argument of the "%s()" method at the 3rd position is deprecated since Symfony 3.4 and will be moved at the 4th position in 4.0.', __METHOD__), \E_USER_DEPRECATED); + $message = $filter; + $filter = 0; + } + + $this->assertSame(rtrim($dump), $this->getDump($data, null, $filter), $message); + } + + public function assertDumpMatchesFormat($dump, $data, $filter = 0, $message = '') + { + if (\is_string($filter)) { + @trigger_error(sprintf('The $message argument of the "%s()" method at the 3rd position is deprecated since Symfony 3.4 and will be moved at the 4th position in 4.0.', __METHOD__), \E_USER_DEPRECATED); + $message = $filter; + $filter = 0; + } + + $this->assertStringMatchesFormat(rtrim($dump), $this->getDump($data, null, $filter), $message); + } + + /** + * @return string|null + */ + protected function getDump($data, $key = null, $filter = 0) + { + $flags = getenv('DUMP_LIGHT_ARRAY') ? CliDumper::DUMP_LIGHT_ARRAY : 0; + $flags |= getenv('DUMP_STRING_LENGTH') ? CliDumper::DUMP_STRING_LENGTH : 0; + + $cloner = new VarCloner(); + $cloner->setMaxItems(-1); + $dumper = new CliDumper(null, null, $flags); + $dumper->setColors(false); + $data = $cloner->cloneVar($data, $filter)->withRefHandles(false); + if (null !== $key && null === $data = $data->seek($key)) { + return null; + } + + return rtrim($dumper->dump($data, true)); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Caster/CasterTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/CasterTest.php new file mode 100644 index 0000000000..73800e5f9d --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/CasterTest.php @@ -0,0 +1,181 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Caster\Caster; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; + +/** + * @author Nicolas Grekas + */ +class CasterTest extends TestCase +{ + use VarDumperTestTrait; + + private $referenceArray = [ + 'null' => null, + 'empty' => false, + 'public' => 'pub', + "\0~\0virtual" => 'virt', + "\0+\0dynamic" => 'dyn', + "\0*\0protected" => 'prot', + "\0Foo\0private" => 'priv', + ]; + + /** + * @dataProvider provideFilter + */ + public function testFilter($filter, $expectedDiff, $listedProperties = null) + { + if (null === $listedProperties) { + $filteredArray = Caster::filter($this->referenceArray, $filter); + } else { + $filteredArray = Caster::filter($this->referenceArray, $filter, $listedProperties); + } + + $this->assertSame($expectedDiff, array_diff_assoc($this->referenceArray, $filteredArray)); + } + + public function provideFilter() + { + return [ + [ + 0, + [], + ], + [ + Caster::EXCLUDE_PUBLIC, + [ + 'null' => null, + 'empty' => false, + 'public' => 'pub', + ], + ], + [ + Caster::EXCLUDE_NULL, + [ + 'null' => null, + ], + ], + [ + Caster::EXCLUDE_EMPTY, + [ + 'null' => null, + 'empty' => false, + ], + ], + [ + Caster::EXCLUDE_VIRTUAL, + [ + "\0~\0virtual" => 'virt', + ], + ], + [ + Caster::EXCLUDE_DYNAMIC, + [ + "\0+\0dynamic" => 'dyn', + ], + ], + [ + Caster::EXCLUDE_PROTECTED, + [ + "\0*\0protected" => 'prot', + ], + ], + [ + Caster::EXCLUDE_PRIVATE, + [ + "\0Foo\0private" => 'priv', + ], + ], + [ + Caster::EXCLUDE_VERBOSE, + [ + 'public' => 'pub', + "\0*\0protected" => 'prot', + ], + ['public', "\0*\0protected"], + ], + [ + Caster::EXCLUDE_NOT_IMPORTANT, + [ + 'null' => null, + 'empty' => false, + "\0~\0virtual" => 'virt', + "\0+\0dynamic" => 'dyn', + "\0Foo\0private" => 'priv', + ], + ['public', "\0*\0protected"], + ], + [ + Caster::EXCLUDE_VIRTUAL | Caster::EXCLUDE_DYNAMIC, + [ + "\0~\0virtual" => 'virt', + "\0+\0dynamic" => 'dyn', + ], + ], + [ + Caster::EXCLUDE_NOT_IMPORTANT | Caster::EXCLUDE_VERBOSE, + $this->referenceArray, + ['public', "\0*\0protected"], + ], + [ + Caster::EXCLUDE_NOT_IMPORTANT | Caster::EXCLUDE_EMPTY, + [ + 'null' => null, + 'empty' => false, + "\0~\0virtual" => 'virt', + "\0+\0dynamic" => 'dyn', + "\0*\0protected" => 'prot', + "\0Foo\0private" => 'priv', + ], + ['public', 'empty'], + ], + [ + Caster::EXCLUDE_VERBOSE | Caster::EXCLUDE_EMPTY | Caster::EXCLUDE_STRICT, + [ + 'empty' => false, + ], + ['public', 'empty'], + ], + ]; + } + + /** + * @requires PHP 7.0 + */ + public function testAnonymousClass() + { + $c = eval('return new class extends stdClass { private $foo = "foo"; };'); + + $this->assertDumpMatchesFormat( + <<<'EOTXT' +stdClass@anonymous { + -foo: "foo" +} +EOTXT + , $c + ); + + $c = eval('return new class { private $foo = "foo"; };'); + + $this->assertDumpMatchesFormat( + <<<'EOTXT' +class@anonymous { + -foo: "foo" +} +EOTXT + , $c + ); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Caster/DateCasterTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/DateCasterTest.php new file mode 100644 index 0000000000..8c685f6b7b --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/DateCasterTest.php @@ -0,0 +1,461 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Caster\Caster; +use Symfony\Component\VarDumper\Caster\DateCaster; +use Symfony\Component\VarDumper\Cloner\Stub; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; +use Symfony\Component\VarDumper\Tests\Fixtures\DateTimeChild; + +/** + * @author Dany Maillard + */ +class DateCasterTest extends TestCase +{ + use VarDumperTestTrait; + + /** + * @dataProvider provideDateTimes + */ + public function testDumpDateTime($time, $timezone, $xDate, $xTimestamp) + { + if ((\defined('HHVM_VERSION_ID') || \PHP_VERSION_ID <= 50509) && preg_match('/[-+]\d{2}:\d{2}/', $timezone)) { + $this->markTestSkipped('DateTimeZone GMT offsets are supported since 5.5.10. See https://github.com/facebook/hhvm/issues/5875 for HHVM.'); + } + + $date = new \DateTime($time, new \DateTimeZone($timezone)); + + $xDump = <<assertDumpEquals($xDump, $date); + } + + /** + * @dataProvider provideDateTimes + */ + public function testCastDateTime($time, $timezone, $xDate, $xTimestamp, $xInfos) + { + if ((\defined('HHVM_VERSION_ID') || \PHP_VERSION_ID <= 50509) && preg_match('/[-+]\d{2}:\d{2}/', $timezone)) { + $this->markTestSkipped('DateTimeZone GMT offsets are supported since 5.5.10. See https://github.com/facebook/hhvm/issues/5875 for HHVM.'); + } + + $stub = new Stub(); + $date = new \DateTime($time, new \DateTimeZone($timezone)); + $cast = DateCaster::castDateTime($date, Caster::castObject($date, \DateTime::class), $stub, false, 0); + + $xDump = << $xDate +] +EODUMP; + + $this->assertDumpEquals($xDump, $cast); + + $xDump = <<assertDumpMatchesFormat($xDump, $cast["\0~\0date"]); + } + + public function provideDateTimes() + { + return [ + ['2017-04-30 00:00:00.000000', 'Europe/Zurich', '2017-04-30 00:00:00.0 Europe/Zurich (+02:00)', 1493503200, 'Sunday, April 30, 2017%Afrom now%ADST On'], + ['2017-12-31 00:00:00.000000', 'Europe/Zurich', '2017-12-31 00:00:00.0 Europe/Zurich (+01:00)', 1514674800, 'Sunday, December 31, 2017%Afrom now%ADST Off'], + ['2017-04-30 00:00:00.000000', '+02:00', '2017-04-30 00:00:00.0 +02:00', 1493503200, 'Sunday, April 30, 2017%Afrom now'], + + ['2017-04-30 00:00:00.100000', '+00:00', '2017-04-30 00:00:00.100 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'], + ['2017-04-30 00:00:00.120000', '+00:00', '2017-04-30 00:00:00.120 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'], + ['2017-04-30 00:00:00.123000', '+00:00', '2017-04-30 00:00:00.123 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'], + ['2017-04-30 00:00:00.123400', '+00:00', '2017-04-30 00:00:00.123400 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'], + ['2017-04-30 00:00:00.123450', '+00:00', '2017-04-30 00:00:00.123450 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'], + ['2017-04-30 00:00:00.123456', '+00:00', '2017-04-30 00:00:00.123456 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'], + ]; + } + + public function testCastDateTimeWithAdditionalChildProperty() + { + $stub = new Stub(); + $date = new DateTimeChild('2020-02-13 00:00:00.123456', new \DateTimeZone('Europe/Paris')); + $objectCast = Caster::castObject($date, DateTimeChild::class); + $dateCast = DateCaster::castDateTime($date, $objectCast, $stub, false, 0); + + $xDate = '2020-02-13 00:00:00.123456 Europe/Paris (+01:00)'; + $xInfo = 'Thursday, February 13, 2020%Afrom now'; + $xDump = << "foo" + "\\x00~\\x00date" => $xDate +] +EODUMP; + + $this->assertDumpEquals($xDump, $dateCast); + + $xDump = <<assertDumpMatchesFormat($xDump, $dateCast["\0~\0date"]); + } + + /** + * @dataProvider provideIntervals + */ + public function testDumpInterval($intervalSpec, $ms, $invert, $expected) + { + if ($ms && \PHP_VERSION_ID >= 70200 && version_compare(\PHP_VERSION, '7.2.0rc3', '<=')) { + $this->markTestSkipped('Skipped on 7.2 before rc4 because of php bug #75354.'); + } + + $interval = $this->createInterval($intervalSpec, $ms, $invert); + + $xDump = <<assertDumpMatchesFormat($xDump, $interval); + } + + /** + * @dataProvider provideIntervals + */ + public function testDumpIntervalExcludingVerbosity($intervalSpec, $ms, $invert, $expected) + { + if ($ms && \PHP_VERSION_ID >= 70200 && version_compare(\PHP_VERSION, '7.2.0rc3', '<=')) { + $this->markTestSkipped('Skipped on 7.2 before rc4 because of php bug #75354.'); + } + + $interval = $this->createInterval($intervalSpec, $ms, $invert); + + $xDump = <<assertDumpEquals($xDump, $interval, Caster::EXCLUDE_VERBOSE); + } + + /** + * @dataProvider provideIntervals + */ + public function testCastInterval($intervalSpec, $ms, $invert, $xInterval, $xSeconds) + { + if ($ms && \PHP_VERSION_ID >= 70200 && version_compare(\PHP_VERSION, '7.2.0rc3', '<=')) { + $this->markTestSkipped('Skipped on 7.2 before rc4 because of php bug #75354.'); + } + + $interval = $this->createInterval($intervalSpec, $ms, $invert); + $stub = new Stub(); + + $cast = DateCaster::castInterval($interval, ['foo' => 'bar'], $stub, false, Caster::EXCLUDE_VERBOSE); + + $xDump = << $xInterval +] +EODUMP; + + $this->assertDumpEquals($xDump, $cast); + + if (null === $xSeconds) { + return; + } + + $xDump = <<assertDumpMatchesFormat($xDump, $cast["\0~\0interval"]); + } + + public function provideIntervals() + { + $i = new \DateInterval('PT0S'); + $ms = ($withMs = \PHP_VERSION_ID >= 70100 && isset($i->f)) ? '.0' : ''; + + return [ + ['PT0S', 0, 0, '0s', '0s'], + ['PT0S', 0.1, 0, $withMs ? '+ 00:00:00.100' : '0s', '%is'], + ['PT1S', 0, 0, '+ 00:00:01'.$ms, '%is'], + ['PT2M', 0, 0, '+ 00:02:00'.$ms, '%is'], + ['PT3H', 0, 0, '+ 03:00:00'.$ms, '%ss'], + ['P4D', 0, 0, '+ 4d', '%ss'], + ['P5M', 0, 0, '+ 5m', null], + ['P6Y', 0, 0, '+ 6y', null], + ['P1Y2M3DT4H5M6S', 0, 0, '+ 1y 2m 3d 04:05:06'.$ms, null], + ['PT1M60S', 0, 0, '+ 00:02:00'.$ms, null], + ['PT1H60M', 0, 0, '+ 02:00:00'.$ms, null], + ['P1DT24H', 0, 0, '+ 2d', null], + ['P1M32D', 0, 0, '+ 1m 32d', null], + + ['PT0S', 0, 1, '0s', '0s'], + ['PT0S', 0.1, 1, $withMs ? '- 00:00:00.100' : '0s', '%is'], + ['PT1S', 0, 1, '- 00:00:01'.$ms, '%is'], + ['PT2M', 0, 1, '- 00:02:00'.$ms, '%is'], + ['PT3H', 0, 1, '- 03:00:00'.$ms, '%ss'], + ['P4D', 0, 1, '- 4d', '%ss'], + ['P5M', 0, 1, '- 5m', null], + ['P6Y', 0, 1, '- 6y', null], + ['P1Y2M3DT4H5M6S', 0, 1, '- 1y 2m 3d 04:05:06'.$ms, null], + ['PT1M60S', 0, 1, '- 00:02:00'.$ms, null], + ['PT1H60M', 0, 1, '- 02:00:00'.$ms, null], + ['P1DT24H', 0, 1, '- 2d', null], + ['P1M32D', 0, 1, '- 1m 32d', null], + ]; + } + + /** + * @dataProvider provideTimeZones + */ + public function testDumpTimeZone($timezone, $expected) + { + if ((\defined('HHVM_VERSION_ID') || \PHP_VERSION_ID <= 50509) && !preg_match('/\w+\/\w+/', $timezone)) { + $this->markTestSkipped('DateTimeZone GMT offsets are supported since 5.5.10. See https://github.com/facebook/hhvm/issues/5875 for HHVM.'); + } + + $timezone = new \DateTimeZone($timezone); + + $xDump = <<assertDumpMatchesFormat($xDump, $timezone); + } + + /** + * @dataProvider provideTimeZones + */ + public function testDumpTimeZoneExcludingVerbosity($timezone, $expected) + { + if ((\defined('HHVM_VERSION_ID') || \PHP_VERSION_ID <= 50509) && !preg_match('/\w+\/\w+/', $timezone)) { + $this->markTestSkipped('DateTimeZone GMT offsets are supported since 5.5.10. See https://github.com/facebook/hhvm/issues/5875 for HHVM.'); + } + + $timezone = new \DateTimeZone($timezone); + + $xDump = <<assertDumpMatchesFormat($xDump, $timezone, Caster::EXCLUDE_VERBOSE); + } + + /** + * @dataProvider provideTimeZones + */ + public function testCastTimeZone($timezone, $xTimezone, $xRegion) + { + if ((\defined('HHVM_VERSION_ID') || \PHP_VERSION_ID <= 50509) && !preg_match('/\w+\/\w+/', $timezone)) { + $this->markTestSkipped('DateTimeZone GMT offsets are supported since 5.5.10. See https://github.com/facebook/hhvm/issues/5875 for HHVM.'); + } + + $timezone = new \DateTimeZone($timezone); + $stub = new Stub(); + + $cast = DateCaster::castTimeZone($timezone, ['foo' => 'bar'], $stub, false, Caster::EXCLUDE_VERBOSE); + + $xDump = << $xTimezone +] +EODUMP; + + $this->assertDumpMatchesFormat($xDump, $cast); + + $xDump = <<assertDumpMatchesFormat($xDump, $cast["\0~\0timezone"]); + } + + public function provideTimeZones() + { + $xRegion = \extension_loaded('intl') ? '%s' : ''; + + return [ + // type 1 (UTC offset) + ['-12:00', '-12:00', ''], + ['+00:00', '+00:00', ''], + ['+14:00', '+14:00', ''], + + // type 2 (timezone abbreviation) + ['GMT', '+00:00', ''], + ['a', '+01:00', ''], + ['b', '+02:00', ''], + ['z', '+00:00', ''], + + // type 3 (timezone identifier) + ['Africa/Tunis', 'Africa/Tunis (%s:00)', $xRegion], + ['America/Panama', 'America/Panama (%s:00)', $xRegion], + ['Asia/Jerusalem', 'Asia/Jerusalem (%s:00)', $xRegion], + ['Atlantic/Canary', 'Atlantic/Canary (%s:00)', $xRegion], + ['Australia/Perth', 'Australia/Perth (%s:00)', $xRegion], + ['Europe/Zurich', 'Europe/Zurich (%s:00)', $xRegion], + ['Pacific/Tahiti', 'Pacific/Tahiti (%s:00)', $xRegion], + ]; + } + + /** + * @dataProvider providePeriods + */ + public function testDumpPeriod($start, $interval, $end, $options, $expected) + { + if (\defined('HHVM_VERSION_ID') || \PHP_VERSION_ID < 50620 || (\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70005)) { + $this->markTestSkipped(); + } + + $p = new \DatePeriod(new \DateTime($start), new \DateInterval($interval), \is_int($end) ? $end : new \DateTime($end), $options); + + $xDump = <<assertDumpMatchesFormat($xDump, $p); + } + + /** + * @dataProvider providePeriods + */ + public function testCastPeriod($start, $interval, $end, $options, $xPeriod, $xDates) + { + if (\defined('HHVM_VERSION_ID') || \PHP_VERSION_ID < 50620 || (\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70005)) { + $this->markTestSkipped(); + } + + $p = new \DatePeriod(new \DateTime($start), new \DateInterval($interval), \is_int($end) ? $end : new \DateTime($end), $options); + $stub = new Stub(); + + $cast = DateCaster::castPeriod($p, [], $stub, false, 0); + + $xDump = << $xPeriod +] +EODUMP; + + $this->assertDumpEquals($xDump, $cast); + + $xDump = <<assertDumpMatchesFormat($xDump, $cast["\0~\0period"]); + } + + public function providePeriods() + { + $i = new \DateInterval('PT0S'); + $ms = \PHP_VERSION_ID >= 70100 && isset($i->f) ? '.0' : ''; + + $periods = [ + ['2017-01-01', 'P1D', '2017-01-03', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-03 00:00:00.0', '1) 2017-01-01%a2) 2017-01-02'], + ['2017-01-01', 'P1D', 1, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 2 time/s', '1) 2017-01-01%a2) 2017-01-02'], + + ['2017-01-01', 'P1D', '2017-01-04', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-04 00:00:00.0', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03'], + ['2017-01-01', 'P1D', 2, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 3 time/s', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03'], + + ['2017-01-01', 'P1D', '2017-01-05', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-05 00:00:00.0', '1) 2017-01-01%a2) 2017-01-02%a1 more'], + ['2017-01-01', 'P1D', 3, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 4 time/s', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03%a1 more'], + + ['2017-01-01', 'P1D', '2017-01-21', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-21 00:00:00.0', '1) 2017-01-01%a17 more'], + ['2017-01-01', 'P1D', 19, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 20 time/s', '1) 2017-01-01%a17 more'], + + ['2017-01-01 01:00:00', 'P1D', '2017-01-03 01:00:00', 0, 'every + 1d, from 2017-01-01 01:00:00.0 (included) to 2017-01-03 01:00:00.0', '1) 2017-01-01 01:00:00.0%a2) 2017-01-02 01:00:00.0'], + ['2017-01-01 01:00:00', 'P1D', 1, 0, 'every + 1d, from 2017-01-01 01:00:00.0 (included) recurring 2 time/s', '1) 2017-01-01 01:00:00.0%a2) 2017-01-02 01:00:00.0'], + + ['2017-01-01', 'P1DT1H', '2017-01-03', 0, "every + 1d 01:00:00$ms, from 2017-01-01 00:00:00.0 (included) to 2017-01-03 00:00:00.0", '1) 2017-01-01 00:00:00.0%a2) 2017-01-02 01:00:00.0'], + ['2017-01-01', 'P1DT1H', 1, 0, "every + 1d 01:00:00$ms, from 2017-01-01 00:00:00.0 (included) recurring 2 time/s", '1) 2017-01-01 00:00:00.0%a2) 2017-01-02 01:00:00.0'], + + ['2017-01-01', 'P1D', '2017-01-04', \DatePeriod::EXCLUDE_START_DATE, 'every + 1d, from 2017-01-01 00:00:00.0 (excluded) to 2017-01-04 00:00:00.0', '1) 2017-01-02%a2) 2017-01-03'], + ['2017-01-01', 'P1D', 2, \DatePeriod::EXCLUDE_START_DATE, 'every + 1d, from 2017-01-01 00:00:00.0 (excluded) recurring 2 time/s', '1) 2017-01-02%a2) 2017-01-03'], + ]; + + if (\PHP_VERSION_ID < 70107) { + array_walk($periods, function (&$i) { $i[5] = ''; }); + } + + return $periods; + } + + private function createInterval($intervalSpec, $ms, $invert) + { + $interval = new \DateInterval($intervalSpec); + if (\PHP_VERSION_ID >= 70100 && isset($interval->f)) { + $interval->f = $ms; + } + $interval->invert = $invert; + + return $interval; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Caster/ExceptionCasterTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/ExceptionCasterTest.php new file mode 100644 index 0000000000..738180f5b2 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/ExceptionCasterTest.php @@ -0,0 +1,227 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Caster\Caster; +use Symfony\Component\VarDumper\Caster\ExceptionCaster; +use Symfony\Component\VarDumper\Caster\FrameStub; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; + +class ExceptionCasterTest extends TestCase +{ + use VarDumperTestTrait; + + private function getTestException($msg, &$ref = null) + { + return new \Exception(''.$msg); + } + + protected function tearDown() + { + ExceptionCaster::$srcContext = 1; + ExceptionCaster::$traceArgs = true; + } + + public function testDefaultSettings() + { + $ref = ['foo']; + $e = $this->getTestException('foo', $ref); + + $expectedDump = <<<'EODUMP' +Exception { + #message: "foo" + #code: 0 + #file: "%sExceptionCasterTest.php" + #line: 28 + trace: { + %s%eTests%eCaster%eExceptionCasterTest.php:28 { + › { + › return new \Exception(''.$msg); + › } + } + %s%eTests%eCaster%eExceptionCasterTest.php:40 { …} +%A +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $e); + $this->assertSame(['foo'], $ref); + } + + public function testSeek() + { + $e = $this->getTestException(2); + + $expectedDump = <<<'EODUMP' +{ + %s%eTests%eCaster%eExceptionCasterTest.php:28 { + › { + › return new \Exception(''.$msg); + › } + } + %s%eTests%eCaster%eExceptionCasterTest.php:64 { …} +%A +EODUMP; + + $this->assertStringMatchesFormat($expectedDump, $this->getDump($e, 'trace')); + } + + public function testNoArgs() + { + $e = $this->getTestException(1); + ExceptionCaster::$traceArgs = false; + + $expectedDump = <<<'EODUMP' +Exception { + #message: "1" + #code: 0 + #file: "%sExceptionCasterTest.php" + #line: 28 + trace: { + %sExceptionCasterTest.php:28 { + › { + › return new \Exception(''.$msg); + › } + } + %s%eTests%eCaster%eExceptionCasterTest.php:82 { …} +%A +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $e); + } + + public function testNoSrcContext() + { + $e = $this->getTestException(1); + ExceptionCaster::$srcContext = -1; + + $expectedDump = <<<'EODUMP' +Exception { + #message: "1" + #code: 0 + #file: "%sExceptionCasterTest.php" + #line: 28 + trace: { + %s%eTests%eCaster%eExceptionCasterTest.php:28 + %s%eTests%eCaster%eExceptionCasterTest.php:%d +%A +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $e); + } + + public function testHtmlDump() + { + if (ini_get('xdebug.file_link_format') || get_cfg_var('xdebug.file_link_format')) { + $this->markTestSkipped('A custom file_link_format is defined.'); + } + + $e = $this->getTestException(1); + ExceptionCaster::$srcContext = -1; + + $cloner = new VarCloner(); + $cloner->setMaxItems(1); + $dumper = new HtmlDumper(); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + $dump = $dumper->dump($cloner->cloneVar($e)->withRefHandles(false), true); + + $expectedDump = <<<'EODUMP' +Exception { + #message: "1" + #code: 0 + #file: "%s%eVarDumper%eTests%eCaster%eExceptionCasterTest.php" + #line: 28 + trace: { + %s%eVarDumper%eTests%eCaster%eExceptionCasterTest.php:28 + …%d + } +} + +EODUMP; + + $this->assertStringMatchesFormat($expectedDump, $dump); + } + + /** + * @requires function Twig\Template::getSourceContext + */ + public function testFrameWithTwig() + { + require_once \dirname(__DIR__).'/Fixtures/Twig.php'; + + $f = [ + new FrameStub([ + 'file' => \dirname(__DIR__).'/Fixtures/Twig.php', + 'line' => 20, + 'class' => '__TwigTemplate_VarDumperFixture_u75a09', + ]), + new FrameStub([ + 'file' => \dirname(__DIR__).'/Fixtures/Twig.php', + 'line' => 21, + 'class' => '__TwigTemplate_VarDumperFixture_u75a09', + 'object' => new \__TwigTemplate_VarDumperFixture_u75a09(null, __FILE__), + ]), + ]; + + $expectedDump = <<<'EODUMP' +array:2 [ + 0 => { + class: "__TwigTemplate_VarDumperFixture_u75a09" + src: { + %sTwig.php:1 { + › + › foo bar + › twig source + } + } + } + 1 => { + class: "__TwigTemplate_VarDumperFixture_u75a09" + object: __TwigTemplate_VarDumperFixture_u75a09 { + %A + } + src: { + %sExceptionCasterTest.php:2 { + › foo bar + › twig source + › + } + } + } +] + +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $f); + } + + public function testExcludeVerbosity() + { + $e = $this->getTestException('foo'); + + $expectedDump = <<<'EODUMP' +Exception { + #message: "foo" + #code: 0 + #file: "%sExceptionCasterTest.php" + #line: 28 +} +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $e, Caster::EXCLUDE_VERBOSE); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Caster/PdoCasterTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/PdoCasterTest.php new file mode 100644 index 0000000000..fca242cfc6 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/PdoCasterTest.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Caster\PdoCaster; +use Symfony\Component\VarDumper\Cloner\Stub; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; + +/** + * @author Nicolas Grekas + */ +class PdoCasterTest extends TestCase +{ + use VarDumperTestTrait; + + /** + * @requires extension pdo_sqlite + */ + public function testCastPdo() + { + $pdo = new \PDO('sqlite::memory:'); + $pdo->setAttribute(\PDO::ATTR_STATEMENT_CLASS, ['PDOStatement', [$pdo]]); + $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + + $cast = PdoCaster::castPdo($pdo, [], new Stub(), false); + + $this->assertInstanceOf('Symfony\Component\VarDumper\Caster\EnumStub', $cast["\0~\0attributes"]); + + $attr = $cast["\0~\0attributes"] = $cast["\0~\0attributes"]->value; + $this->assertInstanceOf('Symfony\Component\VarDumper\Caster\ConstStub', $attr['CASE']); + $this->assertSame('NATURAL', $attr['CASE']->class); + $this->assertSame('BOTH', $attr['DEFAULT_FETCH_MODE']->class); + + $xDump = <<<'EODUMP' +array:2 [ + "\x00~\x00inTransaction" => false + "\x00~\x00attributes" => array:9 [ + "CASE" => NATURAL + "ERRMODE" => EXCEPTION + "PERSISTENT" => false + "DRIVER_NAME" => "sqlite" + "ORACLE_NULLS" => NATURAL + "CLIENT_VERSION" => "%s" + "SERVER_VERSION" => "%s" + "STATEMENT_CLASS" => array:%d [ + 0 => "PDOStatement"%A + ] + "DEFAULT_FETCH_MODE" => BOTH + ] +] +EODUMP; + + $this->assertDumpMatchesFormat($xDump, $cast); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Caster/RedisCasterTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/RedisCasterTest.php new file mode 100644 index 0000000000..ed14494ec8 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/RedisCasterTest.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; + +/** + * @author Nicolas Grekas + * @requires extension redis + */ +class RedisCasterTest extends TestCase +{ + use VarDumperTestTrait; + + public function testNotConnected() + { + $redis = new \Redis(); + + if (\defined('HHVM_VERSION_ID')) { + $xCast = <<<'EODUMP' +Redis { + #host: "" +%A +} +EODUMP; + } else { + $xCast = <<<'EODUMP' +Redis { + isConnected: false +} +EODUMP; + } + + $this->assertDumpMatchesFormat($xCast, $redis); + } + + public function testConnected() + { + $redis = new \Redis(); + if (!@$redis->connect('127.0.0.1')) { + $e = error_get_last(); + self::markTestSkipped($e['message']); + } + + if (\defined('HHVM_VERSION_ID')) { + $xCast = <<<'EODUMP' +Redis { + #host: "127.0.0.1" +%A +} +EODUMP; + } else { + $xCast = <<<'EODUMP' +Redis {%A + isConnected: true + host: "127.0.0.1" + port: 6379 + auth: null + dbNum: 0 + timeout: 0.0 + persistentId: null + options: { + READ_TIMEOUT: 0.0 + SERIALIZER: NONE + PREFIX: null + SCAN: NORETRY + } +} +EODUMP; + } + + $this->assertDumpMatchesFormat($xCast, $redis); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Caster/ReflectionCasterTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/ReflectionCasterTest.php new file mode 100644 index 0000000000..17ad5434be --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/ReflectionCasterTest.php @@ -0,0 +1,270 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Caster\Caster; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; +use Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo; +use Symfony\Component\VarDumper\Tests\Fixtures\NotLoadableClass; + +/** + * @author Nicolas Grekas + */ +class ReflectionCasterTest extends TestCase +{ + use VarDumperTestTrait; + + public function testReflectionCaster() + { + $var = new \ReflectionClass('ReflectionClass'); + + $this->assertDumpMatchesFormat( + <<<'EOTXT' +ReflectionClass { + +name: "ReflectionClass" +%Aimplements: array:%d [ + 0 => "Reflector" +%A] + constants: array:3 [ + "IS_IMPLICIT_ABSTRACT" => 16 + "IS_EXPLICIT_ABSTRACT" => %d + "IS_FINAL" => %d + ] + properties: array:%d [ + "name" => ReflectionProperty { +%A +name: "name" + +class: "ReflectionClass" +%A modifiers: "public" + } +%A] + methods: array:%d [ +%A + "__construct" => ReflectionMethod { + +name: "__construct" + +class: "ReflectionClass" +%A parameters: { + $%s: ReflectionParameter { +%A position: 0 +%A +} +EOTXT + , $var + ); + } + + public function testClosureCaster() + { + $a = $b = 123; + $var = function ($x) use ($a, &$b) {}; + + $this->assertDumpMatchesFormat( + <<markTestSkipped('Not for HHVM.'); + } + $var = [ + (new \ReflectionMethod($this, __FUNCTION__))->getClosure($this), + (new \ReflectionMethod(__CLASS__, 'tearDownAfterClass'))->getClosure(), + ]; + + $this->assertDumpMatchesFormat( + << Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest::testFromCallableClosureCaster { + this: Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest { …} + file: "%sReflectionCasterTest.php" + line: "%d to %d" + } + 1 => %sTestCase::tearDownAfterClass { + file: "%sTestCase.php" + line: "%d to %d" + } +] +EOTXT + , $var + ); + } + + public function testClosureCasterExcludingVerbosity() + { + $var = function () {}; + + $expectedDump = <<assertDumpEquals($expectedDump, $var, Caster::EXCLUDE_VERBOSE); + } + + public function testReflectionParameter() + { + $var = new \ReflectionParameter(reflectionParameterFixture::class, 0); + + $this->assertDumpMatchesFormat( + <<<'EOTXT' +ReflectionParameter { + +name: "arg1" + position: 0 + typeHint: "Symfony\Component\VarDumper\Tests\Fixtures\NotLoadableClass" + default: null +} +EOTXT + , $var + ); + } + + /** + * @requires PHP 7.0 + */ + public function testReflectionParameterScalar() + { + $f = eval('return function (int $a) {};'); + $var = new \ReflectionParameter($f, 0); + + $this->assertDumpMatchesFormat( + <<<'EOTXT' +ReflectionParameter { + +name: "a" + position: 0 + typeHint: "int" +} +EOTXT + , $var + ); + } + + /** + * @requires PHP 7.0 + */ + public function testReturnType() + { + $f = eval('return function ():int {};'); + $line = __LINE__ - 1; + + $this->assertDumpMatchesFormat( + <<markTestSkipped('xdebug is active'); + } + + $generator = new GeneratorDemo(); + $generator = $generator->baz(); + + $expectedDump = <<<'EODUMP' +Generator { + this: Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo { …} + executing: { + Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo->baz() { + %sGeneratorDemo.php:14 { + › { + › yield from bar(); + › } + } + } + } + closed: false +} +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $generator); + + foreach ($generator as $v) { + break; + } + + $expectedDump = <<<'EODUMP' +array:2 [ + 0 => ReflectionGenerator { + this: Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo { …} + trace: { + %s%eTests%eFixtures%eGeneratorDemo.php:9 { + › { + › yield 1; + › } + } + %s%eTests%eFixtures%eGeneratorDemo.php:20 { …} + %s%eTests%eFixtures%eGeneratorDemo.php:14 { …} + } + closed: false + } + 1 => Generator { + executing: { + Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo::foo() { + %sGeneratorDemo.php:10 { + › yield 1; + › } + › + } + } + } + closed: false + } +] +EODUMP; + + $r = new \ReflectionGenerator($generator); + $this->assertDumpMatchesFormat($expectedDump, [$r, $r->getExecutingGenerator()]); + + foreach ($generator as $v) { + } + + $expectedDump = <<<'EODUMP' +Generator { + closed: true +} +EODUMP; + $this->assertDumpMatchesFormat($expectedDump, $generator); + } +} + +function reflectionParameterFixture(NotLoadableClass $arg1 = null, $arg2) +{ +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Caster/SplCasterTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/SplCasterTest.php new file mode 100644 index 0000000000..a8c37faf3f --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/SplCasterTest.php @@ -0,0 +1,238 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; + +/** + * @author Grégoire Pineau + */ +class SplCasterTest extends TestCase +{ + use VarDumperTestTrait; + + public function getCastFileInfoTests() + { + return [ + [__FILE__, <<<'EOTXT' +SplFileInfo { +%Apath: "%sCaster" + filename: "SplCasterTest.php" + basename: "SplCasterTest.php" + pathname: "%sSplCasterTest.php" + extension: "php" + realPath: "%sSplCasterTest.php" + aTime: %s-%s-%d %d:%d:%d + mTime: %s-%s-%d %d:%d:%d + cTime: %s-%s-%d %d:%d:%d + inode: %i + size: %d + perms: 0%d + owner: %d + group: %d + type: "file" + writable: true + readable: true + executable: false + file: true + dir: false + link: false +%A} +EOTXT + ], + ['https://example.com/about', <<<'EOTXT' +SplFileInfo { +%Apath: "https://example.com" + filename: "about" + basename: "about" + pathname: "https://example.com/about" + extension: "" + realPath: false +%A} +EOTXT + ], + ]; + } + + /** @dataProvider getCastFileInfoTests */ + public function testCastFileInfo($file, $dump) + { + $this->assertDumpMatchesFormat($dump, new \SplFileInfo($file)); + } + + public function testCastFileObject() + { + $var = new \SplFileObject(__FILE__); + $var->setFlags(\SplFileObject::DROP_NEW_LINE | \SplFileObject::SKIP_EMPTY); + $dump = <<<'EOTXT' +SplFileObject { +%Apath: "%sCaster" + filename: "SplCasterTest.php" + basename: "SplCasterTest.php" + pathname: "%sSplCasterTest.php" + extension: "php" + realPath: "%sSplCasterTest.php" + aTime: %s-%s-%d %d:%d:%d + mTime: %s-%s-%d %d:%d:%d + cTime: %s-%s-%d %d:%d:%d + inode: %i + size: %d + perms: 0%d + owner: %d + group: %d + type: "file" + writable: true + readable: true + executable: false + file: true + dir: false + link: false +%AcsvControl: array:%d [ + 0 => "," + 1 => """ +%A] + flags: DROP_NEW_LINE|SKIP_EMPTY + maxLineLen: 0 + fstat: array:26 [ + "dev" => %d + "ino" => %i + "nlink" => %d + "rdev" => 0 + "blksize" => %i + "blocks" => %i + …20 + ] + eof: false + key: 0 +} +EOTXT; + $this->assertDumpMatchesFormat($dump, $var); + } + + /** + * @dataProvider provideCastSplDoublyLinkedList + */ + public function testCastSplDoublyLinkedList($modeValue, $modeDump) + { + $var = new \SplDoublyLinkedList(); + $var->setIteratorMode($modeValue); + $dump = <<assertDumpMatchesFormat($dump, $var); + } + + public function provideCastSplDoublyLinkedList() + { + return [ + [\SplDoublyLinkedList::IT_MODE_FIFO, 'IT_MODE_FIFO | IT_MODE_KEEP'], + [\SplDoublyLinkedList::IT_MODE_LIFO, 'IT_MODE_LIFO | IT_MODE_KEEP'], + [\SplDoublyLinkedList::IT_MODE_FIFO | \SplDoublyLinkedList::IT_MODE_DELETE, 'IT_MODE_FIFO | IT_MODE_DELETE'], + [\SplDoublyLinkedList::IT_MODE_LIFO | \SplDoublyLinkedList::IT_MODE_DELETE, 'IT_MODE_LIFO | IT_MODE_DELETE'], + ]; + } + + public function testCastObjectStorageIsntModified() + { + $var = new \SplObjectStorage(); + $var->attach(new \stdClass()); + $var->rewind(); + $current = $var->current(); + + $this->assertDumpMatchesFormat('%A', $var); + $this->assertSame($current, $var->current()); + } + + public function testCastObjectStorageDumpsInfo() + { + $var = new \SplObjectStorage(); + $var->attach(new \stdClass(), new \DateTime()); + + $this->assertDumpMatchesFormat('%ADateTime%A', $var); + } + + public function testCastArrayObject() + { + if (\defined('HHVM_VERSION')) { + $this->markTestSkipped('HHVM as different internal details.'); + } + $var = new \ArrayObject([123]); + $var->foo = 234; + + $expected = << 123 + ] + flag::STD_PROP_LIST: false + flag::ARRAY_AS_PROPS: false + iteratorClass: "ArrayIterator" +} +EOTXT; + if (\PHP_VERSION_ID < 70400) { + $expected = str_replace('-storage:', 'storage:', $expected); + } + $this->assertDumpEquals($expected, $var); + } + + public function testArrayIterator() + { + if (\defined('HHVM_VERSION')) { + $this->markTestSkipped('HHVM as different internal details.'); + } + $var = new MyArrayIterator([234]); + + $expected = << 234 + ] + flag::STD_PROP_LIST: false + flag::ARRAY_AS_PROPS: false +} +EOTXT; + if (\PHP_VERSION_ID < 70400) { + $expected = str_replace('-storage:', 'storage:', $expected); + } + $this->assertDumpEquals($expected, $var); + } + + public function testBadSplFileInfo() + { + $var = new BadSplFileInfo(); + + $expected = <<assertDumpEquals($expected, $var); + } +} + +class MyArrayIterator extends \ArrayIterator +{ + private $foo = 123; +} + +class BadSplFileInfo extends \SplFileInfo +{ + public function __construct() + { + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Caster/StubCasterTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/StubCasterTest.php new file mode 100644 index 0000000000..945833ebca --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/StubCasterTest.php @@ -0,0 +1,192 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Caster\ArgsStub; +use Symfony\Component\VarDumper\Caster\ClassStub; +use Symfony\Component\VarDumper\Caster\LinkStub; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; +use Symfony\Component\VarDumper\Tests\Fixtures\FooInterface; + +class StubCasterTest extends TestCase +{ + use VarDumperTestTrait; + + public function testArgsStubWithDefaults($foo = 234, $bar = 456) + { + $args = [new ArgsStub([123], __FUNCTION__, __CLASS__)]; + + $expectedDump = <<<'EODUMP' +array:1 [ + 0 => { + $foo: 123 + } +] +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $args); + } + + public function testArgsStubWithExtraArgs($foo = 234) + { + $args = [new ArgsStub([123, 456], __FUNCTION__, __CLASS__)]; + + $expectedDump = <<<'EODUMP' +array:1 [ + 0 => { + $foo: 123 + ...: { + 456 + } + } +] +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $args); + } + + public function testArgsStubNoParamWithExtraArgs() + { + $args = [new ArgsStub([123], __FUNCTION__, __CLASS__)]; + + $expectedDump = <<<'EODUMP' +array:1 [ + 0 => { + 123 + } +] +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $args); + } + + public function testArgsStubWithClosure() + { + $args = [new ArgsStub([123], '{closure}', null)]; + + $expectedDump = <<<'EODUMP' +array:1 [ + 0 => { + 123 + } +] +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $args); + } + + public function testLinkStub() + { + $var = [new LinkStub(__CLASS__, 0, __FILE__)]; + + $cloner = new VarCloner(); + $dumper = new HtmlDumper(); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + $dumper->setDisplayOptions(['fileLinkFormat' => '%f:%l']); + $dump = $dumper->dump($cloner->cloneVar($var), true); + + $expectedDump = <<<'EODUMP' +array:1 [ + 0 => "Symfony\Component\VarDumper\Tests\Caster\StubCasterTest" +] + +EODUMP; + + $this->assertStringMatchesFormat($expectedDump, $dump); + } + + public function testLinkStubWithNoFileLink() + { + $var = [new LinkStub('example.com', 0, 'http://example.com')]; + + $cloner = new VarCloner(); + $dumper = new HtmlDumper(); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + $dumper->setDisplayOptions(['fileLinkFormat' => '%f:%l']); + $dump = $dumper->dump($cloner->cloneVar($var), true); + + $expectedDump = <<<'EODUMP' +array:1 [ + 0 => "example.com" +] + +EODUMP; + + $this->assertStringMatchesFormat($expectedDump, $dump); + } + + public function testClassStub() + { + $var = [new ClassStub('hello', [FooInterface::class, 'foo'])]; + + $cloner = new VarCloner(); + $dumper = new HtmlDumper(); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + $dump = $dumper->dump($cloner->cloneVar($var), true, ['fileLinkFormat' => '%f:%l']); + + $expectedDump = <<<'EODUMP' +array:1 [ + 0 => "hello" +] + +EODUMP; + + $this->assertStringMatchesFormat($expectedDump, $dump); + } + + public function testClassStubWithNotExistingClass() + { + $var = [new ClassStub(NotExisting::class)]; + + $cloner = new VarCloner(); + $dumper = new HtmlDumper(); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + $dump = $dumper->dump($cloner->cloneVar($var), true); + + $expectedDump = <<<'EODUMP' +array:1 [ + 0 => "Symfony\Component\VarDumper\Tests\Caster\NotExisting" +] + +EODUMP; + + $this->assertStringMatchesFormat($expectedDump, $dump); + } + + public function testClassStubWithNotExistingMethod() + { + $var = [new ClassStub('hello', [FooInterface::class, 'missing'])]; + + $cloner = new VarCloner(); + $dumper = new HtmlDumper(); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + $dump = $dumper->dump($cloner->cloneVar($var), true, ['fileLinkFormat' => '%f:%l']); + + $expectedDump = <<<'EODUMP' +array:1 [ + 0 => "hello" +] + +EODUMP; + + $this->assertStringMatchesFormat($expectedDump, $dump); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Caster/XmlReaderCasterTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/XmlReaderCasterTest.php new file mode 100644 index 0000000000..1d7b3f6278 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Caster/XmlReaderCasterTest.php @@ -0,0 +1,248 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Caster; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; + +/** + * @author Baptiste Clavié + */ +class XmlReaderCasterTest extends TestCase +{ + use VarDumperTestTrait; + + /** @var \XmlReader */ + private $reader; + + protected function setUp() + { + $this->reader = new \XmlReader(); + $this->reader->open(__DIR__.'/../Fixtures/xml_reader.xml'); + } + + protected function tearDown() + { + $this->reader->close(); + } + + public function testParserProperty() + { + $this->reader->setParserProperty(\XMLReader::SUBST_ENTITIES, true); + + $expectedDump = <<<'EODUMP' +XMLReader { + +nodeType: NONE + parserProperties: { + SUBST_ENTITIES: true + …3 + } + …12 +} +EODUMP; + + $this->assertDumpMatchesFormat($expectedDump, $this->reader); + } + + /** + * @dataProvider provideNodes + */ + public function testNodes($seek, $expectedDump) + { + while ($seek--) { + $this->reader->read(); + } + $this->assertDumpMatchesFormat($expectedDump, $this->reader); + } + + public function provideNodes() + { + return [ + [0, <<<'EODUMP' +XMLReader { + +nodeType: NONE + …13 +} +EODUMP + ], + [1, <<<'EODUMP' +XMLReader { + +localName: "foo" + +nodeType: ELEMENT + +baseURI: "%sxml_reader.xml" + …11 +} +EODUMP + ], + [2, <<<'EODUMP' +XMLReader { + +localName: "#text" + +nodeType: SIGNIFICANT_WHITESPACE + +depth: 1 + +value: """ + \n + + """ + +baseURI: "%sxml_reader.xml" + …9 +} +EODUMP + ], + [3, <<<'EODUMP' +XMLReader { + +localName: "bar" + +nodeType: ELEMENT + +depth: 1 + +baseURI: "%sxml_reader.xml" + …10 +} +EODUMP + ], + [4, <<<'EODUMP' +XMLReader { + +localName: "bar" + +nodeType: END_ELEMENT + +depth: 1 + +baseURI: "%sxml_reader.xml" + …10 +} +EODUMP + ], + [6, <<<'EODUMP' +XMLReader { + +localName: "bar" + +nodeType: ELEMENT + +depth: 1 + +isEmptyElement: true + +baseURI: "%sxml_reader.xml" + …9 +} +EODUMP + ], + [9, <<<'EODUMP' +XMLReader { + +localName: "#text" + +nodeType: TEXT + +depth: 2 + +value: "With text" + +baseURI: "%sxml_reader.xml" + …9 +} +EODUMP + ], + [12, <<<'EODUMP' +XMLReader { + +localName: "bar" + +nodeType: ELEMENT + +depth: 1 + +attributeCount: 2 + +baseURI: "%sxml_reader.xml" + …9 +} +EODUMP + ], + [13, <<<'EODUMP' +XMLReader { + +localName: "bar" + +nodeType: END_ELEMENT + +depth: 1 + +baseURI: "%sxml_reader.xml" + …10 +} +EODUMP + ], + [15, <<<'EODUMP' +XMLReader { + +localName: "bar" + +nodeType: ELEMENT + +depth: 1 + +attributeCount: 1 + +baseURI: "%sxml_reader.xml" + …9 +} +EODUMP + ], + [16, <<<'EODUMP' +XMLReader { + +localName: "#text" + +nodeType: SIGNIFICANT_WHITESPACE + +depth: 2 + +value: """ + \n + + """ + +baseURI: "%sxml_reader.xml" + …9 +} +EODUMP + ], + [17, <<<'EODUMP' +XMLReader { + +localName: "baz" + +prefix: "baz" + +nodeType: ELEMENT + +depth: 2 + +namespaceURI: "http://symfony.com" + +baseURI: "%sxml_reader.xml" + …8 +} +EODUMP + ], + [18, <<<'EODUMP' +XMLReader { + +localName: "baz" + +prefix: "baz" + +nodeType: END_ELEMENT + +depth: 2 + +namespaceURI: "http://symfony.com" + +baseURI: "%sxml_reader.xml" + …8 +} +EODUMP + ], + [19, <<<'EODUMP' +XMLReader { + +localName: "#text" + +nodeType: SIGNIFICANT_WHITESPACE + +depth: 2 + +value: """ + \n + + """ + +baseURI: "%sxml_reader.xml" + …9 +} +EODUMP + ], + [21, <<<'EODUMP' +XMLReader { + +localName: "#text" + +nodeType: SIGNIFICANT_WHITESPACE + +depth: 1 + +value: "\n" + +baseURI: "%sxml_reader.xml" + …9 +} +EODUMP + ], + [22, <<<'EODUMP' +XMLReader { + +localName: "foo" + +nodeType: END_ELEMENT + +baseURI: "%sxml_reader.xml" + …11 +} +EODUMP + ], + ]; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Cloner/DataTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Cloner/DataTest.php new file mode 100644 index 0000000000..d4b6c24c11 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Cloner/DataTest.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Cloner; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Caster\Caster; +use Symfony\Component\VarDumper\Caster\ClassStub; +use Symfony\Component\VarDumper\Cloner\Data; +use Symfony\Component\VarDumper\Cloner\VarCloner; + +class DataTest extends TestCase +{ + public function testBasicData() + { + $values = [1 => 123, 4.5, 'abc', null, false]; + $data = $this->cloneVar($values); + $clonedValues = []; + + $this->assertInstanceOf(Data::class, $data); + $this->assertCount(\count($values), $data); + $this->assertFalse(isset($data->{0})); + $this->assertFalse(isset($data[0])); + + foreach ($data as $k => $v) { + $this->assertTrue(isset($data->{$k})); + $this->assertTrue(isset($data[$k])); + $this->assertSame(\gettype($values[$k]), $data->seek($k)->getType()); + $this->assertSame($values[$k], $data->seek($k)->getValue()); + $this->assertSame($values[$k], $data->{$k}); + $this->assertSame($values[$k], $data[$k]); + $this->assertSame((string) $values[$k], (string) $data->seek($k)); + + $clonedValues[$k] = $v->getValue(); + } + + $this->assertSame($values, $clonedValues); + } + + public function testObject() + { + $data = $this->cloneVar(new \Exception('foo')); + + $this->assertSame('Exception', $data->getType()); + + $this->assertSame('foo', $data->message); + $this->assertSame('foo', $data->{Caster::PREFIX_PROTECTED.'message'}); + + $this->assertSame('foo', $data['message']); + $this->assertSame('foo', $data[Caster::PREFIX_PROTECTED.'message']); + + $this->assertStringMatchesFormat('Exception (count=%d)', (string) $data); + } + + public function testArray() + { + $values = [[], [123]]; + $data = $this->cloneVar($values); + + $this->assertSame($values, $data->getValue(true)); + + $children = $data->getValue(); + + $this->assertIsArray($children); + + $this->assertInstanceOf(Data::class, $children[0]); + $this->assertInstanceOf(Data::class, $children[1]); + + $this->assertEquals($children[0], $data[0]); + $this->assertEquals($children[1], $data[1]); + + $this->assertSame($values[0], $children[0]->getValue(true)); + $this->assertSame($values[1], $children[1]->getValue(true)); + } + + public function testStub() + { + $data = $this->cloneVar([new ClassStub('stdClass')]); + $data = $data[0]; + + $this->assertSame('string', $data->getType()); + $this->assertSame('stdClass', $data->getValue()); + $this->assertSame('stdClass', (string) $data); + } + + public function testHardRefs() + { + $values = [[]]; + $values[1] = &$values[0]; + $values[2][0] = &$values[2]; + + $data = $this->cloneVar($values); + + $this->assertSame([], $data[0]->getValue()); + $this->assertSame([], $data[1]->getValue()); + $this->assertEquals([$data[2]->getValue()], $data[2]->getValue(true)); + + $this->assertSame('array (count=3)', (string) $data); + } + + private function cloneVar($value) + { + $cloner = new VarCloner(); + + return $cloner->cloneVar($value); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Cloner/VarClonerTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Cloner/VarClonerTest.php new file mode 100644 index 0000000000..e37482fca9 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Cloner/VarClonerTest.php @@ -0,0 +1,505 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Cloner; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Tests\Fixtures\Php74; + +/** + * @author Nicolas Grekas + */ +class VarClonerTest extends TestCase +{ + public function testMaxIntBoundary() + { + $data = [\PHP_INT_MAX => 123]; + + $cloner = new VarCloner(); + $clone = $cloner->cloneVar($data); + + $expected = << Array + ( + [0] => Array + ( + [0] => Array + ( + [1] => 1 + ) + + ) + + [1] => Array + ( + [%s] => 123 + ) + + ) + + [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0 + [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0 + [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20 + [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1 + [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1 +) + +EOTXT; + $this->assertSame(sprintf($expected, \PHP_INT_MAX), print_r($clone, true)); + } + + public function testClone() + { + $json = json_decode('{"1":{"var":"val"},"2":{"var":"val"}}'); + + $cloner = new VarCloner(); + $clone = $cloner->cloneVar($json); + + $expected = << Array + ( + [0] => Array + ( + [0] => Symfony\Component\VarDumper\Cloner\Stub Object + ( + [type] => 4 + [class] => stdClass + [value] => + [cut] => 0 + [handle] => %i + [refCount] => 0 + [position] => 1 + [attr] => Array + ( + ) + + ) + + ) + + [1] => Array + ( + [\000+\0001] => Symfony\Component\VarDumper\Cloner\Stub Object + ( + [type] => 4 + [class] => stdClass + [value] => + [cut] => 0 + [handle] => %i + [refCount] => 0 + [position] => 2 + [attr] => Array + ( + ) + + ) + + [\000+\0002] => Symfony\Component\VarDumper\Cloner\Stub Object + ( + [type] => 4 + [class] => stdClass + [value] => + [cut] => 0 + [handle] => %i + [refCount] => 0 + [position] => 3 + [attr] => Array + ( + ) + + ) + + ) + + [2] => Array + ( + [\000+\000var] => val + ) + + [3] => Array + ( + [\000+\000var] => val + ) + + ) + + [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0 + [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0 + [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20 + [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1 + [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1 +) + +EOTXT; + $this->assertStringMatchesFormat($expected, print_r($clone, true)); + } + + public function testLimits() + { + // Level 0: + $data = [ + // Level 1: + [ + // Level 2: + [ + // Level 3: + 'Level 3 Item 0', + 'Level 3 Item 1', + 'Level 3 Item 2', + 'Level 3 Item 3', + ], + [ + 999 => 'Level 3 Item 4', + 'Level 3 Item 5', + 'Level 3 Item 6', + ], + [ + 'Level 3 Item 7', + ], + ], + [ + [ + 'Level 3 Item 8', + ], + 'Level 2 Item 0', + ], + [ + 'Level 2 Item 1', + ], + 'Level 1 Item 0', + [ + // Test setMaxString: + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', + 'SHORT', + ], + ]; + + $cloner = new VarCloner(); + $cloner->setMinDepth(2); + $cloner->setMaxItems(5); + $cloner->setMaxString(20); + $clone = $cloner->cloneVar($data); + + $expected = << Array + ( + [0] => Array + ( + [0] => Array + ( + [2] => 1 + ) + + ) + + [1] => Array + ( + [0] => Array + ( + [2] => 2 + ) + + [1] => Array + ( + [2] => 3 + ) + + [2] => Array + ( + [2] => 4 + ) + + [3] => Level 1 Item 0 + [4] => Array + ( + [2] => 5 + ) + + ) + + [2] => Array + ( + [0] => Array + ( + [2] => 6 + ) + + [1] => Array + ( + [0] => 2 + [1] => 7 + ) + + [2] => Array + ( + [0] => 1 + [2] => 0 + ) + + ) + + [3] => Array + ( + [0] => Array + ( + [0] => 1 + [2] => 0 + ) + + [1] => Level 2 Item 0 + ) + + [4] => Array + ( + [0] => Level 2 Item 1 + ) + + [5] => Array + ( + [0] => Symfony\Component\VarDumper\Cloner\Stub Object + ( + [type] => 2 + [class] => 2 + [value] => ABCDEFGHIJKLMNOPQRST + [cut] => 6 + [handle] => 0 + [refCount] => 0 + [position] => 0 + [attr] => Array + ( + ) + + ) + + [1] => SHORT + ) + + [6] => Array + ( + [0] => Level 3 Item 0 + [1] => Level 3 Item 1 + [2] => Level 3 Item 2 + [3] => Level 3 Item 3 + ) + + [7] => Array + ( + [999] => Level 3 Item 4 + ) + + ) + + [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0 + [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0 + [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20 + [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1 + [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1 +) + +EOTXT; + $this->assertStringMatchesFormat($expected, print_r($clone, true)); + } + + public function testJsonCast() + { + if (2 == ini_get('xdebug.overload_var_dump')) { + $this->markTestSkipped('xdebug is active'); + } + + $data = (array) json_decode('{"1":{}}'); + + $cloner = new VarCloner(); + $clone = $cloner->cloneVar($data); + + $expected = <<<'EOTXT' +object(Symfony\Component\VarDumper\Cloner\Data)#%i (6) { + ["data":"Symfony\Component\VarDumper\Cloner\Data":private]=> + array(2) { + [0]=> + array(1) { + [0]=> + array(1) { + [1]=> + int(1) + } + } + [1]=> + array(1) { + ["1"]=> + object(Symfony\Component\VarDumper\Cloner\Stub)#%i (8) { + ["type"]=> + int(4) + ["class"]=> + string(8) "stdClass" + ["value"]=> + NULL + ["cut"]=> + int(0) + ["handle"]=> + int(%i) + ["refCount"]=> + int(0) + ["position"]=> + int(0) + ["attr"]=> + array(0) { + } + } + } + } + ["position":"Symfony\Component\VarDumper\Cloner\Data":private]=> + int(0) + ["key":"Symfony\Component\VarDumper\Cloner\Data":private]=> + int(0) + ["maxDepth":"Symfony\Component\VarDumper\Cloner\Data":private]=> + int(20) + ["maxItemsPerDepth":"Symfony\Component\VarDumper\Cloner\Data":private]=> + int(-1) + ["useRefHandles":"Symfony\Component\VarDumper\Cloner\Data":private]=> + int(-1) +} + +EOTXT; + ob_start(); + var_dump($clone); + $this->assertStringMatchesFormat(\PHP_VERSION_ID >= 70200 ? str_replace('"1"', '1', $expected) : $expected, ob_get_clean()); + } + + public function testCaster() + { + $cloner = new VarCloner([ + '*' => function ($obj, $array) { + return ['foo' => 123]; + }, + __CLASS__ => function ($obj, $array) { + ++$array['foo']; + + return $array; + }, + ]); + $clone = $cloner->cloneVar($this); + + $expected = << Array + ( + [0] => Array + ( + [0] => Symfony\Component\VarDumper\Cloner\Stub Object + ( + [type] => 4 + [class] => %s + [value] => + [cut] => 0 + [handle] => %i + [refCount] => 0 + [position] => 1 + [attr] => Array + ( + ) + + ) + + ) + + [1] => Array + ( + [foo] => 124 + ) + + ) + + [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0 + [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0 + [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20 + [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1 + [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1 +) + +EOTXT; + $this->assertStringMatchesFormat($expected, print_r($clone, true)); + } + + /** + * @requires PHP 7.4 + */ + public function testPhp74() + { + $data = new Php74(); + + $cloner = new VarCloner(); + $clone = $cloner->cloneVar($data); + + $expected = <<<'EOTXT' +Symfony\Component\VarDumper\Cloner\Data Object +( + [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array + ( + [0] => Array + ( + [0] => Symfony\Component\VarDumper\Cloner\Stub Object + ( + [type] => 4 + [class] => Symfony\Component\VarDumper\Tests\Fixtures\Php74 + [value] => + [cut] => 0 + [handle] => %i + [refCount] => 0 + [position] => 1 + [attr] => Array + ( + ) + + ) + + ) + + [1] => Array + ( + [p1] => 123 + [p2] => Symfony\Component\VarDumper\Cloner\Stub Object + ( + [type] => 4 + [class] => stdClass + [value] => + [cut] => 0 + [handle] => %i + [refCount] => 0 + [position] => 0 + [attr] => Array + ( + ) + + ) + + ) + + ) + + [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0 + [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0 + [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20 + [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1 + [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1 +) + +EOTXT; + $this->assertStringMatchesFormat($expected, print_r($clone, true)); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Dumper/CliDumperTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Dumper/CliDumperTest.php new file mode 100644 index 0000000000..6fae0843a9 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Dumper/CliDumperTest.php @@ -0,0 +1,644 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Dumper; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\AbstractDumper; +use Symfony\Component\VarDumper\Dumper\CliDumper; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; +use Twig\Environment; +use Twig\Loader\FilesystemLoader; + +/** + * @author Nicolas Grekas + */ +class CliDumperTest extends TestCase +{ + use VarDumperTestTrait; + + public function testGet() + { + require __DIR__.'/../Fixtures/dumb-var.php'; + + $dumper = new CliDumper('php://output'); + $dumper->setColors(false); + $cloner = new VarCloner(); + $cloner->addCasters([ + ':stream' => function ($res, $a) { + unset($a['uri'], $a['wrapper_data']); + + return $a; + }, + ]); + $data = $cloner->cloneVar($var); + + ob_start(); + $dumper->dump($data); + $out = ob_get_clean(); + $out = preg_replace('/[ \t]+$/m', '', $out); + $intMax = \PHP_INT_MAX; + $res = (int) $var['res']; + + $r = \defined('HHVM_VERSION') ? '' : '#%d'; + $this->assertStringMatchesFormat( + << 1 + 0 => &1 null + "const" => 1.1 + 1 => true + 2 => false + 3 => NAN + 4 => INF + 5 => -INF + 6 => {$intMax} + "str" => "déjà\\n" + 7 => b"é\\x00" + "[]" => [] + "res" => stream resource {@{$res} +%A wrapper_type: "plainfile" + stream_type: "STDIO" + mode: "r" + unread_bytes: 0 + seekable: true +%A options: [] + } + "obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d + +foo: "foo" + +"bar": "bar" + } + "closure" => Closure {{$r} + class: "Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest" + this: Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest {{$r} …} + parameters: { + \$a: {} + &\$b: { + typeHint: "PDO" + default: null + } + } + file: "%s%eTests%eFixtures%edumb-var.php" + line: "{$var['line']} to {$var['line']}" + } + "line" => {$var['line']} + "nobj" => array:1 [ + 0 => &3 {#%d} + ] + "recurs" => &4 array:1 [ + 0 => &4 array:1 [&4] + ] + 8 => &1 null + "sobj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d} + "snobj" => &3 {#%d} + "snobj2" => {#%d} + "file" => "{$var['file']}" + b"bin-key-é" => "" +] + +EOTXT + , + $out + ); + } + + /** + * @dataProvider provideDumpWithCommaFlagTests + */ + public function testDumpWithCommaFlag($expected, $flags) + { + $dumper = new CliDumper(null, null, $flags); + $dumper->setColors(false); + $cloner = new VarCloner(); + + $var = [ + 'array' => ['a', 'b'], + 'string' => 'hello', + 'multiline string' => "this\nis\na\multiline\nstring", + ]; + + $dump = $dumper->dump($cloner->cloneVar($var), true); + + $this->assertSame($expected, $dump); + } + + public function testDumpWithCommaFlagsAndExceptionCodeExcerpt() + { + $dumper = new CliDumper(null, null, CliDumper::DUMP_TRAILING_COMMA); + $dumper->setColors(false); + $cloner = new VarCloner(); + + $ex = new \RuntimeException('foo'); + + $dump = $dumper->dump($cloner->cloneVar($ex)->withRefHandles(false), true); + + $this->assertStringMatchesFormat(<<<'EOTXT' +RuntimeException { + #message: "foo" + #code: 0 + #file: "%ACliDumperTest.php" + #line: %d + trace: { + %ACliDumperTest.php:%d { + › + › $ex = new \RuntimeException('foo'); + › + } + %A + } +} + +EOTXT + , $dump); + } + + public function provideDumpWithCommaFlagTests() + { + $expected = <<<'EOTXT' +array:3 [ + "array" => array:2 [ + 0 => "a", + 1 => "b" + ], + "string" => "hello", + "multiline string" => """ + this\n + is\n + a\multiline\n + string + """ +] + +EOTXT; + + yield [$expected, CliDumper::DUMP_COMMA_SEPARATOR]; + + $expected = <<<'EOTXT' +array:3 [ + "array" => array:2 [ + 0 => "a", + 1 => "b", + ], + "string" => "hello", + "multiline string" => """ + this\n + is\n + a\multiline\n + string + """, +] + +EOTXT; + + yield [$expected, CliDumper::DUMP_TRAILING_COMMA]; + } + + /** + * @requires extension xml + * @requires PHP < 8.0 + */ + public function testXmlResource() + { + $var = xml_parser_create(); + + $this->assertDumpMatchesFormat( + <<<'EOTXT' +xml resource { + current_byte_index: %i + current_column_number: %i + current_line_number: 1 + error_code: XML_ERROR_NONE +} +EOTXT + , + $var + ); + } + + public function testJsonCast() + { + $var = (array) json_decode('{"0":{},"1":null}'); + foreach ($var as &$v) { + } + $var[] = &$v; + $var[''] = 2; + + if (\PHP_VERSION_ID >= 70200) { + $this->assertDumpMatchesFormat( + <<<'EOTXT' +array:4 [ + 0 => {} + 1 => &1 null + 2 => &1 null + "" => 2 +] +EOTXT + , + $var + ); + } else { + $this->assertDumpMatchesFormat( + <<<'EOTXT' +array:4 [ + "0" => {} + "1" => &1 null + 0 => &1 null + "" => 2 +] +EOTXT + , + $var + ); + } + } + + public function testObjectCast() + { + $var = (object) [1 => 1]; + $var->{1} = 2; + + if (\PHP_VERSION_ID >= 70200) { + $this->assertDumpMatchesFormat( + <<<'EOTXT' +{ + +"1": 2 +} +EOTXT + , + $var + ); + } else { + $this->assertDumpMatchesFormat( + <<<'EOTXT' +{ + +1: 1 + +"1": 2 +} +EOTXT + , + $var + ); + } + } + + public function testClosedResource() + { + if (\defined('HHVM_VERSION') && HHVM_VERSION_ID < 30600) { + $this->markTestSkipped(); + } + + $var = fopen(__FILE__, 'r'); + fclose($var); + + $dumper = new CliDumper('php://output'); + $dumper->setColors(false); + $cloner = new VarCloner(); + $data = $cloner->cloneVar($var); + + ob_start(); + $dumper->dump($data); + $out = ob_get_clean(); + $res = (int) $var; + + $this->assertStringMatchesFormat( + << 'bar'], + ]; + + $this->assertDumpEquals( + << (3) "foo" + 2 => (3) "bar" + ] +] +EOTXT + , + $var + ); + + putenv('DUMP_LIGHT_ARRAY='); + putenv('DUMP_STRING_LENGTH='); + } + + /** + * @requires function Twig\Template::getSourceContext + */ + public function testThrowingCaster() + { + $out = fopen('php://memory', 'r+b'); + + require_once __DIR__.'/../Fixtures/Twig.php'; + $twig = new \__TwigTemplate_VarDumperFixture_u75a09(new Environment(new FilesystemLoader())); + + $dumper = new CliDumper(); + $dumper->setColors(false); + $cloner = new VarCloner(); + $cloner->addCasters([ + ':stream' => function ($res, $a) { + unset($a['wrapper_data']); + + return $a; + }, + ]); + $cloner->addCasters([ + ':stream' => eval('return function () use ($twig) { + try { + $twig->render([]); + } catch (\Twig\Error\RuntimeError $e) { + throw $e->getPrevious(); + } + };'), + ]); + $ref = (int) $out; + + $data = $cloner->cloneVar($out); + $dumper->dump($data, $out); + $out = stream_get_contents($out, -1, 0); + + $r = \defined('HHVM_VERSION') ? '' : '#%d'; + $this->assertStringMatchesFormat( + << 'foo']; + $var->bar = &$var->foo; + + $dumper = new CliDumper(); + $dumper->setColors(false); + $cloner = new VarCloner(); + + $data = $cloner->cloneVar($var); + $out = $dumper->dump($data, true); + + $r = \defined('HHVM_VERSION') ? '' : '#%d'; + $this->assertStringMatchesFormat( + <<getSpecialVars(); + + $this->assertDumpEquals( + <<<'EOTXT' +array:3 [ + 0 => array:1 [ + 0 => &1 array:1 [ + 0 => &1 array:1 [&1] + ] + ] + 1 => array:1 [ + "GLOBALS" => &2 array:1 [ + "GLOBALS" => &2 array:1 [&2] + ] + ] + 2 => &2 array:1 [&2] +] +EOTXT + , + $var + ); + } + + /** + * @runInSeparateProcess + * @preserveGlobalState disabled + */ + public function testGlobalsNoExt() + { + $var = $this->getSpecialVars(); + unset($var[0]); + $out = ''; + + $dumper = new CliDumper(function ($line, $depth) use (&$out) { + if ($depth >= 0) { + $out .= str_repeat(' ', $depth).$line."\n"; + } + }); + $dumper->setColors(false); + $cloner = new VarCloner(); + + $refl = new \ReflectionProperty($cloner, 'useExt'); + $refl->setAccessible(true); + $refl->setValue($cloner, false); + + $data = $cloner->cloneVar($var); + $dumper->dump($data); + + $this->assertSame( + <<<'EOTXT' +array:2 [ + 1 => array:1 [ + "GLOBALS" => &1 array:1 [ + "GLOBALS" => &1 array:1 [&1] + ] + ] + 2 => &1 array:1 [&1] +] + +EOTXT + , + $out + ); + } + + /** + * @runInSeparateProcess + * @preserveGlobalState disabled + */ + public function testBuggyRefs() + { + if (\PHP_VERSION_ID >= 50600) { + $this->markTestSkipped('PHP 5.6 fixed refs counting'); + } + + $var = $this->getSpecialVars(); + $var = $var[0]; + + $dumper = new CliDumper(); + $dumper->setColors(false); + $cloner = new VarCloner(); + + $data = $cloner->cloneVar($var)->withMaxDepth(3); + $out = ''; + $dumper->dump($data, function ($line, $depth) use (&$out) { + if ($depth >= 0) { + $out .= str_repeat(' ', $depth).$line."\n"; + } + }); + + $this->assertSame( + <<<'EOTXT' +array:1 [ + 0 => array:1 [ + 0 => array:1 [ + 0 => array:1 [ …1] + ] + ] +] + +EOTXT + , + $out + ); + } + + public function testIncompleteClass() + { + $unserializeCallbackHandler = ini_set('unserialize_callback_func', null); + $var = unserialize('O:8:"Foo\Buzz":0:{}'); + ini_set('unserialize_callback_func', $unserializeCallbackHandler); + + $this->assertDumpMatchesFormat( + << 'bar'], + 0, + << "\e[1;38;5;113mbar\e[0;38;5;208m"\e[m +\e[0;38;5;208m]\e[m + +EOTXT + ]; + + yield [[], AbstractDumper::DUMP_LIGHT_ARRAY, "\e[0;38;5;208m[]\e[m\n"]; + + yield [ + ['foo' => 'bar'], + AbstractDumper::DUMP_LIGHT_ARRAY, + << "\e[1;38;5;113mbar\e[0;38;5;208m"\e[m +\e[0;38;5;208m]\e[m + +EOTXT + ]; + + yield [[], 0, "\e[0;38;5;208m[]\e[m\n"]; + } + + /** + * @dataProvider provideDumpArrayWithColor + */ + public function testDumpArrayWithColor($value, $flags, $expectedOut) + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Windows console does not support coloration'); + } + + $out = ''; + $dumper = new CliDumper(function ($line, $depth) use (&$out) { + if ($depth >= 0) { + $out .= str_repeat(' ', $depth).$line."\n"; + } + }, null, $flags); + $dumper->setColors(true); + $cloner = new VarCloner(); + $dumper->dump($cloner->cloneVar($value)); + + $this->assertSame($expectedOut, $out); + } + + private function getSpecialVars() + { + foreach (array_keys($GLOBALS) as $var) { + if ('GLOBALS' !== $var) { + unset($GLOBALS[$var]); + } + } + + $var = function &() { + $var = []; + $var[] = &$var; + + return $var; + }; + + return [$var(), $GLOBALS, &$GLOBALS]; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Dumper/FunctionsTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Dumper/FunctionsTest.php new file mode 100644 index 0000000000..7444d4bf58 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Dumper/FunctionsTest.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Dumper; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\CliDumper; +use Symfony\Component\VarDumper\VarDumper; + +class FunctionsTest extends TestCase +{ + public function testDumpReturnsFirstArg() + { + $this->setupVarDumper(); + + $var1 = 'a'; + + ob_start(); + $return = dump($var1); + ob_end_clean(); + + $this->assertEquals($var1, $return); + } + + public function testDumpReturnsAllArgsInArray() + { + $this->setupVarDumper(); + + $var1 = 'a'; + $var2 = 'b'; + $var3 = 'c'; + + ob_start(); + $return = dump($var1, $var2, $var3); + ob_end_clean(); + + $this->assertEquals([$var1, $var2, $var3], $return); + } + + protected function setupVarDumper() + { + $cloner = new VarCloner(); + $dumper = new CliDumper('php://output'); + VarDumper::setHandler(function ($var) use ($cloner, $dumper) { + $dumper->dump($cloner->cloneVar($var)); + }); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Dumper/HtmlDumperTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Dumper/HtmlDumperTest.php new file mode 100644 index 0000000000..d91fda265b --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Dumper/HtmlDumperTest.php @@ -0,0 +1,168 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Dumper; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; + +/** + * @author Nicolas Grekas + */ +class HtmlDumperTest extends TestCase +{ + public function testGet() + { + if (ini_get('xdebug.file_link_format') || get_cfg_var('xdebug.file_link_format')) { + $this->markTestSkipped('A custom file_link_format is defined.'); + } + + require __DIR__.'/../Fixtures/dumb-var.php'; + + $dumper = new HtmlDumper('php://output'); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + $cloner = new VarCloner(); + $cloner->addCasters([ + ':stream' => function ($res, $a) { + unset($a['uri'], $a['wrapper_data']); + + return $a; + }, + ]); + $data = $cloner->cloneVar($var); + + ob_start(); + $dumper->dump($data); + $out = ob_get_clean(); + $out = preg_replace('/[ \t]+$/m', '', $out); + $var['file'] = htmlspecialchars($var['file'], \ENT_QUOTES, 'UTF-8'); + $intMax = \PHP_INT_MAX; + preg_match('/sf-dump-\d+/', $out, $dumpId); + $dumpId = $dumpId[0]; + $res = (int) $var['res']; + + $r = \defined('HHVM_VERSION') ? '' : '#%d'; + $this->assertStringMatchesFormat( + <<array:24 [ + "number" => 1 + 0 => &1 null + "const" => 1.1 + 1 => true + 2 => false + 3 => NAN + 4 => INF + 5 => -INF + 6 => {$intMax} + "str" => "d&%s;j&%s;\\n" + 7 => b"&%s;\\x00" + "[]" => [] + "res" => stream resource @{$res} +%A wrapper_type: "plainfile" + stream_type: "STDIO" + mode: "r" + unread_bytes: 0 + seekable: true +%A options: [] + } + "obj" => DumbFoo {#%d + +foo: "foo" + +"bar": "bar" + } + "closure" => Closure {{$r} + class: "Symfony\Component\VarDumper\Tests\Dumper\HtmlDumperTest" + this: HtmlDumperTest {{$r} &%s;} + parameters: { + \$a: {} + &\$b: { + typeHint: "PDO" + default: null + } + } + file: "%s%eVarDumper%eTests%eFixtures%edumb-var.php" + line: "{$var['line']} to {$var['line']}" + } + "line" => {$var['line']} + "nobj" => array:1 [ + 0 => &3 {#%d} + ] + "recurs" => &4 array:1 [ + 0 => &4 array:1 [&4] + ] + 8 => &1 null + "sobj" => DumbFoo {#%d} + "snobj" => &3 {#%d} + "snobj2" => {#%d} + "file" => "{$var['file']}" + b"bin-key-&%s;" => "" +] + + +EOTXT + , + + $out + ); + } + + public function testCharset() + { + $var = mb_convert_encoding('Словарь', 'CP1251', 'UTF-8'); + + $dumper = new HtmlDumper('php://output', 'CP1251'); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + $cloner = new VarCloner(); + + $data = $cloner->cloneVar($var); + $out = $dumper->dump($data, true); + + $this->assertStringMatchesFormat( + <<<'EOTXT' +b"Словарь" + + +EOTXT + , + $out + ); + } + + public function testAppend() + { + $out = fopen('php://memory', 'r+b'); + + $dumper = new HtmlDumper(); + $dumper->setDumpHeader(''); + $dumper->setDumpBoundaries('', ''); + $cloner = new VarCloner(); + + $dumper->dump($cloner->cloneVar(123), $out); + $dumper->dump($cloner->cloneVar(456), $out); + + $out = stream_get_contents($out, -1, 0); + + $this->assertSame(<<<'EOTXT' +123 + +456 + + +EOTXT + , + $out + ); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/DateTimeChild.php b/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/DateTimeChild.php new file mode 100644 index 0000000000..2ea2df6514 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/DateTimeChild.php @@ -0,0 +1,8 @@ +p2 = new \stdClass(); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/Twig.php b/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/Twig.php new file mode 100644 index 0000000000..8b84d820fc --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/Twig.php @@ -0,0 +1,38 @@ +parent = false; + $this->blocks = []; + $this->path = $path; + } + + protected function doDisplay(array $context, array $blocks = []) + { + // line 2 + throw new \Exception('Foobar'); + } + + public function getTemplateName() + { + return 'foo.twig'; + } + + public function getDebugInfo() + { + return [20 => 1, 21 => 2]; + } + + public function getSourceContext() + { + return new Twig\Source(" foo bar\n twig source\n\n", 'foo.twig', $this->path ?: __FILE__); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/dumb-var.php b/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/dumb-var.php new file mode 100644 index 0000000000..de51cebc21 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/dumb-var.php @@ -0,0 +1,40 @@ +bar = 'bar'; + +$g = fopen(__FILE__, 'r'); + +$var = [ + 'number' => 1, null, + 'const' => 1.1, true, false, NAN, INF, -INF, PHP_INT_MAX, + 'str' => "déjà\n", "\xE9\x00", + '[]' => [], + 'res' => $g, + 'obj' => $foo, + 'closure' => function ($a, \PDO &$b = null) {}, + 'line' => __LINE__ - 1, + 'nobj' => [(object) []], +]; + +$r = []; +$r[] = &$r; + +$var['recurs'] = &$r; +$var[] = &$var[0]; +$var['sobj'] = $var['obj']; +$var['snobj'] = &$var['nobj'][0]; +$var['snobj2'] = $var['nobj'][0]; +$var['file'] = __FILE__; +$var["bin-key-\xE9"] = ''; + +unset($g, $r); diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/xml_reader.xml b/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/xml_reader.xml new file mode 100644 index 0000000000..740c399fc4 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Fixtures/xml_reader.xml @@ -0,0 +1,10 @@ + + + + + With text + + + + + diff --git a/pandora_console/vendor/symfony/var-dumper/Tests/Test/VarDumperTestTraitTest.php b/pandora_console/vendor/symfony/var-dumper/Tests/Test/VarDumperTestTraitTest.php new file mode 100644 index 0000000000..18042fb3bf --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/Tests/Test/VarDumperTestTraitTest.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Tests\Test; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\VarDumper\Test\VarDumperTestTrait; + +class VarDumperTestTraitTest extends TestCase +{ + use VarDumperTestTrait; + + public function testItComparesLargeData() + { + $howMany = 700; + $data = array_fill_keys(range(0, $howMany), ['a', 'b', 'c', 'd']); + + $expected = sprintf("array:%d [\n", $howMany + 1); + for ($i = 0; $i <= $howMany; ++$i) { + $expected .= << array:4 [ + 0 => "a" + 1 => "b" + 2 => "c" + 3 => "d" + ]\n +EODUMP; + } + $expected .= "]\n"; + + $this->assertDumpEquals($expected, $data); + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/VarDumper.php b/pandora_console/vendor/symfony/var-dumper/VarDumper.php new file mode 100644 index 0000000000..2ef20c064b --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/VarDumper.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper; + +use Symfony\Component\VarDumper\Cloner\VarCloner; +use Symfony\Component\VarDumper\Dumper\CliDumper; +use Symfony\Component\VarDumper\Dumper\HtmlDumper; + +// Load the global dump() function +require_once __DIR__.'/Resources/functions/dump.php'; + +/** + * @author Nicolas Grekas + */ +class VarDumper +{ + private static $handler; + + public static function dump($var) + { + if (null === self::$handler) { + $cloner = new VarCloner(); + $dumper = \in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) ? new CliDumper() : new HtmlDumper(); + self::$handler = function ($var) use ($cloner, $dumper) { + $dumper->dump($cloner->cloneVar($var)); + }; + } + + return \call_user_func(self::$handler, $var); + } + + public static function setHandler(callable $callable = null) + { + $prevHandler = self::$handler; + self::$handler = $callable; + + return $prevHandler; + } +} diff --git a/pandora_console/vendor/symfony/var-dumper/composer.json b/pandora_console/vendor/symfony/var-dumper/composer.json new file mode 100644 index 0000000000..9f2352ee25 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/composer.json @@ -0,0 +1,42 @@ +{ + "name": "symfony/var-dumper", + "type": "library", + "description": "Symfony mechanism for exploring and dumping PHP variables", + "keywords": ["dump", "debug"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "ext-iconv": "*", + "twig/twig": "~1.34|~2.4" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "ext-symfony_debug": "" + }, + "autoload": { + "files": [ "Resources/functions/dump.php" ], + "psr-4": { "Symfony\\Component\\VarDumper\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev" +} diff --git a/pandora_console/vendor/symfony/var-dumper/phpunit.xml.dist b/pandora_console/vendor/symfony/var-dumper/phpunit.xml.dist new file mode 100644 index 0000000000..3243fcd027 --- /dev/null +++ b/pandora_console/vendor/symfony/var-dumper/phpunit.xml.dist @@ -0,0 +1,33 @@ + + + + + + + + + + + + ./Tests/ + + + + + + ./ + + ./Resources + ./Tests + ./vendor + + + + diff --git a/pandora_console/views/calendar/special_days_edit.php b/pandora_console/views/calendar/special_days_edit.php index 23f72dc38f..74197e57bd 100644 --- a/pandora_console/views/calendar/special_days_edit.php +++ b/pandora_console/views/calendar/special_days_edit.php @@ -140,7 +140,7 @@ $inputs[] = [ 'type' => 'textarea', 'name' => 'description', 'required' => false, - 'value' => $specialDay->description(), + 'value' => io_safe_output($specialDay->description()), 'rows' => 50, 'columns' => 30, ], diff --git a/pandora_console/views/cluster/edit.php b/pandora_console/views/cluster/edit.php new file mode 100644 index 0000000000..393951f470 --- /dev/null +++ b/pandora_console/views/cluster/edit.php @@ -0,0 +1,129 @@ +operation; + +if ($wizard->id !== null) { + $extra .= '&id='.$wizard->id; +} + +$bc[] = [ + 'link' => $wizard->parentUrl, + 'label' => __('Cluster list'), + 'selected' => false, +]; + +$labels = $wizard->getLabels(); +foreach ($labels as $key => $label) { + $bc[] = [ + 'link' => $wizard->url.(($key >= 0) ? $extra.'&page='.$key : ''), + 'label' => __($label), + 'selected' => ($wizard->page == $key), + ]; +} + +$wizard->prepareBreadcrum($bc); + +$header_str = __(ucfirst($wizard->getOperation())).' '; +$header_str .= (($cluster->name() !== null) ? $cluster->name() : __('cluster ')); +$header_str .= ' » '.__($labels[$wizard->page]); + +// Header. +$buttons = []; + +$main_page = ''; +$main_page .= html_print_image( + 'images/list.png', + true, + [ + 'title' => __('Cluster list'), + 'class' => 'invert_filter', + ] +); +$main_page .= ''; + +$buttons = [ + [ + 'active' => false, + 'text' => $main_page, + ], +]; + +if ($cluster !== null) { + if ($cluster->id() !== null) { + $view = ''; + $view .= html_print_image( + 'images/operation.png', + true, + [ + 'title' => __('View this cluster'), + 'class' => 'invert_filter', + ] + ); + $view .= ''; + + $buttons[] = [ + 'active' => false, + 'text' => $view, + ]; + } +} + +ui_print_page_header( + $header_str, + '', + false, + 'cluster_view', + true, + // Buttons. + $buttons, + false, + '', + GENERIC_SIZE_TEXT, + '', + $wizard->printHeader(true) +); + +// Check if any error ocurred. +if (empty($wizard->errMessages) === false) { + foreach ($wizard->errMessages as $msg) { + ui_print_error_message(__($msg)); + } +} + +if (empty($form) === false) { + // Print form (prepared in ClusterWizard). + HTML::printForm($form, false, ($wizard->page < 6)); +} + +// Print always go back button. +HTML::printForm($wizard->getGoBackForm(), false); diff --git a/pandora_console/views/cluster/list.php b/pandora_console/views/cluster/list.php new file mode 100644 index 0000000000..c72f1752a1 --- /dev/null +++ b/pandora_console/views/cluster/list.php @@ -0,0 +1,132 @@ + 'options', + 'class' => 'action_buttons', + ], + ]; + + $column_names = [ + __('Name'), + __('Description'), + __('Group'), + __('Type'), + __('Nodes'), + __('Status'), + __('Options'), + ]; + + $tableId = 'clusters'; + + // Load datatables user interface. + ui_print_datatable( + [ + 'id' => $tableId, + 'class' => 'info_table', + 'style' => 'width: 100%', + 'columns' => $columns, + 'column_names' => $column_names, + 'ajax_url' => $model->ajaxController, + 'ajax_data' => ['method' => 'draw'], + 'no_sortable_columns' => [-1], + 'order' => [ + 'field' => 'known_status', + 'direction' => 'asc', + ], + 'search_button_class' => 'sub filter float-right', + 'form' => [ + 'inputs' => [ + [ + 'label' => __('Filter group'), + 'name' => 'id_group', + 'returnAllGroup' => true, + 'privilege' => 'AR', + 'type' => 'select_groups', + 'return' => true, + 'size' => '250px', + ], + [ + 'label' => __('Free search'), + 'type' => 'text', + 'class' => 'mw250px', + 'id' => 'free_search', + 'name' => 'free_search', + ], + ], + ], + ] + ); +} catch (Exception $e) { + echo $e->getMessage(); +} + +if (check_acl($config['id_user'], 0, 'AW')) { + HTML::printForm( + [ + 'form' => [ + 'method' => 'POST', + 'action' => ui_get_full_url($model->url.'&op=new'), + ], + 'inputs' => [ + [ + 'class' => 'w100p', + 'arguments' => [ + 'name' => 'submit', + 'label' => __('New cluster'), + 'type' => 'submit', + 'attributes' => 'class="sub next"', + 'return' => true, + ], + ], + ], + ] + ); +} diff --git a/pandora_console/views/cluster/view.php b/pandora_console/views/cluster/view.php new file mode 100644 index 0000000000..aa0c24fdf4 --- /dev/null +++ b/pandora_console/views/cluster/view.php @@ -0,0 +1,454 @@ + $model->url, + 'label' => __('Cluster list'), + 'selected' => false, +]; + +$bc[] = [ + 'link' => $model->url.'&op=view&id='.$cluster->id(), + 'label' => __('Cluster details'), + 'selected' => true, +]; + + +$html->prepareBreadcrum($bc); + +// Header. +$main_page = ''; +$main_page .= html_print_image( + 'images/list.png', + true, + [ + 'title' => __('Cluster list'), + 'class' => 'invert_filter', + ] +); +$main_page .= ''; + +$edit = ''; +$edit .= html_print_image( + 'images/setup.png', + true, + [ + 'title' => __('Edit this cluster'), + 'class' => 'invert_filter', + ] +); +$edit .= ''; + +ui_print_page_header( + __('Cluster details').' » '.$cluster->name(), + '', + false, + // Help link. + 'cluster_view', + true, + // Buttons. + [ + [ + 'active' => false, + 'text' => $main_page, + ], + [ + 'active' => false, + 'text' => $edit, + ], + ], + false, + '', + GENERIC_SIZE_TEXT, + '', + $html->printHeader(true) +); + + +if (empty($error) === false) { + echo $error; +} + +if (empty($message) === false) { + echo $message; +} + +if ($critical === true) { + // Print always go back button. + HTML::printForm($model->getGoBackForm(), false); + return; +} + + +/* + * + * All this block has been retrieved from 'estado_generalagente.php' as + * described in issue #5755. + * + */ + + + +/* + * + * + * CLUSTER AGENT DETAILS. + * + */ + +// Prepare information for view. +$alive_animation = agents_get_status_animation( + agents_get_interval_status($cluster->agent()->toArray(), false) +); + + +$agent_name = ui_print_agent_name( + $cluster->agent()->id_agente(), + true, + 500, + 'font-size: medium;font-weight:bold', + true, + '', + '', + false, + false +); +$in_planned_downtime = db_get_sql( + 'SELECT executed FROM tplanned_downtime + INNER JOIN tplanned_downtime_agents + ON tplanned_downtime.id = tplanned_downtime_agents.id_downtime + WHERE tplanned_downtime_agents.id_agent = '.$cluster->agent()->id_agente().' AND tplanned_downtime.executed = 1' +); + +if ($cluster->agent()->disabled()) { + if ($in_planned_downtime) { + $agent_name = ''.$agent_name.ui_print_help_tip(__('Disabled'), true); + } else { + $agent_name = ''.$agent_name.''.ui_print_help_tip(__('Disabled'), true); + } +} else if ($cluster->agent()->quiet()) { + if ($in_planned_downtime) { + $agent_name = "".$agent_name.' '.html_print_image('images/dot_blue.png', true, ['border' => '0', 'title' => __('Quiet'), 'alt' => '']); + } else { + $agent_name = "".$agent_name.' '.html_print_image('images/dot_blue.png', true, ['border' => '0', 'title' => __('Quiet'), 'alt' => '']).''; + } +} else { + $agent_name = $agent_name; +} + +if ($in_planned_downtime && !$cluster->agent()->disabled() && !$cluster->agent()->quiet()) { + $agent_name .= ' '.ui_print_help_tip( + __('Agent in scheduled downtime'), + true, + 'images/minireloj-16.png' + ).''; +} else if (($in_planned_downtime && !$cluster->agent()->disabled()) + || ($in_planned_downtime && !$cluster->agent()->quiet()) +) { + $agent_name .= ' '.ui_print_help_tip( + __('Agent in scheduled downtime'), + true, + 'images/minireloj-16.png' + ).''; +} + + +$table_agent_header = '
'; +$table_agent_header .= $agent_name; +$table_agent_header .= '
'; +$table_agent_header .= '
'; +if (!$config['show_group_name']) { + $table_agent_header .= ui_print_group_icon( + $cluster->agent()->id_grupo(), + true, + 'groups_small', + 'padding-right: 6px;' + ); +} + +$table_agent_header .= '
'; + +$status_img = agents_detail_view_status_img( + $cluster->agent()->critical_count(), + $cluster->agent()->warning_count(), + $cluster->agent()->unknown_count(), + $cluster->agent()->total_count(), + $cluster->agent()->notinit_count() +); + +$table_agent_header .= '
'.$status_img.'
'; +$table_agent_header .= '  '; +$table_agent_header .= ''.html_print_image( + 'images/target.png', + true, + [ + 'title' => __('Force cluster status calculation'), + 'alt' => '', + 'class' => 'invert_filter', + + ] +).''; +// Fixed width non interactive charts. +$status_chart_width = 180; +$graph_width = 180; + +$table_agent_graph = '
'; +$table_agent_graph .= graph_agent_status( + $cluster->agent()->id_agente(), + $graph_width, + $graph_width, + true, + false, + false, + true +); +$table_agent_graph .= '
'; + +$table_agent_os = '

'.ui_print_os_icon( + $cluster->agent()->id_os(), + false, + true, + true, + false, + false, + false, + ['title' => __('OS').': '.get_os_name($cluster->agent()->id_os())] +); +$table_agent_os .= (empty($cluster->agent()->os_version()) === true) ? get_os_name((int) $cluster->agent()->id_os()) : $cluster->agent()->os_version().'

'; + + + +$addresses = agents_get_addresses($cluster->agent()->id_agente()); +$address = agents_get_address($cluster->agent()->id_agente()); + +foreach ($addresses as $k => $add) { + if ($add == $address) { + unset($addresses[$k]); + } +} + +if (empty($address) === false) { + $table_agent_ip = '

'.html_print_image( + 'images/world.png', + true, + [ + 'title' => __('IP address'), + 'class' => 'invert_filter', + ] + ); + $table_agent_ip .= ''; + $table_agent_ip .= empty($address) ? ''.__('N/A').'' : $address; + $table_agent_ip .= '

'; +} + +$table_agent_description = '

'.html_print_image( + 'images/list.png', + true, + [ + 'title' => __('Description'), + 'class' => 'invert_filter', + ] +); +$table_agent_description .= ''; +$table_agent_description .= empty( + $cluster->description() +) ? ''.__('N/A').'' : $cluster->description(); +$table_agent_description .= '

'; + +$table_agent_count_modules = reporting_tiny_stats( + $cluster->agent()->toArray(), + true, + 'agent', + // Useless. + ':', + true +); + +$table_agent_version = '

'.html_print_image( + 'images/version.png', + true, + [ + 'title' => __('Agent Version'), + 'class' => 'invert_filter', + ] +); +$table_agent_version .= ''; +$table_agent_version .= empty($cluster->agent()->agent_version()) ? ''.__('Cluster agent').'' : $cluster->agent()->agent_version(); +$table_agent_version .= '

'; + +/* + * + * MAP + * + */ + +$nodes = $cluster->getNodes(); + +$font_size = 20; +$width = '45%'; +$height = '500'; +$node_radius = 40; + +// Generate map. +$map_manager = new NetworkMap( + [ + 'nodes' => $nodes, + 'no_pandora_node' => 1, + 'pure' => 1, + 'map_options' => [ + 'generation_method' => LAYOUT_SPRING1, + 'font_size' => $font_size, + 'node_radius' => $node_radius, + 'height' => $height, + 'width' => '100%', + 'tooltip' => true, + 'size_image' => 50, + 'z_dash' => 0.5, + 'map_filter' => [ + 'node_sep' => 7, + 'node_radius' => 50, + 'x_offs' => 130, + 'y_offs' => -70, + ], + ], + ] +); + + +/* + * + * EVENTS 24h + * + */ + +$table_events = '
'; +$table_events .= '
'; +$table_events .= html_print_image( + 'images/arrow_down_green.png', + true +); +$table_events .= ''; +$table_events .= __('Events (Last 24h)'); +$table_events .= ''; +$table_events .= '
'; +$table_events .= '
'; +$table_events .= graph_graphic_agentevents( + $cluster->agent()->id_agente(), + 95, + 70, + SECONDS_1DAY, + '', + true, + true, + 500 +); +$table_events .= '
'; +$table_events .= '
'; + +?> +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+
+ printMap(); ?> +
+
+
+ +
+ +
+ +
+agent()->id_agente(); +require_once $config['homedir'].'/operation/agentes/estado_monitores.php'; +?> +
+ + + [ + 'action' => $model->url.'&op=view&id='.$cluster->id(), + 'method' => 'POST', + ], + 'inputs' => [ + [ + 'arguments' => [ + 'name' => 'submit', + 'label' => __('Reload'), + 'type' => 'submit', + 'attributes' => 'class="sub cancel"', + 'return' => true, + ], + ], + ], + ], + false +); + +echo '
'; + +// Print always go back button. +HTML::printForm($model->getGoBackForm(), false); diff --git a/pandora_console/views/dashboard/layout.php b/pandora_console/views/dashboard/layout.php index 2f8f3a394b..ad80b9b73d 100644 --- a/pandora_console/views/dashboard/layout.php +++ b/pandora_console/views/dashboard/layout.php @@ -77,7 +77,8 @@ echo $output; class: '', hash: '', user: '' - } + }, + title: '', }); // Mode for create new dashboard. diff --git a/pandora_console/views/dashboard/listWidgets.php b/pandora_console/views/dashboard/listWidgets.php index ee8f2d7885..c7cac752f0 100644 --- a/pandora_console/views/dashboard/listWidgets.php +++ b/pandora_console/views/dashboard/listWidgets.php @@ -90,7 +90,7 @@ foreach ($widgets as $widget) { ); $output .= ''; $output .= '
'; - $output .= $widget['description']; + $output .= __($widget['description']); $output .= '
'; $output .= ''; } diff --git a/pandora_plugins/Informix_remote/pandora_informix.py b/pandora_plugins/Informix_remote/pandora_informix.py new file mode 100644 index 0000000000..3dd077e37c --- /dev/null +++ b/pandora_plugins/Informix_remote/pandora_informix.py @@ -0,0 +1,579 @@ +import ibm_db +import re +import argparse,sys,re,json,os,traceback,hashlib +from datetime import datetime +import subprocess + +__author__ = "Alejandro Sánchez Carrion" +__copyright__ = "Copyright 2022, PandoraFMS" +__maintainer__ = "Operations department" +__status__ = "Production" +__version__= '1.0' + +info = f""" +Pandora FMS DB2 +Version = {__version__} + +Manual execution + +./pandora_informix --hostname --port --uid --database --password --conf --as_agent_plugin 1 + +""" + +parser = argparse.ArgumentParser(description= info, formatter_class=argparse.RawTextHelpFormatter) + +parser.add_argument('--database', help="database name",default="sysmaster") +parser.add_argument('--hostname', help="IP") +parser.add_argument('--port', help="default:9089") +parser.add_argument('--uid', help="user") +parser.add_argument('--password', help="password") + +parser.add_argument('--default_metrics', help="",type=int,default=1) +parser.add_argument('--conf', help='path for the file with the queries') + +parser.add_argument('--agent_name', help='agent name', default= "Informix") +parser.add_argument('-a','--agent_alias', help='Name of the agent to store monitoring, default=p: informix', default= "Informix") +parser.add_argument('-A', '--use_alias_as_name', help='Use Agent Alias as Agent Name name', action='store_true') +parser.add_argument('-m', '--module_prefix', help='PandoraFMS module prefix', default='informix') + +parser.add_argument('-g', '--group', help='PandoraFMS destination group (default informix)', default='informix') +parser.add_argument('--data_dir', help='PandoraFMS data dir (default: /var/spool/pandora/data_in/)', default='/var/spool/pandora/data_in/') +parser.add_argument('--as_agent_plugin', help='mode plugin', default=0,type=int) +parser.add_argument('--tentacle_port', help='tentacle port', default=41121) +parser.add_argument('--tentacle_address', help='tentacle adress', default=None) + +args = parser.parse_args() + +conn_str=f'database={args.database};hostname={args.hostname};port={args.port};protocol=tcpip;uid={args.uid};pwd={args.password}' + +def connect(conn_str): + try: + ibm_db_conn = ibm_db.connect(conn_str,'','') + return ibm_db_conn + except: + print("no connection:", ibm_db.conn_errormsg()) + sys.exit(1) + +def executeQuery(con, query): + try: + stmt = ibm_db.exec_immediate(con, query) + result = ibm_db.fetch_both(stmt) + return result + + except Exception as message: + pass + +### Pandora Tools ###------------------------------------------------------------------------------------------------------- +modules = [] + + +######################################################################################### +# print_agent +######################################################################################### +def print_agent(agent, modules, data_dir="/var/spool/pandora/data_in/", log_modules= None, print_flag = None): + """Prints agent XML. Requires agent conf (dict) and modules (list) as arguments. + - Use print_flag to show modules' XML in STDOUT. + - Returns a tuple (xml, data_file). + """ + data_file=None + + header = "\n" + header += "\n" + "\t\n" + "\t" + str(data["type"]) + "\n" + ) + + if type(data["type"]) is not str and "string" not in data["type"]: #### Strip spaces if module not generic_data_string + data["value"] = data["value"].strip() + if isinstance(data["value"], list): # Checks if value is a list + module_xml += "\t\n" + for value in data["value"]: + if type(value) is dict and "value" in value: + module_xml += "\t\n" + module_xml += "\t\t\n" + if "timestamp" in value: + module_xml += "\t\t\n" + module_xml += "\t\n" + module_xml += "\t\n" + else: + module_xml += "\t\n" + if "desc" in data: + module_xml += "\t\n" + if "unit" in data: + module_xml += "\t\n" + if "interval" in data: + module_xml += "\t\n" + if "tags" in data: + module_xml += "\t" + str(data["tags"]) + "\n" + if "module_group" in data: + module_xml += "\t" + str(data["module_group"]) + "\n" + if "module_parent" in data: + module_xml += "\t" + str(data["module_parent"]) + "\n" + if "min_warning" in data: + module_xml += "\t\n" + if "min_warning_forced" in data: + module_xml += "\t\n" + if "max_warning" in data: + module_xml += "\t\n" + if "max_warning_forced" in data: + module_xml += "\t\n" + if "min_critical" in data: + module_xml += "\t\n" + if "min_critical_forced" in data: + module_xml += "\t\n" + if "max_critical" in data: + module_xml += "\t\n" + if "max_critical_forced" in data: + module_xml += "\t\n" + if "str_warning" in data: + module_xml += "\t\n" + if "str_warning_forced" in data: + module_xml += "\t\n" + if "str_critical" in data: + module_xml += "\t\n" + if "str_critical_forced" in data: + module_xml += "\t\n" + if "critical_inverse" in data: + module_xml += "\t\n" + if "warning_inverse" in data: + module_xml += "\t\n" + if "max" in data: + module_xml += "\t\n" + if "min" in data: + module_xml += "\t\n" + if "post_process" in data: + module_xml += "\t\n" + if "disabled" in data: + module_xml += "\t\n" + if "min_ff_event" in data: + module_xml += "\t\n" + if "status" in data: + module_xml += "\t\n" + if "timestamp" in data: + module_xml += "\t\n" + if "custom_id" in data: + module_xml += "\t\n" + if "critical_instructions" in data: + module_xml += "\t\n" + if "warning_instructions" in data: + module_xml += "\t\n" + if "unknown_instructions" in data: + module_xml += "\t\n" + if "quiet" in data: + module_xml += "\t\n" + if "module_ff_interval" in data: + module_xml += "\t\n" + if "crontab" in data: + module_xml += "\t\n" + if "min_ff_event_normal" in data: + module_xml += "\t\n" + if "min_ff_event_warning" in data: + module_xml += "\t\n" + if "min_ff_event_critical" in data: + module_xml += "\t\n" + if "ff_type" in data: + module_xml += "\t\n" + if "ff_timeout" in data: + module_xml += "\t\n" + if "each_ff" in data: + module_xml += "\t\n" + if "module_parent_unlink" in data: + module_xml += "\t\n" + if "global_alerts" in data: + for alert in data["alert"]: + module_xml += "\t\n" + module_xml += "\n" + + if print_flag: + print (module_xml) + + return (module_xml) + +######################################################################################### +# write_xml +######################################################################################### + +def write_xml(xml, agent_name, data_dir="/var/spool/pandora/data_in/"): + """Creates a agent .data file in the specified data_dir folder\n + Args: + - xml (str): XML string to be written in the file. + - agent_name (str): agent name for the xml and file name. + - data_dir (str): folder in which the file will be created.""" + Utime = datetime.now().strftime('%s') + data_file = "%s/%s.%s.data" %(str(data_dir),agent_name,str(Utime)) + try: + with open(data_file, 'x') as data: + data.write(xml) + except OSError as o: + sys.exit(f"ERROR - Could not write file: {o}, please check directory permissions") + except Exception as e: + sys.exit(f"{type(e).__name__}: {e}") + return (data_file) + +# # default agent +def clean_agent() : + global agent + agent = { + "agent_name" : "", + "agent_alias" : "", + "parent_agent_name" : "", + "description" : "", + "version" : "", + "os_name" : "", + "os_version" : "", + "timestamp" : datetime.today().strftime('%Y/%m/%d %H:%M:%S'), + #"utimestamp" : int(datetime.timestamp(datetime.today())), + "address" : "", + "group" : args.group, + "interval" : "", + "agent_mode" : "1", + } + return agent + +# default module +def clean_module() : + global modulo + modulo = { + "name" : "", + "type" : "generic_data_string", + "desc" : "", + "value" : "", + } + return modulo + +######################################################################################### +# tentacle_xml +######################################################################################### +def tentacle_xml(file, tentacle_ops,tentacle_path='', debug=0): + """Sends file using tentacle protocol\n + - Only works with one file at time. + - file variable needs full file path. + - tentacle_opts should be a dict with tentacle options (address [password] [port]). + - tentacle_path allows to define a custom path for tentacle client in case is not in sys path). + - if debug is enabled, the data file will not be removed after being sent. + + Returns 0 for OK and 1 for errors. + """ + + if file is None : + sys.stderr.write("Tentacle error: file path is required.") + else : + data_file = file + + if tentacle_ops['address'] is None : + sys.stderr.write("Tentacle error: No address defined") + return 1 + + try : + with open(data_file, 'r') as data: + data.read() + data.close() + except Exception as e : + sys.stderr.write(f"Tentacle error: {type(e).__name__} {e}") + return 1 + + tentacle_cmd = f"{tentacle_path}tentacle_client -v -a {tentacle_ops['address']} " + if "port" in tentacle_ops: + tentacle_cmd += f"-p {tentacle_ops['port']} " + if "password" in tentacle_ops: + tentacle_cmd += f"-x {tentacle_ops['password']} " + tentacle_cmd += f"{data_file} " + + tentacle_exe=subprocess.Popen(tentacle_cmd, stdout=subprocess.PIPE, shell=True) + rc=tentacle_exe.wait() + + if rc != 0 : + sys.stderr.write("Tentacle error") + return 1 + elif debug == 0 : + os.remove(file) + + return 0 + +## funcion agent +def agentplugin(modules,agent,plugin_type="server",data_dir="/var/spool/pandora/data_in/",tentacle=False,tentacle_conf=None) : + if plugin_type == "server": + for modulo in modules: + print_module(modulo,1) + + elif tentacle == True and tentacle_conf is not None: + agent_file=print_agent(agent, modules,data_dir) + if agent_file[1] is not None: + tentacle_xml(agent_file[1],tentacle_conf) + print ("1") + else: + print_agent(agent, modules,data_dir) + print ("1") + + +### Pandora Tools end ###------------------------------------------------------------------------------------------------------- + +# hash md5 agent name +if args.use_alias_as_name is not True: + agent_name_md5 = (hashlib.md5(args.agent_alias.encode()).hexdigest()) +else: + agent_name_md5 = args.agent_alias + +ibm_db_conn=connect(conn_str) + + +if args.default_metrics == 1: + + clean_agent() + agent.update( + agent_name = args.agent_name +"_metrics", + agent_alias =agent_name_md5 , + description ="Agent generated by pandora_db2" + ) + + #Dbspace I/O + + dbspaceIO = executeQuery(ibm_db_conn, 'SELECT d.name[1,18] dbspace,fname [1,22], sum(pagesread) dreads, sum(pageswritten) dwrites FROM syschkio c, syschunks k, sysdbspaces d WHERE d.dbsnum = k.dbsnum AND k.chknum = c.chunknum GROUP BY 1, 2 ORDER BY 3 desc;') + + for dato,value in dbspaceIO.items(): + if 'dbspace' in str(dato): + + name=value + + if 'fname' in str(dato): + clean_module() + modulo.update( + name = f'{name.strip()}.fname', + type = "generic_data_string", + desc = "", + value = value + ) + modules.append(modulo) + + if 'dreads' in str(dato): + clean_module() + modulo.update( + name = f'{name.strip()}.dreads', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + if 'dwrites' in str(dato): + clean_module() + modulo.update( + name = f'{name.strip()}.dwrites', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + + #Dbspace usage + + dbspaceusage = executeQuery(ibm_db_conn, 'SELECT sysdbspaces.name[1,18] name, nchunks, format_units(sum(syschunks.chksize * (SELECT sh_pagesize FROM sysshmvals)))::CHAR(12) total, format_units(sum(syschunks.chksize * (SELECT sh_pagesize FROM sysshmvals)) - sum(syschunks.nfree * (SELECT sh_pagesize FROM sysshmvals)))::CHAR(12) used, round (100 - ((sum(syschunks.nfree)) / (sum(syschunks.chksize)) * 100), 2) pct_used FROM sysdbspaces,syschunks WHERE sysdbspaces.dbsnum = syschunks.dbsnum AND sysdbspaces.is_sbspace = 0 GROUP BY 1,2 UNION SELECT sysdbspaces.name[1,18] name, nchunks, format_units(sum(syschunks.chksize * (SELECT sh_pagesize FROM sysshmvals)))::CHAR(12) total, format_units(sum(syschunks.chksize * (SELECT sh_pagesize FROM sysshmvals)) - sum(syschunks.nfree * (SELECT sh_pagesize FROM sysshmvals)))::CHAR(12) used, round (100 - ((sum(syschunks.nfree)) / (sum(syschunks.chksize)) * 100), 2) pct_used FROM sysdbspaces,syschunks WHERE sysdbspaces.dbsnum = syschunks.dbsnum AND sysdbspaces.is_sbspace = 1 GROUP BY 1,2 ORDER BY pct_used DESC;') + patron='[+-]?\d*\.?\d+' + for dato,value in dbspaceusage.items(): + if 'name' in str(dato): + name=value + if 'nchunks' in str(dato): + clean_module() + modulo.update( + name = f'{name.strip()}.nchunks', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + if 'total' in str(dato): + value_module=re.findall(patron,str(value)) + clean_module() + modulo.update( + name = f'{name.strip()}.total', + type = "generic_data", + desc = "", + value = value_module[0], + unit="MB" + ) + modules.append(modulo) + if 'used' in str(dato) and 'pct_used' not in str(dato): + value_module=re.findall(patron,str(value)) + + clean_module() + modulo.update( + name = f'{name.strip()}.used', + type = "generic_data", + desc = "", + value = value_module[0], + unit="MB" + ) + modules.append(modulo) + if 'pct_used' in str(dato): + + clean_module() + modulo.update( + name = f'{name.strip()}.pct_used', + type = "generic_data", + desc = "", + value = value, + unit="%" + ) + modules.append(modulo) + + + # #Checking tables I/O + + tablesIO = executeQuery(ibm_db_conn, 'SELECT dbsname[1,18], tabname[1,18], (isreads + pagreads) diskreads,(iswrites + pagwrites) diskwrites FROM sysptprof ORDER BY 3 desc, 4 desc;') + + for dato,value in tablesIO.items(): + + if 'dbsname' in str(dato): + name=value + if 'tabname' in str(dato): + clean_module() + modulo.update( + name = f'{name.strip()}.tabname', + type = "generic_data_string", + desc = "", + value = value.strip() + ) + modules.append(modulo) + if 'diskreads' in str(dato): + clean_module() + modulo.update( + name = f'{name.strip()}.diskreads', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + if 'diskwrites' in str(dato): + clean_module() + modulo.update( + name = f'{name.strip()}.diskwrites', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + + + # #Session statistics + + sessionstatics = executeQuery(ibm_db_conn, 'select sid, username[1,20], hostname[1,20], connected logint_time, hex(state) s_state from syssessions order by logint_time') + + for dato,value in sessionstatics.items(): + if 'sid' in str(dato): + name=value + + if 'hostname' in str(dato): + clean_module() + modulo.update( + name = f'sid->{name}.hostname', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + if 'logint_time' in str(dato): + clean_module() + modulo.update( + name = f'sid->{name}.diskwrites', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + if 's_state' in str(dato): + clean_module() + modulo.update( + name = f'sid->{name}.diskwrites', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + + ##Session profile + + sessionprofile = executeQuery(ibm_db_conn, 'select syssessions.sid, username[1,20],(isreads+bufreads+bufwrites+pagreads+pagwrites) access,locksheld, seqscans,total_sorts,dsksorts from syssesprof, syssessions where syssesprof.sid = syssessions.sid') + + for dato,value in sessionprofile.items(): + if 'sid' in str(dato): + name=value + + if 'access' in str(dato): + clean_module() + modulo.update( + name = f'sid->{name}.access', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + if 'locksheld' in str(dato): + clean_module() + modulo.update( + name = f'sid->{name}.locksheld', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + if 'seqscans' in str(dato): + clean_module() + modulo.update( + name = f'sid->{name}.seqscans', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + if 'total_sorts' in str(dato): + clean_module() + modulo.update( + name = f'sid->{name}.total_sorts', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + if 'dsksorts' in str(dato): + clean_module() + modulo.update( + name = f'sid->{name}.dsksorts', + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + +if args.tentacle_address is not None: + tentacle_conf={"address":args.tentacle_address,"port":args.tentacle_port} + agentplugin(modules,agent,"agent",config["data_in"],True,tentacle_conf) +elif args.as_agent_plugin!=1: + agentplugin(modules,agent,"agent",config["data_in"]) +else: + agentplugin(modules,agent) diff --git a/pandora_plugins/MySQL/pandora_mysql.pl b/pandora_plugins/MySQL/pandora_mysql.pl index ad9c4ebaa4..356db681e0 100644 --- a/pandora_plugins/MySQL/pandora_mysql.pl +++ b/pandora_plugins/MySQL/pandora_mysql.pl @@ -303,6 +303,10 @@ sub parse_config { if ($parametro =~ m/^check\_name\s(.*)/i) { $checks[$plugin_setup{"numchecks"}]{'check_name'} = trim($1); } + + if ($parametro =~ m/^check\_type\s(.*)/i) { + $checks[$plugin_setup{"numchecks"}]{'check_type'} = trim($1); + } if ($parametro =~ m/^check\_schema\s(.*)/i) { $checks[$plugin_setup{"numchecks"}]{'check_schema'} = trim($1); @@ -1015,6 +1019,7 @@ foreach (@checks) { my $check_show = $_->{'show'}; my $return_type = $_->{'return_type'}; my $check_name = $_->{'check_name'}; + my $check_type = $_->{'check_type'}; $result_check = 0; # Process check (System parameters) @@ -1156,7 +1161,7 @@ foreach (@checks) { print_module("MySQL_" . $type . '_' . $check_show, $module_type, $result_check, '', $check_status); } else { if (defined($check_name)) { - print_module("MySQL_" . $type . "_" . $check_name, $module_type, $result_check, '', $check_status); + print_module("MySQL_" . $type . "_" . $check_name, $check_type, $result_check, '', $check_status); } else { print_module("MySQL_" . $type, $module_type, $result_check, '', $check_status); } @@ -1186,3 +1191,4 @@ foreach (@checks) { } # type ne 'unknown' } + diff --git a/pandora_plugins/SNMP remoto/snmp_remotev1r3/snmp.conf b/pandora_plugins/SNMP remoto/snmp_remotev1r3/snmp.conf new file mode 100644 index 0000000000..20260a584e --- /dev/null +++ b/pandora_plugins/SNMP remoto/snmp_remotev1r3/snmp.conf @@ -0,0 +1,19 @@ +# name for the agent +agent_name=snmp_remote +# configuration (1 for activate modules) +memuse=1 +diskuse=1 +cpuload=1 +process=1 +# number of proces to monitoring, each one create a module +numberprocess=3 +# name for each process +process1=dhcp +process2=dockerd +process3=docker-proxy +# transfer configuration +mode=tentacle +tentacle_ip= +tentacle_port=41121 +#define +as_server_plugin=1 diff --git a/pandora_plugins/SNMP remoto/snmp_remotev1r3/snmp_remote.pl b/pandora_plugins/SNMP remoto/snmp_remotev1r3/snmp_remote.pl new file mode 100644 index 0000000000..3f3bf30277 --- /dev/null +++ b/pandora_plugins/SNMP remoto/snmp_remotev1r3/snmp_remote.pl @@ -0,0 +1,388 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------- +# SNMP remote plugin +# Depending on the configuration returns the result of these modules: +# - % Memory Use +# - % CPU Use +# - % Disk Use +# - Show if a process is running or not +# +# Artica ST +# Copyright (C) 2013 mario.pulido@artica.es +# +# License: GPLv2+ +#----------------------------------------------------------------------- +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# GPL License: http://www.gnu.org/licenses/gpl.txt +#----------------------------------------------------------------------- +# Revised by Kevin Rojas 2020 kevin.rojas@pandorafms.com +# - Added check for Module options +# - Optimized SNMP v3 code +# - Improved Help +#----------------------------------------------------------------------- +#----------------------------------------------------------------------- +# Revised by Kevin Rojas 2023 alejandro.sanchez@pandorafms.com +# - Added plugin tools options like tentacle +# - Added file conf for configuration +# - added option for monitoring more than 1 process in the same execution +#----------------------------------------------------------------------- + +use strict; +use Getopt::Std; + +my $VERSION = 'v1r3'; + +#------------------------------ +use File::Basename; +my $dirname; +BEGIN { $dirname = dirname(__FILE__);} +use lib $dirname; +use PandoraFMS::PluginTools; + +# Variables del conf +my $config; +$config = read_configuration($config); + +my $agent_name=$config->{'agent_name'}; + +my $mode=$config->{'mode'}; +my $tentacle_ip=$config->{'tentacle_ip'}; +my $tentacle_port=$config->{'tentacle_port'}; + +my $memuseconf=$config->{'memuse'}; +my $diskuseconf=$config->{'diskuse'}; +my $cpuloadconf=$config->{'cpuload'}; +my $processconf=$config->{'process'}; + +my $numberprocess=$config->{'numberprocess'}; + +my @modules; +my $module_group = $config->{'module_group'}; +my $valid_conf = 1; + +my $as_server_plugin = $config->{'as_server_plugin'}; + +if ($config->{'mode'} eq "tentacle" && !$config->{'tentacle_ip'}){ + print "ERROR: [transfer_mode] set to [tentacle], but no [tentacle_ip] provided.\n"; + $valid_conf = 0; +} + + +#---------------------------------- + +#----------------------------------------------------------------------- +# HELP +#----------------------------------------------------------------------- + +if ($#ARGV == -1 ) { + print "SNMP remote plugin ($VERSION). Retrieves information via SNMP for:\n"; + print "\t- Memory Usage (%)\n"; + print "\t- CPU Usage (%)\n"; + print "\t- Disk Usage (%)\n"; + print "\t- Whether a process is running (1) or not (0)\n"; + print "\n"; + + print "Arguments:\n\n"; + + print "-H, --host=STRING\n"; + print "\tHost IP\n"; + + print "-c, --community=STRING\n"; + print "\tSNMP Community\n"; + + print "-m, --module=STRING\n"; + print "\tDefine module (memuse|diskuse|process|cpuload) \n"; + + print "-d, --disk=STRING\n"; + print "\t[Only for diskuse module] Define disk name (C:, D: in Windows) or mount point (Linux). Default: /\n"; + + print "-p, --process=STRING\n"; + print "\t[Only for process module] Process or service name\n\n"; + + print "SNMP v3 options:\n"; + print "\n"; + + print "-v, --version=STRING\n"; + print "\tSNMP version (Default 2c)\n"; + + print "-u, --user=STRING\n"; + print "\tAuth user\n"; + + print "-l, --level=STRING\n"; + print "\tSecurity level\n"; + + print "-a STRING\n"; + print "\tAuth method\n"; + + print "-A, --auth=STRING\n"; + print "\tAuth pass\n"; + + print "-x STRING\n"; + print "\tPrivacy method\n"; + + print "-X STRING\n"; + print "\tPrivacy pass\n"; + + print "\n"; + print "Usage: \n"; + print "SNMP v1|2|2c:\n" ; + print "\tperl $0 -H host -c community -m (memuse|diskuse|process|cpuload) [-p process -d disk] \n" ; + print "SNMP v3:\n" ; + print "\tperl $0 -H host -v 3 -u user -l seclevel -a authMethod -A authPass -x privMethod -X privPass -m (memuse|diskuse|process|cpuload) [-p process -d disk] \n" ; + print "\n" ; + exit; +} + + +my ( + $host, # $opts{"H"} + $community, # $opts{"c"} + $disk, # $opts{"d"} + $version, # $opts{"v"} + $user, # $opts{"u"} + $pass, # $opts{"A"} + $security_level, # $opts{"l"} + $auth_method, # $opts{"a"} + $privacy_method, # $opts{"x"} + $privacy_pass # $opts{"X"} + ) = &options; + +#----------------------------------------------------------------------- +# OPTIONS +#----------------------------------------------------------------------- +sub options { + + # Get and check args + my %opts; + getopt( 'HcmdpvuAlaxX', \%opts ); + + #~ ' -u ' . $snmp3_auth_user . + #~ ' -A ' . $snmp3_auth_pass . + #~ ' -l ' . $snmp3_security_level . + #~ ' -a ' . $snmp3_auth_method . + #~ ' -x ' . $snmp3_privacy_method . + #~ ' -X' $snmp3_privacy_pass; + + # host + $opts{"H"} = 0 unless ( exists( $opts{"H"} ) ); + # community + $opts{"c"} = 0 unless ( exists( $opts{"c"} ) ); + # module + $opts{"m"} = 0 unless ( exists( $opts{"m"} ) ); + # disk + $opts{"d"} = "/" unless ( exists( $opts{"d"} ) ); + # process + $opts{"p"} = 0 unless ( exists( $opts{"p"} ) ); + # version + $opts{"v"} = "2c" unless ( exists( $opts{"v"} ) ); + # user + $opts{"u"} = "" unless ( exists( $opts{"u"} ) ); + # auth_pass + $opts{"A"} = "" unless ( exists( $opts{"A"} ) ); + # security level + $opts{"l"} = "noAuthNoPriv" unless ( exists( $opts{"l"} ) ); + # auth method + $opts{"a"} = "" unless ( exists( $opts{"a"} ) ); + # privacy method + $opts{"x"} = "" unless ( exists( $opts{"x"} ) ); + # privacy pass + $opts{"X"} = "" unless ( exists( $opts{"X"} ) ); + + return ( + $opts{"H"}, + $opts{"c"}, + $opts{"d"}, + $opts{"v"}, + $opts{"u"}, + $opts{"A"}, + $opts{"l"}, + $opts{"a"}, + $opts{"x"}, + $opts{"X"}); +} + +# unless ( $module ~~ ["memuse","cpuload","process","diskuse"] ){ +# print "Error: Invalid or missing argument (-m).\n"; +# print "Available options: memuse | diskuse | process | cpuload \n\n"; +# exit; +# } + +unless ($host){ + print "Error: missing host address.\n"; + exit; +} + +#----------------------------------------------------------------------- +# SNMP Version parameters +#----------------------------------------------------------------------- +my $command_line_parameters; +if ($version == "3") { + if (lc($security_level) eq lc('authNoPriv')) { + $command_line_parameters = "-v $version -u $user -a $auth_method -A '$pass' -l $security_level $host"; + } + elsif (lc($security_level) eq lc("AuthPriv")) { + $command_line_parameters = "-v $version -u $user -a $auth_method -A '$pass' -l $security_level -x $privacy_method -X '$privacy_pass' $host"; + } + else { + $command_line_parameters = "-v $version -u $user -l $security_level $host"; + } + } +else { + $command_line_parameters = "-v $version -c $community $host"; +} + +#----------------------------------------------------------------------- +# Memory use % module +#----------------------------------------------------------------------- +if($memuseconf==1){ + + my $memuse = 0; + + my $memid = `snmpwalk -On $command_line_parameters .1.3.6.1.2.1.25.2.3.1.3 | grep Physical | head -1 | gawk '{print \$1}' | gawk -F "." '{print \$13}' | tr -d "\r"`; + my @memtot = split(/\s/, `snmpget $command_line_parameters .1.3.6.1.2.1.25.2.3.1.5.$memid `) ; + my @memfree = split(/\s/, `snmpget $command_line_parameters .1.3.6.1.2.1.25.2.3.1.6.$memid `) ; + + if ($memid){ + $memuse = ($memfree[-1]) * 100 / $memtot[-1]; + #printf("%.2f", $memuse); + + push @modules, { + 'name' => "Total RAM used (%)", + 'type' => "generic_data", + 'value' => $memuse, + 'desc' => "Memory use % module", + 'unit' => "%", + 'module_group' => $module_group + }; + } + else { + print STDOUT "-1"; + print STDERR "Error: Memory OID not found"; + } + +} + +#----------------------------------------------------------------------- +# Disk use % module +#----------------------------------------------------------------------- +if($diskuseconf==1){ + + my $diskuse = 0; + + unless ($disk){ + print "Error: Invalid or missing argument (-d).\n"; + exit; + } + + if ($disk =~ /\\ /) { + $disk =~ s/\\/\\\\/g; + } + my $diskid = `snmpwalk -r 2 -On $command_line_parameters .1.3.6.1.2.1.25.2.3.1.3 | grep -F '$disk' | head -1 | gawk '{print \$1}' | gawk -F "." '{print \$13}' | tr -d "\r"`; + my @disktot= split /\s/, `snmpget -r 2 $command_line_parameters .1.3.6.1.2.1.25.2.3.1.5.$diskid` ; + + if ($diskid == ""){ + print STDOUT "-1"; + print STDERR "Error: Disk or partition not found\n"; + exit; + } + if ($disktot[-1] == 0) { + $diskuse = 0; + } + else { + my @diskfree = split (/\s/, `snmpget -r 2 $command_line_parameters .1.3.6.1.2.1.25.2.3.1.6.$diskid`) ; + + $diskuse = ($disktot[-1] - $diskfree[-1]) * 100 / $disktot[-1]; + } + + #printf("%.2f", $diskuse); + + push @modules, { + 'name' => "Storage Physical (%)", + 'type' => "generic_data", + 'value' => $diskuse, + 'desc' => "Disk use % module", + 'unit' => "%", + 'module_group' => $module_group + }; + +} +#----------------------------------------------------------------------- +# Process Status module +#----------------------------------------------------------------------- +if($processconf==1){ + + my $i; + my $count=0; + + my $status = 0; + + $status = `snmpwalk $command_line_parameters .1.3.6.1.2.1.25.4.2.1.2 2>/dev/null`; + + for ($i=0;$i<$numberprocess;$i++){ + $count=$count+1; + my $processname =$config->{'process'. $count}; + if ($? == 0) { + push @modules, { + 'name' => 'Process "'.$processname.'"', + 'type' => "generic_proc", + 'value' => ($status =~ m/$processname/mi)?1:0, + 'desc' => "Process Status module", + 'module_group' => $module_group + }; + } + +#print (($status =~ m/$process/mi)?1:0); + } +} +#----------------------------------------------------------------------- +# CPU Load % module +#----------------------------------------------------------------------- +if($cpuloadconf==1){ + + my $cputotal = 0; + + my $cpuload = `snmpwalk $command_line_parameters .1.3.6.1.2.1.25.3.3.1.2 | gawk '{print \$4}' `; + my @cpuload = split(/\n/, $cpuload); + my $sum; + my $counter = 0; + foreach my $val(@cpuload) { + $sum = $sum + $val; + $counter++; + } + + $cputotal = $sum/$counter; + push @modules, { + 'name' => "CPU Load (%)", + 'type' => "generic_data", + 'value' =>$cputotal, + 'desc' => "CPU Load % module", + 'unit' => "%", + 'module_group' => $module_group + }; + #print $cputotal; +} + +my $xml = print_agent($config, { + 'agent_name' => $agent_name +}, \@modules); +if (!transfer_xml($config, $xml)){ + if ($as_server_plugin != 1){ + print_module ($config, { + name => "snmp_remote", + type => "generic_proc", + desc => "", + value => 0, + }); + } + exit 0; + } +#print $xml; diff --git a/pandora_plugins/google_sheets/pandora_googlesheet.py b/pandora_plugins/google_sheets/pandora_googlesheet.py new file mode 100644 index 0000000000..a6e599b429 --- /dev/null +++ b/pandora_plugins/google_sheets/pandora_googlesheet.py @@ -0,0 +1,47 @@ +import gspread +import argparse +from oauth2client.service_account import ServiceAccountCredentials +from pprint import pprint + +__author__ = "Alejandro Sánchez Carrion" +__copyright__ = "Copyright 2022, PandoraFMS" +__maintainer__ = "Operations department" +__status__ = "Production" +__version__= '1.0' + +info = f""" +Pandora FMS Google Sheets +Version = {__version__} + +Manual execution + +python3 pandora_googlesheets.py --cred --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) + +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) + +client = gspread.authorize(creds) + +sheet = client.open(args.name).sheet1 # Open the spreadhseet + +data = sheet.get_all_records() # Get a list of all records + +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) diff --git a/pandora_plugins/intel_dcm/extensions/intel_dcm_agent_view.php b/pandora_plugins/intel_dcm/extensions/intel_dcm_agent_view.php index bdc1186044..737aa70770 100644 --- a/pandora_plugins/intel_dcm/extensions/intel_dcm_agent_view.php +++ b/pandora_plugins/intel_dcm/extensions/intel_dcm_agent_view.php @@ -142,26 +142,26 @@ function main_intel_dcm_agent_view() $sql = "SELECT description FROM tagent_custom_data WHERE id_field = $id_field_derated_power AND id_agent = $id_agent"; $derated_power = db_get_value_sql($sql); - $percent = number_format((($avg_power / $derated_power) * 100), 2); + $percent = number_format((($avg_power / $derated_power) * 100), 2, $config['decimal_separator'], $config['thousand_separator']); $data[0] = ''.__('Power utilization')." $percent%"; $data[0] .= progress_bar($percent, 400, 30, '', 2); $data[0] .= '

'; $data[0] .= ''.__('Current stats').''; $data[0] .= '

'; - $data[0] .= __('Power demand').': '.number_format($avg_power, 2).' Wh'; + $data[0] .= __('Power demand').': '.number_format($avg_power, 2, $config['decimal_separator'], $config['thousand_separator']).' Wh'; $data[0] .= '
'; - $data[0] .= __('Inlet temp').': '.number_format($avg_temp, 2).' ºC'; + $data[0] .= __('Inlet temp').': '.number_format($avg_temp, 2, $config['decimal_separator'], $config['thousand_separator']).' ºC'; $data[0] .= '


'; $data[0] .= ''.__('Last week summary').''; $data[0] .= '

'; - $data[0] .= __('Equipment energy consumed').': '.number_format($mnged_energy, 2).' Wh'; + $data[0] .= __('Equipment energy consumed').': '.number_format($mnged_energy, 2, $config['decimal_separator'], $config['thousand_separator']).' Wh'; $data[0] .= '
'; - $data[0] .= __('Equipment energy bill').': '.number_format($mnged_energy_bill, 2).' €'; + $data[0] .= __('Equipment energy bill').': '.number_format($mnged_energy_bill, 2, $config['decimal_separator'], $config['thousand_separator']).' €'; $data[0] .= '
'; - $data[0] .= __('Calculated cooling energy').': '.number_format($cooling_energy, 2).' Wh'; + $data[0] .= __('Calculated cooling energy').': '.number_format($cooling_energy, 2, $config['decimal_separator'], $config['thousand_separator']).' Wh'; $data[0] .= '
'; - $data[0] .= __('Calculated cooling energy bill').': '.number_format($cooling_energy_bill, 2).' €'; + $data[0] .= __('Calculated cooling energy bill').': '.number_format($cooling_energy_bill, 2, $config['decimal_separator'], $config['thousand_separator']).' €'; // Print avg. power graph $start_date = date('Y-m-d'); diff --git a/pandora_server/DEBIAN/control b/pandora_server/DEBIAN/control index cd4ae3e6dc..9dcab4bdcb 100644 --- a/pandora_server/DEBIAN/control +++ b/pandora_server/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-server -Version: 7.0NG.766-221122 +Version: 7.0NG.768-230210 Architecture: all Priority: optional Section: admin diff --git a/pandora_server/DEBIAN/make_deb_package.sh b/pandora_server/DEBIAN/make_deb_package.sh index 17bd9b87a2..f6a0439b3e 100644 --- a/pandora_server/DEBIAN/make_deb_package.sh +++ b/pandora_server/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.766-221122" +pandora_version="7.0NG.768-230210" package_cpan=0 package_pandora=1 diff --git a/pandora_server/FreeBSD/pandora_server.conf.new b/pandora_server/FreeBSD/pandora_server.conf.new index a500453137..481bf1f24d 100644 --- a/pandora_server/FreeBSD/pandora_server.conf.new +++ b/pandora_server/FreeBSD/pandora_server.conf.new @@ -348,15 +348,6 @@ self_monitoring 1 # Self monitoring interval (in seconds). self_monitoring_interval 300 -# Pandora Sample Agent. If enabled, every 10 minutes, this embedded agent -# will make sample data. Disabled by default. - -sample_agent 0 - -# Pandora Sample Agent interval (in seconds). - -sample_agent_interval 600 - # Update parent from the agent xml #update_parent 1 @@ -387,11 +378,11 @@ web_threads 1 # Uncomment to perform web checks with LWP instead of CURL. #web_engine lwp -# Enable (1) or disable (0) Pandora FMS Inventory Server (PANDORA FMS ENTERPRISE ONLY). +# Enable (1) or disable (0) Pandora FMS Inventory Server. inventoryserver 1 -# Number of threads for the Web Server (PANDORA FMS ENTERPRISE ONLY). +# Number of threads for the Inventory Server. inventory_threads 1 @@ -429,14 +420,6 @@ snmpserver 1 snmp_threads 4 -# Pandora FMS TransactionalServer (PANDORA FMS ENTERPRISE ONLY). - -transactionalserver 0 - -# Threshold for the Transactional Server (PANDORA FMS ENTERPRISE ONLY). - -transactional_threshold 2 - # Block size for block producer/consumer servers, that is, the number of modules # per block (20 by default) (PANDORA FMS ENTERPRISE ONLY). diff --git a/pandora_server/NetBSD/pandora_server.conf.new b/pandora_server/NetBSD/pandora_server.conf.new index f5c2e79275..9b95def21a 100644 --- a/pandora_server/NetBSD/pandora_server.conf.new +++ b/pandora_server/NetBSD/pandora_server.conf.new @@ -340,15 +340,6 @@ restart_delay 60 self_monitoring 1 -# Pandora Sample Agent. If enabled, every 10 minutes, this embedded agent -# will make sample data. Disabled by default. - -sample_agent 0 - -# Pandora Sample Agent interval (in seconds). - -sample_agent_interval 600 - # Update parent from the agent xml #update_parent 1 @@ -379,11 +370,11 @@ web_threads 1 # Uncomment to perform web checks with LWP instead of CURL. #web_engine lwp -# Enable (1) or disable (0) Pandora FMS Inventory Server (PANDORA FMS ENTERPRISE ONLY). +# Enable (1) or disable (0) Pandora FMS Inventory Server. inventoryserver 1 -# Number of threads for the Web Server (PANDORA FMS ENTERPRISE ONLY). +# Number of threads for the Inventory Server. inventory_threads 1 diff --git a/pandora_server/bin/pandora_exec b/pandora_server/bin/pandora_exec index d6d5da1c8c..2a990067ae 100755 --- a/pandora_server/bin/pandora_exec +++ b/pandora_server/bin/pandora_exec @@ -1,15 +1,8 @@ #!/usr/bin/perl -########################################################################## -# pandora_exec +################################################################################ +# pandora_exec - Execute a command with a time limit. # -# Executes the given command and prints its output to stdout. If the -# execution times out or the command does not exist nothing is printed -# to stdout. This is part of Pandora FMS Plugin server, do not delete!. -# -# Usage: pandora_exec -########################################################################## -# Copyright (c) 2008 Ramon Novoa, rnovoa@gmail.com -# (c) 2008 Artica Soluciones Tecnologicas S.L +# Copyright (c) 2008-2023 Artica PFMS S.L. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -22,41 +15,41 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -########################################################################## - +################################################################################ use strict; use warnings; +use POSIX qw(WEXITSTATUS WIFEXITED); -# Check command line parameters +# Check command line arguments. if ($#ARGV < 1) { + print("Usage: $0 \n"); exit 1; } my @opts = @ARGV; my $timeout = shift(@opts); -my $command; -foreach my $arg (@opts) { - $command .= $^O ne 'MSWin32' ? quotemeta ($arg) . ' ' : '"' . $arg . '" '; -} -chomp ($command); -my $output = ''; -my $ReturnCode = 0; +my $command = ($0 =~ m/_agent_exec$/) ? # For backward compatibility with pandora_agent. + join(' ', @opts) : + join(' ', map { quotemeta($_) } @opts); -# Execute the command -eval { - local $SIG{ALRM} = sub { die "alarm\n" }; - alarm $timeout; - - $output = `$command`; - $ReturnCode = ($? >> 8) & 0xff; - alarm 0; -}; - -# Timeout -if ($@ eq "alarm\n") { - exit 3; +# Fork: +# * The child will run the command. +# * The parent will timeout if needed +# and exit with the appropriate exit status. +my $pid = fork(); +if ($pid == 0) { + setpgrp(); + exec($command); +} else { + eval { + local $SIG{ALRM} = sub { kill(9, -$pid); exit 1; }; + alarm $timeout; + waitpid($pid, 0); + alarm 0; + if (WIFEXITED(${^CHILD_ERROR_NATIVE})) { + exit WEXITSTATUS(${^CHILD_ERROR_NATIVE}); + } + }; } -print $output; - -exit $ReturnCode; +exit 1; diff --git a/pandora_server/bin/pandora_server b/pandora_server/bin/pandora_server index e6ec7ed6dc..1f6d17af49 100755 --- a/pandora_server/bin/pandora_server +++ b/pandora_server/bin/pandora_server @@ -40,6 +40,7 @@ use PandoraFMS::WMIServer; use PandoraFMS::PluginServer; use PandoraFMS::PredictionServer; use PandoraFMS::WebServer; +use PandoraFMS::InventoryServer; # Constants for Win32 services. use constant WIN32_SERVICE_STOPPED => 0x01; @@ -157,6 +158,8 @@ sub pandora_startup () { push (@Servers, new PandoraFMS::PluginServer (\%Config, $DBH)); push (@Servers, new PandoraFMS::PredictionServer (\%Config, $DBH)); push (@Servers, new PandoraFMS::WebServer (\%Config, $DBH)); + push (@Servers, new PandoraFMS::InventoryServer (\%Config, $DBH)); + } else { # Metaconsole service modules are run by the prediction server push (@Servers, new PandoraFMS::PredictionServer (\%Config, $DBH)); @@ -384,119 +387,114 @@ sub pandora_server_tasks ($) { my $counter = 0; my $first_run = 1; while ($THRRUN == 1) { - if (pandora_is_master($pa_config) == 1) { + eval { + if (pandora_is_master($pa_config) == 1) { - # TASKS EXECUTED ONCE - # ------------------- - if ($first_run == 1) { - $first_run = 0; + # TASKS EXECUTED ONCE + # ------------------- + if ($first_run == 1) { + $first_run = 0; - # Update the agent cache. - enterprise_hook('update_agent_cache', [\%Config]); + # Update the agent cache. + enterprise_hook('update_agent_cache', [\%Config]); + } + + # TASKS EXECUTED EVERY 5 SECONDS (Low latency tasks) + # -------------------------------------------------- + if (($counter % 5) == 0) { + + # Update forced alerts + pandora_exec_forced_alerts ($pa_config, $dbh); + + my @agents = get_db_rows ($dbh, 'SELECT id_agente, update_alert_count FROM tagente WHERE update_alert_count=1'); + foreach my $agent (@agents) { + if ($agent->{'update_alert_count'} == 1) { + pandora_update_agent_alert_count ($pa_config, $dbh, $agent->{'id_agente'}); + } + } + } + + # TASKS EXECUTED EVERY 30 SECONDS (Mid latency tasks) + # --------------------------------------------------- + if (($counter % 30) == 0) { + + # Update module status and fired alert counts + my @agents = get_db_rows ($dbh, 'SELECT id_agente, nombre, update_module_count, update_secondary_groups FROM tagente WHERE (update_module_count=1 OR update_secondary_groups=1)'); + foreach my $agent (@agents) { + logger ($pa_config, "Updating module status and fired alert counts for agent " . $agent->{'nombre'}, 10); + + if ($agent->{'update_module_count'} == 1) { + pandora_update_agent_module_count ($pa_config, $dbh, $agent->{'id_agente'}); + } + + if ($agent->{'update_secondary_groups'} == 1) { + pandora_update_secondary_groups_cache ($pa_config, $dbh, $agent->{'id_agente'}); + } + } + + # Keepalive module control.(very DB intensive, not run frecuently + pandora_module_keep_alive_nd ($pa_config, $dbh); + + # Set the status of unknown modules + pandora_module_unknown ($pa_config, $dbh); + + # Check if an autodisabled agent needs to be autodisable + pandora_disable_autodisable_agents ($pa_config, $dbh); + } + + # TASKS EXECUTED EVERY 60 SECONDS (High latency tasks) + # ---------------------------------------------------- + if (($counter % 60) == 0) { + # Downtimes are executed only 30 x Server Threshold secs + pandora_planned_downtime ($pa_config, $dbh); + + # Realtime stats (Only master server!) - ( VERY HEAVY !) + # Realtimestats == 1, generated by WEB Console, not by server! + if (defined($pa_config->{"realtimestats"}) && $pa_config->{"realtimestats"} == 0){ + + # Check if I need to refresh stats + my $last_execution_stats = get_db_value ($dbh, "SELECT MAX(utimestamp) FROM tgroup_stat"); + if (!defined($last_execution_stats) || $last_execution_stats < (time() - $pa_config->{"stats_interval"})){ + pandora_group_statistics ($pa_config, $dbh); + pandora_server_statistics ($pa_config, $dbh); + } + } + + # Check if snmptrapd is freeze. + pandora_snmptrapd_still_working ($pa_config, $dbh); + + # Event auto-expiry + my $expiry_time = $pa_config->{"event_expiry_time"}; + my $expiry_window = $pa_config->{"event_expiry_window"}; + if ($expiry_time > 0 && $expiry_window > 0 && $expiry_window > $expiry_time) { + my $time_ref = time (); + my $expiry_limit = $time_ref - $expiry_time; + my $expiry_window = $time_ref - $expiry_window; + db_do ($dbh, 'UPDATE tevento SET estado=1, ack_utimestamp=? WHERE estado=0 AND utimestamp < ? AND utimestamp > ?', $time_ref, $expiry_limit, $expiry_window); + } + } } - # TASKS EXECUTED EVERY 5 SECONDS (Low latency tasks) - # -------------------------------------------------- - if (($counter % 5) == 0) { - - # Update forced alerts - pandora_exec_forced_alerts ($pa_config, $dbh); - } - - # TASKS EXECUTED EVERY 30 SECONDS (Mid latency tasks) - # --------------------------------------------------- + # COMMON TASKS (master and non-master) + # --------------------------------------------------------------- if (($counter % 30) == 0) { + # Update configuration options from the console. + pandora_get_sharedconfig ($pa_config, $dbh); - # Update module status and fired alert counts - my @agents = get_db_rows ($dbh, 'SELECT id_agente, nombre, update_module_count, update_alert_count, update_secondary_groups FROM tagente WHERE (update_module_count=1 OR update_alert_count=1 OR update_secondary_groups=1)'); - foreach my $agent (@agents) { - logger ($pa_config, "Updating module status and fired alert counts for agent " . $agent->{'nombre'}, 10); - - if ($agent->{'update_module_count'} == 1) { - pandora_update_agent_module_count ($pa_config, $dbh, $agent->{'id_agente'}); - } - - if ($agent->{'update_alert_count'} == 1) { - pandora_update_agent_alert_count ($pa_config, $dbh, $agent->{'id_agente'}); - } - - if ($agent->{'update_secondary_groups'} == 1) { - pandora_update_secondary_groups_cache ($pa_config, $dbh, $agent->{'id_agente'}); - } - } - - # Keepalive module control.(very DB intensive, not run frecuently - pandora_module_keep_alive_nd ($pa_config, $dbh); + # Rotate the log file. + pandora_rotate_logfile($pa_config); - # Set the status of unknown modules - pandora_module_unknown ($pa_config, $dbh); - - # Check if an autodisabled agent needs to be autodisable - pandora_disable_autodisable_agents ($pa_config, $dbh); + # Set event storm protection + pandora_set_event_storm_protection (pandora_get_tconfig_token ($dbh, 'event_storm_protection', 0)); } - - # TASKS EXECUTED EVERY 60 SECONDS (High latency tasks) - # ---------------------------------------------------- - if (($counter % 60) == 0) { - # Downtimes are executed only 30 x Server Threshold secs - pandora_planned_downtime ($pa_config, $dbh); - - # Realtime stats (Only master server!) - ( VERY HEAVY !) - # Realtimestats == 1, generated by WEB Console, not by server! - if (defined($pa_config->{"realtimestats"}) && $pa_config->{"realtimestats"} == 0){ - - # Check if I need to refresh stats - my $last_execution_stats = get_db_value ($dbh, "SELECT MAX(utimestamp) FROM tgroup_stat"); - if (!defined($last_execution_stats) || $last_execution_stats < (time() - $pa_config->{"stats_interval"})){ - pandora_group_statistics ($pa_config, $dbh); - pandora_server_statistics ($pa_config, $dbh); - } - } - - # Check if snmptrapd is freeze. - pandora_snmptrapd_still_working ($pa_config, $dbh); - - # Event auto-expiry - my $expiry_time = $pa_config->{"event_expiry_time"}; - my $expiry_window = $pa_config->{"event_expiry_window"}; - if ($expiry_time > 0 && $expiry_window > 0 && $expiry_window > $expiry_time) { - my $time_ref = time (); - my $expiry_limit = $time_ref - $expiry_time; - my $expiry_window = $time_ref - $expiry_window; - db_do ($dbh, 'UPDATE tevento SET estado=1, ack_utimestamp=? WHERE estado=0 AND utimestamp < ? AND utimestamp > ?', $time_ref, $expiry_limit, $expiry_window); - } + # Pandora self monitoring + if (defined($pa_config->{"self_monitoring"}) + && $pa_config->{"self_monitoring"} == 1 + && !is_metaconsole($pa_config) + && $counter % $pa_config->{'self_monitoring_interval'} == 0) { + pandora_self_monitoring ($pa_config, $dbh); } - } - - # COMMON TASKS (master and non-master) - # --------------------------------------------------------------- - if (($counter % 30) == 0) { - # Update configuration options from the console. - pandora_get_sharedconfig ($pa_config, $dbh); - - # Rotate the log file. - pandora_rotate_logfile($pa_config); - - # Set event storm protection - pandora_set_event_storm_protection (pandora_get_tconfig_token ($dbh, 'event_storm_protection', 0)); - } - # Pandora self monitoring - if (defined($pa_config->{"self_monitoring"}) - && $pa_config->{"self_monitoring"} == 1 - && !is_metaconsole($pa_config) - && $counter % $pa_config->{'self_monitoring_interval'} == 0) { - pandora_self_monitoring ($pa_config, $dbh); - } - - # Pandora sample agent - if (defined($pa_config->{'sample_agent'})) { - if ($pa_config->{'sample_agent'} == 1 - && !is_metaconsole($pa_config) - && $counter % $pa_config->{'sample_agent_interval'} == 0){ - pandora_sample_agent ($pa_config); - } - pandora_update_config_token ($dbh, 'sample_agent', $pa_config->{'sample_agent'}); - } + }; # Avoid counter overflow if ($counter >= ~0){ @@ -855,6 +853,7 @@ sub main() { # Main loop my $time_ref = time (); + my $thr_time_ref = 0; my $test_remote_interval = ($Config{'keepalive'}/$Config{'server_threshold'}); my $test_remote = 0; while ($RUN == 1) { @@ -870,6 +869,15 @@ sub main() { # Make sure all server threads are running. die("Server thread crashed.") unless (check_server_threads() == 1); + # Monitor server threads. + if (defined($Config{"self_monitoring"}) + && $Config{"self_monitoring"} == 1 + && !is_metaconsole(\%Config) + && time() - $thr_time_ref > $Config{'self_monitoring_interval'}) { + $thr_time_ref = time(); + pandora_thread_monitoring (\%Config, $DBH, \@Servers); + } + db_do ($DBH, "UPDATE tserver SET status = -1 WHERE UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(keepalive) > 2*server_keepalive diff --git a/pandora_server/conf/pandora_server.conf.new b/pandora_server/conf/pandora_server.conf.new index 6f7e54d601..d04de89830 100644 --- a/pandora_server/conf/pandora_server.conf.new +++ b/pandora_server/conf/pandora_server.conf.new @@ -1,7 +1,7 @@ ############################################################################# # Pandora FMS Server Parameters # Pandora FMS, the Flexible Monitoring System. -# Version 7.0NG.766 +# Version 7.0NG.768 # Licensed under GPL license v2, # (c) 2003-2021 Artica Soluciones Tecnologicas # http://www.pandorafms.com @@ -422,15 +422,6 @@ self_monitoring 1 # Self monitoring interval (in seconds). self_monitoring_interval 300 -# Pandora Sample Agent. If enabled, every 10 minutes, this embedded agent -# will make sample data. Disabled by default. - -sample_agent 0 - -# Pandora Sample Agent interval (in seconds). - -sample_agent_interval 600 - # Update parent from the agent xml update_parent 1 @@ -466,11 +457,11 @@ web_timeout 60 # Uncomment to perform web checks with LWP instead of CURL. #web_engine lwp -# Enable (1) or disable (0) Pandora FMS Inventory Server (PANDORA FMS ENTERPRISE ONLY). +# Enable (1) or disable (0) Pandora FMS Inventory Server. inventoryserver 1 -# Number of threads for the Web Server (PANDORA FMS ENTERPRISE ONLY). +# Number of threads for the Inventory Server. inventory_threads 1 @@ -533,14 +524,6 @@ snmpserver 1 snmp_threads 4 -# Pandora FMS TransactionalServer (PANDORA FMS ENTERPRISE ONLY). - -transactionalserver 0 - -# Threshold for the Transactional Server (PANDORA FMS ENTERPRISE ONLY). - -transactional_threshold 2 - # Block size for block producer/consumer servers, that is, the number of modules # per block (15 by default) (PANDORA FMS ENTERPRISE ONLY). @@ -615,6 +598,9 @@ unknown_events 1 # Time interval (as a multiple of the module interval) before a module becomes unknown. Twice the module's interval by default. #unknown_interval 2 +# Number of unknown modules that will be processed per iteration. +unknown_block_size 1000 + # Maximum executing time of an alert (in seconds) global_alert_timeout 15 @@ -749,4 +735,4 @@ tentacle_service_watchdog 1 # Enable (1) or disable (0) the parameter of mysql ssl certification (mysql_ssl_verify_server_cert) (enabled by default). -verify_mysql_ssl_cert 1 \ No newline at end of file +verify_mysql_ssl_cert 1 diff --git a/pandora_server/conf/pandora_server.conf.windows b/pandora_server/conf/pandora_server.conf.windows index f7eae25944..8d879bc5cd 100644 --- a/pandora_server/conf/pandora_server.conf.windows +++ b/pandora_server/conf/pandora_server.conf.windows @@ -345,15 +345,6 @@ restart_delay 60 # Self monitoring interval (in seconds). #self_monitoring_interval 300 -# Pandora Sample Agent. If enabled, every 10 minutes, this embedded agent -# will make sample data. Disabled by default. - -sample_agent 0 - -# Pandora Sample Agent interval (in seconds). - -sample_agent_interval 600 - # Update parent from the agent xml #update_parent 1 @@ -384,11 +375,11 @@ web_threads 1 # Uncomment to perform web checks with LWP instead of CURL. #web_engine lwp -# Enable (1) or disable (0) Pandora FMS Inventory Server (PANDORA FMS ENTERPRISE ONLY). +# Enable (1) or disable (0) Pandora FMS Inventory Server. inventoryserver 1 -# Number of threads for the Web Server (PANDORA FMS ENTERPRISE ONLY). +# Number of threads for the Inventory Server. inventory_threads 1 @@ -430,14 +421,6 @@ snmpserver 1 snmp_threads 4 -# Pandora FMS TransactionalServer (PANDORA FMS ENTERPRISE ONLY). - -transactionalserver 0 - -# Threshold for the Transactional Server (PANDORA FMS ENTERPRISE ONLY). - -transactional_threshold 2 - # Block size for block producer/consumer servers, that is, the number of modules # per block (15 by default) (PANDORA FMS ENTERPRISE ONLY). diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm index baddf5c511..1b6bd6e526 100644 --- a/pandora_server/lib/PandoraFMS/Config.pm +++ b/pandora_server/lib/PandoraFMS/Config.pm @@ -45,8 +45,8 @@ our @EXPORT = qw( ); # version: Defines actual version of Pandora Server for this module only -my $pandora_version = "7.0NG.766"; -my $pandora_build = "221122"; +my $pandora_version = "7.0NG.768"; +my $pandora_build = "230210"; our $VERSION = $pandora_version." ".$pandora_build; # Setup hash @@ -256,8 +256,6 @@ sub pandora_load_config { $pa_config->{"inventoryserver"} = 1; # default $pa_config->{"webserver"} = 1; # 3.0 $pa_config->{"web_timeout"} = 60; # 6.0SP5 - $pa_config->{"transactionalserver"} = 0; # Default 0, introduced on 6.1 - $pa_config->{"transactional_threshold"} = 2; # Default 2, introduced on 6.1 $pa_config->{"transactional_pool"} = $pa_config->{"incomingdir"} . "/" . "trans"; # Default, introduced on 6.1 $pa_config->{'snmp_logfile'} = "/var/log/pandora_snmptrap.log"; $pa_config->{"network_threads"} = 3; # Fixed default @@ -417,12 +415,6 @@ sub pandora_load_config { # Self monitoring interval $pa_config->{'self_monitoring_interval'} = 300; # 5.1SP1 - # Sample Agent - $pa_config->{'sample_agent'} = 0; - - # Sample agent interval - $pa_config->{'sample_agent_interval'} = 600; - # Process XML data files as a stack $pa_config->{"dataserver_lifo"} = 0; # 5.0 @@ -535,33 +527,35 @@ sub pandora_load_config { $pa_config->{"unknown_updates"} = 0; # 7.0.718 - $pa_config->{"provisioningserver"} = 1; # 7.0 720 - $pa_config->{"provisioningserver_threads"} = 1; # 7.0 720 - $pa_config->{"provisioning_cache_interval"} = 300; # 7.0 720 + $pa_config->{"provisioningserver"} = 1; # 7.0.720 + $pa_config->{"provisioningserver_threads"} = 1; # 7.0.720 + $pa_config->{"provisioning_cache_interval"} = 300; # 7.0.720 - $pa_config->{"autoconfigure_agents"} = 1; # 7.0 725 - $pa_config->{"autoconfigure_agents_threshold"} = 300; #7.0 764 + $pa_config->{"autoconfigure_agents"} = 1; # 7.0.725 + $pa_config->{"autoconfigure_agents_threshold"} = 300; #7.0.764 - $pa_config->{'snmp_extlog'} = ""; # 7.0 726 + $pa_config->{'snmp_extlog'} = ""; # 7.0.726 - $pa_config->{"fsnmp"} = "/usr/bin/pandorafsnmp"; # 7.0 732 + $pa_config->{"fsnmp"} = "/usr/bin/pandorafsnmp"; # 7.0.732 - $pa_config->{"event_inhibit_alerts"} = 0; # 7.0 737 + $pa_config->{"event_inhibit_alerts"} = 0; # 7.0.737 - $pa_config->{"alertserver"} = 0; # 7.0 756 - $pa_config->{"alertserver_threads"} = 1; # 7.0 756 - $pa_config->{"alertserver_warn"} = 180; # 7.0 756 - $pa_config->{"alertserver_queue"} = 0; # 7.0 764 + $pa_config->{"alertserver"} = 0; # 7.0.756 + $pa_config->{"alertserver_threads"} = 1; # 7.0.756 + $pa_config->{"alertserver_warn"} = 180; # 7.0.756 + $pa_config->{"alertserver_queue"} = 0; # 7.0.764 - $pa_config->{'ncmserver'} = 0; # 7.0 758 - $pa_config->{'ncmserver_threads'} = 1; # 7.0 758 - $pa_config->{'ncm_ssh_utility'} = '/usr/share/pandora_server/util/ncm_ssh_extension'; # 7.0 758 + $pa_config->{'ncmserver'} = 0; # 7.0.758 + $pa_config->{'ncmserver_threads'} = 1; # 7.0.758 + $pa_config->{'ncm_ssh_utility'} = '/usr/share/pandora_server/util/ncm_ssh_extension'; # 7.0.758 - $pa_config->{"pandora_service_cmd"} = 'service pandora_server'; # 7.0 761 - $pa_config->{"tentacle_service_cmd"} = 'service tentacle_serverd'; # 7.0 761 - $pa_config->{"tentacle_service_watchdog"} = 1; # 7.0 761 + $pa_config->{"pandora_service_cmd"} = 'service pandora_server'; # 7.0.761 + $pa_config->{"tentacle_service_cmd"} = 'service tentacle_serverd'; # 7.0.761 + $pa_config->{"tentacle_service_watchdog"} = 1; # 7.0.761 - $pa_config->{"dataserver_smart_queue"} = 0; # 765. + $pa_config->{"dataserver_smart_queue"} = 0; # 7.0.765 + + $pa_config->{"unknown_block_size"} = 1000; # 7.0.769 # Check for UID0 if ($pa_config->{"quiet"} != 0){ @@ -776,12 +770,6 @@ sub pandora_load_config { elsif ($parametro =~ m/^web_timeout\s+([0-9]*)/i) { $pa_config->{'web_timeout'}= clean_blank($1); } - elsif ($parametro =~ m/^transactionalserver\s+([0-9]*)/i) { - $pa_config->{'transactionalserver'}= clean_blank($1); - } - elsif ($parametro =~ m/^transactional_threshold\s+([0-9]*\.{0,1}[0-9]*)/i) { - $pa_config->{'transactional_threshold'}= clean_blank($1); - } if ($parametro =~ m/^transactional_pool\s(.*)/i) { $tbuf= clean_blank($1); if ($tbuf =~ m/^\.(.*)/){ @@ -1022,12 +1010,6 @@ sub pandora_load_config { elsif ($parametro =~ m/^self_monitoring_interval\s+([0-9]*)/i) { $pa_config->{'self_monitoring_interval'} = clean_blank($1); } - elsif ($parametro =~ m/^sample_agent\s+([0-1])/i) { - $pa_config->{'sample_agent'} = clean_blank($1); - } - elsif ($parametro =~ m/^sample_agent_interval\s+([0-9]*)/i) { - $pa_config->{'sample_agent_interval'} = clean_blank($1); - } elsif ($parametro =~ m/^update_parent\s+([0-1])/i) { $pa_config->{'update_parent'} = clean_blank($1); } diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index 45212252e3..d2a5a79580 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -98,7 +98,7 @@ Exported Functions: =item * C -=item * C +=item * C =back @@ -118,7 +118,7 @@ use Tie::File; use Time::Local; use Time::HiRes qw(time); eval "use POSIX::strftime::GNU;1" if ($^O =~ /win/i); -use POSIX qw(strftime); +use POSIX qw(strftime mktime); use threads; use threads::shared; use JSON qw(decode_json encode_json); @@ -258,7 +258,7 @@ our @EXPORT = qw( pandora_group_statistics pandora_server_statistics pandora_self_monitoring - pandora_sample_agent + pandora_thread_monitoring pandora_process_policy_queue pandora_sync_agents_integria pandora_get_integria_ticket_types @@ -280,6 +280,11 @@ our @EXPORT = qw( notification_set_targets notification_get_users notification_get_groups + process_inventory_data + process_inventory_module_diff + exec_cluster_aa_module + exec_cluster_ap_module + exec_cluster_status_module ); # Some global variables @@ -299,7 +304,6 @@ our @ServerTypes = qw ( icmpserver snmpserver satelliteserver - transactionalserver mfserver syncserver wuxserver @@ -1301,13 +1305,17 @@ sub pandora_execute_action ($$$$$$$$$;$$) { $group = get_db_single_row ($dbh, 'SELECT * FROM tgrupo WHERE id_grupo = ?', $agent->{'id_grupo'}); } - my $agent_status; - if(ref ($module) eq "HASH") { - $agent_status = get_db_single_row ($dbh, 'SELECT * FROM tagente_estado WHERE id_agente_modulo = ?', $module->{'id_agente_modulo'}); + my $time_down; + if ($alert_mode == RECOVERED_ALERT && defined($extra_macros->{'_modulelaststatuschange_'})) { + $time_down = (time() - $extra_macros->{'_modulelaststatuschange_'}); + } else { + my $agent_status; + if(ref ($module) eq "HASH") { + $agent_status = get_db_single_row ($dbh, 'SELECT * FROM tagente_estado WHERE id_agente_modulo = ?', $module->{'id_agente_modulo'}); + } + $time_down = (defined ($agent_status)) ? (time() - $agent_status->{'last_status_change'}) : undef; } - my $time_down = (defined ($agent_status)) ? (time() - $agent_status->{'last_status_change'}) : undef; - if (is_numeric($data)) { my $data_precision = $pa_config->{'graph_precision'}; $data = sprintf("%.$data_precision" . "f", $data); @@ -1539,11 +1547,11 @@ sub pandora_execute_action ($$$$$$$$$;$$) { my $threshold = shift; my $period = $hours * 3600; # Hours to seconds if($threshold == 0){ - $params->{"other"} = $period . '%7C1%7C0%7C225%7C""%7C14'; + $params->{"other"} = $period . '%7C1%7C0%7C225%7C%7C14'; $cid = 'module_graph_' . $hours . 'h'; } else{ - $params->{"other"} = $period . '%7C1%7C1%7C225%7C""%7C14'; + $params->{"other"} = $period . '%7C1%7C1%7C225%7C%7C14'; $cid = 'module_graphth_' . $hours . 'h'; } @@ -3165,16 +3173,20 @@ sub pandora_update_server ($$$$$$;$$$$) { $version = $pa_config->{'version'} . ' (P) ' . $pa_config->{'build'} unless defined($version); my $master = ($server_type == SATELLITESERVER) ? 0 : $pa_config->{'pandora_master'}; - + + my ($year, $month, $day, $hour, $minute, $second) = split /[- :]/, $timestamp; + + my $keepalive_utimestamp = mktime($second, $minute, $hour, $day, $month-1, $year-1900); + # First run if ($server_id == 0) { # Create an entry in tserver if needed my $server = get_db_single_row ($dbh, 'SELECT id_server FROM tserver WHERE BINARY name = ? AND server_type = ?', $server_name, $server_type); if (! defined ($server)) { - $server_id = db_insert ($dbh, 'id_server', 'INSERT INTO tserver (name, server_type, description, version, threads, queued_modules, server_keepalive) - VALUES (?, ?, ?, ?, ?, ?, ?)', $server_name, $server_type, - 'Autocreated at startup', $version, $num_threads, $queue_size, $keepalive); + $server_id = db_insert ($dbh, 'id_server', 'INSERT INTO tserver (name, server_type, description, version, threads, queued_modules, server_keepalive, server_keepalive_utimestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)', $server_name, $server_type, + 'Autocreated at startup', $version, $num_threads, $queue_size, $keepalive, $keepalive_utimestamp); $server = get_db_single_row ($dbh, 'SELECT status FROM tserver WHERE id_server = ?', $server_id); if (! defined ($server)) { @@ -3185,14 +3197,14 @@ sub pandora_update_server ($$$$$$;$$$$) { $server_id = $server->{'id_server'}; } - db_do ($dbh, 'UPDATE tserver SET status = ?, keepalive = ?, master = ?, laststart = ?, version = ?, threads = ?, queued_modules = ?, server_keepalive = ? + db_do ($dbh, 'UPDATE tserver SET status = ?, keepalive = ?, master = ?, laststart = ?, version = ?, threads = ?, queued_modules = ?, server_keepalive = ?, server_keepalive_utimestamp = ? WHERE id_server = ?', - 1, $timestamp, $master, $timestamp, $version, $num_threads, $queue_size, $keepalive, $server_id); + 1, $timestamp, $master, $timestamp, $version, $num_threads, $queue_size, $keepalive, $keepalive_utimestamp, $server_id); return; } - - db_do ($dbh, 'UPDATE tserver SET status = ?, keepalive = ?, master = ?, version = ?, threads = ?, queued_modules = ?, server_keepalive = ? - WHERE id_server = ?', $status, $timestamp, $master, $version, $num_threads, $queue_size, $keepalive, $server_id); + + db_do ($dbh, 'UPDATE tserver SET status = ?, keepalive = ?, master = ?, version = ?, threads = ?, queued_modules = ?, server_keepalive = ?, server_keepalive_utimestamp = ? + WHERE id_server = ?', $status, $timestamp, $master, $version, $num_threads, $queue_size, $keepalive, $keepalive_utimestamp, $server_id); } ########################################################################## @@ -3878,7 +3890,7 @@ sub pandora_create_agent ($$$$$$$$$$;$$$$$$$$$$) { $agent_mode = 1 unless defined($agent_mode); $alias = $agent_name unless defined($alias); - $description = "Created by $server_name" unless (defined($description) && $description ne ''); + $description = '' unless (defined($description)); my ($columns, $values) = db_insert_get_values ({ 'nombre' => safe_input($agent_name), 'direccion' => $address, 'comentarios' => $description, @@ -4035,7 +4047,7 @@ sub pandora_event ($$$$$$$$$$;$$$$$$$$$$$$) { $custom_data = '' unless defined ($custom_data); $server_id = 0 unless defined ($server_id); $module_data = defined($module) ? $module->{'datos'} : '' unless defined ($module_data); - $module_status = defined($module) ? $module->{'estado'} : '' unless defined ($module_status); + $module_status = defined($module) ? $module->{'estado'} : 0 unless defined ($module_status); # If the event is created with validated status, assign ack_utimestamp my $ack_utimestamp = $event_status == 1 ? time() : 0; @@ -5062,6 +5074,7 @@ sub process_inc_abs_data ($$$$$$) { return $diff; } + sub log4x_get_severity_num($) { my ($data_object) = @_; my $data = $data_object->{'severity'}; @@ -5996,10 +6009,6 @@ sub pandora_self_monitoring ($$) { $pandoradb = 1; } - my $start_performance = time; - get_db_value($dbh, "SELECT COUNT(*) FROM tagente_datos"); - my $read_speed = int((time - $start_performance) * 1e6); - my $elasticsearch_perfomance = enterprise_hook("elasticsearch_performance", [$pa_config, $dbh]); $xml_output .= $elasticsearch_perfomance if defined($elasticsearch_perfomance); @@ -6046,13 +6055,6 @@ sub pandora_self_monitoring ($$) { $xml_output .=" "; } - $xml_output .=" "; - $xml_output .=" Execution_Time"; - $xml_output .=" generic_data"; - $xml_output .=" us"; - $xml_output .=" $read_speed"; - $xml_output .=" "; - $xml_output .= ""; my $filename = $pa_config->{"incomingdir"}."/".$pa_config->{'servername'}.".self.".$utimestamp.".data"; @@ -6061,82 +6063,69 @@ sub pandora_self_monitoring ($$) { print XMLFILE $xml_output; close (XMLFILE); } -########################################################################## -=head2 C<< xml_module_template (I<$module_name>, I<$module_type>, I<$module_data>) >> -Module template for sample agent +########################################################################## +=head2 C<< pandora_thread_monitoring (I<$pa_config>, I<$dbh>, I<$servers>) >> + +Generate stats for Pandora FMS threads. =cut ########################################################################## -sub xml_module_template ($$$) { - my ($module_name, $module_type, $module_data) = @_; - my $output = "\n"; - - $module_name = "" if $module_name =~ /[\s+.]+/; - $module_data = "" if $module_data =~ /[\s+.]+/; - - $output .= "\t".$module_name."\n"; - $output .= "\t".$module_type."\n"; - $output .= "\t".$module_data."\n"; - $output .= "\n"; - - return $output; -} -########################################################################## -=head2 C<< pandora_sample_agent (I<$pa_config>) >> - -Pandora agent for make sample data - -=cut -########################################################################## -sub pandora_sample_agent ($) { - - my ($pa_config) = @_; +sub pandora_thread_monitoring ($$$) { + my ($pa_config, $dbh, $servers) = @_; my $utimestamp = time (); my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime()); - # First line - my $xml_output = "\n"; - # Header - $xml_output = "\n"; - # Boolean ever return TRUE - $xml_output .= xml_module_template ("Boolean ever true", "generic_proc","1"); - # Boolean return TRUE at 80% of times - my $sample_boolean_mostly_true = 1; - $sample_boolean_mostly_true = 0 if rand(9) > 7; - $xml_output .= xml_module_template ("Boolean mostly true", "generic_proc",$sample_boolean_mostly_true); - # Boolean return false at 80% of times - my $sample_boolean_mostly_false = 0; - $sample_boolean_mostly_false = 1 if rand(9) > 7; - $xml_output .= xml_module_template ("Boolean mostly false", "generic_proc", $sample_boolean_mostly_false); - # Boolean ever return FALSE - $xml_output .= xml_module_template ("Boolean ever false", "generic_proc","0"); - # Random integer between 0 and 100 - $xml_output .= xml_module_template ("Random integer values", "generic_data",int(rand(100))); - # Random values obtained with sinusoidal curves between 0 and 100 values - my $b = 1; - my $sample_serie_curve = 1 + cos(deg2rad($b)); - $b = $b + rand(20)/10; - $b = 0 if ($b > 180); - $sample_serie_curve = $sample_serie_curve * $b * 10; - $sample_serie_curve =~ s/\,/\./g; - $xml_output .= xml_module_template ("Random serie curve", "generic_data", $sample_serie_curve); - # String with 10 random characters - my $sample_random_text = ""; - my @characters = ('a'..'z','A'..'Z'); - for (1...10){ - $sample_random_text .= $characters[int(rand(@characters))]; - } - $xml_output .= xml_module_template ("Random text", "generic_data_string", $sample_random_text); - # End of xml - $xml_output .= ""; - # File path definition - my $filename = $pa_config->{"incomingdir"}."/".$pa_config->{'servername'}.".sample.".$utimestamp.".data"; - # Opening, Writing and closing of XML - open (my $xmlfile, ">", $filename) or die "[FATAL] Could not open sample XML file for deploying monitorization at '$filename'"; - print $xmlfile $xml_output; - close ($xmlfile); + my $xml_output = ""; + + $xml_output = "{'version'} . "' agent_name='".$pa_config->{'servername'} . "' agent_alias='".$pa_config->{'servername'} . "' interval='".$pa_config->{"self_monitoring_interval"}."' timestamp='".$timestamp."' >"; + foreach my $server (@{$servers}) { + while (my ($tid, $stats) = each(%{$server->getProducerStats()})) { + $xml_output .=" "; + $xml_output .=" " . uc($ServerTypes[$server->{'_server_type'}]) . " Producer Status"; + $xml_output .=" generic_proc"; + $xml_output .=" System"; + $xml_output .=" " . (time() - $stats->{'tstamp'} < 2 * $pa_config->{"self_monitoring_interval"} ? 1 : 0) . ""; + $xml_output .=" "; + + $xml_output .=" "; + $xml_output .=" " . uc($ServerTypes[$server->{'_server_type'}]) . " Producer Processing Rate"; + $xml_output .=" generic_data"; + $xml_output .=" Performance"; + $xml_output .=" " . $stats->{'rate'} . ""; + $xml_output .=" tasks/second"; + $xml_output .=" "; + } + + my $idx = 0; + my $consumer_stats = $server->getConsumerStats(); + foreach my $tid (sort(keys(%{$consumer_stats}))) { + my $stats = $consumer_stats->{$tid}; + + $idx += 1; + $xml_output .=" "; + $xml_output .=" " . uc($ServerTypes[$server->{'_server_type'}]) . " Consumer #$idx Status"; + $xml_output .=" generic_proc"; + $xml_output .=" System"; + $xml_output .=" " . (time() - $stats->{'tstamp'} < 2 * $pa_config->{"self_monitoring_interval"} ? 1 : 0) . ""; + $xml_output .=" "; + + $xml_output .=" "; + $xml_output .=" " . uc($ServerTypes[$server->{'_server_type'}]) . " Consumer #$idx Processing Rate"; + $xml_output .=" generic_data"; + $xml_output .=" Performance"; + $xml_output .=" " . $stats->{'rate'} . ""; + $xml_output .=" tasks/second"; + $xml_output .=" "; + } + } + $xml_output .= ""; + + my $filename = $pa_config->{"incomingdir"}."/".$pa_config->{'servername'}.".threads.".$utimestamp.".data"; + open (XMLFILE, ">", $filename) or die "[FATAL] Could not write to the thread monitoring XML file '$filename'"; + print XMLFILE $xml_output; + close (XMLFILE); } ########################################################################## @@ -6214,7 +6203,7 @@ sub pandora_module_unknown ($$) { ') ) AND tagente_estado.utimestamp != 0 - AND (tagente_estado.current_interval * ?) + tagente_estado.utimestamp < UNIX_TIMESTAMP()', $pa_config->{'unknown_interval'}); + AND (tagente_estado.current_interval * ?) + tagente_estado.utimestamp < UNIX_TIMESTAMP() LIMIT ?', $pa_config->{'unknown_interval'}, $pa_config->{'unknown_block_size'}); foreach my $module (@modules) { @@ -7197,6 +7186,278 @@ sub notification_get_groups { return @results; } +################################################################################ +################################################################################ +## Inventory XML data +################################################################################ +################################################################################ + + +################################################################################ +# Process inventory data, creating the module if necessary. +################################################################################ +sub process_inventory_data ($$$$$$$) { + my ($pa_config, $data, $server_id, $agent_name, + $interval, $timestamp, $dbh) = @_; + + foreach my $inventory (@{$data->{'inventory'}}) { + + # Process inventory modules + foreach my $module_data (@{$inventory->{'inventory_module'}}) { + + my $module_name = get_tag_value ($module_data, 'name', ''); + + # Unnamed module + next if ($module_name eq ''); + + # Process inventory data + my $data_list = ''; + foreach my $list (@{$module_data->{'datalist'}}) { + + # Empty list + next unless defined ($list->{'data'}); + + foreach my $data (@{$list->{'data'}}) { + $data_list .= $data . "\n"; + } + } + + next if ($data_list eq ''); + process_inventory_module_data ($pa_config, $data_list, $server_id, $agent_name, $module_name, $interval, $timestamp, $dbh); + } + } +} + +################################################################################ +# Process inventory module data, creating the module if necessary. +################################################################################ +sub process_inventory_module_data ($$$$$$$$) { + my ($pa_config, $data, $server_id, $agent_name, + $module_name, $interval, $timestamp, $dbh) = @_; + + logger ($pa_config, "Processing inventory module '$module_name' for agent '$agent_name'.", 10); + + # Get agent data + my $agent = get_db_single_row ($dbh, + 'SELECT * FROM tagente WHERE nombre = ?', safe_input($agent_name)); + if (! defined ($agent)) { + logger ($pa_config, "Agent '$agent_name' not found for inventory module '$module_name'.", 3); + return; + } + + # Parse the timestamp and process the module + if ($timestamp !~ /(\d+)\/(\d+)\/(\d+) +(\d+):(\d+):(\d+)/ && + $timestamp !~ /(\d+)\-(\d+)\-(\d+) +(\d+):(\d+):(\d+)/) { + logger($pa_config, "Invalid timestamp '$timestamp' from module '$module_name' agent '$agent_name'.", 3); + return; + } + my $utimestamp; + eval { + $utimestamp = strftime("%s", $6, $5, $4, $3, $2 - 1, $1 - 1900); + }; + if ($@) { + logger($pa_config, "Invalid timestamp '$timestamp' from module '$module_name' agent '$agent_name'.", 3); + return; + } + + # Get module data or create it if it does not exist + my $inventory_module = get_db_single_row ($dbh, + 'SELECT tagent_module_inventory.*, tmodule_inventory.name + FROM tagent_module_inventory, tmodule_inventory + WHERE tagent_module_inventory.id_module_inventory = tmodule_inventory.id_module_inventory + AND id_agente = ? AND name = ?', + $agent->{'id_agente'}, safe_input($module_name)); + + + + if (! defined ($inventory_module)) { + # Get the module + my $module_id = get_db_value ($dbh, + 'SELECT id_module_inventory FROM tmodule_inventory WHERE name = ? AND id_os = ?', + safe_input($module_name), $agent->{'id_os'}); + return unless defined ($module_id); + + my $id_agent_module_inventory = 0; + # Update the module data + + $id_agent_module_inventory = db_insert ($dbh, 'id_agent_module_inventory', + "INSERT INTO tagent_module_inventory (id_agente, id_module_inventory, + ${RDBMS_QUOTE}interval${RDBMS_QUOTE}, data, timestamp, utimestamp, flag) + VALUES (?, ?, ?, ?, ?, ?, ?)", + $agent->{'id_agente'}, $module_id, $interval, safe_input($data), $timestamp, $utimestamp, 0); + + + return unless ($id_agent_module_inventory > 0); + + db_do ($dbh, + 'INSERT INTO tagente_datos_inventory (id_agent_module_inventory, data, timestamp, utimestamp) + VALUES (?, ?, ?, ?)', + $id_agent_module_inventory, safe_input($data), $timestamp, $utimestamp); + + return; + } + + process_inventory_module_diff($pa_config, safe_input($data), + $inventory_module, $timestamp, $utimestamp, $dbh, $interval); +} + +################################################################################ +# Searching differences between incoming module and stored module, +# creating/updating module and event +################################################################################ +sub process_inventory_module_diff ($$$$$$;$) { + my ($pa_config, $incoming_data, $inventory_module, $timestamp, $utimestamp, $dbh, $interval) = @_; + + my $stored_data = $inventory_module->{'data'}; + my $agent_id = $inventory_module->{'id_agente'}; + my $stored_utimestamp = $inventory_module->{'utimestamp'}; + my $agent_module_inventory_id = $inventory_module->{'id_agent_module_inventory'}; + my $module_inventory_id = $inventory_module->{'id_module_inventory'}; + + + enterprise_hook('process_inventory_alerts', [$pa_config, $incoming_data, + $inventory_module, $timestamp, $utimestamp, $dbh, $interval]); + + # If there were any changes generate an event and save the new data + if (decode('UTF-8', $stored_data) ne $incoming_data) { + my $inventory_db = $stored_data; + my $inventory_new = $incoming_data; + my @inventory = split('\n', $inventory_new); + my $diff_new = ""; + my $diff_delete = ""; + + foreach my $inv (@inventory) { + my $inv_clean = quotemeta($inv); + if($inventory_db =~ m/$inv_clean/) { + $inventory_db =~ s/$inv_clean//g; + $inventory_new =~ s/$inv_clean//g; + } + else { + $diff_new .= "$inv\n"; + } + } + + # If any register is in the stored yet, we store as deleted + $inventory_db =~ s/\n\n*/\n/g; + $inventory_db =~ s/^\n//g; + + $diff_delete = $inventory_db; + + if($diff_new ne "") { + $diff_new = " NEW: '$diff_new' "; + } + if($diff_delete ne "") { + $diff_delete = " DELETED: '$diff_delete' "; + } + + db_do ($dbh, 'INSERT INTO tagente_datos_inventory (id_agent_module_inventory, data, timestamp, utimestamp) VALUES (?, ?, ?, ?)', + $agent_module_inventory_id, $incoming_data, $timestamp, $utimestamp); + + # Do not generate an event the first time the module runs + if ($stored_utimestamp != 0) { + my $inventory_changes_blacklist = pandora_get_config_value ($dbh, 'inventory_changes_blacklist'); + my $inventory_module_blocked = 0; + + if($inventory_changes_blacklist ne "") { + foreach my $inventory_id_excluded (split (',', $inventory_changes_blacklist)) { + # If the inventory_module_id is in the blacklist, the change will not be processed + if($inventory_module->{'id_module_inventory'} == $inventory_id_excluded) { + logger ($pa_config, "Inventory change omitted on inventory #$inventory_id_excluded due be on the changes blacklist", 10); + $inventory_module_blocked = 1; + } + } + } + + # If the inventory_module_id is in the blacklist, the change will not be processed + if ($inventory_module_blocked == 0) { + my $inventory_module_name = get_db_value ($dbh, "SELECT name FROM tmodule_inventory WHERE id_module_inventory = ?", $module_inventory_id); + return unless defined ($inventory_module_name); + + my $agent_name = get_agent_name ($dbh, $agent_id); + return unless defined ($agent_name); + + my $agent_alias = get_agent_alias ($dbh, $agent_id); + return unless defined ($agent_alias); + + my $group_id = get_agent_group ($dbh, $agent_id); + + + + $stored_data =~ s/&#x20;/ /g; + $incoming_data =~ s/&#x20;/ /g; + + my @values_stored = split(' ', $stored_data); + my @finalc_stored = (); + my @values_incoming = split(' ', $incoming_data); + my @finalc_incoming = (); + my @finalc_compare_added = (); + my @finalc_compare_deleted = (); + my @finalc_compare_updated = (); + my @finalc_compare_updated_del = (); + my @finalc_compare_updated_add = (); + my $temp_compare = (); + my $final_d = ''; + my $final_a = ''; + my $final_u = ''; + + + + foreach my $i (0 .. $#values_stored) { + $finalc_stored[$i] = $values_stored[$i]; + + if ( grep $_ eq $values_stored[$i], @values_incoming ) { + + } else { + # Use 'safe_output' to avoid double encode the entities when creating the event with 'pandora_event' + $final_d .= "DELETED RECORD: ".safe_output($values_stored[$i])."\n"; + } + } + + foreach my $i (0 .. $#values_incoming) { + $finalc_incoming[$i] = $values_incoming[$i]; + + if ( grep $_ eq $values_incoming[$i], @values_stored ) { + + } else { + # Use 'safe_output' to avoid double encode the entities when creating the event with 'pandora_event' + $final_a .= "NEW RECORD: ".safe_output($values_incoming[$i])."\n"; + } + } + + # foreach my $i (0 .. $#finalc_compare_deleted) { + # $finalc_compare_updated_del[$i] = split(';', $finalc_compare_deleted[$i]); + # $finalc_compare_updated_add[$i] = split(';', $finalc_compare_added[$i]); + # if($finalc_compare_updated_del[$i] ~~ @finalc_compare_updated_add){ + # $finalc_compare_updated[$i] = $finalc_compare_updated_del[$i]; + # } + # $finalc_compare_updated[$i] =~ s/DELETED RECORD:/UPDATED RECORD:/g; + # $finalc_compare_updated[$i] =~ s/NEW RECORD://g; + # } + + + pandora_event ($pa_config, "Configuration change:\n".$final_d.$final_a." for agent '" . safe_output($agent_alias) . "' module '" . safe_output($inventory_module_name) . "'.", $group_id, $agent_id, 0, 0, 0, "configuration_change", 0, $dbh); + } + } + } + + # Update the module data + if (defined($interval)) { + db_do ($dbh, 'UPDATE tagent_module_inventory + SET'. $RDBMS_QUOTE . 'interval' . + $RDBMS_QUOTE . '=?, data=?, timestamp=?, utimestamp=? + WHERE id_agent_module_inventory=?', + $interval, $incoming_data, $timestamp, + $utimestamp, $agent_module_inventory_id); + + } + else { + db_do ($dbh, 'UPDATE tagent_module_inventory + SET data = ?, timestamp = ?, utimestamp = ? + WHERE id_agent_module_inventory = ?', + $incoming_data, $timestamp, $utimestamp, $agent_module_inventory_id); + } +} + ########################################################################## =head2 C<< escalate_warning (I<$pa_config>, I<$agent>, I<$module>, I<$agent_status>, I<$new_status>, I<$known_status>) >> @@ -7272,6 +7533,175 @@ sub pandora_snmptrapd_still_working ($$) { } } + +################################################################################ +# Execute a cluster status module. +################################################################################ +sub exec_cluster_status_module ($$$$) { + my ($pa_config, $module, $server_id, $dbh) = @_; + + # Execute cluster modules. + my @modules = get_db_rows($dbh, + 'SELECT * + FROM tagente_modulo + WHERE tagente_modulo.id_agente = ? + AND tagente_modulo.disabled != 1 + AND tagente_modulo.tcp_port = 1', + $module->{'id_agente'}); + foreach my $agent_module (@modules) { + # Cluster active-active module. + if ($agent_module->{'prediction_module'} == 6) { + logger ($pa_config, "Executing cluster active-active critical module " . $agent_module->{'nombre'}, 10); + exec_cluster_aa_module($pa_config, $agent_module, $server_id, $dbh); + } + # Cluster active-passive module. + elsif ($agent_module->{'prediction_module'} == 7) { + logger ($pa_config, "Executing cluster active-passive critical module " . $agent_module->{'nombre'}, 10); + exec_cluster_ap_module($pa_config, $agent_module, $server_id, $dbh); + } + } + + # Get the status of cluster modules. + my $data = -1; + @modules = get_db_rows($dbh, + 'SELECT tagente_modulo.id_agente_modulo, tagente_estado.estado + FROM tagente_estado, tagente_modulo + WHERE tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo + AND tagente_modulo.disabled != 1 + AND tagente_modulo.tcp_port = 1 + AND tagente_modulo.id_agente = ?', + $module->{'id_agente'}); + foreach my $cluster_module (@modules) { + next if ($cluster_module->{'id_agente_modulo'} == $module->{'id_agente_modulo'}); # Skip the current module. + + # Critical. + if ($cluster_module->{'estado'} == MODULE_NORMAL && $data < 0) { + $data = 0; + } elsif ($cluster_module->{'estado'} == MODULE_WARNING && $data < 1) { + $data = 1; + } elsif (($cluster_module->{'estado'} == MODULE_CRITICAL || $cluster_module->{'estado'} == MODULE_UNKNOWN) && $data < 2) { + $data = 2; + } + } + + # No data. + if ($data < 0) { + pandora_update_module_on_error ($pa_config, $module, $dbh); + return; + } + + # Get the current timestamp. + my $utimestamp = time (); + my $timestamp = strftime("%Y-%m-%d %H:%M:%S", localtime($utimestamp)); + + # Update the module. + pandora_process_module($pa_config, {'data' => $data}, '', $module, '', $timestamp, $utimestamp, $server_id, $dbh); + + pandora_update_agent($pa_config, $timestamp, $module->{'id_agente'}, undef, undef, -1, $dbh); +} + +################################################################################ +# Execute a cluster active-active module. +################################################################################ +sub exec_cluster_aa_module ($$$$) { + my ($pa_config, $module, $server_id, $dbh) = @_; + + # Get the cluster item. + my $item = get_db_single_row($dbh, 'SELECT * FROM tcluster_item WHERE id=?', $module->{'custom_integer_2'}); + if (!defined($item)) { + pandora_update_module_on_error ($pa_config, $module, $dbh); + return; + } + + # Get cluster agents and compute the item status. + my ($not_normal, $total) = (0, 0); + my @agents = get_db_rows($dbh, 'SELECT id_agent FROM tcluster_agent WHERE id_cluster = ?', $module->{'custom_integer_1'}); + foreach my $agent_id (@agents) { + my $item_status = get_db_value($dbh, + 'SELECT estado + FROM tagente_estado, tagente_modulo + WHERE tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo + AND tagente_modulo.id_agente = ? + AND tagente_modulo.nombre = ?', + $agent_id->{'id_agent'}, $item->{'name'}); + + # Count modules in a status other than normal. + if (!defined($item_status) || $item_status != MODULE_NORMAL) { + $not_normal += 1; + } + + $total += 1; + } + + # No data. + if ($total < 1) { + pandora_update_module_on_error ($pa_config, $module, $dbh); + return; + } + + # Convert $not_normal to a percentage. + $not_normal = 100 * $not_normal / $total; + + # Get the current timestamp. + my $utimestamp = time (); + my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp)); + + # Update module + pandora_process_module ($pa_config, {'data' => $not_normal}, '', $module, '', $timestamp, $utimestamp, $server_id, $dbh); + + pandora_update_agent ($pa_config, $timestamp, $module->{'id_agente'}, undef, undef, -1, $dbh); +} + +################################################################################ +# Execute a cluster active-pasive module. +################################################################################ +sub exec_cluster_ap_module ($$$$) { + my ($pa_config, $module, $server_id, $dbh) = @_; + + # Get the cluster item. + my $item = get_db_single_row($dbh, 'SELECT * FROM tcluster_item WHERE id=?', $module->{'custom_integer_2'}); + if (!defined($item)) { + pandora_update_module_on_error ($pa_config, $module, $dbh); + return; + } + + # Get cluster agents and compute the item status. + my $data = undef; + my $utimestamp = 0; + my @agents = get_db_rows($dbh, 'SELECT id_agent FROM tcluster_agent WHERE id_cluster = ?', $module->{'custom_integer_1'}); + foreach my $agent_id (@agents) { + my $status = get_db_single_row($dbh, + 'SELECT datos, estado, utimestamp + FROM tagente_estado, tagente_modulo + WHERE tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo + AND tagente_modulo.id_agente = ? + AND tagente_modulo.nombre = ?', + $agent_id->{'id_agent'}, $item->{'name'}); + + # Get the most recent data. + if (defined($status) && $status->{'estado'} != MODULE_UNKNOWN && $status->{'utimestamp'} > $utimestamp) { + $utimestamp = $status->{'utimestamp'}; + $data = $status->{'datos'}; + } + } + + # No data. + if ($utimestamp == 0) { + pandora_update_module_on_error ($pa_config, $module, $dbh); + return; + } + + # Get the current timestamp. + $utimestamp = time (); + my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime($utimestamp)); + + # Update the module. + pandora_process_module ($pa_config, {'data' => $data }, '', $module, '', $timestamp, $utimestamp, $server_id, $dbh); + + # Update the agent. + pandora_update_agent ($pa_config, $timestamp, $module->{'id_agente'}, undef, undef, -1, $dbh); +} + # End of function declaration # End of defined Code diff --git a/pandora_server/lib/PandoraFMS/DB.pm b/pandora_server/lib/PandoraFMS/DB.pm index d02f9734ed..27ea483870 100644 --- a/pandora_server/lib/PandoraFMS/DB.pm +++ b/pandora_server/lib/PandoraFMS/DB.pm @@ -618,8 +618,13 @@ sub get_agent_status ($$$) { $module_status = 2; } elsif ($module_status != 2) { - if ($m_status == 0) { - $module_status = 0; + if ($m_status == 3) { + $module_status = 3; + } + elsif ($module_status != 3) { + if ($m_status == 0) { + $module_status = 0; + } } } } @@ -647,7 +652,7 @@ sub get_agent_status ($$$) { return 3; } } - + return $module_status; } @@ -1041,6 +1046,7 @@ sub get_db_rows_parallel ($$;@) { no warnings 'redefine'; local *PandoraFMS::ProducerConsumerServer::DESTROY = sub {}; local *PandoraFMS::BlockProducerConsumerServer::DESTROY = sub {}; + local *PandoraFMS::SNMPServer::DESTROY = sub {}; # Query the nodes. foreach my $node (@{$nodes}) { diff --git a/pandora_server/lib/PandoraFMS/DataServer.pm b/pandora_server/lib/PandoraFMS/DataServer.pm index e6df607f19..ac4364dca1 100644 --- a/pandora_server/lib/PandoraFMS/DataServer.pm +++ b/pandora_server/lib/PandoraFMS/DataServer.pm @@ -304,21 +304,22 @@ sub data_consumer ($$) { agent_unlock($pa_config, $agent_name); return; } - unlink ($file_name); - if (defined($xml_data->{'server_name'})) { - process_xml_server ($self->getConfig (), $file_name, $xml_data, $self->getDBH ()); - } elsif (defined($xml_data->{'connection_source'})) { - enterprise_hook('process_xml_connections', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]); - } elsif (defined($xml_data->{'ipam_source'})) { - enterprise_hook('process_xml_ipam', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]); - } elsif (defined($xml_data->{'network_matrix'})){ - process_xml_matrix_network( - $self->getConfig(), $xml_data, $self->getDBH() - ); - } else { - process_xml_data ($self->getConfig (), $file_name, $xml_data, $self->getServerID (), $self->getDBH ()); - } + + eval { + if (defined($xml_data->{'server_name'})) { + process_xml_server ($self->getConfig (), $file_name, $xml_data, $self->getDBH ()); + } elsif (defined($xml_data->{'connection_source'})) { + enterprise_hook('process_xml_connections', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]); + } elsif (defined($xml_data->{'ipam_source'})) { + enterprise_hook('process_xml_ipam', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]); + } elsif (defined($xml_data->{'network_matrix'})){ + process_xml_matrix_network( $self->getConfig(), $xml_data, $self->getDBH()); + } else { + process_xml_data ($self->getConfig (), $file_name, $xml_data, $self->getServerID (), $self->getDBH ()); + } + }; + agent_unlock($pa_config, $agent_name); return; } @@ -681,8 +682,7 @@ sub process_xml_data ($$$$$) { # Process inventory modules - enterprise_hook('process_inventory_data', [$pa_config, $data, $server_id, $agent_name, - $interval, $timestamp, $dbh]); + process_inventory_data($pa_config, $data, $server_id, $agent_name, $interval, $timestamp, $dbh); # Process log modules enterprise_hook('process_log_data', [$pa_config, $data, $server_id, $agent_name, @@ -1175,15 +1175,6 @@ sub process_xml_matrix_network { sub agent_lock { my ($pa_config, $dbh, $agent_name) = @_; - # Do not lock on LIFO mode if the agent already exist. - # get_agent_id will be called again from process_xml_data, - # so the should be no race conditions if the agent does - # not exist. - if ($pa_config->{'dataserver_lifo'} == 1 && - get_agent_id ($dbh, $agent_name) > 0) { - return 1; - } - $AgentSem->down (); if (defined ($Agents{$agent_name})) { $AgentSem->up (); diff --git a/pandora_server/lib/PandoraFMS/InventoryServer.pm b/pandora_server/lib/PandoraFMS/InventoryServer.pm new file mode 100644 index 0000000000..f0c92a7fd3 --- /dev/null +++ b/pandora_server/lib/PandoraFMS/InventoryServer.pm @@ -0,0 +1,267 @@ +package PandoraFMS::InventoryServer; + +########################################################################## +# Pandora FMS Inventory Server. +########################################################################## +# Copyright (c) 2007-2021 Artica Soluciones Tecnologicas S.L +# This code is not free or OpenSource. Please don't redistribute. +########################################################################## + +use strict; +use warnings; + +use threads; +use threads::shared; +use Thread::Semaphore; + +use File::Temp qw(tempfile unlink0); +use POSIX qw(strftime); +use HTML::Entities; +use MIME::Base64; +use JSON; + +# UTF-8 flags control with I/O for multibyte characters +use open ":utf8"; + +# Default lib dir for RPM and DEB packages +BEGIN { push @INC, '/usr/lib/perl5'; } + +use PandoraFMS::Tools; +use PandoraFMS::DB; +use PandoraFMS::Core; +use PandoraFMS::ProducerConsumerServer; + +# Inherits from PandoraFMS::ProducerConsumerServer +our @ISA = qw(PandoraFMS::ProducerConsumerServer); + +# Global variables +my @TaskQueue :shared; +my %PendingTasks :shared; +my $Sem :shared; +my $TaskSem :shared; + +######################################################################################## +# Inventory Server class constructor. +######################################################################################## +sub new ($$;$) { + my ($class, $config, $dbh) = @_; + + return undef unless $config->{'inventoryserver'} == 1; + + # Initialize semaphores and queues + @TaskQueue = (); + %PendingTasks = (); + $Sem = Thread::Semaphore->new; + $TaskSem = Thread::Semaphore->new (0); + + # Call the constructor of the parent class + my $self = $class->SUPER::new($config, INVENTORYSERVER, \&PandoraFMS::InventoryServer::data_producer, \&PandoraFMS::InventoryServer::data_consumer, $dbh); + + bless $self, $class; + return $self; +} + +############################################################################### +# Run. +############################################################################### +sub run ($) { + my $self = shift; + my $pa_config = $self->getConfig (); + + print_message ($pa_config, " [*] Starting " . $pa_config->{'rb_product_name'} . " Inventory Server.", 1); + $self->setNumThreads ($pa_config->{'inventory_threads'}); + $self->SUPER::run (\@TaskQueue, \%PendingTasks, $Sem, $TaskSem); +} + +############################################################################### +# Data producer. +############################################################################### +sub data_producer ($) { + my $self = shift; + my ($pa_config, $dbh) = ($self->getConfig (), $self->getDBH ()); + + my @tasks; + my @rows; + + if (pandora_is_master($pa_config) == 0) { + if ($pa_config->{'dbengine'} ne 'oracle') { + @rows = get_db_rows ($dbh, + 'SELECT tagent_module_inventory.id_agent_module_inventory, tagent_module_inventory.flag, tagent_module_inventory.timestamp + FROM tagente, tagent_module_inventory, tmodule_inventory + WHERE tagente.server_name = ? + AND tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory + AND tmodule_inventory.id_os IS NOT NULL + AND tagente.id_agente = tagent_module_inventory.id_agente + AND tagent_module_inventory.target <> \'\' + AND tagente.disabled = 0 + AND (tagent_module_inventory.timestamp = \'1970-01-01 00:00:00\' + OR UNIX_TIMESTAMP(tagent_module_inventory.timestamp) + tagent_module_inventory.interval < UNIX_TIMESTAMP() + OR tagent_module_inventory.flag = 1) + ORDER BY tagent_module_inventory.timestamp ASC', + $pa_config->{'servername'}); + } + else { + @rows = get_db_rows ($dbh, + 'SELECT tagent_module_inventory.id_agent_module_inventory, tagent_module_inventory.flag, tagent_module_inventory.timestamp + FROM tagente, tagent_module_inventory, tmodule_inventory + WHERE tagente.server_name = ? + AND tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory + AND tmodule_inventory.id_os IS NOT NULL + AND tagente.id_agente = tagent_module_inventory.id_agente + AND tagent_module_inventory.target IS NOT NULL + AND tagente.disabled = 0 + AND (tagent_module_inventory.timestamp = \'1970-01-01 00:00:00\' + OR UNIX_TIMESTAMP(tagent_module_inventory.timestamp) + tagent_module_inventory.' . ${RDBMS_QUOTE} . 'interval' . ${RDBMS_QUOTE} . '< UNIX_TIMESTAMP() + OR tagent_module_inventory.flag = 1) + ORDER BY tagent_module_inventory.timestamp ASC', + $pa_config->{'servername'}); + } + } + else { + if ($pa_config->{'dbengine'} ne 'oracle') { + @rows = get_db_rows ($dbh, + 'SELECT tagent_module_inventory.id_agent_module_inventory, tagent_module_inventory.flag, tagent_module_inventory.timestamp + FROM tagente, tagent_module_inventory, tmodule_inventory + WHERE (server_name = ? OR server_name = ANY(SELECT name FROM tserver WHERE status <> 1 AND server_type = ?)) + AND tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory + AND tmodule_inventory.id_os IS NOT NULL + AND tagente.id_agente = tagent_module_inventory.id_agente + AND tagent_module_inventory.target <> \'\' + AND tagente.disabled = 0 + AND (tagent_module_inventory.timestamp = \'1970-01-01 00:00:00\' + OR UNIX_TIMESTAMP(tagent_module_inventory.timestamp) + tagent_module_inventory.interval < UNIX_TIMESTAMP() + OR tagent_module_inventory.flag = 1) + ORDER BY tagent_module_inventory.timestamp ASC', + $pa_config->{'servername'}, INVENTORYSERVER); + } + else { + @rows = get_db_rows ($dbh, + 'SELECT tagent_module_inventory.id_agent_module_inventory, tagent_module_inventory.flag, tagent_module_inventory.timestamp + FROM tagente, tagent_module_inventory, tmodule_inventory + WHERE (server_name = ? OR server_name = ANY(SELECT name FROM tserver WHERE status <> 1 AND server_type = ?)) + AND tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory + AND tmodule_inventory.id_os IS NOT NULL + AND tagente.id_agente = tagent_module_inventory.id_agente + AND tagent_module_inventory.target IS NOT NULL + AND tagente.disabled = 0 + AND (tagent_module_inventory.timestamp = \'1970-01-01 00:00:00\' + OR UNIX_TIMESTAMP(tagent_module_inventory.timestamp) + tagent_module_inventory.' . ${RDBMS_QUOTE} . 'interval' . ${RDBMS_QUOTE} . ' < UNIX_TIMESTAMP() + OR tagent_module_inventory.flag = 1) + ORDER BY tagent_module_inventory.timestamp ASC', + $pa_config->{'servername'}, INVENTORYSERVER); + } + } + + foreach my $row (@rows) { + + # Reset forced execution flag + if ($row->{'flag'} == 1) { + db_do ($dbh, 'UPDATE tagent_module_inventory SET flag = 0 WHERE id_agent_module_inventory = ?', $row->{'id_agent_module_inventory'}); + } + + push (@tasks, $row->{'id_agent_module_inventory'}); + } + + return @tasks; +} + +############################################################################### +# Data consumer. +############################################################################### +sub data_consumer ($$) { + my ($self, $module_id) = @_; + my ($pa_config, $dbh) = ($self->getConfig (), $self->getDBH ()); + + my $timeout = $pa_config->{'inventory_timeout'}; + + # Get inventory module data + my $module = get_db_single_row ($dbh, + 'SELECT * FROM tagent_module_inventory, tmodule_inventory + WHERE tagent_module_inventory.id_agent_module_inventory = ? + AND tagent_module_inventory.id_module_inventory = tmodule_inventory.id_module_inventory', + $module_id); + + # No code to run + return if ($module->{'interpreter'} eq ''); + + # Save script in a temporary file + my ($fh, $temp_file) = tempfile(); + $fh->print (decode_base64($module->{'code'})); + close ($fh); + set_file_permissions($pa_config, $temp_file, "0777"); + + # Run the script + my $command = $module->{'interpreter'} . ' ' . $temp_file . ' "' . $module->{'target'} . '"'; + + # Try to read the custom fields to use them as arguments into the command + if (defined($module->{'custom_fields'}) && $module->{'custom_fields'} ne '') { + my $decoded_cfields; + + eval { + $decoded_cfields = decode_json (decode_base64 ($module->{'custom_fields'})); + }; + if ($@) { + logger($pa_config, "Failed to encode received inventory data", 10); + } + + if (!defined ($decoded_cfields)) { + logger ($pa_config, "Remote inventory module ".$module->{'name'}." has failed because the custom fields can't be read", 6); + unlink ($temp_file); + return; + } + + foreach my $field (@{$decoded_cfields}) { + if ($field->{'secure'}) { + $command .= ' "' . pandora_output_password($pa_config, $field->{'value'}) . '"'; + } + else { + $command .= ' "' . $field->{'value'} . '"'; + } + } + } + # Add the default user/password arguments to the command + else { + # Initialize macros. + my %macros = ( + '_agentcustomfield_\d+_' => undef, + ); + + my $wmi_user = safe_output(subst_column_macros($module->{"username"}, \%macros, $pa_config, $dbh, undef, $module)); + my $wmi_pass = safe_output(pandora_output_password($pa_config, subst_column_macros($module->{"password"}, \%macros, $pa_config, $dbh, undef, $module))); + $command .= ' "' . $wmi_user . '" "' . $wmi_pass . '"'; + } + + logger ($pa_config, "Inventory execution command $command", 10); + my $data = `$command 2>$DEVNULL`; + + # Check for errors + if ($? != 0) { + logger ($pa_config, "Remote inventory module ".$module->{'name'}." has failed with error level $?", 6); + unlink ($temp_file); + return; + } + + unlink ($temp_file); + my $utimestamp = time (); + my $timestamp = strftime ("%Y-%m-%d %H:%M:%S", localtime ($utimestamp)); + eval { + $data = encode_entities ($data, "'<>&"); + }; + if ($@) { + logger($pa_config, "Failed to encode received inventory data", 10); + return; + } + + # Get previous data from the database + my $inventory_module = get_db_single_row ($dbh, + 'SELECT * FROM tagent_module_inventory + WHERE id_agent_module_inventory = ?', + $module_id); + return unless defined ($inventory_module); + + process_inventory_module_diff($pa_config, $data, + $inventory_module, $timestamp, $utimestamp, $dbh); +} + +1; +__END__ diff --git a/pandora_server/lib/PandoraFMS/PluginTools.pm b/pandora_server/lib/PandoraFMS/PluginTools.pm index bb2fdef5d5..5a9357a3d8 100644 --- a/pandora_server/lib/PandoraFMS/PluginTools.pm +++ b/pandora_server/lib/PandoraFMS/PluginTools.pm @@ -33,8 +33,8 @@ use base 'Exporter'; our @ISA = qw(Exporter); # version: Defines actual version of Pandora Server for this module only -my $pandora_version = "7.0NG.766"; -my $pandora_build = "221122"; +my $pandora_version = "7.0NG.768"; +my $pandora_build = "230210"; our $VERSION = $pandora_version." ".$pandora_build; our %EXPORT_TAGS = ( 'all' => [ qw() ] ); diff --git a/pandora_server/lib/PandoraFMS/PredictionServer.pm b/pandora_server/lib/PandoraFMS/PredictionServer.pm index 1fd05730cd..1225ab5b19 100644 --- a/pandora_server/lib/PandoraFMS/PredictionServer.pm +++ b/pandora_server/lib/PandoraFMS/PredictionServer.pm @@ -207,21 +207,21 @@ sub exec_prediction_module ($$$$) { # Cluster status module. if ($agent_module->{'prediction_module'} == 5) { logger ($pa_config, "Executing cluster status module " . $agent_module->{'nombre'}, 10); - enterprise_hook ('exec_cluster_status_module', [$pa_config, $agent_module, $server_id, $dbh]); + exec_cluster_status_module($pa_config, $agent_module, $server_id, $dbh); return; } # Cluster active-active module. if ($agent_module->{'prediction_module'} == 6) { logger ($pa_config, "Executing cluster active-active module " . $agent_module->{'nombre'}, 10); - enterprise_hook ('exec_cluster_aa_module', [$pa_config, $agent_module, $server_id, $dbh]); + exec_cluster_aa_module($pa_config, $agent_module, $server_id, $dbh); return; } # Cluster active-passive module. if ($agent_module->{'prediction_module'} == 7) { logger ($pa_config, "Executing cluster active-passive module " . $agent_module->{'nombre'}, 10); - enterprise_hook ('exec_cluster_ap_module', [$pa_config, $agent_module, $server_id, $dbh]); + exec_cluster_ap_module($pa_config, $agent_module, $server_id, $dbh); return; } diff --git a/pandora_server/lib/PandoraFMS/ProducerConsumerServer.pm b/pandora_server/lib/PandoraFMS/ProducerConsumerServer.pm index 11026ae0b2..770bc06522 100644 --- a/pandora_server/lib/PandoraFMS/ProducerConsumerServer.pm +++ b/pandora_server/lib/PandoraFMS/ProducerConsumerServer.pm @@ -89,6 +89,15 @@ sub run ($$$$$) { # Launch consumer threads for (1..$self->getNumThreads ()) { + + # Enable consumer stats + my $consumer_stats = shared_clone({ + 'tstamp' => time(), + 'rate' => 0, + 'rate_count' => 0, + 'rate_tstamp' => time() + }); + my $thr = threads->create ({'exit' => 'thread_only'}, sub { my ($self, $task_queue, $pending_tasks, $sem, $task_sem) = @_; @@ -98,13 +107,29 @@ sub run ($$$$$) { $sem->up(); exit 0; }; + + # Make consumer stats reachable from the thread + $self->{'_consumer_stats'}->{threads->tid()} = $consumer_stats; + PandoraFMS::ProducerConsumerServer::data_consumer->(@_); }, $self, $task_queue, $pending_tasks, $sem, $task_sem ); return unless defined ($thr); $self->addThread ($thr->tid ()); + + # Make consumer stats reachable from the main program + $self->{'_consumer_stats'}->{$thr->tid()} = $consumer_stats; } + + # Enable producer stats + my $producer_stats = shared_clone({ + 'tstamp' => time(), + 'rate' => 0, + 'rate_count' => 0, + 'rate_tstamp' => time() + }); + # Launch producer thread my $thr = threads->create ({'exit' => 'thread_only'}, sub { @@ -115,11 +140,18 @@ sub run ($$$$$) { $sem->up(); exit 0; }; + + # Make producer stats reachable from the thread + $self->{'_producer_stats'}->{threads->tid()} = $producer_stats; + PandoraFMS::ProducerConsumerServer::data_producer->(@_); }, $self, $task_queue, $pending_tasks, $sem, $task_sem ); return unless defined ($thr); $self->addThread ($thr->tid ()); + + # Make producer stats reachable from the main program + $self->{'_producer_stats'}->{$thr->tid()} = $producer_stats; } ############################################################################### @@ -130,46 +162,50 @@ sub data_producer ($$$$$) { my $pa_config = $self->getConfig (); my $dbh; - eval { - # Connect to the DB - $dbh = db_connect ($pa_config->{'dbengine'}, $pa_config->{'dbname'}, $pa_config->{'dbhost'}, $pa_config->{'dbport'}, - $pa_config->{'dbuser'}, $pa_config->{'dbpass'}); - $self->setDBH ($dbh); + while ($RUN == 1) { + eval { + # Connect to the DB + $dbh = db_connect ($pa_config->{'dbengine'}, $pa_config->{'dbname'}, $pa_config->{'dbhost'}, $pa_config->{'dbport'}, + $pa_config->{'dbuser'}, $pa_config->{'dbpass'}); + $self->setDBH ($dbh); - while ($RUN == 1) { + while ($RUN == 1) { - # Get pending tasks - $self->logThread('[PRODUCER] Queuing tasks.'); - my @tasks = &{$self->{'_producer'}}($self); - - foreach my $task (@tasks) { - $sem->down; + # Get pending tasks + $self->logThread('[PRODUCER] Queuing tasks.'); + my @tasks = &{$self->{'_producer'}}($self); - last if ($RUN == 0); - if (defined $pending_tasks->{$task}) { - $sem->up; - next; - } + foreach my $task (@tasks) { + $sem->down; - # Queue task and signal consumers - $pending_tasks->{$task} = 0; - push (@{$task_queue}, $task); - $task_sem->up; - - $sem->up; + last if ($RUN == 0); + if (defined $pending_tasks->{$task}) { + $sem->up; + next; + } + + # Queue task and signal consumers + $pending_tasks->{$task} = 0; + push (@{$task_queue}, $task); + $task_sem->up; + + $sem->up; + } + + last if ($RUN == 0); + + # Update queue size and thread stats + $self->setQueueSize (scalar @{$task_queue}); + $self->updateProducerStats(scalar(@tasks)); + + threads->yield; + usleep (int(1e6 * $self->getPeriod())); } - - last if ($RUN == 0); - # Update queue size for statistics - $self->setQueueSize (scalar @{$task_queue}); - - threads->yield; - usleep (int(1e6 * $self->getPeriod())); + }; + + if ($@) { + print STDERR $@; } - }; - - if ($@) { - $self->setErrStr ($@); } $task_sem->up($self->getNumThreads ()); @@ -185,40 +221,51 @@ sub data_consumer ($$$$$) { my $pa_config = $self->getConfig (); my $dbh; - eval { - # Connect to the DB - $dbh = db_connect ($pa_config->{'dbengine'}, $pa_config->{'dbname'}, $pa_config->{'dbhost'}, $pa_config->{'dbport'}, - $pa_config->{'dbuser'}, $pa_config->{'dbpass'}); - $self->setDBH ($dbh); + my $sem_timeout = $pa_config->{'self_monitoring_interval'} > 0 ? + $pa_config->{'self_monitoring_interval'} : + 300; + while ($RUN == 1) { + eval { + # Connect to the DB + $dbh = db_connect ($pa_config->{'dbengine'}, $pa_config->{'dbname'}, $pa_config->{'dbhost'}, $pa_config->{'dbport'}, + $pa_config->{'dbuser'}, $pa_config->{'dbpass'}); + $self->setDBH ($dbh); - while ($RUN == 1) { - # Wait for data - $self->logThread('[CONSUMER] Waiting for data.'); - $task_sem->down; + while ($RUN == 1) { + # Wait for data + $self->logThread('[CONSUMER] Waiting for data.'); + while (!$task_sem->down_timed($sem_timeout)) { + $self->updateConsumerStats(0); + } - $sem->down; - last if ($RUN == 0); - my $task = shift (@{$task_queue}); - $sem->up; + last if ($RUN == 0); - # The consumer was waiting for data when the producer exited - last if ($RUN == 0); - - # Execute task - $self->logThread("[CONSUMER] Executing task: $task"); - &{$self->{'_consumer'}}($self, $task); + $sem->down; + my $task = shift (@{$task_queue}); + $sem->up; - # Update task status - $sem->down; - delete ($pending_tasks->{$task}); - $sem->up; + # The consumer was waiting for data when the producer exited + last if ($RUN == 0); + + # Execute task + $self->logThread("[CONSUMER] Executing task: $task"); + &{$self->{'_consumer'}}($self, $task); - threads->yield; + # Update thread stats + $self->updateConsumerStats(1); + + # Update task status + $sem->down; + delete ($pending_tasks->{$task}); + $sem->up; + + threads->yield; + } + }; + + if ($@) { + print STDERR $@; } - }; - - if ($@) { - $self->setErrStr ($@); } db_disconnect ($dbh); diff --git a/pandora_server/lib/PandoraFMS/SNMPServer.pm b/pandora_server/lib/PandoraFMS/SNMPServer.pm index 581c1b441d..5d772ea5f5 100644 --- a/pandora_server/lib/PandoraFMS/SNMPServer.pm +++ b/pandora_server/lib/PandoraFMS/SNMPServer.pm @@ -147,7 +147,9 @@ sub data_producer ($) { # Reset storm protection counters my $curr_time = time (); - if ($pa_config->{"__storm_ref__"} + $pa_config->{"snmp_storm_timeout"} < $curr_time) { + if ($pa_config->{"__storm_ref__"} + $pa_config->{"snmp_storm_timeout"} < $curr_time + || $pa_config->{'snmpconsole_lock'} == 1 + ) { $pa_config->{"__storm_ref__"} = $curr_time; %AGENTS = (); } diff --git a/pandora_server/lib/PandoraFMS/Server.pm b/pandora_server/lib/PandoraFMS/Server.pm index 41a07b1418..9009c2bbf3 100644 --- a/pandora_server/lib/PandoraFMS/Server.pm +++ b/pandora_server/lib/PandoraFMS/Server.pm @@ -47,7 +47,9 @@ sub new ($$$;$) { _threads => [], _queue_size => 0, _errstr => '', - _period => 0 + _period => 0, + _producer_stats => {}, + _consumer_stats => {}, }; # Share variables that may be set from different threads @@ -176,6 +178,24 @@ sub getServerType ($) { return $self->{'_server_type'}; } +######################################################################################## +# Return consumer stats. +######################################################################################## +sub getConsumerStats ($) { + my $self = shift; + + return $self->{'_consumer_stats'}; +} + +######################################################################################## +# Return producer stats. +######################################################################################## +sub getProducerStats ($) { + my $self = shift; + + return $self->{'_producer_stats'}; +} + ######################################################################################## # Set error string. ######################################################################################## @@ -337,6 +357,52 @@ sub stop ($) { } } +######################################################################################## +# Update stats for the current thread. +######################################################################################## +sub updateStats ($$$) { + my ($self, $dest, $inc) = @_; + my $tid = threads->tid(); + my $curr_time = time(); + + # Stats disabled for this thread. + if (!defined($dest->{$tid})) { + return; + } + + # Update the timestamp and count. + $dest->{$tid}->{'tstamp'} = time(); + $dest->{$tid}->{'rate_count'} += $inc; + + # Compute the processing rate. + my $elapsed = $curr_time - $dest->{$tid}->{'rate_tstamp'}; + if ($elapsed >= $self->{'_pa_config'}->{'self_monitoring_interval'}) { + $dest->{$tid}->{'rate'} = $dest->{$tid}->{'rate_count'} / $elapsed; + $dest->{$tid}->{'rate_count'} = 0; + $dest->{$tid}->{'rate_tstamp'} = $curr_time; + return; + } +} + + +######################################################################################## +# Update producer stats. +######################################################################################## +sub updateProducerStats ($$) { + my ($self, $queued_tasks) = @_; + + $self->updateStats($self->{'_producer_stats'}, $queued_tasks); +} + +######################################################################################## +# Update consumer stats. +######################################################################################## +sub updateConsumerStats ($$) { + my ($self, $processed_tasks) = @_; + + $self->updateStats($self->{'_consumer_stats'}, $processed_tasks); +} + # End of function declaration # End of defined Code diff --git a/pandora_server/lib/PandoraFMS/Tools.pm b/pandora_server/lib/PandoraFMS/Tools.pm index f922e75854..590fdf2020 100755 --- a/pandora_server/lib/PandoraFMS/Tools.pm +++ b/pandora_server/lib/PandoraFMS/Tools.pm @@ -72,7 +72,6 @@ our @EXPORT = qw( SNMPSERVER SATELLITESERVER MFSERVER - TRANSACTIONALSERVER SYNCSERVER SYSLOGSERVER WUXSERVER @@ -2837,7 +2836,6 @@ sub get_server_name { return "ICMPSERVER" if ($server_type eq ICMPSERVER); return "SNMPSERVER" if ($server_type eq SNMPSERVER); return "SATELLITESERVER" if ($server_type eq SATELLITESERVER); - return "TRANSACTIONALSERVER" if ($server_type eq TRANSACTIONALSERVER); return "MFSERVER" if ($server_type eq MFSERVER); return "SYNCSERVER" if ($server_type eq SYNCSERVER); return "WUXSERVER" if ($server_type eq WUXSERVER); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 22a07d1dbb..35238d78ba 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -2,8 +2,8 @@ # Pandora FMS Server # %define name pandorafms_server -%define version 7.0NG.766 -%define release 221122 +%define version 7.0NG.768 +%define release 230210 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index fc88dbc5c0..ab61c7894d 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -2,8 +2,8 @@ # Pandora FMS Server # %define name pandorafms_server -%define version 7.0NG.766 -%define release 221122 +%define version 7.0NG.768 +%define release 230210 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 9c6d45dd6b..4a3432fbfe 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -8,8 +8,8 @@ # This code is licensed under GPL 2.0 license. # ********************************************************************** -PI_VERSION="7.0NG.766" -PI_BUILD="221122" +PI_VERSION="7.0NG.768" +PI_BUILD="230210" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_count.sh b/pandora_server/util/pandora_count.sh index 9aec192f31..7e15e6b144 100755 --- a/pandora_server/util/pandora_count.sh +++ b/pandora_server/util/pandora_count.sh @@ -1,12 +1,12 @@ #!/bin/bash -echo "Small tool to measure data processing throughput for a Pandora FMS data server" -echo "(c) 2010-2015 Sancho Lerena, slerena@gmail.com" +echo "Small tool to measure data processing throughput for a Pandora FMS Data server" +echo "(c) 2010-2023 Pandora FMS Team" ANT=0 while [ 1 ] do - ACT=`find /var/spool/pandora/data_in | wc -l` + ACT=`find /var/spool/pandora/data_in -maxdepth 1 -type f | wc -l` if [ $ANT != 0 ] then RES=`expr $ANT - $ACT` diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 9c0315ece8..15b8b0897e 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.766 Build 221122"; +my $version = "7.0NG.768 Build 230210"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_dbstress.pl b/pandora_server/util/pandora_dbstress.pl index 4f74631bdf..6289f68745 100755 --- a/pandora_server/util/pandora_dbstress.pl +++ b/pandora_server/util/pandora_dbstress.pl @@ -188,7 +188,7 @@ sub process_module($$$$$){ $data_object{"data"} = $valor; - pandora_process_module ($pa_config, \%data_object, $agent, $module, '', $timestamp, $utimestamp, 1, $dbh, ""); + pandora_process_module ($pa_config, \%data_object, $agent, $module, '', $timestamp, $utimestamp, 1, $dbh); pandora_update_agent($pa_config, $timestamp, $target_agent, undef, undef, -1, $dbh); $modules_processed++; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 7c55364fce..b0839f05af 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -21,7 +21,7 @@ use JSON qw(decode_json encode_json); use MIME::Base64; use Encode qw(decode encode_utf8); use LWP::Simple; -#use Data::Dumper; +use Data::Dumper; # Default lib dir for RPM and DEB packages BEGIN { push @INC, '/usr/lib/perl5'; } @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.766 Build 221122"; +my $version = "7.0NG.768 Build 230210"; # save program name for logging my $progname = basename($0); @@ -1294,6 +1294,57 @@ sub help_screen_line($$$){ print "\n\t$option $parameters : $help.\n" unless ($param ne '' && $param ne $option); } +sub check_values($) { + my ($check) = @_; + + my $arg_cont = 2; + my $cont = 0; + my @args = @ARGV; + my $total = $#args; + + while ($arg_cont <= $total) { + # Check type. + if ($check->[$cont]->{'type'} eq 'json') { + my $json_out = eval { decode_json($args[$arg_cont]) }; + if ($@) + { + print "\nValue `$args[$arg_cont]` is an invalid json. \nError:$@\n"; + exit; + } + } + + # Check values. + if (defined($check->[$cont]->{'values'})) { + if (!(is_in_array($check->[$cont]->{'values'}, $args[$arg_cont]))) { + print "\nError: value `$args[$arg_cont]` is not valid for $check->[$cont]->{'name'}\n"; + print "\tAvailable options: \t$check->[$cont]->{'values'}->[0]"; + if (defined($check->[$cont]->{'text_extra'}->[0])) { + print " $check->[$cont]->{'text_extra'}->[0]"; + } + print "\n"; + + my $cont_aux = 1; + my $while = 'false'; + while ($while eq 'false') { + if (defined($check->[$cont]->{'values'}->[$cont_aux])) { + print "\t\t\t\t$check->[$cont]->{'values'}->[$cont_aux]"; + if (defined($check->[$cont]->{'text_extra'}->[$cont_aux])) { + print " $check->[$cont]->{'text_extra'}->[$cont_aux]"; + } + print "\n"; + } else { + exit; + } + $cont_aux++; + } + } + } + + $cont++; + $arg_cont++; + } +} + ############################################################################### ############################################################################### # CLI FUNCTIONS @@ -3453,6 +3504,8 @@ sub cli_agent_update() { } else { pandora_update_table_from_hash ($conf, $update, 'id_agente', safe_input($id_agent), 'tagente', $dbh); } + + enterprise_hook('update_agent_cache', [$conf, $dbh, $id_agent]) if ($conf->{'node_metaconsole'} == 1); } ############################################################################## @@ -4671,7 +4724,7 @@ sub cli_add_event_comment() { $id_user = 'admin'; } else { - $id_user = pandora_get_user_id($dbh,$user_name); + $id_user = pandora_get_user_id($dbh,safe_input($user_name)); exist_check($id_user,'user',$user_name); } @@ -4680,7 +4733,7 @@ sub cli_add_event_comment() { my $current_comment = encode_utf8(pandora_get_event_comment($dbh, $id_event)); my $utimestamp = time (); - my @additional_comment = ({ comment => safe_input($comment), action => "Added comment", id_user => $id_user, utimestamp => $utimestamp}); + my @additional_comment = ({ comment => safe_input($comment), action => "Added comment", id_user => $id_user, utimestamp => $utimestamp, event_id => $id_event}); print_log "[INFO] Adding event comment for event '$id_event'. \n\n"; @@ -7812,9 +7865,57 @@ sub pandora_manage_main ($$$) { cli_delete_profile(); } elsif ($param eq '--create_event') { + my @fields = ( + {'name' => 'event'}, + { + 'name' => 'event_type', + 'values' => [ + 'unknown','alert_fired','alert_recovered','alert_ceased', + 'alert_manual_validation','recon_host_detected','system', + 'error','new_agent','going_up_warning','going_up_critical','going_down_warning', + 'going_down_normal','going_down_critical','going_up_normal','configuration_change' + ] + }, + {'name' => 'group_name'}, + {'name' => 'agent_name'}, + {'name' => 'module_name'}, + { + 'name' => 'event_status', + 'values' => ['0', '1', '2'], + 'text_extra' => ['(New)', '(Validated)', '(In process)'] + }, + { + 'name' => 'severity', + 'values' => ['0', '1', '2', '3', '4', '5', '6'], + 'text_extra' => [ + '(Maintenance)', '(Informational)', '(Normal)', + '(Warning)', '(Critical)', '(Minor)', '(Major)' + ] + }, + {'name' => 'template_name'}, + {'name' => 'user_name'}, + {'name' => 'comment'}, + {'name' => 'source'}, + {'name' => 'id_extra'}, + {'name' => 'tags'}, + {'type' => 'json', 'name' => 'custom_data_json'}, + { + 'name' => 'force_create_agent', + 'values' => ['0', '1'] + }, + {'name' => 'critical_instructions'}, + {'name' => 'warning_instructions'}, + {'name' => 'unknown_instructions'}, + {'name' => 'use_alias'}, + {'name' => 'metaconsole'} + ); + param_check($ltotal, 20, 17); + + check_values(\@fields); + cli_create_event(); - } + } elsif ($param eq '--validate_event') { param_check($ltotal, 8, 7); cli_validate_event(); diff --git a/pandora_server/util/plugin/pandora_snmp_bandwidth.pl b/pandora_server/util/plugin/pandora_snmp_bandwidth.pl index 3eb2b4fb53..c4224299ba 100755 --- a/pandora_server/util/plugin/pandora_snmp_bandwidth.pl +++ b/pandora_server/util/plugin/pandora_snmp_bandwidth.pl @@ -2,7 +2,7 @@ # ################################################################################ # -# Bandwith usage plugin +# Bandwidth usage plugin # # Requirements: # snmpget @@ -55,7 +55,7 @@ Where OPTIONS could be: [EXTRA] -ifIndex Target interface to retrieve, if not specified, total - bandwith will be reported. + bandwidth will be reported. -uniqid Use custom temporary file name. -inUsage Show only input usage (in percentage) - 1, or not 0. -outUsage Show only output usage (in percentage) - 1, or not 0. @@ -66,7 +66,7 @@ e.g. -v is equal to -version, -c to -community, etc. EO_HELP use constant { - UNKNOWN_DUPLEX => 0, + UNKNOWN_DUPLEX => 1, HALF_DUPLEX => 2, FULL_DUPLEX => 3, }; @@ -133,9 +133,12 @@ sub update_config_key ($) { if ($arg eq 'inUsage') { return "inUsage"; } - if ($arg eq 'outUsage') { - return "outUsage"; - } + if ($arg eq 'outUsage') { + return "outUsage"; + } + if ($arg eq 'f') { + return "unknown_fullduplex"; + } } ################################################################################ @@ -188,7 +191,7 @@ sub prepare_tree { my $inOctets = snmp_get(\%inOctets_call); if (ref($inOctets) eq "HASH") { - if ($inOctets->{'data'} eq '') { + if (! exists($inOctets->{'data'}) || $inOctets->{'data'} eq '') { $inOctets = 0; } else { $inOctets = int $inOctets->{'data'}; @@ -198,18 +201,18 @@ sub prepare_tree { next; } - my %outOctets_call = %{$config}; - if (is_enabled($config->{'use_x64'})) { - $outOctets_call{'oid'} = $config->{'oid_base'}; - $outOctets_call{'oid'} .= $config->{'x64_indexes'}{'outOctets'}.$ifIndex; - } else { - $outOctets_call{'oid'} = $config->{'oid_base'}; - $outOctets_call{'oid'} .= $config->{'x86_indexes'}{'outOctets'}.$ifIndex; - } + my %outOctets_call = %{$config}; + if (is_enabled($config->{'use_x64'})) { + $outOctets_call{'oid'} = $config->{'oid_base'}; + $outOctets_call{'oid'} .= $config->{'x64_indexes'}{'outOctets'}.$ifIndex; + } else { + $outOctets_call{'oid'} = $config->{'oid_base'}; + $outOctets_call{'oid'} .= $config->{'x86_indexes'}{'outOctets'}.$ifIndex; + } my $outOctets = snmp_get(\%outOctets_call); if (ref($outOctets) eq "HASH") { - if ($outOctets->{'data'} eq '') { + if (! exists($outOctets->{'data'}) || $outOctets->{'data'} eq '') { $outOctets = 0; } else { $outOctets = int $outOctets->{'data'}; @@ -220,28 +223,32 @@ sub prepare_tree { } my %duplex_call = %{$config}; - if (is_enabled($config->{'use_x64'})) { - $duplex_call{'oid'} = $config->{'oid_base'}; - $duplex_call{'oid'} .= $config->{'x64_indexes'}{'duplex'}.$ifIndex; - } else { - $duplex_call{'oid'} = $config->{'oid_base'}; - $duplex_call{'oid'} .= $config->{'x86_indexes'}{'duplex'}.$ifIndex; - } + if (is_enabled($config->{'use_x64'})) { + $duplex_call{'oid'} = $config->{'oid_base'}; + $duplex_call{'oid'} .= $config->{'x64_indexes'}{'duplex'}.$ifIndex; + } else { + $duplex_call{'oid'} = $config->{'oid_base'}; + $duplex_call{'oid'} .= $config->{'x86_indexes'}{'duplex'}.$ifIndex; + } my $duplex = snmp_get(\%duplex_call); if (ref($duplex) eq "HASH") { - if ($duplex->{'data'} eq '') { - $duplex = 0; + if (! exists($duplex->{'data'}) || ($duplex->{'data'} ne '2' && $duplex->{'data'} ne '3')) { + # Unknown duplex. + if (is_enabled($config->{'unknown_fullduplex'})) { + $duplex = 3; + } else { + $duplex = 1; + } } else { $duplex = int $duplex->{'data'}; } - } else { # Ignore, cannot retrieve inOctets. next; } - my %speed = %{$config}; + my %speed = %{$config}; if (is_enabled($config->{'use_x64'})) { $speed{'oid'} = $config->{'oid_base'}; $speed{'oid'} .= $config->{'x64_indexes'}{'ifSpeed'}.$ifIndex; @@ -492,9 +499,9 @@ $config->{'tmp_separator'} = ';' if empty($config->{'tmp_separator'}); $config->{'tmp'} = (($^O =~ /win/)?$ENV{'TMP'}:'/tmp') if empty($config->{'tmp'}); # Create unique name for tmp and log file for host -my $filename = $config->{'tmp'}.'/pandora_bandwith_'.$config->{'host'}; +my $filename = $config->{'tmp'}.'/pandora_bandwidth_'.$config->{'host'}; if (!empty($config->{'uniqid'})) { - $filename = $config->{'tmp'}.'/pandora_bandwith_'.$config->{'uniqid'}; + $filename = $config->{'tmp'}.'/pandora_bandwidth_'.$config->{'uniqid'}; } # Replace every dot for underscore $filename =~ tr/./_/; @@ -511,7 +518,7 @@ if ( defined($sysobjectid->{'error'}) || $sysobjectid->{'data'} eq '' ) { # Check SNMP x64 interfaces my $walk64 = snmp_walk({%{$config}, 'oid' => '.1.3.6.1.2.1.31.1.1.1.6'}); -if ( $walk64 =~ 'No Such Instance currently exists at this OID' || $walk64 =~ 'No more variables left in this MIB View') { +if ( $walk64 !~ /.*\.[0-9]+ = Counter64: [0-9]+/ ) { $config->{'use_x64'} = 0; } else { $config->{'use_x64'} = 1; @@ -556,35 +563,35 @@ my $j = 0; my $k = 0; foreach my $iface (keys %{$analysis_tree}) { # Calculate summary; - if (is_enabled($analysis_tree->{$iface}{'bandwidth'})) { - $bandwidth = $analysis_tree->{$iface}{'bandwidth'}; + if (is_enabled($analysis_tree->{$iface}{'bandwidth'}) || $analysis_tree->{$iface}{'bandwidth'} == 0) { + $bandwidth += $analysis_tree->{$iface}{'bandwidth'}; $i++; } - if (is_enabled($analysis_tree->{$iface}{'inUsage'})) { - $inUsage = $analysis_tree->{$iface}{'inUsage'}; + if (is_enabled($analysis_tree->{$iface}{'inUsage'}) || $analysis_tree->{$iface}{'inUsage'} == 0) { + $inUsage += $analysis_tree->{$iface}{'inUsage'}; $j++; } - if (is_enabled($analysis_tree->{$iface}{'outUsage'})) { - $outUsage = $analysis_tree->{$iface}{'outUsage'}; + if (is_enabled($analysis_tree->{$iface}{'outUsage'}) || $analysis_tree->{$iface}{'inUsage'} == 0) { + $outUsage += $analysis_tree->{$iface}{'outUsage'}; $k++; } } if ($j > 0 && is_enabled($config->{'inUsage'})) { - $inUsage /= $j; - print sprintf("%.9f\n", $inUsage); + $inUsage /= $j; + print sprintf("%.9f\n", $inUsage); } elsif ($k > 0 && is_enabled($config->{'outUsage'})) { - $outUsage /= $k; - print sprintf("%.9f\n", $outUsage); + $outUsage /= $k; + print sprintf("%.9f\n", $outUsage); } if ($i > 0 && !is_enabled($config->{'inUsage'}) && !is_enabled($config->{'outUsage'}) ) { - $bandwidth /= $i; - print sprintf("%.9f\n", $bandwidth); + $bandwidth /= $i; + print sprintf("%.9f\n", $bandwidth); } logger($config, 'info', "Plugin ends") if (is_enabled($config->{'debug'})); diff --git a/tentacle/tentacle_server_installer b/tentacle/tentacle_server_installer index 176a4743e5..562c4eea88 100755 --- a/tentacle/tentacle_server_installer +++ b/tentacle/tentacle_server_installer @@ -188,6 +188,16 @@ install () { execute_cmd "ps --version" 'Checking dependencies: ps' "Error ps not found, please install procps" execute_cmd "sudo --version" 'Checking dependencies: sudo' "Error sudo not found, please install sudo" execute_cmd "perl -MIO::Compress::Zip -le 'pass'" 'Checking dependencies: perl IO::Compress' "Error perl IO::Compress not found, please install perl IO::Compress" + + execute_cmd "perl -MGetopt::Std -le 'pass'" 'Checking dependencies: perl Getopt::Std' "Error perl IO::Compress not found, please install perl Getopt::Std" + execute_cmd "perl -MIO::Select -le 'pass'" 'Checking dependencies: perl IO::Select' "Error perl IO::Select not found, please install perl IO::Select" + execute_cmd "perl -MIO::Uncompress::Unzip -le 'pass'" 'Checking dependencies: perl IO::Uncompress::Unzip' "Error perl IO::Uncompress::Unzip not found, please install perl IO::Uncompress::Unzip" + execute_cmd "perl -Mthreads -le 'pass'" 'Checking dependencies: perl threads' "Error perl IO::Compress not found, please install perl threads" + execute_cmd "perl -MThread::Semaphore -le 'pass'" 'Checking dependencies: perl Thread::Semaphore' "Error perl Thread::Semaphore, please install perl Thread::Semaphore" + + execute_cmd "perl -MPOSIX -le 'pass'" 'Checking dependencies: perl POSIX' "Error perl POSIX not found, please install perl POSIX" + execute_cmd "perl -MTime::HiRes -le 'pass'" 'Checking dependencies: perl Time::HiRes' "Error perl Time::HiRes not found, please install perl Time::HiRes" + execute_cmd "perl -MScalar::Util -le 'pass'" 'Checking dependencies: perl Scalar::Util' "Error perl Scalar::Util not found, please install perl Scalar::Util" fi # install tentacle @@ -351,8 +361,8 @@ uninstall () { } help () { - echo " --install To install Pandora FMS Servers on this system (You have to be root)" - echo " --uninstall To uninstall and remove Pandora FMS Servers on this System" + echo " --install To install Tentacle Server on this system (You have to be root)" + echo " --uninstall To uninstall and remove Tentacle Server on this System" echo " " echo " Additional second parameter (after --install) " echo " " @@ -401,4 +411,3 @@ case "$MODE" in *) help esac - diff --git a/tests/Dockerfile b/tests/Dockerfile index 4a8a114200..f414f3fe03 100644 --- a/tests/Dockerfile +++ b/tests/Dockerfile @@ -92,6 +92,7 @@ RUN dnf install -y vim wget bzip2 curl && \ libstdc++ \ gettext \ wmic \ + chromium \ cpanminus && \ cpanm Geo::IP && \ mkdir -p /opt/phantomjs/bin && cd /opt/phantomjs/bin && \ diff --git a/visual_console_client/package-lock.json b/visual_console_client/package-lock.json index 2b6f14d197..998687386e 100644 --- a/visual_console_client/package-lock.json +++ b/visual_console_client/package-lock.json @@ -14,60 +14,79 @@ "@types/jest": "^24.9.1", "@typescript-eslint/eslint-plugin": "^1.13.0", "@typescript-eslint/parser": "^1.13.0", - "awesome-typescript-loader": "^5.2.1", - "clean-webpack-plugin": "^2.0.2", - "css-loader": "^2.1.1", + "clean-webpack-plugin": "^4.0.0", + "css-loader": "^6.7.3", "d3-shape": "^1.3.7", "eslint": "^5.16.0", "eslint-config-prettier": "^4.3.0", "eslint-plugin-prettier": "^3.4.0", - "file-loader": "^3.0.1", - "jest": "^24.9.0", - "mini-css-extract-plugin": "^0.5.0", + "file-loader": "^6.2.0", + "jest": "^29.3.1", + "mini-css-extract-plugin": "^2.7.2", "npm-watch": "^0.11.0", "postcss-loader": "^3.0.0", "prettier": "^1.19.1", - "ts-jest": "^24.3.0", - "typescript": "^3.9.9", - "url-loader": "^1.1.2", - "webpack": "^4.46.0", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.2" + "ts-jest": "^29.0.3", + "typescript": "^4.9.4", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.11.1" + }, + "devDependencies": { + "ts-loader": "^9.4.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dependencies": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", - "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==" + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/core": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", - "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.3", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.3", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2", + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.2", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -77,63 +96,10 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/core/node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/core/node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", @@ -144,25 +110,45 @@ } }, "node_modules/@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", "dependencies": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dependencies": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0" } @@ -175,129 +161,150 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", - "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dependencies": { - "@babel/types": "^7.12.13" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz", - "integrity": "sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dependencies": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==" + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", + "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.3.tgz", - "integrity": "sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -305,6 +312,108 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", @@ -316,387 +425,897 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/template/node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", + "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" }, "engines": { - "node": ">=0.1.95" + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", - "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==", + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", - "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" }, "engines": { "node": ">=6" } }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", + "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", "dependencies": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", + "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", "dependencies": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", + "@jest/console": "^29.3.1", + "@jest/reporters": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-resolve-dependencies": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "jest-watcher": "^29.3.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@jest/core/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, "node_modules/@jest/core/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", + "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", "dependencies": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "dependencies": { + "expect": "^29.3.1", + "jest-snapshot": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", + "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", "dependencies": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/types": "^29.3.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", + "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/types": "^29.3.1", + "jest-mock": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", + "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", "dependencies": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@jest/reporters/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" + "graceful-fs": "^4.2.9" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", + "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", "dependencies": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" + "@jest/console": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", + "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", "dependencies": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" + "@jest/test-result": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "slash": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", + "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" + "@babel/core": "^7.11.6", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", "dependencies": { + "@jest/schemas": "^29.0.0", "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "defer-to-connect": "^1.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" } }, "node_modules/@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -706,61 +1325,155 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "dependencies": { "@babel/types": "^7.3.0" } }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "node_modules/@types/d3-path": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz", "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==" }, "node_modules/@types/d3-shape": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.5.tgz", - "integrity": "sha512-aPEax03owTAKynoK8ZkmkZEDZvvT4Y5pWgii4Jp4oQt0gH45j6siDl9gNDVC5kl64XHN2goN9jbYoHK88tFAcA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.8.tgz", + "integrity": "sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==", "dependencies": { "@types/d3-path": "^1" } }, + "node_modules/@types/eslint": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "node_modules/@types/express": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", + "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.32", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", + "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "node_modules/@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dependencies": { "@types/minimatch": "*", "@types/node": "*" } }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", @@ -771,11 +1484,10 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dependencies": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, @@ -788,37 +1500,95 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "node_modules/@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "node_modules/@types/node": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz", - "integrity": "sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ==" + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", + "integrity": "sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "1.13.0", @@ -885,162 +1655,177 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" - }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, + "node_modules/@webpack-cli/configtest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", + "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -1051,32 +1836,27 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" } }, "node_modules/acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "bin": { "acorn": "bin/acorn" }, @@ -1084,40 +1864,27 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, "node_modules/acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "peerDependencies": { - "acorn": "^6.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "engines": { - "node": ">=0.4.0" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/ajv": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", - "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ajv-errors": { @@ -1128,62 +1895,50 @@ "ajv": ">=5.0.0" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "peerDependencies": { "ajv": "^6.9.1" } }, - "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dependencies": { - "string-width": "^3.0.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -1192,10 +1947,10 @@ "node": ">=4" } }, - "node_modules/ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "engines": [ "node >= 0.8.0" ], @@ -1204,9 +1959,9 @@ } }, "node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "engines": { "node": ">=4" } @@ -1223,30 +1978,17 @@ } }, "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dependencies": { - "remove-trailing-separator": "^1.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1255,35 +1997,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -1292,7 +2005,7 @@ "node_modules/array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dependencies": { "array-uniq": "^1.0.1" }, @@ -1303,77 +2016,7 @@ "node_modules/array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "engines": { "node": ">=0.10.0" } @@ -1386,230 +2029,165 @@ "node": ">=4" } }, - "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "node_modules/babel-jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", + "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" + "@jest/transform": "^29.3.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" }, "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/awesome-typescript-loader": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz", - "integrity": "sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==", - "dependencies": { - "chalk": "^2.4.1", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.1.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.3", - "webpack-log": "^1.2.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "typescript": "^2.7 || ^3" + "@babel/core": "^7.8.0" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "dependencies": { - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", "dependencies": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "node_modules/big.js": { "version": "5.2.2", @@ -1627,207 +2205,59 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" - }, "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "node_modules/boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/boxen/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/boxen/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, "node_modules/brace-expansion": { @@ -1840,183 +2270,41 @@ } }, "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dependencies": { - "resolve": "1.1.7" - } - }, - "node_modules/browser-resolve/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-sign/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dependencies": { - "pako": "~1.0.5" + "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bs-logger": { @@ -2038,143 +2326,19 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2187,46 +2351,66 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "engines": { "node": ">=6" } }, "node_modules/camelcase": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", - "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001228", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", - "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "version": "1.0.30001442", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz", + "integrity": "sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/chalk": { "version": "2.4.2", @@ -2241,102 +2425,45 @@ "node": ">=4" } }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/chokidar/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/chokidar/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/chokidar/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -2346,73 +2473,42 @@ } }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, "node_modules/clean-webpack-plugin": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-2.0.2.tgz", - "integrity": "sha512-pi1111o4OBd9qvacbgs+NRqClfVPKVIc66B4d8kx6Ho/L+i9entQ/NpK600CsTYTPu3kWvKwwyKarsYMvC2xeA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", "dependencies": { - "del": "^4.0.0" + "del": "^4.1.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.0.0" }, "peerDependencies": { - "webpack": "*" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "webpack": ">=4.0.0 <6.0.0" } }, "node_modules/cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dependencies": { "restore-cursor": "^2.0.0" }, @@ -2421,80 +2517,89 @@ } }, "node_modules/cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" } }, "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" }, "node_modules/color-convert": { "version": "1.9.3", @@ -2507,39 +2612,18 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -2568,98 +2652,43 @@ "node": ">= 0.8.0" } }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/configstore/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/configstore/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "engines": { "node": ">=0.8" } }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" @@ -2674,17 +2703,14 @@ } }, "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } @@ -2692,85 +2718,57 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "engines": { - "node": ">=0.10.0" - } + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dependencies": { + "import-fresh": "^2.0.0", "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "node_modules/cosmiconfig/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "node_modules/cosmiconfig/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "engines": { + "node": ">=4" } }, "node_modules/cross-spawn": { @@ -2788,59 +2786,61 @@ "node": ">=4.8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, "node_modules/css-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", - "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", "dependencies": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.14", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", - "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0" + "webpack": "^5.0.0" } }, + "node_modules/css-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2852,32 +2852,6 @@ "node": ">=4" } }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dependencies": { - "cssom": "0.3.x" - } - }, - "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, - "node_modules/d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dependencies": { - "es5-ext": "^0.10.9" - } - }, "node_modules/d3-path": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", @@ -2891,182 +2865,57 @@ "d3-path": "1" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dependencies": { - "mimic-response": "^1.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/deep-equal/node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dependencies": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dependencies": { - "object-keys": "^1.0.12" - }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/del": { @@ -3086,50 +2935,29 @@ "node": ">=6" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "node": ">= 0.8" } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/detect-node": { @@ -3145,41 +2973,20 @@ "node": ">= 6" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "node_modules/dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dependencies": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" } }, "node_modules/doctrine": { @@ -3193,144 +3000,69 @@ "node": ">=6.0.0" } }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dependencies": { - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.3.730", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.730.tgz", - "integrity": "sha512-1Tr3h09wXhmqXnvDyrRe6MFgTeU0ZXy3+rMJWTrOHh/HNesWwBBrKnMxRJWZ86dzs8qQdw2c7ZE1/qeGHygImA==" + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/elliptic/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "engines": { - "node": ">= 0.10" + "node": ">= 4" } }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.13.0" } }, - "node_modules/errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dependencies": { - "prr": "~1.0.1" - }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "bin": { - "errno": "cli.js" + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" } }, "node_modules/error-ex": { @@ -3341,115 +3073,10 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract/node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract/node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-abstract/node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.47", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.47.tgz", - "integrity": "sha512-/1TItLfj+TTfWoeRcDn/0FbGV6SNo4R+On2GGVucPU/j3BWnXE2Co8h8CTo4Tu34gFJtnmwS9xiScKs4EjZhdw==", - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, "node_modules/escalade": { "version": "3.1.1", @@ -3459,57 +3086,19 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "engines": { - "node": ">=8" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint": { "version": "5.16.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", @@ -3574,9 +3163,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", - "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", "dependencies": { "prettier-linter-helpers": "^1.0.0" }, @@ -3606,51 +3195,28 @@ } }, "node_modules/eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, "engines": { "node": ">=6" } }, "node_modules/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "engines": { "node": ">=4" } }, - "node_modules/eslint/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, "node_modules/eslint/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bin": { "semver": "bin/semver" } @@ -3681,39 +3247,55 @@ } }, "node_modules/esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dependencies": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=0.6" + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" } }, "node_modules/esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dependencies": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { - "node": ">=0.10.0" + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" } }, "node_modules/esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { "node": ">=0.10.0" } @@ -3721,7 +3303,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } @@ -3739,154 +3321,138 @@ "node": ">=0.8.x" } }, - "node_modules/eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "dependencies": { - "original": "^1.0.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" - }, "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "engines": { "node": ">= 0.8.0" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", "dependencies": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -3898,48 +3464,25 @@ "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "node_modules/express/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "ms": "2.0.0" } }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -3949,93 +3492,10 @@ "node": ">=4" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.2.0", @@ -4043,19 +3503,27 @@ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" }, "node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "engines": { + "node": ">= 4.9.1" + } }, "node_modules/faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -4064,22 +3532,17 @@ } }, "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dependencies": { "bser": "2.1.1" } }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, "node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -4099,104 +3562,75 @@ } }, "node_modules/file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", - "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "dependencies": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0" + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" + "ms": "2.0.0" } }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" + "node": ">=8" } }, "node_modules/flat-cache": { @@ -4212,24 +3646,26 @@ "node": ">=4" } }, - "node_modules/flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==" - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "node_modules/flat-cache/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + }, "node_modules/follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -4245,111 +3681,43 @@ } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { "node": ">= 0.6" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, "optional": true, "os": [ "darwin" ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, "engines": { - "node": ">= 4.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { @@ -4360,7 +3728,7 @@ "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -4379,27 +3747,24 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-intrinsic/node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, "node_modules/get-stdin": { @@ -4411,46 +3776,33 @@ } }, "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { @@ -4464,68 +3816,15 @@ "node": ">= 6" } }, - "node_modules/global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dependencies": { - "ini": "1.3.7" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-modules/node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { "node": ">=4" } @@ -4533,7 +3832,7 @@ "node_modules/globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "dependencies": { "array-union": "^1.0.1", "glob": "^7.0.3", @@ -4548,88 +3847,21 @@ "node_modules/globby/node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "engines": { "node": ">=0.10.0" } }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4641,163 +3873,29 @@ "node": ">= 0.4.0" } }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } }, "node_modules/has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -4805,53 +3903,67 @@ "wbuf": "^1.1.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { - "whatwg-encoding": "^1.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, "node_modules/html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" }, "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "node_modules/http-proxy": { "version": "1.18.1", @@ -4867,37 +3979,35 @@ } }, "node_modules/http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dependencies": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "node": ">=12.0.0" }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } }, "node_modules/iconv-lite": { "version": "0.4.24", @@ -4910,46 +4020,17 @@ "node": ">=0.10.0" } }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, "node_modules/icss-utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.0.tgz", - "integrity": "sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ==", - "dependencies": { - "postcss": "^7.0.14" - }, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -4961,12 +4042,12 @@ "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" }, "node_modules/import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", "dependencies": { "import-from": "^2.1.0" }, @@ -4975,21 +4056,24 @@ } }, "node_modules/import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-from": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", "dependencies": { "resolve-from": "^3.0.0" }, @@ -5000,75 +4084,55 @@ "node_modules/import-from/node_modules/resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "engines": { "node": ">=4" } }, "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "engines": { "node": ">=0.8.19" } }, - "node_modules/indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dependencies": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -5076,12 +4140,12 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "engines": { @@ -5089,9 +4153,9 @@ } }, "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "engines": { "node": ">=6" } @@ -5107,111 +4171,26 @@ "node": ">=6" } }, - "node_modules/internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dependencies": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10" } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -5224,51 +4203,10 @@ "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { "has": "^1.0.3" }, @@ -5276,80 +4214,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } @@ -5357,7 +4247,7 @@ "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "engines": { "node": ">=4" } @@ -5371,9 +4261,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -5381,87 +4271,12 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dependencies": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally/node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" + "node": ">=0.12.0" } }, "node_modules/is-path-cwd": { @@ -5494,6 +4309,17 @@ "node": ">=6" } }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -5505,153 +4331,67 @@ "node": ">=0.10.0" } }, - "node_modules/is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "node_modules/is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex/node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", - "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol/node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "engines": { - "node": ">=0.10.0" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, "node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dependencies": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { @@ -5663,137 +4403,406 @@ } }, "node_modules/istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dependencies": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dependencies": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", + "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, "node_modules/istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dependencies": { - "html-escaper": "^2.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", + "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", "dependencies": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" + "@jest/core": "^29.3.1", + "@jest/types": "^29.3.1", + "import-local": "^3.0.2", + "jest-cli": "^29.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", "dependencies": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" + "execa": "^5.0.0", + "p-limit": "^3.1.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", + "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", + "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "dependencies": { + "@jest/core": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", + "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.3.1", + "@jest/types": "^29.3.1", + "babel-jest": "^29.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.3.1", + "jest-environment-node": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-diff": { @@ -5810,64 +4819,45 @@ "node": ">= 6" } }, - "node_modules/jest-docblock": { + "node_modules/jest-diff/node_modules/@jest/types": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "dependencies": { - "detect-newline": "^2.1.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" }, "engines": { "node": ">= 6" } }, - "node_modules/jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "node_modules/jest-diff/node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "dependencies": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "engines": { - "node": ">= 6" + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" } }, - "node_modules/jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "node_modules/jest-diff/node_modules/@types/yargs": { + "version": "13.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", + "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", "dependencies": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - }, - "engines": { - "node": ">= 6" + "@types/yargs-parser": "*" } }, - "node_modules/jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dependencies": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - }, + "node_modules/jest-diff/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/jest-get-type": { + "node_modules/jest-diff/node_modules/jest-get-type": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", @@ -5875,115 +4865,375 @@ "node": ">= 6" } }, - "node_modules/jest-haste-map": { + "node_modules/jest-diff/node_modules/pretty-format": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dependencies": { "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" }, "engines": { "node": ">= 6" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" } }, - "node_modules/jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "node_modules/jest-diff/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", + "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "dependencies": { + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.3.1", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", + "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", + "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "dependencies": { + "@jest/types": "^29.3.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, "node_modules/jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", + "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", "dependencies": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", "dependencies": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-matcher-utils/node_modules/diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", + "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", "dependencies": { - "@jest/types": "^24.9.0" + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-util": "^29.3.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "engines": { "node": ">=6" }, @@ -5997,263 +5247,750 @@ } }, "node_modules/jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", + "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", "dependencies": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", + "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", "dependencies": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.3.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", + "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", "dependencies": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "@jest/console": "^29.3.1", + "@jest/environment": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-leak-detector": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-resolve": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-util": "^29.3.1", + "jest-watcher": "^29.3.1", + "jest-worker": "^29.3.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", + "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", "dependencies": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/globals": "^29.3.1", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", + "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", "dependencies": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" + "pretty-format": "^29.3.1", + "semver": "^7.3.5" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" - } - }, - "node_modules/jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dependencies": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/jest-util/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", + "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", "dependencies": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", + "@jest/types": "^29.3.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", "leven": "^3.1.0", - "pretty-format": "^24.9.0" + "pretty-format": "^29.3.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-validate/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", + "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", "dependencies": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.3.1", + "string-length": "^4.0.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", "dependencies": { + "@types/node": "*", + "jest-util": "^29.3.1", "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "supports-color": "^8.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, "node_modules/jest-worker/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/jest/node_modules/jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "dependencies": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" + "node": ">=10" }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/js-tokens": { @@ -6262,9 +5999,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -6273,55 +6010,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dependencies": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6333,20 +6021,15 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -6356,60 +6039,23 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, "node_modules/kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "engines": { "node": ">=0.10.0" } @@ -6422,23 +6068,6 @@ "node": ">=6" } }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "deprecated": "use String.prototype.padStart()" - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -6450,7 +6079,7 @@ "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -6459,134 +6088,57 @@ "node": ">= 0.8.0" } }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=6.11.5" } }, "node_modules/loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.9.0" } }, "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, "node_modules/lodash.unescape": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=" - }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/loglevelnext": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", - "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", - "dependencies": { - "es6-symbol": "^3.1.1", - "object.assign": "^4.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } + "integrity": "sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==" }, "node_modules/lru-cache": { "version": "5.1.1", @@ -6597,23 +6149,25 @@ } }, "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" } }, "node_modules/make-error": { @@ -6622,63 +6176,36 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dependencies": { - "tmpl": "1.0.x" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "tmpl": "1.0.5" } }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "node_modules/memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" } }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", @@ -6688,51 +6215,23 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -6745,54 +6244,97 @@ } }, "node_modules/mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.47.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { - "node": ">=4" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/mini-css-extract-plugin": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", - "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", "dependencies": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 6.9.0 <7.0.0 || >= 8.9.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.4.0" + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/minimalistic-assert": { @@ -6800,15 +6342,10 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6817,146 +6354,66 @@ } }, "node_modules/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { - "minimist": "0.0.8" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, - "node_modules/mkdirp/node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dependencies": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, "node_modules/mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" }, - "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } @@ -6966,105 +6423,44 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "engines": { - "node": ">= 6.0.0" + "node": ">= 6.13.0" } }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-notifier": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", - "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "1.1.72", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", - "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==" + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" }, "node_modules/nodemon": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz", - "integrity": "sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==", - "hasInstallScript": true, + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", "dependencies": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" + "undefsafe": "^2.0.5" }, "bin": { "nodemon": "bin/nodemon.js" @@ -7085,11 +6481,6 @@ "ms": "^2.1.1" } }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "node_modules/nodemon/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -7101,7 +6492,7 @@ "node_modules/nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", "dependencies": { "abbrev": "1" }, @@ -7112,17 +6503,6 @@ "node": "*" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -7131,23 +6511,23 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dependencies": { - "path-key": "^2.0.0" - }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/npm-watch": { @@ -7162,175 +6542,31 @@ "npm-watch": "cli.js" } }, - "node_modules/npm-watch/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm-watch/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -7349,98 +6585,91 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dependencies": { - "is-wsl": "^1.1.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dependencies": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dependencies": { - "url-parse": "^1.4.3" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { - "p-reduce": "^1.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/p-limit": { + "node_modules/p-locate/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", @@ -7454,17 +6683,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/p-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", @@ -7473,23 +6691,16 @@ "node": ">=6" } }, - "node_modules/p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "engines": { - "node": ">=4" - } - }, "node_modules/p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dependencies": { - "retry": "^0.12.0" + "@types/retry": "0.12.0", + "retry": "^0.13.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/p-try": { @@ -7500,43 +6711,6 @@ "node": ">=6" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7548,43 +6722,23 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dependencies": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -7593,36 +6747,18 @@ "node": ">= 0.8" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } @@ -7630,69 +6766,35 @@ "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "engines": { "node": ">=4" } }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-type/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -7711,7 +6813,7 @@ "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "engines": { "node": ">=0.10.0" } @@ -7719,7 +6821,7 @@ "node_modules/pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dependencies": { "pinkie": "^2.0.0" }, @@ -7728,105 +6830,61 @@ } }, "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dependencies": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/portfinder/node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/portfinder/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">=6.0.0" + "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "dependencies": { - "cosmiconfig": "^4.0.0", + "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" }, "engines": { "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, "node_modules/postcss-loader": { @@ -7843,104 +6901,144 @@ "node": ">= 6" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "node_modules/postcss-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dependencies": { - "postcss": "^7.0.5" + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/postcss-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" }, "engines": { - "node": ">= 6" + "node": ">=4.0.0" + } + }, + "node_modules/postcss-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/postcss-modules-local-by-default": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", - "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" }, "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/postcss-modules-scope": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", - "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": ">= 6" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dependencies": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "dependencies": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "util-deprecate": "^1.0.2" }, "engines": { "node": ">=4" } }, "node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "engines": { "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "engines": { - "node": ">=4" - } - }, "node_modules/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", @@ -7964,39 +7062,33 @@ } }, "node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "engines": { - "node": ">=6" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "engines": { - "node": ">= 0.6.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", @@ -8006,15 +7098,10 @@ "node": ">=0.4.0" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, "node_modules/prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -8024,78 +7111,30 @@ } }, "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "engines": { "node": ">= 0.10" } }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -8104,47 +7143,20 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "escape-goat": "^2.0.0" + "side-channel": "^1.0.4" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -8153,15 +7165,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -8171,12 +7174,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -8185,75 +7188,35 @@ } }, "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dependencies": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -8261,42 +7224,15 @@ "node": ">=8.10.0" } }, - "node_modules/realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dependencies": { - "util.promisify": "^1.0.0" + "resolve": "^1.20.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10.13.0" } }, "node_modules/regexpp": { @@ -8307,120 +7243,10 @@ "node": ">=6.5.0" } }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-core/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { "node": ">=0.10.0" } @@ -8433,70 +7259,44 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dependencies": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-dir/node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/resolve-from": { @@ -8507,24 +7307,18 @@ "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dependencies": { - "lowercase-keys": "^1.0.0" + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "engines": { + "node": ">=10" } }, "node_modules/restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -8533,26 +7327,37 @@ "node": ">=4" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "engines": { - "node": ">=0.12" + "node": ">=4" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "engines": { "node": ">= 4" } }, "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { "glob": "^7.1.3" }, @@ -8560,46 +7365,18 @@ "rimraf": "bin.js" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "engines": { - "node": "6.* || >= 7.*" - } - }, "node_modules/run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dependencies": { - "is-promise": "^2.1.0" - }, + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "engines": { "node": ">=0.12.0" } }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dependencies": { - "aproba": "^1.1.1" - } - }, "node_modules/rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dependencies": { "tslib": "^1.9.0" }, @@ -8608,75 +7385,60 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dependencies": { - "ret": "~0.1.10" - } + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, "node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 4" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "node_modules/selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dependencies": { - "node-forge": "^0.10.0" + "node-forge": "^1" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver": { @@ -8687,57 +7449,51 @@ "semver": "bin/semver" } }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dependencies": { "randombytes": "^2.1.0" } @@ -8745,7 +7501,7 @@ "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -8759,10 +7515,26 @@ "node": ">= 0.8.0" } }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -8773,81 +7545,63 @@ "node": ">= 0.6" } }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "kind-of": "^6.0.2" }, - "bin": { - "sha.js": "bin.js" + "engines": { + "node": ">=8" } }, "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dependencies": { "shebang-regex": "^1.0.0" }, @@ -8858,20 +7612,47 @@ "node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "engines": { "node": ">=0.10.0" } }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/sisteransi": { "version": "1.0.5", @@ -8879,11 +7660,11 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/slice-ansi": { @@ -8899,213 +7680,17 @@ "node": ">=6" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dependencies": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, - "node_modules/sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", - "dependencies": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.1" - } - }, - "node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/sockjs-client/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/sockjs-client/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/sockjs/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dependencies": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", @@ -9113,40 +7698,23 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated" - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.8.tgz", - "integrity": "sha512-NDgA96EnaLSvtbM7trJj+t1LUR3pirkDCcz9nOUlPb5DMBGsH7oES6C3hs3j7R9oHEa1EMvReS/BUAIT5Tcr0g==" - }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -9175,118 +7743,20 @@ "wbuf": "^1.7.3" } }, - "node_modules/spdy-transport/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy-transport/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spdy/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dependencies": { - "figgy-pudding": "^3.5.1" - } + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/stack-utils/node_modules/escape-string-regexp": { @@ -9297,98 +7767,51 @@ "node": ">=8" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "node_modules/string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dependencies": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/string-width": { @@ -9403,34 +7826,10 @@ "node": ">=4" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -9439,25 +7838,25 @@ } }, "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "engines": { "node": ">=0.10.0" } @@ -9473,18 +7872,24 @@ "node": ">=4" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dependencies": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", + "ajv": "^6.10.2", + "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" }, @@ -9493,13 +7898,18 @@ } }, "node_modules/table/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "engines": { "node": ">=6" } }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "node_modules/table/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -9525,132 +7935,147 @@ } }, "node_modules/tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "engines": { "node": ">=6" } }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, "node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0" + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/terser-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/terser-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dependencies": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "node_modules/throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "readable-stream": "3" } }, "node_modules/thunky": { @@ -9658,17 +8083,6 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -9681,83 +8095,33 @@ } }, "node_modules/tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } @@ -9773,91 +8137,204 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/ts-jest": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.3.0.tgz", - "integrity": "sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==", + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", + "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", "dependencies": { "bs-logger": "0.x", - "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", - "json5": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.1", "lodash.memoize": "4.x", "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "10.x" + "semver": "7.x", + "yargs-parser": "^21.0.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "jest": ">=24 <25" + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } } }, - "node_modules/ts-jest/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-jest/node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "minimist": "^1.2.5" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" }, "bin": { - "json5": "lib/cli.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/ts-jest/node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "node_modules/ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, "dependencies": { - "camelcase": "^4.1.0" + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" } }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -9873,31 +8350,10 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -9905,12 +8361,23 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "engines": { - "node": ">=8" + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { @@ -9925,23 +8392,10 @@ "node": ">= 0.6" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9950,528 +8404,117 @@ "node": ">=4.2.0" } }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive/node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dependencies": { - "debug": "^2.2.0" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "bin": { + "browserslist-lint": "cli.js" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dependencies": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/update-notifier/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/update-notifier/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", - "dependencies": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/url-loader/node_modules/mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dependencies": { - "inherits": "2.0.3" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/util.promisify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", - "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/util.promisify/node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" } }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dependencies": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" - } - }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "optional": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "optional": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" + "node": ">=10.13.0" } }, "node_modules/wbuf": { @@ -10482,45 +8525,41 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, "node_modules/webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" }, "engines": { - "node": ">=6.11.5" + "node": ">=10.13.0" }, "funding": { "type": "opencollective", @@ -10529,394 +8568,145 @@ "peerDependenciesMeta": { "webpack-cli": { "optional": true - }, - "webpack-command": { - "optional": true } } }, "node_modules/webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", + "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", "dependencies": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", + "colorette": "^2.0.14", + "commander": "^9.4.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=6.11.5" + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "4.x.x" + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/webpack-cli/node_modules/emojis-list": { + "node_modules/webpack-cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/webpack-cli/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-cli/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/webpack-cli/node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "node_modules/webpack-cli/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/webpack-cli/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack-cli/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/webpack-cli/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" + "node": ">= 8" } }, "node_modules/webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", - "dependencies": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 6.11.5" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/webpack-dev-server/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/webpack-dev-server/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/webpack-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", - "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", - "dependencies": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "loglevelnext": "^1.0.1", - "uuid": "^3.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { @@ -10924,83 +8714,206 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.8.2" } }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/webpack/node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "node": ">= 12.13.0" }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/webpack/node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/webpack/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", "dependencies": { - "minimist": "^1.2.5" + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/webpack/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "webpack-dev-server": "bin/webpack-dev-server.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/webpack/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, "node_modules/websocket-driver": { @@ -11024,29 +8937,6 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "node_modules/whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -11058,51 +8948,74 @@ "which": "bin/which" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "string-width": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/widest-line/node_modules/is-fullwidth-code-point": { + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", @@ -11110,92 +9023,34 @@ "node": ">=8" } }, - "node_modules/widest-line/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dependencies": { - "errno": "~0.1.7" - } - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write": { "version": "1.0.3", @@ -11209,48 +9064,44 @@ } }, "node_modules/write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dependencies": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", "engines": { - "node": ">=8" - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { "version": "3.1.1", @@ -11258,143 +9109,131 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" } }, "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" } }, "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } }, "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "requires": { - "@babel/highlight": "^7.0.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", - "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==" + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==" }, "@babel/core": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", - "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.3", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.3", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2", + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.2", + "semver": "^6.3.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "semver": { "version": "6.3.0", @@ -11404,23 +9243,36 @@ } }, "@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "requires": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "dependencies": { @@ -11431,129 +9283,183 @@ } } }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", - "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "requires": { - "@babel/types": "^7.12.13" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" } }, "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz", - "integrity": "sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" - } + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" }, "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.20.2" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + }, "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==" + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" }, "@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", + "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "requires": { + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.3.tgz", - "integrity": "sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==" + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==" + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", @@ -11563,326 +9469,671 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", + "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "requires": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", - "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==" + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" }, "@fortawesome/free-solid-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", - "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", + "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", + "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", + "@jest/console": "^29.3.1", + "@jest/reporters": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-resolve-dependencies": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "jest-watcher": "^29.3.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" } } } }, "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", + "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1" + } + }, + "@jest/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "requires": { + "expect": "^29.3.1", + "jest-snapshot": "^29.3.1" + } + }, + "@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "requires": { + "jest-get-type": "^29.2.0" } }, "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", + "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/types": "^29.3.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "@jest/globals": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", + "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "requires": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/types": "^29.3.1", + "jest-mock": "^29.3.1" } }, "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", + "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", "requires": { + "@jridgewell/trace-mapping": "^0.3.15", "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "graceful-fs": "^4.2.9" } }, "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", + "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" + "@jest/console": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", + "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" + "@jest/test-result": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "slash": "^3.0.0" } }, "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", + "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" + "@babel/core": "^7.11.6", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", "requires": { + "@jest/schemas": "^29.0.0", "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "requires": { - "defer-to-connect": "^1.0.1" + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "requires": { + "@sinonjs/commons": "^1.7.0" } }, "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -11892,61 +10143,155 @@ } }, "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "requires": { "@babel/types": "^7.3.0" } }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "@types/d3-path": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz", "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==" }, "@types/d3-shape": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.5.tgz", - "integrity": "sha512-aPEax03owTAKynoK8ZkmkZEDZvvT4Y5pWgii4Jp4oQt0gH45j6siDl9gNDVC5kl64XHN2goN9jbYoHK88tFAcA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.8.tgz", + "integrity": "sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==", "requires": { "@types/d3-path": "^1" } }, + "@types/eslint": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "@types/express": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", + "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.32", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", + "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "requires": { "@types/minimatch": "*", "@types/node": "*" } }, + "@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "requires": { + "@types/node": "*" + } + }, + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" }, "@types/istanbul-lib-report": { "version": "3.0.0", @@ -11957,11 +10302,10 @@ } }, "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "requires": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, @@ -11974,37 +10318,95 @@ } }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "@types/node": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.3.0.tgz", - "integrity": "sha512-8/bnjSZD86ZfpBsDlCIkNXIvm+h6wi9g7IqL+kmFkQ+Wvu3JrasgLElfiPgoo8V8vVfnEi0QVS12gbl94h9YsQ==" + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" + }, + "@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "requires": { + "@types/node": "*" + } }, "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "requires": { + "@types/node": "*" + } }, "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", + "integrity": "sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==", "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { "version": "1.13.0", @@ -12049,162 +10451,154 @@ } }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, + "@webpack-cli/configtest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", + "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", + "requires": {} + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -12215,56 +10609,37 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" - }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "requires": {} }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" - }, "ajv": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", - "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -12276,64 +10651,52 @@ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "requires": {} }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "requires": {} - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "requires": { - "string-width": "^3.0.0" + "ajv": "^8.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" } } }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" }, "ansi-styles": { "version": "3.2.1", @@ -12344,29 +10707,14 @@ } }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -12375,26 +10723,6 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -12403,7 +10731,7 @@ "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "requires": { "array-uniq": "^1.0.1" } @@ -12411,337 +10739,27 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==" }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "awesome-typescript-loader": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz", - "integrity": "sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==", - "requires": { - "chalk": "^2.4.1", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.1.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.3", - "webpack-log": "^1.2.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", + "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - } - }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "@jest/transform": "^29.3.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -12750,15 +10768,10 @@ "color-convert": "^2.0.1" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12777,39 +10790,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12820,6 +10805,127 @@ } } }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "requires": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "bonjour-service": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -12830,156 +10936,22 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" + "fill-range": "^7.0.1" } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" } }, "bs-logger": { @@ -12998,122 +10970,15 @@ "node-int64": "^0.4.0" } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" }, "call-bind": { "version": "1.0.2", @@ -13124,33 +10989,43 @@ "get-intrinsic": "^1.0.2" } }, - "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==" - }, - "camelcase": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", - "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==" - }, - "caniuse-lite": { - "version": "1.0.30001228", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", - "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==" - }, - "capture-exit": { + "caller-callsite": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "requires": { - "rsvp": "^4.8.4" + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==" + } } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caniuse-lite": { + "version": "1.0.30001442", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz", + "integrity": "sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==" }, "chalk": { "version": "2.4.2", @@ -13162,199 +11037,126 @@ "supports-color": "^5.3.0" } }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } + "readdirp": "~3.6.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==" }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, "clean-webpack-plugin": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-2.0.2.tgz", - "integrity": "sha512-pi1111o4OBd9qvacbgs+NRqClfVPKVIc66B4d8kx6Ho/L+i9entQ/NpK600CsTYTPu3kWvKwwyKarsYMvC2xeA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", "requires": { - "del": "^4.0.0" + "del": "^4.1.1" } }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "requires": { "restore-cursor": "^2.0.0" } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "requires": { - "mimic-response": "^1.0.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" }, "color-convert": { "version": "1.9.3", @@ -13367,36 +11169,18 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -13417,84 +11201,44 @@ "on-headers": "~1.0.2", "safe-buffer": "5.1.2", "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" } }, "content-type": { @@ -13503,98 +11247,61 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "requires": { + "import-fresh": "^2.0.0", "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==" } } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -13607,45 +11314,42 @@ "which": "^1.2.9" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, "css-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", - "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", "requires": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.14", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", - "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "cssesc": { @@ -13653,32 +11357,6 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "requires": { - "cssom": "0.3.x" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "^0.10.9" - } - }, "d3-path": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", @@ -13692,150 +11370,41 @@ "d3-path": "1" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - } - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" } }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" }, "del": { "version": "4.1.1", @@ -13851,39 +11420,20 @@ "rimraf": "^2.6.3" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" }, "detect-node": { "version": "2.1.0", @@ -13895,43 +11445,17 @@ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "requires": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" } }, "doctrine": { @@ -13942,128 +11466,49 @@ "esutils": "^2.0.2" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.3.730", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.730.tgz", - "integrity": "sha512-1Tr3h09wXhmqXnvDyrRe6MFgTeU0ZXy3+rMJWTrOHh/HNesWwBBrKnMxRJWZ86dzs8qQdw2c7ZE1/qeGHygImA==" + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==" }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==" }, "error-ex": { "version": "1.3.2", @@ -14073,130 +11518,25 @@ "is-arrayish": "^0.2.1" } }, - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - } - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.47", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.47.tgz", - "integrity": "sha512-/1TItLfj+TTfWoeRcDn/0FbGV6SNo4R+On2GGVucPU/j3BWnXE2Co8h8CTo4Tu34gFJtnmwS9xiScKs4EjZhdw==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - } - } + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "eslint": { "version": "5.16.0", @@ -14241,32 +11581,10 @@ "text-table": "^0.2.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -14279,9 +11597,9 @@ } }, "eslint-plugin-prettier": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", - "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", "requires": { "prettier-linter-helpers": "^1.0.0" } @@ -14296,14 +11614,17 @@ } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==" + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" }, "espree": { "version": "5.0.1", @@ -14321,35 +11642,49 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "eventemitter3": { "version": "4.0.7", @@ -14361,132 +11696,110 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, - "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" - }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } } }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" - } + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" }, "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -14495,117 +11808,37 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "is-plain-object": "^2.0.4" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.2.0", @@ -14613,40 +11846,40 @@ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==" }, "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "requires": { "websocket-driver": ">=0.5.1" } }, "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "requires": { "bser": "2.1.1" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "requires": { "escape-string-regexp": "^1.0.5" } @@ -14660,82 +11893,58 @@ } }, "file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", - "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "to-regex-range": "^5.0.1" } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "flat-cache": { @@ -14746,107 +11955,53 @@ "flatted": "^2.0.0", "rimraf": "2.6.3", "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==" - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" }, "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true }, "function-bind": { "version": "1.1.1", @@ -14856,7 +12011,7 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, "gensync": { "version": "1.0.0-beta.2", @@ -14869,57 +12024,39 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - } + "has-symbols": "^1.0.3" } }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -14932,62 +12069,20 @@ "is-glob": "^4.0.1" } }, - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "requires": { - "ini": "1.3.7" - }, - "dependencies": { - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==" + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "requires": { "array-union": "^1.0.1", "glob": "^7.0.3", @@ -14999,75 +12094,20 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" } } }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - } - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -15076,174 +12116,87 @@ "function-bind": "^1.1.1" } }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "requires": { "inherits": "^2.0.1", "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" - } - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "http-proxy": { "version": "1.18.1", @@ -15256,30 +12209,21 @@ } }, "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, "iconv-lite": { "version": "0.4.24", @@ -15289,28 +12233,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, "icss-utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.0.tgz", - "integrity": "sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ==", - "requires": { - "postcss": "^7.0.14" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} }, "ignore": { "version": "4.0.6", @@ -15320,20 +12247,20 @@ "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", "requires": { "import-from": "^2.1.0" } }, "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -15342,7 +12269,7 @@ "import-from": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", "requires": { "resolve-from": "^3.0.0" }, @@ -15350,62 +12277,42 @@ "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==" } } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -15413,19 +12320,19 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" }, "strip-ansi": { "version": "5.2.0", @@ -15437,83 +12344,20 @@ } } }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==" }, "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "requires": { - "call-bind": "^1.0.0" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-binary-path": { "version": "2.1.0", @@ -15523,99 +12367,33 @@ "binary-extensions": "^2.0.0" } }, - "is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "requires": { "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==" }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" }, "is-generator-fn": { "version": "2.1.0", @@ -15623,66 +12401,17 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "dependencies": { - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - } - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" - }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-path-cwd": { "version": "2.2.0", @@ -15705,6 +12434,11 @@ "path-is-inside": "^1.0.2" } }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -15713,2523 +12447,48 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - } - } - }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" }, "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "requires": { - "html-escaper": "^2.0.0" - } - }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", - "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - } - } - }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - } - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", - "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "requires": { - "@jest/types": "^24.9.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "requires": {} - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" - }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", - "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" - } - }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - } - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" - }, - "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - } - } - }, - "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", - "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "requires": { - "package-json": "^6.3.0" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=" - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "requires": { - "chalk": "^2.0.1" - } - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" - }, - "loglevelnext": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", - "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", - "requires": { - "es6-symbol": "^3.1.1", - "object.assign": "^4.1.0" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" - }, - "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", - "requires": { - "mime-db": "1.47.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "mini-css-extract-plugin": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", - "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==", - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", - "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, - "node-releases": { - "version": "1.1.72", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", - "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==" - }, - "nodemon": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz", - "integrity": "sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==", - "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npm-watch": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.11.0.tgz", - "integrity": "sha512-wAOd0moNX2kSA2FNvt8+7ORwYaJpQ1ZoWjUYdb1bBCxq4nkWuU0IiJa9VpVxrj5Ks+FGXQd62OC/Bjk0aSr+dg==", - "requires": { - "nodemon": "^2.0.7", - "through2": "^4.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "requires": { - "readable-stream": "3" - } - } - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", - "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" - } - }, - "postcss-modules-scope": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", - "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "requires": { - "escape-goat": "^2.0.0" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "requires": { - "util.promisify": "^1.0.0" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { - "rc": "^1.2.8" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "requires": { - "lodash": "^4.17.19" - }, - "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - } - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "requires": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "dependencies": { @@ -18240,1145 +12499,94 @@ } } }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.8.tgz", - "integrity": "sha512-NDgA96EnaLSvtbM7trJj+t1LUR3pirkDCcz9nOUlPb5DMBGsH7oES6C3hs3j7R9oHEa1EMvReS/BUAIT5Tcr0g==" - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "spdy-transport": { + "istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "has-flag": "^4.0.0" } } } }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "requires": { - "extend-shallow": "^3.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", - "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==" - }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "requires": { - "nopt": "~1.0.10" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "requires": { - "punycode": "^2.1.0" - } - }, - "ts-jest": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.3.0.tgz", - "integrity": "sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==", - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "10.x" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { + "istanbul-reports": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "requires": { - "is-typedarray": "^1.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==" - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", + "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - } + "@jest/core": "^29.3.1", + "@jest/types": "^29.3.1", + "import-local": "^3.0.2", + "jest-cli": "^29.3.1" } }, - "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", "requires": { - "debug": "^2.2.0" + "execa": "^5.0.0", + "p-limit": "^3.1.0" } }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "jest-circus": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", + "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, - "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "dependencies": { "ansi-styles": { @@ -19390,9 +12598,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19426,253 +12634,2840 @@ } } }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "jest-cli": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", + "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "@jest/core": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" }, "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, - "url-loader": { + "jest-config": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", + "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.3.1", + "@jest/types": "^29.3.1", + "babel-jest": "^29.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.3.1", + "jest-environment-node": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "13.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", + "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", + "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "requires": { + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.3.1", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-node": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", + "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "requires": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==" + }, + "jest-haste-map": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", + "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "requires": { + "@jest/types": "^29.3.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", + "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "requires": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", + "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-util": "^29.3.1" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "requires": {} + }, + "jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==" + }, + "jest-resolve": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", + "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", + "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "requires": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.3.1" + } + }, + "jest-runner": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", + "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "requires": { + "@jest/console": "^29.3.1", + "@jest/environment": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-leak-detector": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-resolve": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-util": "^29.3.1", + "jest-watcher": "^29.3.1", + "jest-worker": "^29.3.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", + "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "requires": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/globals": "^29.3.1", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-snapshot": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", + "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.3.1", + "semver": "^7.3.5" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", + "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "requires": { + "@jest/types": "^29.3.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", + "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "requires": { + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.3.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "requires": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "requires": { + "tmpl": "1.0.5" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mini-css-extract-plugin": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" + }, + "nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + }, + "dependencies": { + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + } + } + }, + "npm-watch": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.11.0.tgz", + "integrity": "sha512-wAOd0moNX2kSA2FNvt8+7ORwYaJpQ1ZoWjUYdb1bBCxq4nkWuU0IiJa9VpVxrj5Ks+FGXQd62OC/Bjk0aSr+dg==", + "requires": { + "nodemon": "^2.0.7", + "through2": "^4.0.2" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "requires": { "loader-utils": "^1.1.0", - "mime": "^2.0.3", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", "schema-utils": "^1.0.0" }, "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } } } }, - "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-parse-lax": { + "postcss-modules-extract-imports": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "requires": { - "prepend-http": "^2.0.0" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "requires": { - "inherits": "2.0.3" + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + } + } + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + } + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "requires": { + "mimic-fn": "^1.0.0" + } + } + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "terser": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "~1.0.10" + } + }, + "ts-jest": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", + "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==" + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", - "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - } - } + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + } } }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "requires": { - "browser-process-hrtime": "^1.0.0" - } + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "requires": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "optional": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - } + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, "wbuf": { @@ -19683,398 +15478,265 @@ "minimalistic-assert": "^1.0.0" } }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" }, "dependencies": { "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "requires": {} }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } } } }, "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", + "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", + "colorette": "^2.0.14", + "commander": "^9.4.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" }, "dependencies": { - "emojis-list": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" + "isexe": "^2.0.0" } } } }, "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } }, "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "requires": { - "ms": "2.1.2" + "fast-deep-equal": "^3.1.3" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } + "glob": "^7.1.3" } }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "requires": { - "binary-extensions": "^1.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "requires": { - "async-limiter": "~1.0.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } }, - "webpack-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", - "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "requires": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "loglevelnext": "^1.0.1", - "uuid": "^3.1.0" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" }, "websocket-driver": { "version": "0.7.4", @@ -20091,29 +15753,6 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -20122,40 +15761,51 @@ "isexe": "^2.0.0" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { + "wildcard": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { - "string-width": "^4.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -20163,69 +15813,21 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -20233,7 +15835,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write": { "version": "1.0.3", @@ -20244,42 +15846,24 @@ } }, "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "signal-exit": "^3.0.7" } }, "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "requires": {} }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "3.1.1", @@ -20287,55 +15871,58 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/visual_console_client/package.json b/visual_console_client/package.json index 016411c660..98db3e7959 100644 --- a/visual_console_client/package.json +++ b/visual_console_client/package.json @@ -29,28 +29,29 @@ "@types/jest": "^24.9.1", "@typescript-eslint/eslint-plugin": "^1.13.0", "@typescript-eslint/parser": "^1.13.0", - "awesome-typescript-loader": "^5.2.1", - "clean-webpack-plugin": "^2.0.2", - "css-loader": "^2.1.1", + "clean-webpack-plugin": "^4.0.0", + "css-loader": "^6.7.3", "d3-shape": "^1.3.7", "eslint": "^5.16.0", "eslint-config-prettier": "^4.3.0", "eslint-plugin-prettier": "^3.4.0", - "file-loader": "^3.0.1", - "jest": "^24.9.0", - "mini-css-extract-plugin": "^0.5.0", + "file-loader": "^6.2.0", + "jest": "^29.3.1", + "mini-css-extract-plugin": "^2.7.2", "npm-watch": "^0.11.0", "postcss-loader": "^3.0.0", "prettier": "^1.19.1", - "ts-jest": "^24.3.0", - "typescript": "^3.9.9", - "url-loader": "^1.1.2", - "webpack": "^4.46.0", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.2" + "ts-jest": "^29.0.3", + "typescript": "^4.9.4", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.11.1" }, "browserslist": [ "> 1%", "last 2 versions" - ] + ], + "devDependencies": { + "ts-loader": "^9.4.2" + } } diff --git a/visual_console_client/src/Item.ts b/visual_console_client/src/Item.ts index 3d32e8d61e..3fd789b1b3 100644 --- a/visual_console_client/src/Item.ts +++ b/visual_console_client/src/Item.ts @@ -66,6 +66,7 @@ export interface ItemProps extends Position, Size { cacheExpiration: number | null; colorStatus: string; cellId: number | null; + alertOutline: boolean; } export interface ItemClickEvent { @@ -143,6 +144,7 @@ export function itemBasePropsDecoder(data: AnyObject): ItemProps | never { cacheExpiration: parseIntOr(data.cacheExpiration, null), colorStatus: notEmptyStringOr(data.colorStatus, "#CCC"), cellId: parseIntOr(data.cellId, null), + alertOutline: parseBoolean(data.alertOutline), ...sizePropsDecoder(data), // Object spread. It will merge the properties of the two objects. ...positionPropsDecoder(data) // Object spread. It will merge the properties of the two objects. }; @@ -534,6 +536,10 @@ abstract class VisualConsoleItem { box.style.left = `${this.props.x}px`; box.style.top = `${this.props.y}px`; + if (this.props.alertOutline) { + box.classList.add("is-alert-triggered"); + } + // Init the click listeners. box.addEventListener("dblclick", e => { if (!this.meta.isBeingMoved && !this.meta.isBeingResized) { @@ -815,15 +821,34 @@ abstract class VisualConsoleItem { prevProps: Props | null = null, prevMeta: ItemMeta | null = null ): void { - this.updateDomElement(this.childElementRef); - + if ( + prevProps && + (prevProps.type == ItemType.LINE_ITEM || + prevProps.type == ItemType.NETWORK_LINK) + ) { + this.updateDomElement(this.childElementRef); + } // Move box. if (!prevProps || this.positionChanged(prevProps, this.props)) { this.moveElement(this.props.x, this.props.y); + if ( + prevProps && + prevProps.type != ItemType.LINE_ITEM && + prevProps.type != ItemType.NETWORK_LINK + ) { + this.updateDomElement(this.childElementRef); + } } // Resize box. if (!prevProps || this.sizeChanged(prevProps, this.props)) { this.resizeElement(this.props.width, this.props.height); + if ( + prevProps && + prevProps.type != ItemType.LINE_ITEM && + prevProps.type != ItemType.NETWORK_LINK + ) { + this.updateDomElement(this.childElementRef); + } } // Change label. const oldLabelHtml = this.labelElementRef.innerHTML; @@ -887,8 +912,13 @@ abstract class VisualConsoleItem { ) { if (this.meta.editMode && this.meta.maintenanceMode === false) { this.elementRef.classList.add("is-editing"); + this.elementRef.classList.remove("is-alert-triggered"); } else { this.elementRef.classList.remove("is-editing"); + + if (this.props.alertOutline) { + this.elementRef.classList.add("is-alert-triggered"); + } } } @@ -923,6 +953,8 @@ abstract class VisualConsoleItem { } } } + + this.updateDomElement(this.childElementRef); } if (!prevMeta || prevMeta.isSelected !== this.meta.isSelected) { if (this.meta.isSelected) { diff --git a/visual_console_client/src/VisualConsole.ts b/visual_console_client/src/VisualConsole.ts index 22a8bd1f54..500f7dcdaa 100644 --- a/visual_console_client/src/VisualConsole.ts +++ b/visual_console_client/src/VisualConsole.ts @@ -558,6 +558,20 @@ export default class VisualConsole { delete this.lineLinks[i]; } } + + if ( + (this.lineLinks[i][line].start != itemAtStart && + this.lineLinks[i][line].end == itemAtEnd) || + (this.lineLinks[i][line].start == itemAtStart && + this.lineLinks[i][line].end != itemAtEnd) + ) { + // Object not connected to a line. + delete this.lineLinks[i][line]; + + if (Object.keys(this.lineLinks[i]).length === 0) { + delete this.lineLinks[i]; + } + } } } } catch (error) { @@ -722,7 +736,7 @@ export default class VisualConsole { context.containerRef.append(itemInstance.elementRef); return itemInstance; } catch (error) { - console.error("Error creating a new element:", error.message); + console.error("Error creating a new element:", (error as Error).message); } return; } @@ -759,7 +773,10 @@ export default class VisualConsole { try { this.elementsById[item.id].props = decodeProps(item); } catch (error) { - console.error("Error updating an element:", error.message); + console.error( + "Error updating an element:", + (error as Error).message + ); } } } @@ -780,7 +797,7 @@ export default class VisualConsole { ...decodeProps(item) }; } catch (error) { - console.error("Error updating element:", error.message); + console.error("Error updating element:", (error as Error).message); } // Re-build relations. diff --git a/visual_console_client/src/items/BarsGraph.ts b/visual_console_client/src/items/BarsGraph.ts index 2057b6254e..fa3e96303d 100644 --- a/visual_console_client/src/items/BarsGraph.ts +++ b/visual_console_client/src/items/BarsGraph.ts @@ -72,11 +72,8 @@ export function barsGraphPropsDecoder(data: AnyObject): BarsGraphProps | never { export default class BarsGraph extends Item { protected createDomElement(): HTMLElement { const element = document.createElement("div"); + element.innerHTML = this.props.html; element.className = "bars-graph"; - element.style.backgroundImage = `url(${this.props.html})`; - element.style.backgroundRepeat = "no-repeat"; - element.style.backgroundSize = `${this.props.width}px ${this.props.height}px`; - if ( this.props.agentDisabled === true || this.props.moduleDisabled === true @@ -84,13 +81,23 @@ export default class BarsGraph extends Item { element.style.opacity = "0.2"; } + // Hack to execute the JS after the HTML is added to the DOM. + const scripts = element.getElementsByTagName("script"); + for (let i = 0; i < scripts.length; i++) { + if (scripts[i].src.length === 0) { + setTimeout(() => { + try { + eval(scripts[i].innerHTML.trim()); + } catch (ignored) {} // eslint-disable-line no-empty + }, 0); + } + } + return element; } protected updateDomElement(element: HTMLElement): void { - element.style.backgroundImage = `url(${this.props.html})`; - element.style.backgroundRepeat = "no-repeat"; - element.style.backgroundSize = `${this.props.width}px ${this.props.height}px`; + element.innerHTML = this.props.html; if ( this.props.agentDisabled === true || @@ -98,5 +105,13 @@ export default class BarsGraph extends Item { ) { element.style.opacity = "0.2"; } + + // Hack to execute the JS after the HTML is added to the DOM. + const scripts = element.getElementsByTagName("script"); + for (let i = 0; i < scripts.length; i++) { + if (scripts[i].src.length === 0) { + eval(scripts[i].innerHTML.trim()); + } + } } } diff --git a/visual_console_client/src/items/DonutGraph.ts b/visual_console_client/src/items/DonutGraph.ts index 6b7ac6b87c..874e0f2ead 100644 --- a/visual_console_client/src/items/DonutGraph.ts +++ b/visual_console_client/src/items/DonutGraph.ts @@ -43,7 +43,7 @@ export function donutGraphPropsDecoder( ? data.html : decodeBase64(data.encodedHtml), legendBackgroundColor: stringIsEmpty(data.legendBackgroundColor) - ? "#000000" + ? "#ffffff" : data.legendBackgroundColor, ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects. ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects. @@ -55,6 +55,7 @@ export default class DonutGraph extends Item { const element = document.createElement("div"); element.className = "donut-graph"; element.innerHTML = this.props.html; + element.style.backgroundColor = this.props.legendBackgroundColor; if ( this.props.agentDisabled === true || @@ -66,9 +67,13 @@ export default class DonutGraph extends Item { // Hack to execute the JS after the HTML is added to the DOM. const scripts = element.getElementsByTagName("script"); for (let i = 0; i < scripts.length; i++) { - setTimeout(() => { - if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim()); - }, 0); + if (scripts[i].src.length === 0) { + setTimeout(() => { + try { + eval(scripts[i].innerHTML.trim()); + } catch (ignored) {} // eslint-disable-line no-empty + }, 0); + } } return element; @@ -76,11 +81,17 @@ export default class DonutGraph extends Item { protected updateDomElement(element: HTMLElement): void { element.innerHTML = this.props.html; + element.style.backgroundColor = this.props.legendBackgroundColor; + + if ( + this.props.agentDisabled === true || + this.props.moduleDisabled === true + ) { + element.style.opacity = "0.2"; + } // Hack to execute the JS after the HTML is added to the DOM. - const aux = document.createElement("div"); - aux.innerHTML = this.props.html; - const scripts = aux.getElementsByTagName("script"); + const scripts = element.getElementsByTagName("script"); for (let i = 0; i < scripts.length; i++) { if (scripts[i].src.length === 0) { eval(scripts[i].innerHTML.trim()); diff --git a/visual_console_client/src/items/ModuleGraph.ts b/visual_console_client/src/items/ModuleGraph.ts index 0de3d2fd68..e7f4c2c293 100644 --- a/visual_console_client/src/items/ModuleGraph.ts +++ b/visual_console_client/src/items/ModuleGraph.ts @@ -98,18 +98,6 @@ export default class ModuleGraph extends Item { element.style.opacity = "0.2"; } - // Remove the overview graph. - const legendP = element.getElementsByTagName("p"); - for (let i = 0; i < legendP.length; i++) { - legendP[i].style.margin = "0px"; - } - - // Remove the overview graph. - const overviewGraphs = element.getElementsByClassName("overview_graph"); - for (let i = 0; i < overviewGraphs.length; i++) { - overviewGraphs[i].remove(); - } - // Hack to execute the JS after the HTML is added to the DOM. const scripts = element.getElementsByTagName("script"); for (let i = 0; i < scripts.length; i++) { @@ -128,16 +116,11 @@ export default class ModuleGraph extends Item { protected updateDomElement(element: HTMLElement): void { element.innerHTML = this.props.html; - // Remove the overview graph. - const legendP = element.getElementsByTagName("p"); - for (let i = 0; i < legendP.length; i++) { - legendP[i].style.margin = "0px"; - } - - // Remove the overview graph. - const overviewGraphs = element.getElementsByClassName("overview_graph"); - for (let i = 0; i < overviewGraphs.length; i++) { - overviewGraphs[i].remove(); + if ( + this.props.agentDisabled === true || + this.props.moduleDisabled === true + ) { + element.style.opacity = "0.2"; } // Hack to execute the JS after the HTML is added to the DOM. diff --git a/visual_console_client/src/items/Odometer.ts b/visual_console_client/src/items/Odometer.ts index 4aeaae5527..ecaeae2e0b 100644 --- a/visual_console_client/src/items/Odometer.ts +++ b/visual_console_client/src/items/Odometer.ts @@ -223,16 +223,11 @@ export default class Odometer extends Item { let script = document.createElement("script"); script.type = "text/javascript"; - script.onload = function() { + script.onload = () => { odometerB.style.transform = `rotate(${rotate}turn)`; }; - - if (typeof this.props.metaconsoleId !== "undefined") { - script.src = "./../../include/javascript/pandora_alerts.js"; - } else { - script.src = "./include/javascript/pandora_alerts.js"; - } - + var url_pandora = window.location.pathname.split("/")[1]; + script.src = `${document.dir}/${url_pandora}/include/javascript/pandora_alerts.js`; odometerA.appendChild(h1); odometerA.appendChild(h2); odometerContainer.appendChild(odometerB); @@ -325,9 +320,7 @@ export default class Odometer extends Item { } private getCoords(percent: number, radio: number): string { - if (this.props.minMaxValue === "") { - percent = percent; - } else { + if (this.props.minMaxValue !== "") { const minMax = JSON.parse(this.props.minMaxValue); if (minMax["min"] === percent) { percent = 0; diff --git a/visual_console_client/src/main.css b/visual_console_client/src/main.css index aae750bb7b..459e0fc805 100644 --- a/visual_console_client/src/main.css +++ b/visual_console_client/src/main.css @@ -74,6 +74,10 @@ } } +.visual-console-item.is-alert-triggered { + border: 3px solid #f36201; +} + .visual-console-spinner { background-color: transparent; margin: 0px auto; diff --git a/visual_console_client/tsconfig.json b/visual_console_client/tsconfig.json index 5f047a33d6..094e4f8552 100644 --- a/visual_console_client/tsconfig.json +++ b/visual_console_client/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "outDir": "./dist/", "target": "es5", "module": "es6", "strict": true, diff --git a/visual_console_client/webpack.config.js b/visual_console_client/webpack.config.js index d8ec769d50..a4f0d628ff 100644 --- a/visual_console_client/webpack.config.js +++ b/visual_console_client/webpack.config.js @@ -1,8 +1,6 @@ // eslint-disable-next-line @typescript-eslint/no-var-requires const path = require("path"); // eslint-disable-next-line @typescript-eslint/no-var-requires -const CleanWebpackPlugin = require("clean-webpack-plugin"); -// eslint-disable-next-line @typescript-eslint/no-var-requires const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const dev = process.env.NODE_ENV !== "production"; @@ -21,7 +19,9 @@ module.exports = { output: { path: buildPath, // The files will be created here. // filename: dev ? "vc.[name].min.js" : "vc.[name].[chunkhash:8].min.js" - filename: "vc.[name].min.js" + filename: "vc.[name].min.js", + assetModuleFilename: "[name][ext]", + clean: true }, devtool: "source-map", resolve: { @@ -31,19 +31,27 @@ module.exports = { rules: [ // Loader for the Typescript compiler. { - test: /\.ts$/, - loader: "awesome-typescript-loader" + test: /\.(ts)x?$/, + exclude: /node_modules|\.d\.ts$/, // this line as well + use: { + loader: "ts-loader", + options: { + compilerOptions: { + noEmit: false + } + } + } }, // This loader builds a main CSS file from all the CSS imports across the files. { test: /\.css$/, - loader: [ + use: [ // https://github.com/webpack-contrib/mini-css-extract-plugin { loader: MiniCssExtractPlugin.loader, options: { - hot: true, // if you want HMR - we try to automatically inject hot reloading but if it's not working, add it to the config - reloadAll: true // when desperation kicks in - this is a brute force HMR flag + //hot: true // if you want HMR - we try to automatically inject hot reloading but if it's not working, add it to the config + //reloadAll: true // when desperation kicks in - this is a brute force HMR flag } }, // https://webpack.js.org/loaders/css-loader @@ -52,20 +60,6 @@ module.exports = { options: { sourceMap: true } - }, - // To post process CSS and add some things like prefixes to the rules. e.g.: -webkit-... - // https://github.com/postcss/postcss-loader - { - loader: "postcss-loader", - options: { - plugins: () => [ - // Moved to package.json (?) - // // To improve the support for old browsers. - // require("autoprefixer")({ - // browsers: ["> 1%", "last 2 versions"] - // }) - ] - } } ] }, @@ -74,32 +68,25 @@ module.exports = { // https://webpack.js.org/loaders/url-loader { test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/, - loader: "url-loader", - options: { - limit: 10000, - // name: "[name].[hash:8].[ext]" - name: "[name].[ext]" + type: "asset", + generator: { + filename: "[name][ext]" } } ] }, plugins: [ - // This plugin will remove all files inside Webpack's output.path directory, - // as well as all unused webpack assets after every successful rebuild. - new CleanWebpackPlugin(), // Options for the plugin which extract the CSS files to build a main file. new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional // filename: dev ? "vc.[name].css" : "vc.[name].[contenthash:8].css", - filename: "vc.[name].css", - // Disable to remove warnings about conflicting order between imports. - orderWarning: true + filename: "vc.[name].css" }) ], // Static server which runs the playground on npm start. devServer: { open: true, - contentBase: "playground" + static: path.join(__dirname, "playground") } };