summaryrefslogtreecommitdiff
path: root/solenv/bin/modules/installer/control.pm
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/bin/modules/installer/control.pm')
-rw-r--r--solenv/bin/modules/installer/control.pm719
1 files changed, 0 insertions, 719 deletions
diff --git a/solenv/bin/modules/installer/control.pm b/solenv/bin/modules/installer/control.pm
deleted file mode 100644
index cda8512fc..000000000
--- a/solenv/bin/modules/installer/control.pm
+++ /dev/null
@@ -1,719 +0,0 @@
-#*************************************************************************
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# Copyright 2000, 2010 Oracle and/or its affiliates.
-#
-# OpenOffice.org - a multi-platform office productivity suite
-#
-# This file is part of OpenOffice.org.
-#
-# OpenOffice.org is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License version 3
-# only, as published by the Free Software Foundation.
-#
-# OpenOffice.org 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 Lesser General Public License version 3 for more details
-# (a copy is included in the LICENSE file that accompanied this code).
-#
-# You should have received a copy of the GNU Lesser General Public License
-# version 3 along with OpenOffice.org. If not, see
-# <http://www.openoffice.org/license.html>
-# for a copy of the LGPLv3 License.
-#
-#*************************************************************************
-
-package installer::control;
-
-use Cwd;
-use installer::converter;
-use installer::exiter;
-use installer::files;
-use installer::globals;
-use installer::pathanalyzer;
-use installer::scriptitems;
-use installer::systemactions;
-
-#########################################################
-# Function that can be used for additional controls.
-# Search happens in $installer::globals::patharray.
-#########################################################
-
-sub check_needed_files_in_path
-{
- my ( $filesref ) = @_;
-
- foreach $onefile ( @{$filesref} )
- {
- installer::logger::print_message( "...... searching $onefile ..." );
-
- my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$onefile, $installer::globals::patharray , 0);
-
- if ( $$fileref eq "" )
- {
- $error = 1;
- installer::logger::print_error( "$onefile not found\n" );
- }
- else
- {
- installer::logger::print_message( "\tFound: $$fileref\n" );
- }
- }
-
- if ( $error )
- {
- installer::exiter::exit_program("ERROR: Could not find all needed files in path!", "check_needed_files_in_path");
- }
-}
-
-#########################################################
-# Checking the local system
-# Checking existence of needed files in include path
-#########################################################
-
-sub check_system_path
-{
- # The following files have to be found in the environment variable PATH
- # All platforms: zip
- # Windows only: "msiinfo.exe", "msidb.exe", "uuidgen.exe", "makecab.exe", "msitran.exe", "expand.exe" for msi database and packaging
-
- my $onefile;
- my $error = 0;
- my $pathvariable = $ENV{'PATH'};
- my $local_pathseparator = $installer::globals::pathseparator;
-
- if( $^O =~ /cygwin/i )
- { # When using cygwin's perl the PATH variable is POSIX style and ...
- my $temparrayref = installer::converter::convert_stringlist_into_array_without_newline(\$pathvariable, $local_pathseparator);
- foreach $i (0..$#$temparrayref) {
- $$temparrayref[$i] = qx{cygpath -m "$$temparrayref[$i]"};
- chomp($$temparrayref[$i]);
- }
- # has to be converted to DOS style for further use.
- $local_pathseparator = ';';
- $pathvariable = join($local_pathseparator, @$temparrayref);
- }
- my $patharrayref = installer::converter::convert_stringlist_into_array(\$pathvariable, $local_pathseparator);
-
- $installer::globals::patharray = $patharrayref;
-
- my @needed_files_in_path = ();
-
- if (($installer::globals::iswin) && ($installer::globals::iswindowsbuild))
- {
- @needed_files_in_path = ("zip.exe", "msiinfo.exe", "msidb.exe", "uuidgen.exe", "makecab.exe", "msitran.exe", "expand.exe");
- }
- elsif ($installer::globals::iswin)
- {
- @needed_files_in_path = ("zip.exe");
- }
- else
- {
- @needed_files_in_path = ("zip");
- }
-
- foreach $onefile ( @needed_files_in_path )
- {
- installer::logger::print_message( "...... searching $onefile ..." );
-
- my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$onefile, $patharrayref , 0);
-
- if ( $$fileref eq "" )
- {
- $error = 1;
- installer::logger::print_error( "$onefile not found\n" );
- }
- else
- {
- installer::logger::print_message( "\tFound: $$fileref\n" );
- # Saving the absolut path for msitran.exe. This is required for the determination of the checksum.
- if ( $onefile eq "msitran.exe" ) { $installer::globals::msitranpath = $$fileref; }
- }
- }
-
- if ( $error )
- {
- installer::exiter::exit_program("ERROR: Could not find all needed files in path!", "check_system_path");
- }
-
- # checking for epm, which has to be in the path or in the solver
-
- if (( $installer::globals::call_epm ) && (!($installer::globals::iswindowsbuild)))
- {
- my $onefile = "epm";
- my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$onefile, $patharrayref , 0);
- if (!( $$fileref eq "" ))
- {
- $installer::globals::epm_in_path = 1;
-
- if ( $$fileref =~ /^\s*\.\/epm\s*$/ )
- {
- my $currentdir = cwd();
- $$fileref =~ s/\./$currentdir/;
- }
-
- $installer::globals::epm_path = $$fileref;
- }
- }
-
- # checking, if upx can be found in path
-
- if ( $installer::globals::iswindowsbuild ) { $installer::globals::upxfile = "upx.exe"; }
- else { $installer::globals::upxfile = "upx"; }
-
- my $upxfilename = $installer::globals::upxfile;
- my $upxfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$upxfilename, $patharrayref , 0);
-
- if (!( $$upxfileref eq "" ))
- {
- $installer::globals::upx_in_path = 1;
- $installer::globals::upxfile = $$upxfileref;
- installer::logger::print_message( "\tFound: $$upxfileref\n" );
- }
-
-}
-
-######################################################################
-# Determining the version of file makecab.exe
-######################################################################
-
-sub get_makecab_version
-{
- my $makecabversion = -1;
-
- my $systemcall = "makecab.exe |";
- my @makecaboutput = ();
-
- open (CAB, $systemcall);
- while (<CAB>) { push(@makecaboutput, $_); }
- close (CAB);
-
- my $returnvalue = $?; # $? contains the return value of the systemcall
-
- if ($returnvalue)
- {
- $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
- push( @installer::globals::globallogfileinfo, $infoline);
- }
- else
- {
- $infoline = "Success: Executed \"$systemcall\" successfully!\n";
- push( @installer::globals::globallogfileinfo, $infoline);
-
- my $versionline = "";
-
- for ( my $i = 0; $i <= $#makecaboutput; $i++ )
- {
- if ( $makecaboutput[$i] =~ /\bVersion\b/i )
- {
- $versionline = $makecaboutput[$i];
- last;
- }
- }
-
- $infoline = $versionline;
- push( @installer::globals::globallogfileinfo, $infoline);
-
- if ( $versionline =~ /\bVersion\b\s+(\d+[\d\.]+\d+)\s+/ )
- {
- $makecabversion = $1;
- }
-
- # Only using the first number
-
- if ( $makecabversion =~ /^\s*(\d+?)\D*/ )
- {
- $makecabversion = $1;
- }
-
- $infoline = "Using version: " . $makecabversion . "\n";
- push( @installer::globals::globallogfileinfo, $infoline);
- }
-
- return $makecabversion;
-}
-
-######################################################################
-# Checking the version of file makecab.exe
-######################################################################
-
-sub check_makecab_version
-{
- # checking version of makecab.exe
- # Now it is guaranteed, that makecab.exe is in the path
-
- my $do_check = 1;
-
- my $makecabversion = get_makecab_version();
-
- my $infoline = "Tested version: " . $installer::globals::controlledmakecabversion . "\n";
- push( @installer::globals::globallogfileinfo, $infoline);
-
- if ( $makecabversion < 0 ) { $do_check = 0; } # version could not be determined
-
- if ( $do_check )
- {
- if ( $makecabversion < $installer::globals::controlledmakecabversion )
- {
- # warning for OOo, error for inhouse products
- if ( $installer::globals::isopensourceproduct )
- {
- installer::logger::print_warning("Old version of makecab.exe. Found version: \"$makecabversion\", tested version: \"$installer::globals::controlledmakecabversion\"!\n");
- }
- else
- {
- installer::exiter::exit_program("makecab.exe too old. Found version: \"$makecabversion\", required version: \"$installer::globals::controlledmakecabversion\"!", "check_makecab_version");
- }
- }
- }
- else
- {
- $infoline = "Warning: No version check of makecab.exe\n";
- push( @installer::globals::globallogfileinfo, $infoline);
- }
-}
-
-######################################################################
-# Reading the environment variables for the pathes in ziplist.
-# solarpath, solarenvpath, solarcommonpath, os, osdef, pmiscpath
-######################################################################
-
-sub check_system_environment
-{
- my %variables = ();
- my $key;
- my $error = 0;
-
- foreach $key ( @installer::globals::environmentvariables )
- {
- my $value = "";
- if ( $ENV{$key} ) { $value = $ENV{$key}; }
- $variables{$key} = $value;
-
- if ( $value eq "" )
- {
- installer::logger::print_error( "$key not set in environment\n" );
- $error = 1;
- }
- }
-
- if ( $error )
- {
- installer::exiter::exit_program("ERROR: Environment variable not set!", "check_system_environment");
- }
-
- return \%variables;
-}
-
-#############################################################
-# Controlling the log file at the end of the
-# packaging process
-#############################################################
-
-sub check_logfile
-{
- my ($logfile) = @_;
-
- my @errors = ();
- my @output = ();
- my $contains_error = 0;
-
- my $ignore_error = 0;
- my $make_error_to_warning = 0;
-
- if (( ! $installer::globals::pro ) && ( $installer::globals::ignore_error_in_logfile )) { $ignore_error = 1; }
-
- for ( my $i = 0; $i <= $#{$logfile}; $i++ )
- {
- my $line = ${$logfile}[$i];
-
- # Errors are all errors, but not the Windows installer table "Error.idt"
-
- my $compareline = $line;
- $compareline =~ s/Error\.idt//g; # removing all occurrences of "Error.idt"
- $compareline =~ s/Error\.mlf//g; # removing all occurrences of "Error.mlf"
- $compareline =~ s/Error\.ulf//g; # removing all occurrences of "Error.ulf"
- $compareline =~ s/Error\.idl//g; # removing all occurrences of "Error.idl"
- $compareline =~ s/Error\.html//g; # removing all occurrences of "Error.html"
-
- if ( $compareline =~ /\bError\b/i )
- {
- $contains_error = 1;
- push(@errors, $line);
-
- if ( $ignore_error )
- {
- $contains_error = 0;
- $make_error_to_warning = 1;
- }
- }
- }
-
- if ($contains_error)
- {
- my $line = "\n*********************************************************************\n";
- push(@output, $line);
- $line = "ERROR: The following errors occurred in packaging process:\n\n";
- push(@output, $line);
-
- for ( my $i = 0; $i <= $#errors; $i++ )
- {
- $line = "$errors[$i]";
- push(@output, $line);
- }
-
- $line = "*********************************************************************\n";
- push(@output, $line);
- }
- else
- {
- my $line = "";
-
- if ( $make_error_to_warning )
- {
- $line = "\n*********************************************************************\n";
- push(@output, $line);
- $line = "The following errors in the log file were ignored:\n\n";
- push(@output, $line);
-
- for ( my $i = 0; $i <= $#errors; $i++ )
- {
- $line = "$errors[$i]";
- push(@output, $line);
- }
-
- $line = "*********************************************************************\n";
- push(@output, $line);
- }
-
- $line = "\n***********************************************************\n";
- push(@output, $line);
- $line = "Successful packaging process!\n";
- push(@output, $line);
- $line = "***********************************************************\n";
- push(@output, $line);
- }
-
- # printing the output file and adding it to the logfile
-
- installer::logger::include_header_into_logfile("Summary:");
-
- my $force = 1; # print this message even in 'quiet' mode
- for ( my $i = 0; $i <= $#output; $i++ )
- {
- my $line = "$output[$i]";
- installer::logger::print_message( "$line", $force );
- push( @installer::globals::logfileinfo, $line);
- push( @installer::globals::errorlogfileinfo, $line);
- }
-
- return $contains_error;
-}
-
-#############################################################
-# Determining the ship installation directory
-#############################################################
-
-sub determine_ship_directory
-{
- my ($languagesref) = @_;
-
- if (!( $ENV{'SHIPDRIVE'} )) { installer::exiter::exit_program("ERROR: SHIPDRIVE must be set for updater!", "determine_ship_directory"); }
-
- my $shipdrive = $ENV{'SHIPDRIVE'};
-
- my $languagestring = $$languagesref;
-
- if (length($languagestring) > $installer::globals::max_lang_length )
- {
- my $number_of_languages = installer::systemactions::get_number_of_langs($languagestring);
- chomp(my $shorter = `echo $languagestring | md5sum | sed -e "s/ .*//g"`);
- my $id = substr($shorter, 0, 8); # taking only the first 8 digits
- $languagestring = "lang_" . $number_of_languages . "_id_" . $id;
- }
-
- my $productstring = $installer::globals::product;
- my $productsubdir = "";
-
- if ( $productstring =~ /^\s*(.+?)\_\_(.+?)\s*$/ )
- {
- $productstring = $1;
- $productsubdir = $2;
- }
-
- if ( $installer::globals::languagepack ) { $productstring = $productstring . "_languagepack"; }
- if ( $installer::globals::helppack ) { $productstring = $productstring . "_helppack"; }
- if ( $installer::globals::patch ) { $productstring = $productstring . "_patch"; }
-
- my $destdir = $shipdrive . $installer::globals::separator . $installer::globals::compiler .
- $installer::globals::productextension . $installer::globals::separator .
- $productstring . $installer::globals::separator;
-
- if ( $productsubdir ) { $destdir = $destdir . $productsubdir . $installer::globals::separator; }
-
- $destdir = $destdir . $installer::globals::installertypedir . $installer::globals::separator .
- $installer::globals::build . "_" . $installer::globals::lastminor . "_" .
- "native_inprogress-number_" . $languagestring . "\." . $installer::globals::buildid;
-
- my $infoline = "\nSetting ship directory: $destdir\n";
- push(@installer::globals::globallogfileinfo, $infoline);
-
- return $destdir;
-}
-
-#############################################################
-# Controlling if this is an official RE pack process
-#############################################################
-
-sub check_updatepack
-{
- my $shipdrive = "";
- my $filename = "";
- my $infoline = "";
-
- if ( $ENV{'UPDATER'} ) # the environment variable UPDATER has to be set
- {
- $infoline = "\nEnvironment variable UPDATER set\n";
- push(@installer::globals::globallogfileinfo, $infoline);
-
- # There are no CWSes any more, no environment variable CWS_WORK_STAMP
- {
- if ( $ENV{'SHIPDRIVE'} ) # the environment variable SHIPDRIVE must be set
- {
- $shipdrive = $ENV{'SHIPDRIVE'};
- $infoline = "Ship drive defined: $shipdrive\n";
- push(@installer::globals::globallogfileinfo, $infoline);
-
- if ( -d $shipdrive ) # SHIPDRIVE must be a directory
- {
- $infoline = "Ship drive exists\n";
- push(@installer::globals::globallogfileinfo, $infoline);
-
- # try to write into $shipdrive
-
- $directory = $installer::globals::product . "_" . $installer::globals::compiler . "_" . $installer::globals::buildid . "_" . $installer::globals::languageproducts[0] . "_test_$$";
- $directory =~ s/\,/\_/g; # for the list of languages
- $directory =~ s/\-/\_/g; # for en-US, pt-BR, ...
- $directory = $shipdrive . $installer::globals::separator . $directory;
-
- $infoline = "Try to create directory: $directory\n";
- push(@installer::globals::globallogfileinfo, $infoline);
-
- # saving this directory for later removal
- $installer::globals::shiptestdirectory = $directory;
-
- if ( installer::systemactions::try_to_create_directory($directory))
- {
- $infoline = "Write access on Ship drive\n";
- push(@installer::globals::globallogfileinfo, $infoline);
- $infoline = "Ship test directory $installer::globals::shiptestdirectory was successfully created\n";
- push(@installer::globals::globallogfileinfo, $infoline);
- my $systemcall = "rmdir $directory";
- my $returnvalue = system($systemcall);
-
- # 5th condition: No local build environment.
- # In this case the content of SOLARENV starts with the content of SOL_TMP
-
- my $solarenv = "";
- my $sol_tmp;
- if ( $ENV{'SOLARENV'} ) { $solarenv = $ENV{'SOLARENV'}; }
-
- $infoline = "Environment variable SOLARENV: $solarenv\n";
- push(@installer::globals::globallogfileinfo, $infoline);
-
- if ( $ENV{'SOL_TMP'} )
- {
- $sol_tmp = $ENV{'SOL_TMP'};
- $infoline = "Environment variable SOL_TMP: $sol_tmp\n";
- } else {
- $infoline = "Environment variable SOL_TMP not set\n";
- }
- push(@installer::globals::globallogfileinfo, $infoline);
-
- if ( defined $sol_tmp && ( $solarenv =~ /^\s*\Q$sol_tmp\E/ ))
- {
- $infoline = "Content of SOLARENV starts with the content of SOL_TMP\: Local environment -\> No Updatepack\n";
- push(@installer::globals::globallogfileinfo, $infoline);
- }
- else
- {
- $infoline = "Content of SOLARENV does not start with the content of SOL_TMP: No local environment\n";
- push(@installer::globals::globallogfileinfo, $infoline);
-
- $installer::globals::updatepack = 1; # That's it
- }
-
- # Additional logging information for the temporary ship directory
-
- if ( -d $installer::globals::shiptestdirectory )
- {
- $infoline = "Ship test directory $installer::globals::shiptestdirectory still exists. Trying removal later again.\n";
- push(@installer::globals::globallogfileinfo, $infoline);
- }
- else
- {
- $infoline = "Ship test directory $installer::globals::shiptestdirectory was successfully removed.\n";
- push(@installer::globals::globallogfileinfo, $infoline);
- }
- }
- else
- {
- $infoline = "No write access on Ship drive\n";
- push(@installer::globals::globallogfileinfo, $infoline);
- $infoline = "Failed to create directory $directory\n";
- push(@installer::globals::globallogfileinfo, $infoline);
- if ( defined $ENV{'BSCLIENT'} && ( uc $ENV{'BSCLIENT'} eq 'TRUE' ) ) {
- installer::exiter::exit_program("ERROR: No write access to SHIPDRIVE allthough BSCLIENT is set.", "check_updatepack");
- }
- }
- }
- else
- {
- $infoline = "Ship drive not found: No updatepack\n";
- push(@installer::globals::globallogfileinfo, $infoline);
- }
- }
- else
- {
- $infoline = "Environment variable SHIPDRIVE not set: No updatepack\n";
- push(@installer::globals::globallogfileinfo, $infoline);
- }
- }
- }
-
- if ( $installer::globals::updatepack ) { $infoline = "Setting updatepack true\n\n"; }
- else { $infoline = "\nNo updatepack\n"; }
- push(@installer::globals::globallogfileinfo, $infoline);
-
-}
-
-#############################################################
-# Reading the Windows list file for language encodings
-#############################################################
-
-sub read_encodinglist
-{
- my ($patharrayref) = @_;
-
- my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$installer::globals::encodinglistname, $patharrayref , 0);
-
- if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Did not find Windows encoding list $installer::globals::encodinglistname!", "read_encodinglist"); }
-
- my $infoline = "Found encoding file: $$fileref\n";
- push(@installer::globals::globallogfileinfo, $infoline);
-
- my $encodinglist = installer::files::read_file($$fileref);
-
- my %msiencoding = ();
- my %msilanguage = ();
-
- # Controlling the encoding list
-
- for ( my $i = 0; $i <= $#{$encodinglist}; $i++ )
- {
- my $line = ${$encodinglist}[$i];
-
- if ( $line =~ /^\s*\#/ ) { next; } # this is a comment line
-
- if ( $line =~ /^(.*?)(\#.*)$/ ) { $line = $1; } # removing comments after "#"
-
- if ( $line =~ /^\s*([\w-]+)\s*(\d+)\s*(\d+)\s*$/ )
- {
- my $onelanguage = $1;
- my $codepage = $2;
- my $windowslanguage = $3;
-
- $msiencoding{$onelanguage} = $codepage;
- $msilanguage{$onelanguage} = $windowslanguage;
- }
- else
- {
- installer::exiter::exit_program("ERROR: Wrong syntax in Windows encoding list $installer::globals::encodinglistname : en-US 1252 1033 !", "read_encodinglist");
- }
- }
-
- $installer::globals::msiencoding = \%msiencoding;
- $installer::globals::msilanguage = \%msilanguage;
-}
-
-#############################################################
-# Only for Windows and Linux (RPM)there is currently
-# a reliable mechanism to register extensions during
-# installation process. Therefore it is for all other
-# platforms forbidden to install oxt files into that
-# directory, in which they are searched for registration.
-#############################################################
-
-sub check_oxtfiles
-{
- my ( $filesarray ) = @_;
-
- for ( my $i = 0; $i <= $#{$filesarray}; $i++ )
- {
- my $onefile = ${$filesarray}[$i];
-
- if (( $onefile->{'Name'} ) && ( $onefile->{'Dir'} ))
- {
- if (( $onefile->{'Name'} =~ /\.oxt\s*$/ ) && ( $onefile->{'Dir'} eq $installer::globals::extensioninstalldir ))
- {
- installer::exiter::exit_program("There is currently only for Linux (RPM) and Windows a reliable mechanism to register extensions during installation.\nPlease remove file \"$onefile->{'gid'}\" from your installation set!\nYou can use \"\#ifdef WNT\" and \"\#ifdef LINUX\" in scp.", "check_oxtfiles");
- }
- }
- }
-}
-
-#############################################################
-# Check if Java is available to create xpd installer
-#############################################################
-
-sub check_java_for_xpd
-{
- my ( $allvariables ) = @_;
-
- if ( ! $installer::globals::solarjavaset ) { $allvariables->{'XPDINSTALLER'} = 0; }
-}
-
-####################################################################
-# Setting global variable "$installer::globals::addchildprojects"
-####################################################################
-
-sub set_addchildprojects
-{
- my ($allvariables) = @_;
-
- if (( $allvariables->{'JAVAPRODUCT'} ) ||
- ( $allvariables->{'ADAPRODUCT'} ) ||
- ( $allvariables->{'UREPRODUCT'} ) ||
- ( $allvariables->{'ADDREQUIREDPACKAGES'} )) { $installer::globals::addchildprojects = 1; }
-
- if ( $installer::globals::patch )
- {
- $installer::globals::addchildprojects = 0; # no child projects for patches
- }
-
- my $infoline = "Value of \$installer::globals::addchildprojects: $installer::globals::addchildprojects\n";
- push( @installer::globals::globallogfileinfo, $infoline);
-}
-
-#######################################################################
-# Setting global variable "$installer::globals::addsystemintegration"
-#######################################################################
-
-sub set_addsystemintegration
-{
- my ($allvariables) = @_;
-
- if ( $allvariables->{'ADDSYSTEMINTEGRATION'} ) { $installer::globals::addsystemintegration = 1; }
-
- if ( $installer::globals::patch ) { $installer::globals::addsystemintegration = 0; }
- if ( $installer::globals::languagepack ) { $installer::globals::addsystemintegration = 0; }
- if ( $installer::globals::helppack ) { $installer::globals::addsystemintegration = 0; }
- if (( $installer::globals::packageformat eq "native" ) || ( $installer::globals::packageformat eq "portable" )) { $installer::globals::addsystemintegration = 0; }
-
- my $infoline = "Value of \$installer::globals::addsystemintegration: $installer::globals::addsystemintegration\n";
- push( @installer::globals::globallogfileinfo, $infoline);
-}
-
-1;