[-]
[+]
|
Added |
otrs.changes
|
|
[-]
[+]
|
Changed |
otrs.spec
^
|
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Custom
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GI
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GI/Mapping
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GI/Transport
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GI/Transport/HTTP
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface/Event
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface/Invoker
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface/Invoker/SolMan
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface/Invoker/Test
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface/Mapping
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface/Operation
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface/Operation/SolMan
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface/Operation/Test
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface/Transport
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/GenericInterface/Transport/HTTP
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/Output/ASCII
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/Output/XML
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/Scheduler
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/Scheduler/TaskHandler
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/System/GI
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/System/GenericInterface
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/System/Scheduler
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/System/Support
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/System/Support/Database
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/System/Support/Webserver
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/System/SysConfig
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/System/UnitTest
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/System/VirtualFS
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/System/XMLMaster
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Archive
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Archive/Tar
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/CSS
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Class
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Class/Inspector
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Digest
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Digest/SHA
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Email
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/HTML
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/HTTP
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/HTTP/Request
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/JSON
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/JSON/PP
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/JSON/backportPP
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/JavaScript
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/LWP
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/LWP/Authen
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/LWP/Protocol
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Mozilla
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Mozilla/CA
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Net/SMTP/TLS
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/Proc
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/SOAP
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/SOAP/Lite
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/SOAP/Lite/Deserializer
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/SOAP/Transport
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/URI
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/URI/file
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/URI/urn
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/YAML
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/YAML/Dumper
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/YAML/Loader
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/Kernel/cpan-lib/version
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/bin/cgi-bin/cpanel
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/diagrams
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/diagrams/GenericInterface
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/diagrams/Scheduler
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc-admin
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc-admin/en
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc-admin/en/screenshots
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc-developer
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc-developer/en
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc-developer/en/content
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc-developer/en/content/get-started
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc-developer/en/content/hacking-otrs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc-developer/en/content/hacking-otrs/module-format
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc-developer/en/content/screenshots
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc/en
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc/en/content
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc/en/content/get-started
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/doc/en/screenshots
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/mockups
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/development/mockups/GI
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/doc/sample_mails
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/suse-fillup-template-rc.config.otrs
^
|
@@ -1,5 +0,0 @@
-#
-# Start OTRS (yes|no)?
-# (a web based ticket system)
-#
-START_OTRS="yes"
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/suse-otrs-7.3.spec
^
|
@@ -1,196 +0,0 @@
-# --
-# RPM spec file for SuSE Linux of the OTRS package
-# Copyright (C) 2001-2009 OTRS AG, http://otrs.org/
-# --
-# $Id: suse-otrs-7.3.spec,v 1.35 2009/02/16 12:50:17 tr Exp $
-# --
-# This software comes with ABSOLUTELY NO WARRANTY. For details, see
-# the enclosed file COPYING for license information (AGPL). If you
-# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
-# --
-#
-# please send bugfixes or comments to bugs+rpm@otrs.org
-#
-# --
-Summary: The Open Ticket Request System.
-Name: otrs
-Version: 0.0
-Copyright: GNU GENERAL PUBLIC LICENSE Version 2, June 1991
-Group: Applications/Mail
-Provides: otrs
-Requires: perl perl-DBI perl-GD perl-Net-DNS perl-Digest-MD5 apache mod_perl mysql mysql-client perl-Msql-Mysql-modules mysql-shared procmail perl-MIME-Base64 perl-libwww-perl
-Autoreqprov: on
-Release: 01
-Source0: otrs-%{version}.tar.bz2
-BuildArch: noarch
-BuildRoot: %{_tmppath}/%{name}-%{version}-build
-
-%description
-<DESCRIPTION>
-
-SuSE series: ap
-
-%prep
-%setup
-
-%build
-# copy config file
-cp Kernel/Config.pm.dist Kernel/Config.pm
-cd Kernel/Config/ && for foo in *.dist; do cp $foo `basename $foo .dist`; done && cd ../../
-# copy all crontab dist files
-for foo in var/cron/*.dist; do mv $foo var/cron/`basename $foo .dist`; done
-# copy all .dist files
-cp .procmailrc.dist .procmailrc
-cp .fetchmailrc.dist .fetchmailrc
-cp .mailfilter.dist .mailfilter
-
-%install
-# delete old RPM_BUILD_ROOT
-rm -rf $RPM_BUILD_ROOT
-# set DESTROOT
-export DESTROOT="/opt/otrs/"
-# create RPM_BUILD_ROOT DESTROOT
-mkdir -p $RPM_BUILD_ROOT/$DESTROOT/
-# copy files
-cp -R . $RPM_BUILD_ROOT/$DESTROOT
-# install init-Script and rc.config entry
-install -d -m 755 $RPM_BUILD_ROOT/etc/init.d
-install -d -m 755 $RPM_BUILD_ROOT/usr/sbin
-install -d -m 755 $RPM_BUILD_ROOT/etc/rc.config.d
-install -d -m 744 $RPM_BUILD_ROOT/var/adm/fillup-templates
-
-# check suse release
-install -m 644 scripts/suse-fillup-template-rc.config.otrs $RPM_BUILD_ROOT/var/adm/fillup-templates/rc.config.otrs
-install -m 644 scripts/suse-rcotrs-config $RPM_BUILD_ROOT/etc/rc.config.d/otrs
-
-install -m 755 scripts/suse-rcotrs $RPM_BUILD_ROOT/etc/init.d/otrs
-rm -f $RPM_BUILD_ROOT/sbin/otrs
-ln -s ../../etc/init.d/otrs $RPM_BUILD_ROOT/usr/sbin/rcotrs
-
-# set permission
-export OTRSUSER=otrs
-useradd $OTRSUSER || :
-useradd wwwrun || :
-groupadd nogroup || :
-$RPM_BUILD_ROOT/opt/otrs/bin/SetPermissions.sh $RPM_BUILD_ROOT/opt/otrs $OTRSUSER wwwrun
-
-%pre
-# remember about the installed version
-if test -e /opt/otrs/RELEASE; then
- cat /opt/otrs/RELEASE|grep VERSION|sed 's/VERSION = //'|sed 's/ /-/g' > /tmp/otrs-old.tmp
-fi
-# useradd
-export OTRSUSER=otrs
-echo -n "Check OTRS user ... "
-if id $OTRSUSER >/dev/null 2>&1; then
- echo "$OTRSUSER exists."
- # update groups
- usermod -g nogroup $OTRSUSER
- # update home dir
- usermod -d /opt/otrs $OTRSUSER
-else
- useradd $OTRSUSER -d /opt/otrs/ -s /bin/false -g nogroup -c 'OTRS System User' && echo "$OTRSUSER added."
-fi
-
-%post
-# rc.config
-%{fillup_and_insserv -s otrs START_OTRS}
-
-# add apache-httpd.include.conf to apache.rc.config
-APACHERC=/etc/rc.config.d/apache.rc.config
-
-OTRSINCLUDE=/opt/otrs/scripts/apache-httpd.include.conf
-sed 's+^HTTPD_CONF_INCLUDE_FILES=.*$+HTTPD_CONF_INCLUDE_FILES='$OTRSINCLUDE'+' \
-$APACHERC > /tmp/apache.rc.config.tmp && mv /tmp/apache.rc.config.tmp $APACHERC
-# if it's a major-update backup old version templates (maybe not compatible!)
-if test -e /tmp/otrs-old.tmp; then
- TOINSTALL=`echo %{version}| sed 's/..$//'`
- OLDOTRS=`cat /tmp/otrs-old.tmp`
- if echo $OLDOTRS | grep -v "$TOINSTALL" > /dev/null; then
- echo "backup old (maybe not compatible) templates (of $OLDOTRS)"
- for i in /opt/otrs/Kernel/Output/HTML/Standard/*.rpmnew;
- do BF=`echo $i|sed 's/.rpmnew$//'`; mv -v $BF $BF.backup_maybe_not_compat_to.$OLDOTRS; mv $i $BF;
- done
- fi
- rm -rf /tmp/otrs-old.tmp
-fi
-
-# OTRS 2.0 -> OTRS 2.1
-# remove old ticket config file
-if test -e /opt/otrs/Kernel/Config/Files/Ticket.pm; then
- mv /opt/otrs/Kernel/Config/Files/Ticket.pm /opt/otrs/Kernel/Config/Files/Ticket.pm.not_longer_used
-fi;
-# remove old ticket postmaster config file
-if test -e /opt/otrs/Kernel/Config/Files/TicketPostMaster.pm; then
- mv /opt/otrs/Kernel/Config/Files/TicketPostMaster.pm /opt/otrs/Kernel/Config/Files/TicketPostMaster.pm.not_longer_used;
-fi
-# remove old faq config file
-if test -e /opt/otrs/Kernel/Config/Files/FAQ.pm; then
- mv /opt/otrs/Kernel/Config/Files/FAQ.pm /opt/otrs/Kernel/Config/Files/FAQ.pm.not_longer_used;
-fi
-
-# note
-HOST=`hostname -f`
-echo ""
-echo "Next steps: "
-echo ""
-echo "[SuSEconfig]"
-echo " Execute 'SuSEconfig' to configure the webserver."
-echo ""
-echo "[start Apache and MySQL]"
-echo " Execute 'rcapache start' and 'rcmysql start' in case they don't run."
-echo ""
-echo "[install the OTRS database]"
-echo " Use a webbrowser and open this link:"
-echo " http://$HOST/otrs/installer.pl"
-echo ""
-echo "[OTRS services]"
-echo " Start OTRS 'rcotrs start-force' (rcotrs {start|stop|status|restart|start-force|stop-force})."
-echo ""
-echo "((enjoy))"
-echo ""
-echo " Your OTRS Team"
-echo " http://otrs.org/"
-echo ""
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%files
-%config(noreplace) /etc/rc.config.d/otrs
-
-/etc/init.d/otrs
-/usr/sbin/rcotrs
-
-<FILES>
-
-%changelog
-* Thu Oct 18 2006 - martin+rpm@otrs.org
-- added rename of old /opt/otrs/Kernel/Config/Files/(Ticket|TicketPostMaster|FAQ).pm files
-* Thu Jan 02 2003 - martin+rpm@otrs.org
-- moved from /opt/OpenTRS to /opt/otrs
-* Thu Nov 12 2002 - martin+rpm@otrs.org
-- moved %doc/install* to /opt/OpenTRS/ (installer problems!)
- and added Kernel/cpan-lib*
-* Sun Sep 22 2002 - martin+rpm@otrs.org
-- added /etc/rc.config.d/otrs for rc script (Thanks to Lars Müller)
-* Fri Sep 06 2002 - martin+rpm@otrs.org
-- added Kernel/Config/*.pm
-* Sat Jun 16 2002 - martin+rpm@otrs.org
-- added new modules for 0.5 BETA6
-* Thu Jun 04 2002 - martin+rpm@otrs.org
-- added .fetchmailrc
-* Mon May 20 2002 - martin+rpm@otrs.org
-- moved all .dlt and all Kernel::Language::*.pm to %config(noreplace)
-* Sat May 05 2002 - martin+rpm@otrs.org
-- added Kernel/Output/HTML/Standard/Motd.dtl as config file
-* Thu Apr 16 2002 - martin+rpm@otrs.org
-- moved to SuSE 8.0 support
-* Sun Feb 03 2002 - martin+rpm@otrs.org
-- added SuSE-Apache support
-* Wed Jan 30 2002 - martin+rpm@otrs.org
-- added to useradd bash=/bin/false
-* Sat Jan 12 2002 - martin+rpm@otrs.org
-- added SuSE like rc scripts
-* Tue Jan 10 2002 - martin+rpm@otrs.org
-- new package created
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/DB
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/Event
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Debugger
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Event
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Invoker
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Invoker/SolMan
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Invoker/Test
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Mapping
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/ObjectLockState
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Operation
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Operation/SolMan
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Operation/Test
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Provider
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Requester
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Transport
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Transport/HTTP
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/GenericInterface/Transport/HTTP/SOAP
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/ObjectLockState
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/SOAP
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/Scheduler
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/Scheduler/TaskHandler
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/Selenium
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/Selenium/AgentTicketPhone
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/Ticket
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/Crypt
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/EmailParser
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/GenericInterface
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/GenericInterface/Webservice
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/HTMLUtils
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/LinkObject
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/Loader
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/Main
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/PDF
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/PostMaster
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/SMIME
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/Stats
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/StdAttachment
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/Ticket
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/VirtualFS
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/WebUploadCache
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/XML
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/ssl
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/ssl/certs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/scripts/test/sample/ssl/private
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/css/overcast
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/css/overcast/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.4.1/editor/dialog/fck_spellerpages/spellerpages/server-scripts
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.4.1/editor/dtd
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.4.1/editor/filemanager
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.4.1/editor/plugins
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/_source
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/_source/classes
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/_source/commandclasses
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/_source/internals
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/css
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/css/behaviors
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/css/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/common
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/common/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_about
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_docprops
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_flash
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_image
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_link
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_scayt
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_select
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_spellerpages
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_spellerpages/spellerpages
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_template
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dialog/fck_template/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/dtd
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/browser
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/browser/default
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/browser/default/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/browser/default/images/icons
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/browser/default/images/icons/32
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/browser/default/js
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/connectors
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/connectors/asp
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/connectors/aspx
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/connectors/cfm
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/connectors/lasso
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/connectors/perl
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/connectors/php
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/filemanager/connectors/py
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/images/smiley
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/images/smiley/msn
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/js
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/lang
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/plugins
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/plugins/autogrow
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/plugins/bbcode
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/plugins/bbcode/_sample
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/plugins/dragresizetable
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/plugins/placeholder
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/plugins/placeholder/lang
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/plugins/simplecommands
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/plugins/tablecommands
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/skins
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/skins/default
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/skins/default/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/skins/office2003
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/skins/office2003/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/skins/silver
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/skins/silver/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/fckeditor-2.6.6/editor/wsc
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/js-cache
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/test
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/test/sample
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/flot-0.6
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/flot-0.7
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-1.4.2
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-1.4.3
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-1.4.4
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-1.5.1
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-1.5.2
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-tablesorter-2.0.3
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-tablesorter-2.0.5
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-tooltip-1.3
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-ui-1.8
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-ui-1.8.11
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-ui-1.8.5
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-ui-1.8.6
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-ui-1.8.7
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-validate-1.7
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/jquery-validate-1.8
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/json
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/qunit
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js/thirdparty/stacktrace
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/js-cache
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/test
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/adapters
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/core
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/core/dom
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/core/htmlparser
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/lang
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/a11yhelp
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/a11yhelp/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/a11yhelp/lang
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/about
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/about/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/aspell
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/aspell/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/aspell/spellerpages
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/basicstyles
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/blockquote
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/button
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/clipboard
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/clipboard/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/colorbutton
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/colordialog
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/colordialog/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/dialog
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/dialogui
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/div
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/div/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/domiterator
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/editingblock
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/elementspath
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/enterkey
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/entities
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/fakeobjects
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/filebrowser
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/find
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/find/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/flash
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/flash/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/flash/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/floatpanel
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/font
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/format
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/forms
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/forms/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/horizontalrule
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/htmldataprocessor
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/htmlwriter
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/iframedialog
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/image
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/image/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/indent
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/justify
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/keystrokes
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/link
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/link/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/link/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/list
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/listblock
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/maximize
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/newpage
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/pagebreak
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/pagebreak/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/panel
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/panelbutton
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/pastefromword
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/pastefromword/filter
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/pastetext
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/pastetext/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/preview
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/print
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/removeformat
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/resize
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/richcombo
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/save
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/scayt
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/scayt/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/selection
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/showblocks
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/showblocks/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/showborders
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/smiley
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/smiley/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/smiley/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/sourcearea
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/specialchar
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/specialchar/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/styles
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/stylescombo
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/stylescombo/styles
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/tab
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/table
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/table/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/tabletools
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/tabletools/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/templates
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/templates/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/templates/templates
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/templates/templates/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/toolbar
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/uicolor
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/uicolor/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/uicolor/lang
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/uicolor/yui
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/uicolor/yui/assets
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/undo
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/wsc
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/wsc/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/plugins/wysiwygarea
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/skins
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/skins/kama
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/skins/kama/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/skins/office2003
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/skins/office2003/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/skins/v2
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/skins/v2/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/themes
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/_source/themes/default
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/adapters
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/lang
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/a11yhelp
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/a11yhelp/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/a11yhelp/lang
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/about
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/about/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/aspell
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/aspell/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/aspell/spellerpages
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/clipboard
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/clipboard/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/colordialog
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/colordialog/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/dialog
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/div
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/div/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/find
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/find/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/flash
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/flash/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/flash/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/forms
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/forms/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/iframedialog
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/image
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/image/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/link
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/link/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/link/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/pagebreak
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/pagebreak/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/pastefromword
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/pastefromword/filter
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/pastetext
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/pastetext/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/scayt
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/scayt/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/showblocks
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/showblocks/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/smiley
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/smiley/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/smiley/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/specialchar
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/specialchar/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/stylescombo
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/stylescombo/styles
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/table
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/table/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/tabletools
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/tabletools/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/templates
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/templates/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/templates/templates
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/templates/templates/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/uicolor
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/uicolor/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/uicolor/lang
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/uicolor/yui
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/uicolor/yui/assets
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/wsc
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/plugins/wsc/dialogs
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/skins
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/skins/default
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/skins/default/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/skins/kama
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/skins/kama/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/skins/office2003
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/skins/office2003/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/skins/v2
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/skins/v2/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/themes
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/ckeditor-3.2/themes/default
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/flot
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/jquery-1.4.2
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/jquery-tooltip-1.3
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/jquery-ui-1.7.2
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/jquery-ui-1.8
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/jquery-validate-1.7
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/json
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/js_new/thirdparty/qunit
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/css
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/css-cache
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/css/thirdparty
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/css/thirdparty/ui-lightness
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/css/thirdparty/ui-lightness/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/css/thirdparty/ui-theme
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/css/thirdparty/ui-theme/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/img
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/img/icons
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/img/source
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/img/source/root
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/img/source/toolbar_icons
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/thirdparty
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/thirdparty/ui-lightness
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/thirdparty/ui-lightness/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/thirdparty/ui-theme
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/default/thirdparty/ui-theme/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/ivory
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/ivory/css
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/ivory/img
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/ivory/img/source
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/moos
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/moos/css
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/moos/img
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/slim
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/slim/css
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/slim/img
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/slim/img/source
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Agent/slim/img/source/toolbar_icons
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/default
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/default/css
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/default/css-cache
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/default/css/thirdparty
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/default/css/thirdparty/ui-lightness
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/default/css/thirdparty/ui-lightness/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/default/css/thirdparty/ui-theme
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/default/css/thirdparty/ui-theme/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/default/img
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/default/img/icons
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/ivory
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/httpd/htdocs/skins/Customer/ivory/css
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/log
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/packages/Support-1.1.3.opm
^
|
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<otrs_package version="1.1">
- <Name>Support</Name>
- <Version>1.1.3</Version>
- <Vendor>OTRS AG</Vendor>
- <URL>http://otrs.org/</URL>
- <License>GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007</License>
- <ChangeLog Date="2010-07-30 13:57:13" Version="1.1.3">Added OTRS::ITSM version detection.</ChangeLog>
- <ChangeLog Date="2010-05-28 09:33:51" Version="1.1.2">Fixed bug#5369 - Support Module fails on Oracle databases.</ChangeLog>
- <ChangeLog Date="2010-05-13 18:14:29" Version="1.1.1">Added new check to compare the application and DB servers timestamp.</ChangeLog>
- <ChangeLog Date="2010-02-23 16:28:03" Version="1.0.99">Fixed bug with check.xml files containing no information.</ChangeLog>
- <ChangeLog Date="2010-02-16 20:09:33" Version="1.0.98">Fixed bug# 4992 - Support package 1.0.96 and 1.0.97 not working on OTRS 2.1.9.</ChangeLog>
- <ChangeLog Date="2010-02-15 13:55:24" Version="1.0.97">Fixed error message in log about missing cron check.</ChangeLog>
- <ChangeLog Date="2010-02-09 22:38:30" Version="1.0.96">Made it possible to enable/disable each check via sysconfig.</ChangeLog>
- <ChangeLog Date="2010-01-07 21:15:31" Version="1.0.95">Fixed some performance issues of tar files with OTRS 2.4 (support package took 100% cpu time up to 30 min.).</ChangeLog>
- <ChangeLog Date="2009-12-01 18:32:16" Version="1.0.94">Added some debug info to fnd out where a support package stop the process and added max file count protection of application archive file.</ChangeLog>
- <ChangeLog Date="2009-10-01 18:06:11" Version="1.0.93">Added new checks for root@otrs password and SOAP, improved Win32 version detection, improved PostgreSQL version detection, fixed typos.</ChangeLog>
- <ChangeLog Date="2009-08-01 13:48:51" Version="1.0.92">Improved DirectoryFiles() to exclude TempDir und ArticleDir based on current config setting (prevent possible Mail Bomb mail rejects).</ChangeLog>
- <ChangeLog Date="2009-04-17 16:58:02" Version="1.0.91">Init release for OTRS 2.4. Add new Encode handling.</ChangeLog>
- <Description Lang="en">Verifies System settings and gives performance tips.</Description>
- <Description Lang="de">Das Support Assessment Modul prüft fehlerhafte System-Einstellungen und gibt Performance-Tips.</Description>
- <Framework>2.4.x</Framework>
- <Framework>2.3.x</Framework>
- <Framework>2.2.x</Framework>
- <Framework>2.1.x</Framework>
- <IntroInstallPost Lang="en" Title="Notice - Introduction">The Support assessment module provides system checks and can help to find setup errors. After installation it can be accessed from the Administration Interface, in the rightmost column.</IntroInstallPost>
- <IntroInstallPost Lang="de" Title="Hinweis - Einführung">Die Verknüpfung zum Support Assessment Modul ist in der vierten Spalte des Administrations-Bereichs hinterlegt. Mit ihr können System-Checks ausgeführt werden, um Fehler im Setup zu finden.</IntroInstallPost>
- <BuildDate>2010-07-30 13:57:13</BuildDate>
- <BuildHost>opms.otrs.com</BuildHost>
- <Filelist>
- <File Location="Kernel/Output/HTML/Standard/AdminSupport.dtl" Permission="644" Encode="Base64">IyAtLQojIEFkbWluU3VwcG9ydC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU3VwcG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TdXBwb3J0LmR0bCx2IDEuMjAgMjAwOS8wOC8yNyAxOTo0NToxMSBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBzdGFydCBmb3JtIC0tPgoKIyAtLS0KIyAtSmF2YSBzY3JpcHQgZnVuY3Rpb25zCiMgLS0tCgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkgewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuU2VuZGVyLnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkNhbid0IGNyZWF0ZSBzdXBwb3J0IHBhY2thZ2UsIGJlY2F1c2UgeW91IHdvcmsgY3VycmVudGx5IHdpdGggdGhlIHN5c3RlbSB1c2VyIHJvb3RAbG9jYWxob3N0IGFuZCB5b3VyIGFkbWluIGVtYWlsIGFkZHJlc3MgaXMgbm90IHlldCBjb25maWd1cmVkLiBQbGVhc2UgZGVmaW5lIHRoZSBhZG1pbiBlbWFpbCBzZXR0aW5nIGluIHRoZSBTeXNDb25maWcgbW9kdWxlIGFuZCBkb24ndCB1c2UgdGhlIHVzZXIgcm9vdEBsb2NhbGhvc3QgZm9yIHdvcmtpbmcgd2l0aCBPVFJTLiJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5TZW5kZXIuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfQoKZnVuY3Rpb24gc3VibWl0X2NvbmZpZGVudGlhbCgpIHsKICAgIGlmICghZG9jdW1lbnQuY29tcG9zZWNvbmZpZGVudGlhbC5jb25maWRlbnRpYWxpbmZvLmNoZWNrZWQpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiUGxlYXNlIGNvbmZpcm0gdGhlIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiB0byBjb250aW51ZS4ifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2Vjb25maWRlbnRpYWwuY29uZmlkZW50aWFsaW5mby5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0PgoKIyAtLS0KIyAtIFN1cHBvcnRtb2R1bGUgb3ZlcnZpZXcgcGFnZQojIC0tLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU3VwcG9ydCJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSIzMCUiIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDb25maWRlbnRpYWwiLz4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTdXBwb3J0In06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICRUZXh0eyJGb3IgcXVpY2sgaGVscCBwbGVhc2Ugc3VibWl0IHlvdXIgc3lzdGVtIGluZm9ybWF0aW9uIGFuZCBjcmVhdGUgYSBzdXBwb3J0IHRpY2tldCBhdCB0aGUgdmVuZG9yJ3Mgc2l0ZS4ifQogICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgJFRleHR7IkZvciBtb3JlIGluZm8gcGxlYXNlIGNoZWNrIn0gPGEgaHJlZj0iaHR0cDovL290cnMuY29tLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9vdHJzLmNvbS88L2E+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3RhcnQifSIvPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxici8+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJCZW5jaG1hcmtTUUwiLz4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTUUwgQmVuY2htYXJrIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICRUZXh0eyJFeGVjdXRlIGEgU1FMIGJlbmNobWFyayB0ZXN0IG9uIHlvdXIgZGF0YWJhc2UgdG8gZmluZCBvdXQgaG93IGZhc3QgeW91ciBkYXRhYmFzZSBpcyAoZG9uZSBvbiBkZWRpY2F0ZWQgYmVuY2htYXJrIHRhYmxlKS4ifQogICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgJFRleHR7Ik5vdGU6IFRoaXMgc2hvdWxkIG5vdCBiZSBkb25lIG9uIHByb2R1Y3Rpb24gc3lzdGVtcyEifQogICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgTXVsdGlwbGllcjogJERhdGF7Ik1vZGVTdHJnIn0KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdGFydCJ9Ii8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyLz4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjcwJSIgY2xhc3M9Im1haW5ib2R5Ij4KCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlIC0tPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFFEYXRheyJNb2R1bGUifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMzAlIj4kVGV4dHsiQ2hlY2sifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI1NSUiPiRUZXh0eyJDb21tZW50In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj4kVGV4dHsiU3RhdGUifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGVSb3cgLS0+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRRRGF0YXsiRGVzY3JpcHRpb24ifSI+JFFEYXRheyJEZXNjcmlwdGlvbiJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkNvbW1lbnQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+PGZvbnQgY29sb3I9IiRRRGF0YXsiRm9udENvbG9yIn0iPiRRRGF0YXsiQ2hlY2sifTwvZm9udD48L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlUm93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlIC0tPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgoKIyAtLS0KIyAtIFN1cHBvcnRtb2R1bGUgY29uZmlkZW50aWFsIHBhZ2UKIyAtLS0KCjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JEVudnsiQm94MCJ9JFRleHR7IkFkbWluIFN1cHBvcnQgSW5mbyJ9JEVudnsiQm94MSJ9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWRtaW5TdXBwb3J0IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2MDBweCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ29uZmlkZW50aWFsIGluZm9ybWF0aW9uIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50Ym9keSIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbENvbnRlbnRERSAtLT4KICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJDb25maWRlbnRpYWwiIHJvd3M9IjIyIiBjb2xzPSI3OCIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSIgcmVhZG9ubHk+RGF0ZW5zY2h1dHoKCldpciwgZGllIEZpcm1hIE9UUlMgQUcsIG5laG1lbiBkZW4gU2NodXR6IElocmVyIHBlcnMmb3VtbDtubGljaGVuIERhdGVuIHNlaHIgZXJuc3QgdW5kIGhhbHRlbiB1bnMgc3RyaWt0IGFuIGRpZSBSZWdlbG4gZGVyIERhdGVuc2NodXR6Z2VzZXR6ZS4gQWxsZSBQYXNzdyZvdW1sO3J0ZXIgd2VyZGVuIHZvciBkZW0gVmVyc2VuZGVuIGRlciBJbmZvcm1hdGlvbmVuIGF1dG9tYXRpc2llcnQgdW5rZW5udGxpY2ggZ2VtYWNodC4gSW4ga2VpbmVtIEZhbGwgd2VyZGVuIGRpZSBlcmhvYmVuZW4gRGF0ZW4gdmVya2F1ZnQgb2RlciBhdXMgYW5kZXJlbiBHciZ1dW1sO25kZW4gYW4gdW5hdXRvcmlzaWVydGUgRHJpdHRlIHdlaXRlcmdlZ2ViZW4uCgpEaWUgbmFjaGZvbGdlbmRlIEVya2wmYXVtbDtydW5nIGdpYnQgSWhuZW4gZWluZW4gJlV1bWw7YmVyYmxpY2sgZGFyJnV1bWw7YmVyLCB3aWUgd2lyIGRpZXNlbiBTY2h1dHogZ2V3JmF1bWw7aHJsZWlzdGVuIHVuZCB3ZWxjaGUgQXJ0IHZvbiBEYXRlbiB6dSB3ZWxjaGVtIFp3ZWNrICZ1dW1sO2Jlcm1pdHRlbHQgd2VyZGVuLgoKRGF0ZW4mdXVtbDtiZXJtaXR0bHVuZyBkdXJjaCBkYXMgJ1N1cHBvcnRtb2R1bCcKRGllIEZpcm1hIE9UUlMgQUcgJnV1bWw7YmVybWl0dGVsdCB1bmQgc3BlaWNoZXJ0IEluZm9ybWF0aW9uZW4sIGRpZSBkdXJjaCBkYXMgJ1N1cHBvcnRtb2R1bCcgYW4gZGllIEZpcm1hIE9UUlMgQUcgdmVyc2VuZGV0IHdlcmRlbi4gRGFiZWkgaGFuZGVsdCBlcyBzaWNoIHVtIGF1c3NjaGxpZSZzemxpZztsaWNoIHVtIERhdGVuLCBkaWUgZGllIEZpcm1hIE9UUlMgQUcgYmVuJm91bWw7dGlndCwgdW0gRnVua3Rpb25zZiZhdW1sO2hpZ2tlaXQgdW5kIExlaXN0dW5nc2YmYXVtbDtoaWdrZWl0IGRlcyBiZXRyb2ZmZW5lbiBPVFJTLVNlcnZlcnMgenUgYW5hbHlzaWVyZW4sIG9kZXIgdW0gZWluZSBLb250YWt0YXVmbmFobWUgenUgZXJtJm91bWw7Z2xpY2hlbi4KClNpY2hlcmhlaXQgSWhyZXIgcGVycyZvdW1sO25saWNoZW4gRGF0ZW4KRGllIEZpcm1hIE9UUlMgQUcgc2NoJnV1bWw7dHp0IElocmUgcGVycyZvdW1sO25saWNoZW4gRGF0ZW4gdm9yIHVuZXJsYXVidGVuIFp1Z3JpZmYsIFZlcndlbmR1bmcgb2RlciBWZXImb3VtbDtmZmVudGxpY2h1bmcuIERpZSBGaXJtYSBPVFJTIEFHIHNvcmd0IGRhZiZ1dW1sO3IsIGRhc3Mgdm9uIElobmVuIGF1ZiBkZW0gU2VydmVyIGdlc3BlaWNoZXJ0ZSBwZXJzJm91bWw7bmxpY2hlIEluZm9ybWF0aW9uZW4gaW4gZWluZXIga29udHJvbGxpZXJ0ZW4sIHNpY2hlcmVuIFVtZ2VidW5nIHZvciB1bmVybGF1YnRlbSBadWdyaWZmIHVuZCBWZXImb3VtbDtmZmVudGxpY2h1bmcgZ2VzY2gmVXVtbDt0enQgc2luZC4KCldlaXRlcmdhYmUgSWhyZXIgRGF0ZW4KRGllIEZpcm1hIE9UUlMgQUcgZ2lidCBJaHJlIERhdGVuIG5pY2h0IGFuIERyaXR0ZSB3ZWl0ZXIsIHNvZmVybiBkaWVzIG5pY2h0IHp1ciBBYndpY2tsdW5nIGRlcyBHZXNjaCZhdW1sO2Z0c3ZlcmtlaHJlcyBuJm91bWw7dGlnIGlzdC4KU293ZWl0IGRpZSBGaXJtYSBPVFJTIEFHIGdlc2V0emxpY2ggb2RlciBwZXIgR2VyaWNodHNiZXNjaGx1c3MgZGF6dSB2ZXJwZmxpY2h0ZXQgaXN0LCBnZWJlbiB3aXIgSWhyZSBEYXRlbiBudXIgYW4gYXVza3VuZnRzYmVyZWNodGlndGUgc3RhYXRsaWNoZSBJbnN0aXR1dGlvbmVuIHVuZCBCZWgmb3VtbDtyZGVuIHdlaXRlci4KCiZBdW1sO25kZXJ1bmcgZGllc2VyIERhdGVuc2NodXR6YmVzdGltbXVuZ2VuCkRpZSBGaXJtYSBPVFJTIEFHIGJlaCZhdW1sO2x0IHNpY2ggZGFzIFJlY2h0IHZvciwgZGllc2UgU2ljaGVyaGVpdHMtIHVuZCBEYXRlbnNjaHV0em1hJnN6bGlnO25haG1lbiB6dSB2ZXImYXVtbDtuZGVybiwgc293ZWl0IGRpZXMgd2VnZW4gZGVyIHRlY2huaXNjaGVuIEVudHdpY2tsdW5nIGVyZm9yZGVybGljaCB3aXJkLiBJbiBzb2xjaGVuIEYmYXVtbDtsbGVuIHdlcmRlbiB3aXIgYXVjaCB1bnNlcmUgSGlud2Vpc2UgenVtIERhdGVuc2NodXR6IGVudHNwcmVjaGVuZCBhbnBhc3Nlbi4gQml0dGUgYmVhY2h0ZW4gU2llIGRhaGVyIGRpZSBqZXdlaWxzIGFrdHVlbGxlIFZlcnNpb24gdW5zZXJlciBEYXRlbnNjaHV0emVya2wmYXVtbDtydW5nLgoKQXVza3VuZnRzcmVjaHQKU2llIGhhYmVuIGplZGVyemVpdCBkYXMgUmVjaHQgYXVmIEF1c2t1bmZ0ICZ1dW1sO2JlciBkaWUgYmV6JnV1bWw7Z2xpY2ggSWhyZXIgUGVyc29uIGdlc3BlaWNoZXJ0ZW4gRGF0ZW4sIGRlcmVuIEhlcmt1bmZ0IHVuZCBFbXBmJmF1bWw7bmdlciBzb3dpZSBkZW4gWndlY2sgZGVyIERhdGVudmVyYXJiZWl0dW5nLiBBdXNrdW5mdCAmdXVtbDtiZXIgZGllIGdlc3BlaWNoZXJ0ZW4gRGF0ZW4gayZvdW1sO25uZW4gU2llIHVudGVyIGluZm9Ab3Rycy5jb20gYW5mb3JkZXJuLgoKV2VpdGVyZSBJbmZvcm1hdGlvbmVuCklociBWZXJ0cmF1ZW4gaXN0IHVucyB3aWNodGlnLiBEYWhlciBnZWJlbiB3aXIgSWhuZW4gZ2VybmUgamVkZXJ6ZWl0IEF1c2t1bmZ0ICZ1dW1sO2JlciBkaWUgVmVyYXJiZWl0dW5nIElocmVyIHBlcnNvbmVuYmV6b2dlbmVuIERhdGVuLiBXZW5uIFNpZSBGcmFnZW4gaGFiZW4sIGRpZSBJaG5lbiBkaWVzZSBEYXRlbnNjaHV0emVya2wmYXVtbDtydW5nIG5pY2h0IGJlYW50d29ydGVuIGtvbm50ZSBvZGVyIHdlbm4gU2llIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlaW5lbSBQdW5rdCB3JnV1bWw7bnNjaGVuLCB3ZW5kZW4gU2llIHNpY2ggYml0dGUgbWl0IGVpbmVyIEUtTWFpbCBhbiBpbmZvQG90cnMuY29tLgogICAgICAgICAgPC90ZXh0YXJlYT4KPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsQ29udGVudERFIC0tPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWxDb250ZW50RU4gLS0+CiAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ29uZmlkZW50aWFsIiByb3dzPSIyMiIgY29scz0iNzgiIHdyYXA9IiRFbnZ7IkJyb3dzZXJXcmFwIn0iIHJlYWRvbmx5PkRhdGEgUHJvdGVjdGlvbgoKSGVyZSBhdCBPVFJTIEFHIHdlIHRha2UgdGhlIHByb3RlY3Rpb24gb2YgeW91ciBwZXJzb25hbCBkZXRhaWxzIHZlcnkgc2VyaW91c2x5IGFuZCBzdHJpY3RseSBhZGhlcmUgdG8gZGF0YSBwcm90ZWN0aW9uIGxhd3MuIEFsbCBwYXNzd29yZHMgYXJlIGF1dG9tYXRpY2FsbHkgbWFkZSB1bnJlY29nbml6YWJsZSBiZWZvcmUgdGhlIGluZm9ybWF0aW9uIGlzIHNlbnQuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCBhbnkgZGF0YSB3ZSBvYnRhaW4gYmUgc29sZCBvciBwYXNzZWQgb24gdG8gdW5hdXRob3JpemVkIHRoaXJkIHBhcnRpZXMuClRoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb24gcHJvdmlkZXMgeW91IHdpdGggYW4gb3ZlcnZpZXcgb2YgaG93IHdlIGd1YXJhbnRlZSB0aGlzIHByb3RlY3Rpb24gYW5kIHdoaWNoIHR5cGUgb2YgZGF0YSBpcyBjb2xsZWN0ZWQgZm9yIHdoaWNoIHB1cnBvc2UuCgpEYXRhIEhhbmRsaW5nIHdpdGggJ1N1cHBvcnQgTW9kdWxlJwpJbmZvcm1hdGlvbiByZWNlaXZlZCB0aHJvdWdoIHRoZSAnU3VwcG9ydCBNb2R1bGUnIGlzIHNhdmVkIGJ5IE9UUlMgQUcuIFRoaXMgb25seSBhcHBsaWVzIHRvIGRhdGEgdGhhdCBPVFJTIEFHIHJlcXVpcmVzIHRvIGFuYWx5emUgdGhlIHBlcmZvcm1hbmNlIGFuZCBmdW5jdGlvbiBvZiB0aGUgT1RSUyBzZXJ2ZXIgb3IgdG8gZXN0YWJsaXNoIGNvbnRhY3QuCgpTYWZldHkgb2YgUGVyc29uYWwgRGV0YWlscwpPVFJTIEFHIHByb3RlY3RzIHlvdXIgcGVyc29uYWwgZGF0YSBmcm9tIHVuYXV0aG9yaXplZCBhY2Nlc3MsIHVzZSBvciBwdWJsaWNhdGlvbi4gT1RSUyBBRyBlbnN1cmVzIHRoYXQgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHlvdSBzdG9yZSBvbiB0aGUgc2VydmVyIGlzIHByb3RlY3RlZCBmcm9tIHVuYXV0aG9yaXplZCBhY2Nlc3MgYW5kIHB1YmxpY2F0aW9uLgoKRGlzY2xvc3VyZSBvZiBEZXRhaWxzCk9UUlMgQUcgd2lsbCBub3QgcGFzcyBvbiB5b3VyIGRldGFpbHMgdG8gdGhpcmQgcGFydGllcyB1bmxlc3MgcmVxdWlyZWQgZm9yIGJ1c2luZXNzIHRyYW5zYWN0aW9ucy4KT1RSUyBBRyB3aWxsIG9ubHkgcGFzcyBvbiB5b3VyIGRldGFpbHMgdG8gZW50aXRsZWQgcHVibGljIGluc3RpdHV0aW9ucyBhbmQgYXV0aG9yaXRpZXMgaWYgcmVxdWlyZWQgYnkgbGF3IG9yIGNvdXJ0IG9yZGVyLgoKQW1lbmRtZW50IG9mIERhdGEgUHJvdGVjdGlvbiBQb2xpY3kKT1RSUyBBRyByZXNlcnZlcyB0aGUgcmlnaHQgdG8gYW1lbmQgdGhpcyBzZWN1cml0eSBhbmQgZGF0YSBwcm90ZWN0aW9uIHBvbGljeSBpZiByZXF1aXJlZCBieSB0ZWNobmljYWwgZGV2ZWxvcG1lbnRzLiBJbiB0aGlzIGNhc2Ugd2Ugd2lsbCBhbHNvIGFkYXB0IG91ciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgZGF0YSBwcm90ZWN0aW9uIGFjY29yZGluZ2x5LiBQbGVhc2UgcmVndWxhcmx5IHJlZmVyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBvdXIgRGF0YSBQcm90ZWN0aW9uIFBvbGljeS4KClJpZ2h0IHRvIEluZm9ybWF0aW9uCllvdSBoYXZlIHRoZSByaWdodCB0byBkZW1hbmQgaW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgZGF0YSBzYXZlZCBhYm91dCB5b3UsIGl0cyBvcmlnaW4gYW5kIHJlY2lwaWVudHMsIGFzIHdlbGwgYXMgdGhlIHB1cnBvc2Ugb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyBhdCBhbnkgdGltZS4gWW91IGNhbiByZXF1ZXN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYXZlZCBkYXRhIGJ5IHNlbmRpbmcgYW4gZS1tYWlsIHRvIGluZm9Ab3Rycy5jb20uCgpGdXJ0aGVyIEluZm9ybWF0aW9uCllvdXIgdHJ1c3QgaXMgdmVyeSBpbXBvcnRhbnQgdG8gdXMuIFdlIGFyZSB3aWxsaW5nIHRvIGluZm9ybSB5b3UgYWJvdXQgdGhlIHByb2Nlc3Npbmcgb2YgeW91ciBwZXJzb25hbCBkZXRhaWxzIGF0IGFueSB0aW1lLiBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiBhbnN3ZXJlZCBieSB0aGlzIERhdGEgUHJvdGVjdGlvbiBQb2xpY3kgb3IgaWYgeW91IHJlcXVpcmUgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHRvcGljLCBwbGVhc2UgY29udGFjdCBpbmZvQG90cnMuY29tLgoKICAgICAgICAgIDwvdGV4dGFyZWE+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbENvbnRlbnRFTiAtLT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VuZGVySW5mb3JtYXRpb24iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFjY2VwdCBsaWNlbnNlIn0iLz4KICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTAiIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiRG9uJ3QgYWNjZXB0IGxpY2Vuc2UifSIvPgogICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsIC0tPgoKIyAtLS0KIyAtIFN1cHBvcnRtb2R1bGUgc2VuZGVyIGFuZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyAtLS0KCjwhLS0gZHRsOmJsb2NrOlNlbmRlckluZm9ybWF0aW9uIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4kRW52eyJCb3gwIn0kVGV4dHsiQWRtaW4gU3VwcG9ydCBJbmZvIn0kRW52eyJCb3gxIn08L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZG1pblN1cHBvcnQmU3ViYWN0aW9uPUNvbmZpZGVudGlhbCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdWJtaXQiPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2MDBweCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlZlbmRvciBTdXBwb3J0In08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CjwhLS0gZHRsOmJsb2NrOlNlbmRlckluZm9ybWF0aW9uSGlkZGVuIC0tPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iJFFEYXRheyJWYWx1ZSJ9Ij4KPCEtLSBkdGw6YmxvY2s6U2VuZGVySW5mb3JtYXRpb25IaWRkZW4gLS0+CiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI2MDBweCIgY2VsbHNwYWNpbmc9IjUiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkVtYWlsIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJTZW5kZXIiIHZhbHVlPSIkUURhdGF7IlNlbmRlckFkcmVzcyJ9IiBzaXplPSI0MCIgcmVhZG9ubHk+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IlNhbHV0YXRpb24ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IlNhbHV0YXRpb24iIHZhbHVlPSIkUURhdGF7IlNlbmRlclNhbHV0YXRpb24ifSIgc2l6ZT0iNDAiIHJlYWRvbmx5PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJOYW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJTZW5kZXJOYW1lIn0iIHNpemU9IjQwInJlYWRvbmx5PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJDb21wYW55In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJDb21wYW55IiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IlN0cmVldCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iU3RyZWV0IiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IlppcCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iWmlwIiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IkNpdHkiIHZhbHVlPSIiIHNpemU9IjQwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiUGhvbmUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IlBob25lIiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkJ1Z3ppbGxhIElEIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJCdWd6aWxsYUlEIiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIiBhbGlnbj0ianVzdGlmeSI+JFRleHR7IklmIHlvdSd2ZSBhbHJlYWR5IGFkZGVkIGEgQnVnemlsbGEgcmVwb3J0IGF0IGJ1Z3Mub3Rycy5vcmcsIHBsZWFzZSBhZGQgeW91ciBCdWd6aWxsYSBJRCBoZXJlLiJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRW50ZXJwcmlzZSBTdXBwb3J0IGFuZCBFbnRlcnByaXNlIFN1YnNjcmlwdGlvbiBpbmZvcm1hdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRib2R5IiB3aWR0aD0iMjUwIiBhbGlnbj0ianVzdGlmeSI+JFRleHR7Ik5vLCBJJ20gbm90IHlldCBhbiAoKG90cnMpKSAnRW50ZXJwcmlzZSBTdWJzY3JpcHRpb24nIG9yICdFbnRlcnByaXNlIFN1cHBvcnQnIGN1c3RvbWVyLiBQbGVhc2UgcmV2aWV3IG15IHN1cHBvcnQgcGFja2FnZSB3aXRob3V0IGFueSBjb21taXRtZW50IGFuZCBzZW5kIG1lIGluZm9ybWF0aW9uIG9ubHkgYW5kIHdpdGhvdXQgcmVzcG9uc2liaWxpdHksIGFib3V0IHRoZSBkaWZmZXJlbnQgKChvdHJzKSkgRW50ZXJwcmlzZSBwYWNrYWdlcyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249Im1pZGRsZSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJTZW5kSW5mbyIgdmFsdWU9IjEiIGNoZWNrZWQ9ImNoZWNrZWQiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJEb3dubG9hZCIgdmFsdWU9IiRUZXh0eyJEb3dubG9hZCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTZW5kIiB2YWx1ZT0iJFRleHR7IlNlbmQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpTZW5kZXJJbmZvcm1hdGlvbiAtLT4KCiMgLS0tCiMgLSBTdXBwb3J0bW9kdWxlIGJlbmNobWFyayByZXN1bHQKIyAtLS0KCjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JEVudnsiQm94MCJ9JFRleHR7IkJlbmNobWFyayJ9JEVudnsiQm94MSJ9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiUmVzdWx0In06ICRUZXh0eyIkUURhdGF7IkhlYWQifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiS2V5In08L3RkPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsdWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI0MCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpCZW5jaG1hcmtSZXN1bHRSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IktleSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJWYWx1ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNvbW1lbnQifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdCAtLT4KPCEtLSBlbmQgZm9ybSAtLT4K</File>
- <File Location="Kernel/System/Support.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN1cHBvcnQucG0sdiAxLjQ0IDIwMTAvMDcvMzAgMTA6MDY6MjggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbWFpbDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwp1c2UgS2VybmVsOjpTeXN0ZW06OlBhY2thZ2U7CnVzZSBEaWdlc3Q6Ok1ENSBxdyhtZDVfaGV4KTsKCnVzZSBNSU1FOjpCYXNlNjQ7CnVzZSBBcmNoaXZlOjpUYXI7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNDQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0IC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3VwcG9ydCBpbmZvcm1hdGlvbiBvZiBhIHJ1bm5pbmcgT1RSUyBzeXN0ZW0uCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBTdXBwb3J0IG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFN1cHBvcnRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57REJPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57WE1MT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57RW1haWxPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57UGFja2FnZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UGFja2FnZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKZ2V0IGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBwb3NzaWJpbGl0eSBjaGVja3MuCgogICAgbXkgJExpc3QgPSAkU3VwcG9ydC0+QWRtaW5DaGVja3NHZXQoKTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdBZG1pbkNoZWNrc0dldCBzdGFydCcsCiAgICApOwoKICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvJzsKCiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoICREaXJOYW1lIC4gJy8qLnBtJyApOwoKICAgIG15ICREYXRhSGFzaDsKICAgIE1PRFVMRToKICAgIGZvciBteSAkRmlsZSAoQExpc3QpIHsKCiAgICAgICAgIyByZW1vdmUgLnBtCiAgICAgICAgJEZpbGUgPX4gcy9eLipcLyguKz8pXC5wbSQvJDEvOwogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjokRmlsZSI7CgogICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CgogICAgICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGxvYWQgJEdlbmVyaWNNb2R1bGUhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgTU9EVUxFOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgIyByZXR1cm4gaWYgaW5zdGFuY2UgY2FuIG5vdCBiZSBjcmVhdGVkCiAgICAgICAgaWYgKCAhJFN1cHBvcnRPYmplY3QgKSB7CgogICAgICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiAkR2VuZXJpY01vZHVsZSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBNT0RVTEU7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhZG1pbiBjaGVjayBkYXRhCiAgICAgICAgbXkgJEFkbWluQ2hlY2tSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKCiAgICAgICAgIyBjaGVjayBpZiByZXR1cm4gdmFsdWUgaXMgYSB2YWxpZCBhcnJheSByZWZlcmVuY2UKICAgICAgICBpZiAoICEkQWRtaW5DaGVja1JlZiB8fCByZWYgJEFkbWluQ2hlY2tSZWYgbmUgJ0FSUkFZJyB8fCAhQHskQWRtaW5DaGVja1JlZn0gKSB7CgogICAgICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIGNoZWNrcyBvZiAkR2VuZXJpY01vZHVsZSByZXR1cm5lZCBubyBkYXRhISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IE1PRFVMRTsKICAgICAgICB9CgogICAgICAgICMgZXh0cmFjdCBhbGwgdmFsaWQgZWxlbWVudHMKICAgICAgICBteSBAQ2xlYW5kQWRtaW5DaGVja1JlZiA9IGdyZXAgeyByZWYoJF8pIGVxICdIQVNIJyB9IEB7JEFkbWluQ2hlY2tSZWZ9OwoKICAgICAgICAjIGF0dGFjaCB0aGUgY2xlYW5lZCBlbGVtZW50IGFycmF5CiAgICAgICAgJERhdGFIYXNoLT57JEZpbGV9ID0gXEBDbGVhbmRBZG1pbkNoZWNrUmVmOwogICAgfQoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdBZG1pbkNoZWNrc0dldCBlbmQnLAogICAgKTsKCiAgICByZXR1cm4gJERhdGFIYXNoOwp9CgpzdWIgWE1MU3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoRGF0YUhhc2gpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggcmVmICRQYXJhbXtEYXRhSGFzaH0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRGF0YUhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ1hNTFN0cmluZ0NyZWF0ZSBzdGFydCcsCiAgICApOwoKICAgIG15ICRYTUxIYXNoICAgICA9IFtdOwogICAgbXkgJENvdW50TW9kdWxlID0gMDsKICAgIG15ICRDb3VudEl0ZW0gICA9IDA7CiAgICBNT0RVTEU6CiAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXsgJFBhcmFte0RhdGFIYXNofSB9ICkgewoKICAgICAgICAkQ291bnRNb2R1bGUrKzsKICAgICAgICAkWE1MSGFzaC0+WzFdLT57U3VwcG9ydEluZm99LT5bMV0tPntNb2R1bGV9LT5bJENvdW50TW9kdWxlXS0+e05hbWV9ID0gJE1vZHVsZTsKCiAgICAgICAgZm9yIG15ICREYXRhSGFzaFJvdyAoIEB7ICRQYXJhbXtEYXRhSGFzaH0tPnskTW9kdWxlfSB9ICkgewoKICAgICAgICAgICAgJENvdW50SXRlbSsrOwogICAgICAgICAgICBteSAkRGF0YSA9IHt9OwoKICAgICAgICAgICAgRUxFTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICgga2V5cyAleyREYXRhSGFzaFJvd30gKSB7CgogICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICRFbGVtZW50IGVxICdOYW1lJzsKICAgICAgICAgICAgICAgICREYXRhLT57JEVsZW1lbnR9LT5bMV0tPntDb250ZW50fSA9ICREYXRhSGFzaFJvdy0+eyRFbGVtZW50fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFhNTEhhc2gtPlsxXS0+e1N1cHBvcnRJbmZvfS0+WzFdLT57TW9kdWxlfS0+WyRDb3VudE1vZHVsZV0tPntJdGVtfS0+WyRDb3VudEl0ZW1dCiAgICAgICAgICAgICAgICA9ICREYXRhOwoKICAgICAgICAgICAgJFhNTEhhc2gtPlsxXS0+e1N1cHBvcnRJbmZvfS0+WzFdLT57TW9kdWxlfS0+WyRDb3VudE1vZHVsZV0tPntJdGVtfS0+WyRDb3VudEl0ZW1dCiAgICAgICAgICAgICAgICAtPntOYW1lfSA9ICREYXRhSGFzaFJvdy0+e05hbWV9OwogICAgICAgIH0KICAgIH0KCiAgICBteSAkWE1MU3RyaW5nID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoMlhNTCggQHskWE1MSGFzaH0gKTsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnWE1MU3RyaW5nQ3JlYXRlIGVuZCcsCiAgICApOwoKICAgIHJldHVybiBcJFhNTFN0cmluZzsKfQoKc3ViIExvZ0xhc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiTG9nTGFzdCAnJFBhcmFte1R5cGV9JyBzdGFydCIsCiAgICApOwoKICAgIG15ICRMb2dTdHJpbmcgPSAkU2VsZi0+e0xvZ09iamVjdH0tPkdldExvZyggTGltaXQgPT4gMTIwMCApOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJMb2dMYXN0ICckUGFyYW17VHlwZX0nIGVuZCIsCiAgICApOwoKICAgIHJldHVybiAoIFwkTG9nU3RyaW5nLCAkUGFyYW17VHlwZX0gLiAnLmxvZycgKTsKfQoKc3ViIE1vZHVsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ01vZHVsZUNoZWNrIHN0YXJ0JywKICAgICk7CgogICAgbXkgJEhvbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgbXkgJFRtcFN1bVN0cmluZzsKICAgIG15ICRUbXBMb2c7CiAgICBvcGVuKCAkVG1wU3VtU3RyaW5nLCAicGVybCAkSG9tZS9iaW4vb3Rycy5jaGVja01vZHVsZXMgfCIgKTsKCiAgICB3aGlsZSAoPCRUbXBTdW1TdHJpbmc+KSB7CiAgICAgICAgJFRtcExvZyAuPSAkXzsKICAgIH0KICAgIGNsb3NlKCRUbXBTdW1TdHJpbmcpOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdNb2R1bGVDaGVjayBlbmQnLAogICAgKTsKCiAgICByZXR1cm4gKCBcJFRtcExvZywgJ01vZHVsZUNoZWNrLmxvZycgKTsKfQoKc3ViIEFSQ0hJVkVMb2dDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnQVJDSElWRUxvZ0NyZWF0ZSBzdGFydCcsCiAgICApOwoKICAgIG15ICRIb21lICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgIG15ICRBcmNoaXZlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvQVJDSElWRSc7CgogICAgbXkgJEhhbmRsZTsKICAgIGlmICggIW9wZW4oICRIYW5kbGUsICc8JywgJEFyY2hpdmUgKSApIHsKICAgICAgICBteSAkQVJDSElWRUVtcHR5ID0gIkNhbid0IG9wZW4gJEFyY2hpdmU6ICQhIjsKCiAgICAgICAgIyBsb2cgaW5mbwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0FSQ0hJVkVMb2dDcmVhdGUgZW5kJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gKCBcJEFSQ0hJVkVFbXB0eSwgJ0FSQ0hJVkUubG9nJyApOwogICAgfQogICAgYmlubW9kZSAkSGFuZGxlOwogICAgbXkgJUNvbXBhcmU7CiAgICB3aGlsZSAoPCRIYW5kbGU+KSB7CiAgICAgICAgbXkgQFJvdyA9IHNwbGl0KCAvOjovLCAkXyApOwogICAgICAgIGNob21wICRSb3dbMV07CiAgICAgICAgJENvbXBhcmV7ICRSb3dbMV0gfSA9ICRSb3dbMF07CiAgICB9CiAgICBjbG9zZSAkSGFuZGxlOwoKICAgIG15ICVSZXN1bHQgPSAkU2VsZi0+X0FSQ0hJVkVMb2dMb29rdXAoCiAgICAgICAgSW4gICAgICA9PiAkSG9tZSwKICAgICAgICBDb21wYXJlID0+IFwlQ29tcGFyZSwKICAgICAgICBIb21lICAgID0+ICRIb21lLAogICAgKTsKCiAgICBteSAkQVJDSElWRVN0cmluZyA9ICcnOwogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVJlc3VsdCApIHsKICAgICAgICAkQVJDSElWRVN0cmluZyAuPSAiJFJlc3VsdHskS2V5fVxuIjsKICAgIH0KCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ25vdGljZScsIE1lc3NhZ2UgPT4gJ0FSQ0hJVkVMb2dDcmVhdGUgZW5kJyApOwoKICAgIHJldHVybiAoIFwkQVJDSElWRVN0cmluZywgJ0FSQ0hJVkUubG9nJyApOwp9CgpzdWIgX0FSQ0hJVkVMb2dMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATGlzdCA9IGdsb2IoIiRQYXJhbXtJbn0vKiIpOwogICAgRklMRToKICAgIGZvciBteSAkRmlsZSAoQExpc3QpIHsKCiAgICAgICAgIyBjbGVhbiB1cCBkaXJlY3RvcnkgbmFtZQogICAgICAgICRGaWxlID1+IHMvXC9cLy9cLy9nOwoKICAgICAgICAjIGlnbm90ZSBjdnMgZGlyZWN0b3JpZXMKICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL0VudHJpZXN8UmVwb3NpdG9yeXxSb290fENWU3xBUkNISVZFLzsKCiAgICAgICAgIyBpZiBpdCdzIGEgZGlyZWN0b3J5CiAgICAgICAgaWYgKCAtZCAkRmlsZSApIHsKICAgICAgICAgICAgJFNlbGYtPl9BUkNISVZFTG9nTG9va3VwKAogICAgICAgICAgICAgICAgSW4gICAgICA9PiAkRmlsZSwKICAgICAgICAgICAgICAgIENvbXBhcmUgPT4gJFBhcmFte0NvbXBhcmV9LAogICAgICAgICAgICAgICAgSG9tZSAgICA9PiAkUGFyYW17SG9tZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRklMRTsKCiAgICAgICAgICAgICMgcHJpbnQgIkRpcmVjdG9yeTogJEZpbGVcbiI7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGl0J3MgYSBmaWxlCiAgICAgICAgbXkgJE9yaWdGaWxlID0gJEZpbGU7CiAgICAgICAgJEZpbGUgPX4gcy9cUSRQYXJhbXtIb21lfVxFLy87CiAgICAgICAgJEZpbGUgPX4gcy9eXC8oLiopJC8kMS87CgogICAgICAgICMgaWdub3JlIHZhciBkaXJlY3RvcmllcwogICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvXmRvY1wvLzsKICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL152YXJcL3RtcC87CiAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC9edmFyXC9hcnRpY2xlLzsKCiAgICAgICAgIyBuZXh0IGlmIG5vdCByZWFkYWJsZQogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggIW9wZW4oICRJbiwgJzwnLCAkT3JpZ0ZpbGUgKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHJlYWQ6ICRPcmlnRmlsZTogJCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IEZJTEU7CiAgICAgICAgfQogICAgICAgIG15ICRjdHggPSBEaWdlc3Q6Ok1ENS0+bmV3OwogICAgICAgICRjdHgtPmFkZGZpbGUoKiRJbik7CiAgICAgICAgbXkgJERpZ2VzdCA9ICRjdHgtPmhleGRpZ2VzdCgpOwogICAgICAgIGNsb3NlICRJbjsKICAgICAgICBpZiAoICEkUGFyYW17Q29tcGFyZX0tPnskRmlsZX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSA9ICJOZXcgJEZpbGUiOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSBuZSAkRGlnZXN0ICkgewogICAgICAgICAgICAkUGFyYW17Q29tcGFyZX0tPnskRmlsZX0gPSAiRGlmICRGaWxlIjsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCBkZWZpbmVkICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSApIHsKICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICV7ICRQYXJhbXtDb21wYXJlfSB9Owp9CgpzdWIgT3BtSW5mbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnbm90aWNlJywgTWVzc2FnZSA9PiAnT3BtSW5mbyBzdGFydCcgKTsKCiAgICBteSAkT3BtSW5mbzsKICAgIGZvciBteSAkUGFja2FnZSAoICRTZWxmLT57UGFja2FnZU9iamVjdH0tPlJlcG9zaXRvcnlMaXN0KCkgKSB7CiAgICAgICAgJE9wbUluZm8KICAgICAgICAgICAgLj0gIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIjsKICAgICAgICAkT3BtSW5mbyAuPSAifCBOYW1lOiAgICAgICAgJFBhY2thZ2UtPntOYW1lfS0+e0NvbnRlbnR9XG4iOwogICAgICAgICRPcG1JbmZvIC49ICJ8IFZlcnNpb246ICAgICAkUGFja2FnZS0+e1ZlcnNpb259LT57Q29udGVudH1cbiI7CiAgICAgICAgJE9wbUluZm8gLj0gInwgVmVuZG9yOiAgICAgICRQYWNrYWdlLT57VmVuZG9yfS0+e0NvbnRlbnR9XG4iOwogICAgICAgICRPcG1JbmZvIC49ICJ8IFVSTDogICAgICAgICAkUGFja2FnZS0+e1VSTH0tPntDb250ZW50fVxuIjsKICAgICAgICAkT3BtSW5mbyAuPSAifCBMaWNlbnNlOiAgICAgJFBhY2thZ2UtPntMaWNlbnNlfS0+e0NvbnRlbnR9XG4iOwogICAgfQogICAgJE9wbUluZm8gLj0gIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIjsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ25vdGljZScsIE1lc3NhZ2UgPT4gJ09wbUluZm8gZW5kJyApOwoKICAgIHJldHVybiAoIFwkT3BtSW5mbywgJ0luc3RhbGxlZFBhY2thZ2VzLmxvZycgKTsKfQoKc3ViIEFwcGxpY2F0aW9uQXJjaGl2ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnbm90aWNlJywgTWVzc2FnZSA9PiAnQXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlIHN0YXJ0JyApOwoKICAgIG15ICRIb21lICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgIG15ICRBcmNoaXZlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvdmFyL3RtcC9hcHBsaWNhdGlvbi50YXInOwoKICAgIGlmICggLWYgJEFyY2hpdmUgKSB7CiAgICAgICAgdW5saW5rICRBcmNoaXZlIHx8IGRpZSAiQ2FuJ3QgdW5saW5rICRBcmNoaXZlOiAkISI7CiAgICB9CgogICAgbXkgQExpc3Q7CiAgICBmb3IgbXkgJExpc3RFbGVtZW50ICggJFNlbGYtPkRpcmVjdG9yeUZpbGVzKCBEaXJlY3RvcnkgPT4gJEhvbWUgKSApIHsKICAgICAgICBpZiAoIC1yICRMaXN0RWxlbWVudCApIHsKICAgICAgICAgICAgcHVzaCBATGlzdCwgJExpc3RFbGVtZW50OwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBmaWxlcyB0byB0aGUgdGFyIGFyY2hpdmUKICAgIG15ICRUYXJPYmplY3QgPSBBcmNoaXZlOjpUYXItPm5ldygpOwoKICAgICRUYXJPYmplY3QtPmFkZF9maWxlcyhATGlzdCk7CgogICAgIyBNYXNrIFBhc3N3b3JkcyBpbiBDb25maWcucG0KICAgIG15ICRIb21lV2l0aG91dFNsYXNoID0gJEhvbWU7CiAgICAkSG9tZVdpdGhvdXRTbGFzaCA9fiBzL15cLy8vOwogICAgbXkgJENvbmZpZyA9ICRUYXJPYmplY3QtPmdldF9jb250ZW50KCIkSG9tZVdpdGhvdXRTbGFzaC9LZXJuZWwvQ29uZmlnLnBtIik7CgogICAgbXkgQFRyaW1BY3Rpb24gPSBxdygKICAgICAgICBEYXRhYmFzZVB3CiAgICAgICAgU2VhcmNoVXNlclB3CiAgICAgICAgVXNlclB3CiAgICAgICAgU2VuZG1haWxNb2R1bGU6OkF1dGhQYXNzd29yZAogICAgICAgIEF1dGhNb2R1bGU6OlJhZGl1czo6UGFzc3dvcmQKICAgICAgICBQR1A6OktleTo6UGFzc3dvcmQKICAgICAgICBDdXN0b21lcjo6QXV0aE1vZHVsZTo6REI6OkN1c3RvbWVyUGFzc3dvcmQKICAgICAgICBDdXN0b21lcjo6QXV0aE1vZHVsZTo6UmFkaXVzOjpQYXNzd29yZAogICAgKTsKCiAgICBTVFJJTkc6CiAgICBmb3IgbXkgJFN0cmluZyAoQFRyaW1BY3Rpb24pIHsKICAgICAgICBuZXh0IFNUUklORyBpZiAhJFN0cmluZzsKICAgICAgICAkQ29uZmlnID1+IHMvKF5ccytcJFNlbGYuKj8kU3RyaW5nLio/PS4qPylcJy4qP1wnOy8kMVwneHh4XCc7L21nOwogICAgfQogICAgJENvbmZpZyA9fiBzLyheXHMrUGFzc3dvcmQuKj89Pi4qPylcJy4qP1wnLC8kMVwneHh4XCcsL21nOwoKICAgICRUYXJPYmplY3QtPnJlcGxhY2VfY29udGVudCggIiRIb21lV2l0aG91dFNsYXNoL0tlcm5lbC9Db25maWcucG0iLCAkQ29uZmlnICk7CiAgICBteSAkV3JpdGUgPSAkVGFyT2JqZWN0LT53cml0ZSggJEFyY2hpdmUsIDAgKTsKICAgIGlmICggISRXcml0ZSApIHsKCiAgICAgICAgIyBsb2cgaW5mbwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlIGNhbid0IHdyaXRlICRBcmNoaXZlOiAkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhZGQgZmlsZXMgdG8gdGhlIHRhciBhcmNoaXZlCiAgICBteSAkVGFyOwogICAgaWYgKCAhb3BlbiggJFRhciwgJzwnLCAkQXJjaGl2ZSApICkgewoKICAgICAgICAjIGxvZyBpbmZvCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUgY2FuJ3QgcmVhZCAkQXJjaGl2ZTogJCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGJpbm1vZGUgJFRhcjsKICAgIG15ICRUbXBUYXIgPSBkbyB7IGxvY2FsICQvOyA8JFRhcj4gfTsKICAgIGNsb3NlICRUYXI7CgogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCdDb21wcmVzczo6WmxpYicpICkgewogICAgICAgIG15ICRHelRhciA9IENvbXByZXNzOjpabGliOjptZW1HemlwKCRUbXBUYXIpOwoKICAgICAgICAjIGxvZyBpbmZvCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlIENvbXByZXNzOjpabGliIGVuZCcsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICggXCRHelRhciwgJ2FwcGxpY2F0aW9uLnRhci5neicgKTsKICAgIH0KCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnQXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlIG5vIENvbXByZXNzOjpabGliIGVuZCcsCiAgICApOwoKICAgIHJldHVybiAoIFwkVG1wVGFyLCAnYXBwbGljYXRpb24udGFyJyApOwp9CgpzdWIgRGlyZWN0b3J5RmlsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhEaXJlY3RvcnkpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXJ0aWNsZSBkaXJlY3RvcnkKICAgIG15ICRBcnRpY2xlRGlyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FydGljbGVEaXInKTsKCiAgICAjIGNsZWFudXAgZmlsZSBuYW1lCiAgICAkQXJ0aWNsZURpciA9fiBzL1wvXC8vXC8vZzsKCiAgICAjIHRlbXAgZGlyZWN0b3J5CiAgICBteSAkVGVtcERpciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUZW1wRGlyJyk7CgogICAgIyBjbGVhbnVwIGZpbGUgbmFtZQogICAgJFRlbXBEaXIgPX4gcy9cL1wvL1wvL2c7CgogICAgIyByZXNldCBmaWxlIGNvdW50IG9uIGluaXRpYWwgY2FsbAogICAgaWYgKCAhJFBhcmFte0xvb3B9ICkgewogICAgICAgICRTZWxmLT57RGlyZWN0b3J5RmlsZXNDb3VudH0gPSAwOwogICAgfQoKICAgICMgY2hlY2sgYWxsICRQYXJhbXtEaXJlY3Rvcnl9LyogaW4gaG9tZSBkaXJlY3RvcnkKICAgIG15IEBGaWxlczsKICAgIG15IEBMaXN0ID0gZ2xvYigiJFBhcmFte0RpcmVjdG9yeX0vKiIpOwogICAgRklMRToKICAgIGZvciBteSAkRmlsZSAoQExpc3QpIHsKCiAgICAgICAgIyBjbGVhbnVwIGZpbGUgbmFtZQogICAgICAgICRGaWxlID1+IHMvXC9cLy9cLy9nOwoKICAgICAgICAjIGNoZWNrIGlmIGRpcmVjdG9yeQogICAgICAgIGlmICggLWQgJEZpbGUgKSB7CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIENWUyBkaXJlY3RvcmllcwogICAgICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL1wvQ1ZTLzsKCiAgICAgICAgICAgICMgZG8gbm90IGluY2x1ZGUgYXJ0aWNsZSBpbiBmaWxlIHN5c3RlbQogICAgICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL1xRJEFydGljbGVEaXJcRS9pOwoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSB0bXAgaW4gZmlsZSBzeXN0ZW0KICAgICAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC9cUSRUZW1wRGlyXEUvaTsKCiAgICAgICAgICAgICMgYWRkIGRpcmVjdG9yeSB0byBsaXN0CiAgICAgICAgICAgIHB1c2ggQEZpbGVzLCAkU2VsZi0+RGlyZWN0b3J5RmlsZXMoIERpcmVjdG9yeSA9PiAkRmlsZSwgTG9vcCA9PiAxICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBoaWRkZW4gZmlsZXMKICAgICAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC9eXC4vOwoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBmaWxlcyB3aXRoICMgaW4gZmlsZSBuYW1lCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvIy87CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGlmIGZpbGUgaXMgYmlnZ2VyIHRoZSAwLjQ1IE1CCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAoIC1zICRGaWxlID4gKCAxMDI0ICogMTAyNCAqIDAuNDUgKSApOwoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBpZiBmaWxlIGlzIG5vdCByZWFkYWJsZQogICAgICAgICAgICBuZXh0IEZJTEUgaWYgIS1yICRGaWxlOwoKICAgICAgICAgICAgIyBhZGQgZmlsZSB0byBsaXN0CiAgICAgICAgICAgIHB1c2ggQEZpbGVzLCAkRmlsZTsKCiAgICAgICAgICAgICMgY2hlY2sgdG90YWwgY291bnQgb2YgZmlsZXMgKG1heC4gZmlsZSBjb3VudCkKICAgICAgICAgICAgbXkgJEZpbGVDb3VudE1heCA9IDhfMDAwOwogICAgICAgICAgICAkU2VsZi0+e0RpcmVjdG9yeUZpbGVzQ291bnR9Kys7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntEaXJlY3RvcnlGaWxlc0NvdW50fSA+ICRGaWxlQ291bnRNYXggKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJNYXggZmlsZSBjb3VudCAoJEZpbGVDb3VudE1heCkgZm9yIGFwcGxpY2F0aW9uIGFyY2hpdmUgcmVhY2hlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiBARmlsZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBGaWxlczsKfQoKc3ViIEdldEluc3RhbGxlZFByb2R1Y3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnR2V0SW5zdGFsbGVkUHJvZHVjdCBzdGFydCcsCiAgICApOwoKICAgIG15ICRQcm9kdWN0OwogICAgbXkgJVRvb2wgPSAoCiAgICAgICAgU0lSSU9TICAgICAgICAgICAgICAgPT4gMCwKICAgICAgICBJVFNNICAgICAgICAgICAgICAgICA9PiAwLAogICAgICAgIFdJREF1dGhvcmluZyAgICAgICAgID0+IDAsCiAgICAgICAgV0lEUHVibGljYXRpb25TeXN0ZW0gPT4gMCwKICAgICk7CgogICAgJFByb2R1Y3QgPSAiUHJvZHVjdDogIiAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0JykgLiAnICcKICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdWZXJzaW9uJyk7CgogICAgZm9yIG15ICRQYWNrYWdlICggJFNlbGYtPntQYWNrYWdlT2JqZWN0fS0+UmVwb3NpdG9yeUxpc3QoKSApIHsKICAgICAgICBmb3IgbXkgJFRvb2xzICgga2V5cyAlVG9vbCApIHsKICAgICAgICAgICAgaWYgKCAkVG9vbHMgPX4gL15cUSRQYWNrYWdlLT57TmFtZX0tPntDb250ZW50fVxFJC8gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRUb29seyRUb29sc30gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkUHJvZHVjdCAuPSAiIC8gJFBhY2thZ2UtPntOYW1lfS0+e0NvbnRlbnR9IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRUb29seyRUb29sc30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHRoZSBwcm9kdWN0IG5hbWUgKHdoaWNoIGNvbnRhaW5zIHRoZSBJVFNNIHZlcnNpb24sIGlmIElUU00gaXMgaW5zdGFsbGVkKQogICAgJFByb2R1Y3QgLj0gJyAvICcgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdE5hbWUnKTsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnR2V0SW5zdGFsbGVkUHJvZHVjdCBlbmQnLAogICAgKTsKCiAgICByZXR1cm4gJFByb2R1Y3Q7Cn0KCnN1YiBTZW5kSW5mbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdTZW5kSW5mbyBzdGFydCcsCiAgICApOwoKICAgICMgY3JlYXRlIGxvZyBwYWNrYWdlCiAgICBteSAoICRMb2dQcmVDb250ZW50LCAkTG9nUHJlRmlsZW5hbWUgKSA9ICRTZWxmLT5Mb2dMYXN0KCBUeXBlID0+ICdsb2dfcHJlJyApOwoKICAgICMgY3JlYXRlIGNoZWNrIHBhY2thZ2UKICAgIG15ICREYXRhSGFzaCA9ICRTZWxmLT5BZG1pbkNoZWNrc0dldCgpOwogICAgbXkgJFhNTENoZWNrID0gJFNlbGYtPlhNTFN0cmluZ0NyZWF0ZSggRGF0YUhhc2ggPT4gJERhdGFIYXNoICk7CgogICAgIyBjcmVhdGUgYXBwbGljYXRpb24gcGFja2FnZQogICAgbXkgKCAkQ29udGVudCwgJEZpbGVuYW1lICkgPSAkU2VsZi0+QXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlKCk7CgogICAgIyBjcmVhdGUgQVJDSElWRSBsb2cgcGFja2FnZQogICAgbXkgKCAkQVJDSElWRUNvbnRlbnQsICRBUkNISVZFRmlsZW5hbWUgKSA9ICRTZWxmLT5BUkNISVZFTG9nQ3JlYXRlKCk7CgogICAgIyBjcmVhdGUgT1BNIEluZm8gcGFja2FnZSBsaWtlIC4vb3BtLnBsIC1hIGxpc3QKICAgIG15ICggJE9QTUluZm9Db250ZW50LCAkT1BNSW5mb0ZpbGVuYW1lICkgPSAkU2VsZi0+T3BtSW5mbygpOwoKICAgICMgY3JlYXRlIG1vZHVsZSBjaGVjayBwYWNrYWdlCiAgICBteSAoICRNb2R1bGVDaGVja0NvbnRlbnQsICRNb2R1bGVDaGVja0ZpbGVuYW1lICkgPSAkU2VsZi0+TW9kdWxlQ2hlY2soKTsKCiAgICAjIGNyZWF0ZSBsb2cgcGFja2FnZQogICAgbXkgKCAkTG9nUG9zdENvbnRlbnQsICRMb2dQb3N0RmlsZW5hbWUgKSA9ICRTZWxmLT5Mb2dMYXN0KCBUeXBlID0+ICdsb2dfcG9zdCcgKTsKCiAgICAjIGNyZWF0ZSBtYWlsIGJvZHkKICAgIG15ICRCb2R5ID0gJyc7CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJEJvZHkgLj0gIiRLZXk6JFBhcmFte0N1c3RvbWVySW5mb30tPnskS2V5fVxuIjsKICAgIH0KCiAgICAjIEdldCB0aGUgRlFETgogICAgbXkgJEZRRE4gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpIHx8ICcnOwogICAgJEJvZHkgLj0gIkZRRE46IiAuICRGUUROIC4gIlxuIjsKCiAgICAjIEdldCB0aGUgb3RycyB2ZXJzaW9uIGFuZCBpZiBpbnN0YWxsZWQgYWRkIG90aGVyIHByb2R1Y3QgaW5mbyBsaWtlIFNJUklPUyBvciBJVFNNLgogICAgJEJvZHkgLj0gJFNlbGYtPkdldEluc3RhbGxlZFByb2R1Y3QoKTsKCiAgICBteSAkU2VuZCA9ICRTZWxmLT57RW1haWxPYmplY3R9LT5TZW5kKAogICAgICAgIEZyb20gICAgICAgPT4gJFBhcmFte0N1c3RvbWVySW5mb30tPntTZW5kZXJ9LAogICAgICAgIFRvICAgICAgICAgPT4gJ3N1cHBvcnRAb3Rycy5jb20nLAogICAgICAgIFN1YmplY3QgICAgPT4gJ1N1cHBvcnQ6OlJlcXVlc3Q6OkF1dG86OkVtYWlsOjpDSEVDSycsCiAgICAgICAgVHlwZSAgICAgICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgQ2hhcnNldCAgICA9PiAndXRmLTgnLAogICAgICAgIEJvZHkgICAgICAgPT4gJEJvZHksCiAgICAgICAgQXR0YWNobWVudCA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRMb2dQcmVGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JExvZ1ByZUNvbnRlbnR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnY2hlY2sueG1sJywKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JFhNTENoZWNrfSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3htbCcsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JENvbnRlbnR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRBUkNISVZFRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRBUkNISVZFQ29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRNb2R1bGVDaGVja0ZpbGVuYW1lLAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJHskTW9kdWxlQ2hlY2tDb250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJE9QTUluZm9GaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JE9QTUluZm9Db250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJExvZ1Bvc3RGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JExvZ1Bvc3RDb250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnU2VuZEluZm8gZW5kJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBEb3dubG9hZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdEb3dubG9hZCBzdGFydCcsCiAgICApOwoKICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSwgJHdkLCAkeWQsICRkc3QgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CiAgICBteSAkRmlsZW5hbWUgPSAiU3VwcG9ydEluZm9fJFktJE0tJEQiIC4gJ18nIC4gIiRoLSRtIjsKCiAgICAjIGNyZWF0ZSBsb2cgcGFja2FnZQogICAgbXkgJUZpbGU7CiAgICAoICRGaWxle0xvZ1ByZUNvbnRlbnR9LCAkRmlsZXtMb2dQcmVGaWxlbmFtZX0gKSA9ICRTZWxmLT5Mb2dMYXN0KCBUeXBlID0+ICdsb2dfcHJlJyApOwoKICAgICMgY3JlYXRlIGNoZWNrIHBhY2thZ2UKICAgIG15ICREYXRhSGFzaCA9ICRTZWxmLT5BZG1pbkNoZWNrc0dldCgpOwoKICAgICRGaWxle0NoZWNrQ29udGVudH0gPSAkU2VsZi0+WE1MU3RyaW5nQ3JlYXRlKCBEYXRhSGFzaCA9PiAkRGF0YUhhc2gsICk7CiAgICAkRmlsZXtDaGVja0ZpbGVuYW1lfSA9ICdjaGVjay54bWwnLAoKICAgICAgICAjIGNyZWF0ZSBhcHBsaWNhdGlvbiBwYWNrYWdlCiAgICAgICAgKCAkRmlsZXtBcHBDb250ZW50fSwgJEZpbGV7QXBwRmlsZW5hbWV9ICkgPSAkU2VsZi0+QXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlKCk7CgogICAgIyBjcmVhdGUgQVJDSElWRSBsb2cgcGFja2FnZQogICAgKCAkRmlsZXtBcmNoQ29udGVudH0sICRGaWxle0FyY2hGaWxlbmFtZX0gKSA9ICRTZWxmLT5BUkNISVZFTG9nQ3JlYXRlKCk7CgogICAgIyBjcmVhdGUgT1BNIEluZm8gcGFja2FnZSBsaWtlIC4vb3BtLnBsIC1hIGxpc3QKICAgICggJEZpbGV7T1BNSW5mb0NvbnRlbnR9LCAkRmlsZXtPUE1JbmZvRmlsZW5hbWV9ICkgPSAkU2VsZi0+T3BtSW5mbygpOwoKICAgICMgY3JlYXRlIG1vZHVsZSBjaGVjayBwYWNrYWdlCiAgICAoICRGaWxle01vZHVsZUNoZWNrQ29udGVudH0sICRGaWxle01vZHVsZUNoZWNrRmlsZW5hbWV9ICkgPSAkU2VsZi0+TW9kdWxlQ2hlY2soKTsKCiAgICAjIGNyZWF0ZSBsb2cgcGFja2FnZQogICAgKCAkRmlsZXtMb2dQb3N0Q29udGVudH0sICRGaWxle0xvZ1Bvc3RGaWxlbmFtZX0gKSA9ICRTZWxmLT5Mb2dMYXN0KCBUeXBlID0+ICdsb2dfcG9zdCcgKTsKCiAgICAjIGNyZWF0ZSBtYWlsIGJvZHkKICAgIG15ICRCb2R5ID0gJyc7CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVBhcmFtICkgewogICAgICAgICRCb2R5IC49ICIkS2V5OiRQYXJhbXskS2V5fVxuIjsKICAgIH0KICAgICRCb2R5IC49ICJGUUROOiIgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpIC4gIlxuIjsKICAgICRCb2R5IC49ICRTZWxmLT5HZXRJbnN0YWxsZWRQcm9kdWN0KCk7CgogICAgJEZpbGV7Qm9keUNvbnRlbnR9ICA9IFwkQm9keTsKICAgICRGaWxle0JvZHlGaWxlbmFtZX0gPSAnQm9keS50eHQnOwoKICAgICMgc2F2ZSBhbmQgY3JlYXRlIGFyY2hpdmUKICAgIG15ICRUZW1wRGlyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBEaXInKSAuICcvc3VwcG9ydGluZm8vJzsKCiAgICBpZiAoICEtZCAkVGVtcERpciApIHsKICAgICAgICBta2RpciAkVGVtcERpcjsKICAgIH0KCiAgICAjIHJlbW92ZSBhbGwgZmlsZXMKICAgIG15IEBMaXN0T2xkID0gZ2xvYiggJFRlbXBEaXIgLiAnLyonICk7CiAgICBmb3IgbXkgJEZpbGUgKEBMaXN0T2xkKSB7CiAgICAgICAgdW5saW5rICRGaWxlOwogICAgfQoKICAgIG15IEBMaXN0OwogICAgZm9yIG15ICRLZXkgKHF3KEJvZHkgTG9nUHJlIENoZWNrIEFwcCBBcmNoIE1vZHVsZUNoZWNrIExvZ1Bvc3QgT1BNSW5mbykpIHsKICAgICAgICBpZiAoICRGaWxleyAkS2V5IC4gJ0ZpbGVuYW1lJyB9ICYmICRGaWxleyAkS2V5IC4gJ0NvbnRlbnQnIH0gKSB7CiAgICAgICAgICAgIG15ICRGaWxlbmFtZSA9ICRUZW1wRGlyIC4gJy8nIC4gJEZpbGV7ICRLZXkgLiAnRmlsZW5hbWUnIH07CiAgICAgICAgICAgIG9wZW4oIG15ICRPdXQsICc+JywgJEZpbGVuYW1lICk7CiAgICAgICAgICAgIGJpbm1vZGUoJE91dCk7CiAgICAgICAgICAgIHByaW50ICRPdXQgJHsgJEZpbGV7ICRLZXkgLiAnQ29udGVudCcgfSB9OwogICAgICAgICAgICBjbG9zZSAkT3V0OwogICAgICAgICAgICBwdXNoIEBMaXN0LCAkRmlsZW5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGZpbGVzIHRvIHRoZSB0YXIgYXJjaGl2ZQogICAgbXkgJEFyY2hpdmUgICA9ICRUZW1wRGlyIC4gJy8nIC4gJEZpbGVuYW1lOwogICAgbXkgJFRhck9iamVjdCA9IEFyY2hpdmU6OlRhci0+bmV3KCk7CiAgICAkVGFyT2JqZWN0LT5hZGRfZmlsZXMoQExpc3QpOwogICAgJFRhck9iamVjdC0+d3JpdGUoICRBcmNoaXZlLCAwICkgfHwgZGllICJDb3VsZCBub3Qgd3JpdGU6ICRfISI7CgogICAgIyBhZGQgZmlsZXMgdG8gdGhlIHRhciBhcmNoaXZlCiAgICBvcGVuKCBteSAkVGFyLCAnPCcsICRBcmNoaXZlICk7CiAgICBiaW5tb2RlICRUYXI7CiAgICBteSAkVG1wVGFyID0gZG8geyBsb2NhbCAkLzsgPCRUYXI+IH07CiAgICBjbG9zZSAkVGFyOwoKICAgICMgcmVtb3ZlIGFsbCBmaWxlcwogICAgQExpc3RPbGQgPSBnbG9iKCAkVGVtcERpciAuICcvKicgKTsKICAgIGZvciBteSAkRmlsZSAoQExpc3RPbGQpIHsKICAgICAgICB1bmxpbmsgJEZpbGU7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCdDb21wcmVzczo6WmxpYicpICkgewogICAgICAgIG15ICRHelRhciA9IENvbXByZXNzOjpabGliOjptZW1HemlwKCRUbXBUYXIpOwoKICAgICAgICAjIGxvZyBpbmZvCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRG93bmxvYWQgQ29tcHJlc3M6OlpsaWIgZW5kJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gKCBcJEd6VGFyLCAkRmlsZW5hbWUgLiAnLnRhci5neicgKTsKICAgIH0KCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnRG93bmxvYWQgbm8gQ29tcHJlc3M6OlpsaWIgZW5kJywKICAgICk7CgogICAgcmV0dXJuICggXCRUbXBUYXIsICRGaWxlbmFtZSAuICcudGFyJyApOwp9CgpzdWIgQmVuY2htYXJrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEluc2VydCA9ICRQYXJhbXtJbnNlcnR9OwogICAgbXkgJFVwZGF0ZSA9ICRQYXJhbXtVcGRhdGV9OwogICAgbXkgJFNlbGVjdCA9ICRQYXJhbXtTZWxlY3R9OwogICAgbXkgJE1vZGUgICA9ICRQYXJhbXtNb2RlfTsKCiAgICBmb3IgKCAxIC4uICRNb2RlICkgewogICAgICAgICRTZWxmLT57IkRCT2JqZWN0JF8ifSA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCAleyRTZWxmfSApOwogICAgfQoKICAgICRQYXJhbXtJbnNlcnRUaW1lfSA9IDA7CiAgICAkUGFyYW17VXBkYXRlVGltZX0gPSAwOwogICAgJFBhcmFte1NlbGVjdFRpbWV9ID0gMDsKICAgICRQYXJhbXtEZWxldGVUaW1lfSA9IDA7CiAgICBteSAkVGltZVN0YXJ0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgJFNlbGYtPl9TUUxJbnNlcnQoICRJbnNlcnQsICRNb2RlICk7CiAgICBteSAkVGltZTEgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAkU2VsZi0+X1NRTFVwZGF0ZSggJFVwZGF0ZSwgJE1vZGUgKTsKICAgIG15ICRUaW1lMiA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKICAgICRTZWxmLT5fU1FMU2VsZWN0KCAkU2VsZWN0LCAkTW9kZSApOwogICAgbXkgJFRpbWUzID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgJFNlbGYtPl9TUUxEZWxldGUoICRJbnNlcnQsICRNb2RlICk7CiAgICBteSAkVGltZTQgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAkUGFyYW17SW5zZXJ0VGltZX0gPSAkUGFyYW17SW5zZXJ0VGltZX0gKyAkVGltZTEgLSAkVGltZVN0YXJ0OwogICAgJFBhcmFte1VwZGF0ZVRpbWV9ID0gJFBhcmFte1VwZGF0ZVRpbWV9ICsgJFRpbWUyIC0gJFRpbWUxOwogICAgJFBhcmFte1NlbGVjdFRpbWV9ID0gJFBhcmFte1NlbGVjdFRpbWV9ICsgJFRpbWUzIC0gJFRpbWUyOwogICAgJFBhcmFte0RlbGV0ZVRpbWV9ID0gJFBhcmFte0RlbGV0ZVRpbWV9ICsgJFRpbWU0IC0gJFRpbWUzOwoKICAgIG15ICRJbnNlcnRUaW1lID0gKCAkUGFyYW17SW5zZXJ0VGltZX0gLyAkTW9kZSApICogKCAxMDAwMCAvICRJbnNlcnQgKTsKICAgIGlmICggJEluc2VydFRpbWUgPD0gMyApIHsKICAgICAgICAkUGFyYW17SW5zZXJ0TW9vZH0gICAgPSAnOi0pJzsKICAgICAgICAkUGFyYW17SW5zZXJ0Q29tbWVudH0gPSAnJFRleHR7Ikxvb2tzIGZpbmUhIn0nLAogICAgfQogICAgZWxzaWYgKCAkSW5zZXJ0VGltZSA8PSA1ICkgewogICAgICAgICRQYXJhbXtJbnNlcnRNb29kfSAgICA9ICc6LXwnOwogICAgICAgICRQYXJhbXtJbnNlcnRDb21tZW50fSA9ICckVGV4dHsiT2sifSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17SW5zZXJ0TW9vZH0gPSAnOi0oJzsKICAgICAgICBteSAkU2hvdWxkVGFrZSA9IGludCggJE1vZGUgKiA1ICk7CiAgICAgICAgJFBhcmFte0luc2VydENvbW1lbnR9CiAgICAgICAgICAgID0gJyRUZXh0eyJTaG91bGQgbm90IHRha2UgbW9yZSB0aGFuICVzIG9uIGFuIGF2ZXJhZ2Ugc3lzdGVtLiIsICInIC4gJFNob3VsZFRha2UgLiAncyJ9JywKICAgIH0KCiAgICBteSAkVXBkYXRlVGltZSA9ICggJFBhcmFte1VwZGF0ZVRpbWV9IC8gJE1vZGUgKSAqICggMTAwMDAgLyAkVXBkYXRlICk7CiAgICBpZiAoICRVcGRhdGVUaW1lIDw9IDUgKSB7CiAgICAgICAgJFBhcmFte1VwZGF0ZU1vb2R9ICAgID0gJzotKSc7CiAgICAgICAgJFBhcmFte1VwZGF0ZUNvbW1lbnR9ID0gJyRUZXh0eyJMb29rcyBmaW5lISJ9JywKICAgIH0KICAgIGVsc2lmICggJFVwZGF0ZVRpbWUgPD0gOSApIHsKICAgICAgICAkUGFyYW17VXBkYXRlTW9vZH0gICAgPSAnOi18JzsKICAgICAgICAkUGFyYW17VXBkYXRlQ29tbWVudH0gPSAnJFRleHR7Ik9rIn0nOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1VwZGF0ZU1vb2R9ID0gJzotKCc7CiAgICAgICAgbXkgJFNob3VsZFRha2UgPSBpbnQoICRNb2RlICogOSApOwogICAgICAgICRQYXJhbXtVcGRhdGVDb21tZW50fQogICAgICAgICAgICA9ICckVGV4dHsiU2hvdWxkIG5vdCB0YWtlIG1vcmUgdGhhbiAlcyBvbiBhbiBhdmVyYWdlIHN5c3RlbS4iLCAiJyAuICRTaG91bGRUYWtlIC4gJ3MifScsCiAgICB9CgogICAgbXkgJFNlbGVjdFRpbWUgPSAoICRQYXJhbXtTZWxlY3RUaW1lfSAvICRNb2RlICkgKiAoIDEwMDAwIC8gJFNlbGVjdCApOwogICAgaWYgKCAkU2VsZWN0VGltZSA8PSA1ICkgewogICAgICAgICRQYXJhbXtTZWxlY3RNb29kfSAgICA9ICc6LSknOwogICAgICAgICRQYXJhbXtTZWxlY3RDb21tZW50fSA9ICckVGV4dHsiTG9va3MgZmluZSEifScsCiAgICB9CiAgICBlbHNpZiAoICRTZWxlY3RUaW1lIDw9IDYgKSB7CiAgICAgICAgJFBhcmFte1NlbGVjdE1vb2R9ICAgID0gJzotfCc7CiAgICAgICAgJFBhcmFte1NlbGVjdENvbW1lbnR9ID0gJyRUZXh0eyJPayJ9JzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtTZWxlY3RNb29kfSA9ICc6LSgnOwogICAgICAgIG15ICRTaG91bGRUYWtlID0gaW50KCAkTW9kZSAqIDYgKTsKICAgICAgICAkUGFyYW17U2VsZWN0Q29tbWVudH0KICAgICAgICAgICAgPSAnJFRleHR7IlNob3VsZCBub3QgdGFrZSBtb3JlIHRoYW4gJXMgb24gYW4gYXZlcmFnZSBzeXN0ZW0uIiwgIicgLiAkU2hvdWxkVGFrZSAuICdzIn0nLAogICAgfQoKICAgIG15ICREZWxldGVUaW1lID0gKCAkUGFyYW17RGVsZXRlVGltZX0gLyAkTW9kZSApOwogICAgaWYgKCAkRGVsZXRlVGltZSA8PSA0ICkgewogICAgICAgICRQYXJhbXtEZWxldGVNb29kfSAgICA9ICc6LSknOwogICAgICAgICRQYXJhbXtEZWxldGVDb21tZW50fSA9ICckVGV4dHsiTG9va3MgZmluZSEifScsCiAgICB9CiAgICBlbHNpZiAoICREZWxldGVUaW1lIDw9IDUgKSB7CiAgICAgICAgJFBhcmFte0RlbGV0ZU1vb2R9ICAgID0gJzotfCc7CiAgICAgICAgJFBhcmFte0RlbGV0ZUNvbW1lbnR9ID0gJyRUZXh0eyJPayJ9JzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtEZWxldGVNb29kfSA9ICc6LSgnOwogICAgICAgIG15ICRTaG91bGRUYWtlID0gaW50KCAkTW9kZSAqIDUgKTsKICAgICAgICAkUGFyYW17RGVsZXRlQ29tbWVudH0KICAgICAgICAgICAgPSAnJFRleHR7IlNob3VsZCBub3QgdGFrZSBtb3JlIHRoYW4gJXMgb24gYW4gYXZlcmFnZSBzeXN0ZW0uIiwgIicgLiAkU2hvdWxkVGFrZSAuICdzIn0nLAogICAgfQoKICAgIHJldHVybiAlUGFyYW07Cn0KCnN1YiBfU1FMSW5zZXJ0IHsKICAgIG15ICggJFNlbGYsICRDb3VudCwgJE1vZGUgKSA9IEBfOwoKICAgIGZvciBteSAkQyAoIDEgLi4gJENvdW50ICkgewogICAgICAgIGZvciBteSAkTSAoIDEgLi4gJE1vZGUgKSB7CiAgICAgICAgICAgIG15ICRWYWx1ZTEgPSAiYWFhJEMtJE0iOwogICAgICAgICAgICBteSAkVmFsdWUyID0gJ2JiYic7CiAgICAgICAgICAgICRTZWxmLT57IkRCT2JqZWN0JE0ifS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHN1cHBvcnRfYmVuY2hfdGVzdCAobmFtZV9hLCBuYW1lX2IpIHZhbHVlcyAoPywgPyknLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkVmFsdWUxLCBcJFZhbHVlMiwgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9TUUxVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJENvdW50LCAkTW9kZSApID0gQF87CgogICAgbXkgJFZhbHVlMSA9ICcxMTEnOwogICAgbXkgJFZhbHVlMiA9ICcyMjInOwogICAgZm9yIG15ICRDICggMSAuLiAkQ291bnQgKSB7CiAgICAgICAgZm9yIG15ICRNICggMSAuLiAkTW9kZSApIHsKICAgICAgICAgICAgbXkgJFZhbHVlID0gImFhYSRDLSRNIjsKICAgICAgICAgICAgJFNlbGYtPnsiREJPYmplY3QkTSJ9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAnVVBEQVRFIHN1cHBvcnRfYmVuY2hfdGVzdCBTRVQgbmFtZV9hID0gPywgbmFtZV9iID0gPyBXSEVSRSBuYW1lX2EgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFZhbHVlMSwgXCRWYWx1ZTIsIFwkVmFsdWUgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9TUUxTZWxlY3QgewogICAgbXkgKCAkU2VsZiwgJENvdW50LCAkTW9kZSApID0gQF87CgogICAgZm9yIG15ICRDICggMSAuLiAkQ291bnQgKSB7CiAgICAgICAgZm9yIG15ICRNICggMSAuLiAkTW9kZSApIHsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCJhYWEkQy0kTSIpOwogICAgICAgICAgICAkU2VsZi0+eyJEQk9iamVjdCRNIn0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICBTUUwgPT4gIlNFTEVDVCBuYW1lX2EsIG5hbWVfYiBGUk9NIHN1cHBvcnRfYmVuY2hfdGVzdCBXSEVSRSBuYW1lX2EgPSAnJFZhbHVlJyIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57IkRCT2JqZWN0JE0ifS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgICAgICMgZG8gbm90aGluZwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfU1FMRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICRDb3VudCwgJE1vZGUgKSA9IEBfOwoKICAgIGZvciBteSAkQyAoIDEgLi4gJENvdW50ICkgewogICAgICAgIGZvciBteSAkTSAoIDEgLi4gJE1vZGUgKSB7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICIxMTEkQy0kTSI7CiAgICAgICAgICAgICRTZWxmLT57IkRCT2JqZWN0JE0ifS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBzdXBwb3J0X2JlbmNoX3Rlc3QgV0hFUkUgbmFtZV9hID0gPycsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRWYWx1ZSBdLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40NCAkICREYXRlOiAyMDEwLzA3LzMwIDEwOjA2OjI4ICQKCj1jdXQK</File>
- <File Location="Kernel/System/Support/Database.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGFiYXNlLnBtLHYgMS4xMiAyMDEwLzAyLzA5IDE5OjU0OjE3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uIHRvIGEgcnVubmluZyBPVFJTIGhvc3QuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBEYXRhYmFzZSBpbmZvIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2UtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBBZG1pbkNoZWNrcyBpbmZvcm1hdGlvbi4KCiREYXRhYmFzZUFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZGF0YWJhc2VzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiAgICAjICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwogICAgIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IGluZm9ybWF0aW9uIGFib3V0IHVzZWQgZGF0YWJhc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHRyeSB0byBmaW5kIG91dCB3aGljaCB0aWNrZXQgZGF0YWJhc2UgaXMgY29uZmlndXJlZAogICAgbXkgJERhdGFiYXNlVHlwZSA9ICRTZWxmLT57REJPYmplY3R9LT57J0RCOjpUeXBlJ307CgogICAgIyB0cnkgdG8gZ2V0IGF2YWlsYWJsZSBtb2R1bGVzIGFuZCB0aGUgZGlyZWN0b3J5IG5hbWUKICAgIG15ICREaXJOYW1lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvS2VybmVsL1N5c3RlbS9TdXBwb3J0L0RhdGFiYXNlIjsKCiAgICAjIHJlYWQgYWxsIGF2YWlsYWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoICREaXJOYW1lIC4gIi8qLnBtIiApOwogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgaWYgKCAkRGF0YWJhc2VUeXBlID1+IC9PREJDL2kgKSB7CiAgICAgICAgICAgICREYXRhYmFzZVR5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGF0YWJhc2U6OlR5cGUnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkRGF0YWJhc2VUeXBlID1+IC9eJEZpbGUvaSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjokRmlsZSI7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKICAgICAgICAgICAgICAgIGlmICgkU3VwcG9ydE9iamVjdCkgewogICAgICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5BZG1pbkNoZWNrc0dldCgpOwogICAgICAgICAgICAgICAgICAgIGlmICggJEFycmF5UmVmICYmIHJlZigkQXJyYXlSZWYpIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7JERhdGFBcnJheX0sIEB7JEFycmF5UmVmfSApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEyICQgJERhdGU6IDIwMTAvMDIvMDkgMTk6NTQ6MTcgJAoKPWN1dAo=</File>
- <File Location="Kernel/System/Support/OS.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PUy5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9TLnBtLHYgMS4xNSAyMDEwLzAyLzA5IDIxOjI5OjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpPUzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5hbWVzIG9mIGF2YWlsYWJsZSBjaGVja3MgZnJvbSBzeXNjb25maWcKICAgIG15ICRDaGVja3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6T1MnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gc29ydCBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9EaXN0cmlidXRpb25DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXR1cm5IYXNoID0ge307CgogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoICReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGRhcndpbikvaSApIHsKICAgICAgICBteSAkVG1wTGluZSA9ICIiOwogICAgICAgIG15ICREaXN0cmlidXRpb247CiAgICAgICAgaWYgKCBvcGVuKCAkRGlzdHJpYnV0aW9uLCAnPCcsICIvZXRjL2lzc3VlIiApICkgewogICAgICAgICAgICB3aGlsZSAoPCREaXN0cmlidXRpb24+KSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkRGlzdHJpYnV0aW9uKTsKICAgICAgICAgICAgaWYgKCRUbXBMaW5lKSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL1xcLiovLzsKICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXG4vL2c7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRGlzdHJpYnV0aW9uJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlwiJFRtcExpbmVcIiBpcyB1c2VkLiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAiQ2FuXCd0IGZpbmQgL2V0Yy9pc3N1ZS4uLiIsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luL2kgKSB7CiAgICAgICAgcmVxdWlyZSBXaW4zMjsKICAgICAgICBteSAkV2luVmVyc2lvbiA9IFdpbjMyOjpHZXRPU05hbWUoKTsKICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJTaG93cyB0aGUgdXNlZCBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIiRXaW5WZXJzaW9uIGlzIHVzZWQuIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICB9OwogICAgfQogICAgZWxzaWYgKCAkXk8gPX4gL2ZyZWVic2QvaSApIHsKICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJTaG93cyB0aGUgdXNlZCBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIiReTyBpcyB1c2VkLiIsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9LZXJuZWxJbmZvQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCAkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxmcmVlYnNkfGRhcndpbikvaSApIHsKICAgICAgICBteSAkVG1wTGluZSA9ICIiOwogICAgICAgIG15ICRLZXJuZWxJbmZvOwogICAgICAgIGlmICggb3BlbiggJEtlcm5lbEluZm8sICJ1bmFtZSAtYSB8IiApICkgewogICAgICAgICAgICB3aGlsZSAoPCRLZXJuZWxJbmZvPikgewogICAgICAgICAgICAgICAgJFRtcExpbmUgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEtlcm5lbEluZm8pOwogICAgICAgICAgICBpZiAoJFRtcExpbmUpIHsKICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdLZXJuZWwgVmVyc2lvbicsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIlNob3dzIHRoZSB1c2VkIEtlcm5lbCB2ZXJzaW9uLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlwiJFRtcExpbmVcIiBpcyB1c2VkLiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0tlcm5lbCBWZXJzaW9uJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJTaG93cyB0aGUgdXNlZCBLZXJuZWwgdmVyc2lvbi4iLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhblwndCBleGVjdXRlIHVuYW1lIC1hLi4uIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkXk8gPX4gL3dpbi9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9QZXJsQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgY2hlY2sgdmVyaXNvbiBzdHJpbmcKICAgIG15ICRWZXJzaW9uID0gc3ByaW50ZiAiJXZkIiwgJF5WOwogICAgbXkgJE9TICAgICAgPSBzcHJpbnRmICIkXk8iLCAkXlY7CiAgICBpZiAoICRWZXJzaW9uID1+IC8oXGQrKVwuKFxkKylcLihcZCspL2kgKSB7CiAgICAgICAgaWYgKCAkMSA8PSA1ICYmICQyIDw9IDggJiYgJDMgPD0gNyApIHsKICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnUGVybENoZWNrJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBQZXJsIHZlcnNpb24uIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4KICAgICAgICAgICAgICAgICAgICAiWW91ciBQZXJsICRWZXJzaW9uICgkT1MpIGlzIHRvIG9sZCwgeW91IHNob3VsZCB1cGdyYWRlIHRvIFBlcmwgNS44Ljggb3IgaGlnaGVyLiIsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnRmFpbGVkJywKICAgICAgICAgICAgfTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQZXJsQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIFBlcmwgVmVyc2lvbi4iLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlBlcmwgJFZlcnNpb24gKCRPUykgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BlcmxDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBQZXJsIFZlcnNpb24uIiwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlVuYWJsZSB0byBwYXJzZSB2ZXJzaW9uIHN0cmluZyAoJFZlcnNpb24gLyAkT1MpLiIsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9NZW1vcnlTd2FwQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CgogICAgbXkgJE1lbUluZm9GaWxlOwogICAgbXkgJE1lbVRvdGFsOwogICAgbXkgJE1lbUZyZWU7CiAgICBteSAkU3dhcFRvdGFsOwogICAgbXkgJFN3YXBGcmVlOwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCAkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxmcmVlYnNkfGRhcndpbikvaSApIHsKICAgICAgICBpZiAoIG9wZW4oICRNZW1JbmZvRmlsZSwgJzwnLCAiL3Byb2MvbWVtaW5mbyIgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkTWVtSW5mb0ZpbGU+KSB7CiAgICAgICAgICAgICAgICBteSAkVG1wTGluZSA9ICRfOwogICAgICAgICAgICAgICAgaWYgKCAkVG1wTGluZSA9fiAvTWVtVG90YWwvICkgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtVG90YWwgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkVG1wTGluZSA9fiAvTWVtRnJlZS8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRNZW1GcmVlID0gaW50KCRUbXBMaW5lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFRtcExpbmUgPX4gL1N3YXBUb3RhbC8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRTd2FwVG90YWwgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkVG1wTGluZSA9fiAvU3dhcEZyZWUvICkgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkU3dhcEZyZWUgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRNZW1JbmZvRmlsZSk7CgogICAgICAgICAgICAjIGJ1aWxkIHJldHVybiBoYXNoCiAgICAgICAgICAgIG15ICREZXNjcmlidGlvbgogICAgICAgICAgICAgICAgPSAiVGhlIEhvc3QgU3lzdGVtIGhhczogXG4iCiAgICAgICAgICAgICAgICAuIGludCggJE1lbVRvdGFsIC8gMTAyNCApCiAgICAgICAgICAgICAgICAuICIgTUIgTWVtb3J5IHRvdGFsIFxuIgogICAgICAgICAgICAgICAgLiBpbnQoICRNZW1GcmVlIC8gMTAyNCApCiAgICAgICAgICAgICAgICAuICIgTUIgTWVtb3J5IGZyZWUgXG4iCiAgICAgICAgICAgICAgICAuIGludCggJFN3YXBUb3RhbCAvIDEwMjQgKQogICAgICAgICAgICAgICAgLiAiIE1CIFN3YXAgdG90YWwgXG4iCiAgICAgICAgICAgICAgICAuIGludCggJFN3YXBGcmVlIC8gMTAyNCApCiAgICAgICAgICAgICAgICAuICIgTUIgU3dhcCBmcmVlICI7CgogICAgICAgICAgICBpZiAoICEkU3dhcFRvdGFsICkgewogICAgICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ01lbW9yeSBTd2FwIENoZWNrJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQSBNZW1vcnkgQ2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIk5vIFN3YXAgZW5hYmxlZCEiLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgKCAoJFN3YXBGcmVlKSAvICgkU3dhcFRvdGFsKSA8IDYwICkKICAgICAgICAgICAgICAgIHx8ICggKCRTd2FwVG90YWwpIC0gKCRTd2FwRnJlZSkgPiAyMDAwMCApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdNZW1vcnkgU3dhcCBDaGVjaycsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJTd2FwRnJlZSA6IFN3YXBUb3RhbCA8IDYwICUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgb3IgaWYgbW9yZSB0aGFuIDIwMCBNQiBTd2FwIGlzIHVzZWQuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICIkRGVzY3JpYnRpb24iLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTWVtb3J5IFN3YXAgQ2hlY2snLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJBIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiU3dhcEZyZWUgOiBTd2FwVG90YWwgPCA2MCAlICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAiJERlc2NyaWJ0aW9uIiwKICAgICAgICAgICAgICAgICAgICBDaGVjayAgID0+ICdGYWlsZWQnLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJF5PID1+IC93aW4vaSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgpzdWIgX0NQVUxvYWRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXR1cm5IYXNoID0ge307CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15IEBTcGxpdEFycmF5ID0ge307CgogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoICReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGZyZWVic2R8ZGFyd2luKS9pICkgewogICAgICAgIGlmICggLWUgIi9wcm9jL2xvYWRhdmciICkgewogICAgICAgICAgICBteSAkTG9hZEZpbGU7CiAgICAgICAgICAgIG9wZW4oICRMb2FkRmlsZSwgJzwnLCAiL3Byb2MvbG9hZGF2ZyIgKTsKICAgICAgICAgICAgd2hpbGUgKDwkTG9hZEZpbGU+KSB7CiAgICAgICAgICAgICAgICBAU3BsaXRBcnJheSA9IHNwbGl0KCAiICIsICRfICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJExvYWRGaWxlKTsKCiAgICAgICAgICAgICMgYnVpbGQgcmV0dXJuIGhhc2gKICAgICAgICAgICAgbXkgJERlc2NyaWJ0aW9uCiAgICAgICAgICAgICAgICA9ICJUaGUgSG9zdCBTeXN0ZW0gaGFzIGEgbG9hZDogXG4iCiAgICAgICAgICAgICAgICAuICRTcGxpdEFycmF5WzBdCiAgICAgICAgICAgICAgICAuICIgaW4gdGhlIGxhc3QgMSBtaW51dGUgXG4iCiAgICAgICAgICAgICAgICAuICRTcGxpdEFycmF5WzFdCiAgICAgICAgICAgICAgICAuICIgaW4gdGhlIGxhc3QgNSBtaW51dGVzIFxuIgogICAgICAgICAgICAgICAgLiAkU3BsaXRBcnJheVsyXQogICAgICAgICAgICAgICAgLiAiIGluIHRoZSBsYXN0IDE1IG1pbnV0ZXMiOwoKICAgICAgICAgICAgaWYgKCAkU3BsaXRBcnJheVsyXSA8ICcxLjAwJyApIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdDUFUgTG9hZCcsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgQ1BVIGxvYWQgY2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRoZSBzeXN0ZW0gbG9hZCBpbiB0aGUgbGFzdCAxNSBtaW51dGVzID4gMS4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICA9PiAnT0snLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdDUFUgTG9hZCcsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgQ1BVIGxvYWQgY2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRoZSBzeXN0ZW0gbG9hZCBpbiB0aGUgbGFzdCAxNSBtaW51dGVzIDwgMS4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luL2kgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgpzdWIgX0Rpc2tVc2FnZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgICAgPSB7fTsKICAgIG15ICRDaGVjayAgID0gJ09LJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CgogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoICReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGZyZWVic2R8ZGFyd2luKS9pICkgewogICAgICAgIG15ICRJbjsKICAgICAgICBpZiAoIG9wZW4oICRJbiwgImRmIC1seCB0bXBmcyAteCBpc285OTYwIC14IHVkZiB8IiApICkgewogICAgICAgICAgICB3aGlsZSAoPCRJbj4pIHsKICAgICAgICAgICAgICAgIGlmICggJF8gPX4gL14oLis/KVxzLipccyhcZFxkXGR8XGRcZHxcZCklLis/JC8gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkMiA+IDkwICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2hlY2sgbmUgJ0ZhaWxlZCcgJiYgJDIgPiA4NSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIsIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiQxXFskMiVcXSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgaWYgKCAkQ2hlY2sgZXEgJ0ZhaWxlZCcgKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJEaXNrIGlzIGZ1bGwgKCRNZXNzYWdlKS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiRGlzayB1c2FnZSAoJE1lc3NhZ2UpLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEaXNrIFVzYWdlJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGRpc2sgdXNhZ2UuIiwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICB9OwogICAgICAgIHJldHVybiAkRGF0YTsKICAgIH0KfQoKMTsK</File>
- <File Location="Kernel/System/Support/OTRS.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PVFJTLnBtIC0gYWxsIHJlcXVpcmVkIG90cnMgaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9UUlMucG0sdiAxLjI3IDIwMTAvMDIvMDkgMjE6Mjk6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6Ok9UUlM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UGFja2FnZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpBdXRoOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI3ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBFbmNvZGVPYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1N1cHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57UGFja2FnZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UGFja2FnZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHcm91cE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntBdXRoT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpBdXRoLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6Ok9UUlMnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gc29ydCBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKIyBjaGVjayBpZiBlcnJvciBsb2cgZW50cmllcyBhcmUgYXZhaWxhYmxlCnN1YiBfTG9nQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgVGlja2V0OjpJbmRleE1vZHVsZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnT0snOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIG15ICRFcnJvciAgID0gJyc7CgogICAgbXkgQExpbmVzID0gc3BsaXQoIC9cbi8sICRTZWxmLT57TG9nT2JqZWN0fS0+R2V0TG9nKCkgKTsKICAgIGZvciAoQExpbmVzKSB7CiAgICAgICAgbXkgQFJvdyA9IHNwbGl0KCAvOzsvLCAkXyApOwogICAgICAgIGlmICggJFJvd1szXSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzFdID1+IC9lcnJvci9pICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICdZb3UgaGF2ZSBtb3JlIGVycm9yIGxvZyBlbnRyaWVzOiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAnVGhlcmUgaXMgb25lIGVycm9yIGxvZyBlbnRyeTogJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3IgLj0gJywgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRFcnJvciAuPSAkUm93WzNdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdMb2dDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGxvZyBmb3IgZXJyb3IgbG9nIGVudHJpZXMuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSAuICRFcnJvciwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RpY2tldEluZGV4TW9kdWxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgVGlja2V0OjpJbmRleE1vZHVsZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSAkTW9kdWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkluZGV4TW9kdWxlJyk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdTRUxFQ1QgY291bnQoKikgZnJvbSB0aWNrZXQnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA+IDgwMDAwICkgewogICAgICAgICAgICBpZiAoICRNb2R1bGUgPX4gL1J1bnRpbWVEQi8gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiJFJvd1swXSB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZC4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSb3dbMF0gPiA2MDAwMCApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlID1+IC9SdW50aW1lREIvICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiJFJvd1swXSB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZC4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3UgYXJlIHVzaW5nIFwiJE1vZHVsZVwiLCB0aGF0J3MgZmluZSBmb3IgJFJvd1swXSB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiI7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RpY2tldDo6SW5kZXhNb2R1bGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBUaWNrZXQ6OkluZGV4TW9kdWxlIHNldHRpbmcuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RpY2tldFN0YXRpY0RCT3JwaGFuZWRSZWNvcmRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIFRpY2tldDo6SW5kZXhNb2R1bGUgY2hlY2sgZm9yIHJlY29yZHMgaW4gU3RhdGljREIgd2hlbiB1c2luZyBkaWZmZXJlbnQgYmFja2VuZAogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSAkTW9kdWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkluZGV4TW9kdWxlJyk7CgogICAgaWYgKCAkTW9kdWxlICF+IC9TdGF0aWNEQi8gKSB7CgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBjb3VudCgqKSBmcm9tIHRpY2tldF9sb2NrX2luZGV4JyApOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICIkUm93WzBdIHRpY2tldHMgaW4gU3RhdGljREIgbG9ja19pbmRleCBidXQgeW91IGFyZSB1c2luZyB0aGUgJE1vZHVsZSBpbmRleC4gUGxlYXNlIHJ1biBvdHJzL2Jpbi9vdHJzLkNsZWFuVGlja2V0SW5kZXgucGwgdG8gY2xlYW4gdGhlIFN0YXRpY0RCIGluZGV4LiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBjb3VudCgqKSBmcm9tIHRpY2tldF9pbmRleCcgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMF0gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiJFJvd1swXSB0aWNrZXRzIGluIFN0YXRpY0RCIGluZGV4IGJ1dCB5b3UgYXJlIHVzaW5nIHRoZSAkTW9kdWxlIGluZGV4LiBQbGVhc2UgcnVuIG90cnMvYmluL290cnMuQ2xlYW5UaWNrZXRJbmRleC5wbCB0byBjbGVhbiB0aGUgU3RhdGljREIgaW5kZXguIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRNZXNzYWdlID0gIllvdSBhcmUgdXNpbmcgJE1vZHVsZS4gU2tpcHBpbmcgdGVzdC4iOwogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgIH0KICAgIGlmICggJE1lc3NhZ2UgZXEgJycgKSB7CiAgICAgICAgJE1lc3NhZ2UgPSAnTm8gb3JwaGFuZWQgcmVjb3JkcyBmb3VuZC4nOwogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnVGlja2V0U3RhdGljREJPcnBoYW5lZFJlY29yZHMnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBvcnBoYW5lZCBTdGF0aWNEQiByZWNvcmRzLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UaWNrZXRGdWxsdGV4dEluZGV4TW9kdWxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgVGlja2V0OjpJbmRleE1vZHVsZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSAkTW9kdWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlYXJjaEluZGV4TW9kdWxlJyk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdTRUxFQ1QgY291bnQoKikgZnJvbSBhcnRpY2xlJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPiAxMDAwMDAgKSB7CiAgICAgICAgICAgIGlmICggJE1vZHVsZSA9fiAvUnVudGltZURCLyApIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICIkUm93WzBdIGFydGljbGVzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZCBmb3IgT1RSUyAyLjMgYW5kIGhpZ2hlci4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSb3dbMF0gPiA1MDAwMCApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlID1+IC9SdW50aW1lREIvICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiJFJvd1swXSBhcnRpY2xlcyBpbiB5b3VyIHN5c3RlbS4gWW91IHNob3VsZCB1c2UgdGhlIFN0YXRpY0RCIGJhY2tlbmQgZm9yIE9UUlMgMi4zIGFuZCBoaWdoZXIuIFNlZSBhZG1pbiBtYW51YWwgKFBlcmZvcm1hbmNlIFR1bmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICA9ICJZb3UgYXJlIHVzaW5nIFwiJE1vZHVsZVwiLCB0aGF0J3MgZmluZSBmb3IgJFJvd1swXSBhcnRpY2xlcyBpbiB5b3VyIHN5c3RlbS4iOwogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdUaWNrZXQ6OlNlYXJjaEluZGV4TW9kdWxlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgVGlja2V0OjpTZWFyY2hJbmRleE1vZHVsZSBzZXR0aW5nLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKIyBPcGVuVGlja2V0Q2hlY2sgY2hlY2sKc3ViIF9PcGVuVGlja2V0Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgIG15ICRDaGVjayAgICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlICAgPSAnJzsKICAgIG15IEBUaWNrZXRJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgU3RhdGVUeXBlICA9PiAnT3BlbicsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICAgICBMaW1pdCAgICAgID0+IDg5OTk5LAogICAgKTsKICAgIGlmICggJCNUaWNrZXRJRHMgPiA4OTk5MCApIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdZb3Ugc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhlbiA4MDAwIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IGN1cnJlbnRseSBoYXZlIG92ZXIgODk5OTkhIEluIGNhc2UgeW91IHdhbnQgdG8gaW1wcm92ZSB5b3VyIHBlcmZvcm1hbmNlLCBjbG9zZSBub3QgbmVlZGVkIG9wZW4gdGlja2V0cy4nOwoKICAgIH0KICAgIGVsc2lmICggJCNUaWNrZXRJRHMgPiAxMDAwMCApIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdZb3Ugc2hvdWxkIG5vdCBoYXZlIG92ZXIgODAwMCBvcGVuIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uIFlvdSBjdXJyZW50bHkgaGF2ZSAnCiAgICAgICAgICAgIC4gJCNUaWNrZXRJRHMKICAgICAgICAgICAgLiAnLiBJbiBjYXNlIHlvdSB3YW50IHRvIGltcHJvdmUgeW91ciBwZXJmb3JtYW5jZSwgY2xvc2Ugbm90IG5lZWRlZCBvcGVuIHRpY2tldHMuJzsKCiAgICB9CiAgICBlbHNpZiAoICQjVGlja2V0SURzID4gODAwMCApIHsKICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1lvdSBzaG91bGQgbm90IGhhdmUgbW9yZSB0aGVuIDgwMDAgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3UgY3VycmVudGx5IGhhdmUgJwogICAgICAgICAgICAuICQjVGlja2V0SURzCiAgICAgICAgICAgIC4gJy4gSW4gY2FzZSB5b3Ugd2FudCB0byBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UsIGNsb3NlIG5vdCBuZWVkZWQgb3BlbiB0aWNrZXRzLic7CgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICRNZXNzYWdlID0gJ1lvdSBoYXZlICcgLiAkI1RpY2tldElEcyAuICcgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLic7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnT3BlblRpY2tldENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKIyBDaGVjayBpZiB0aGUgY29uZmlndXJlZCBGUUROIGlzIHZhbGlkLgpzdWIgX0ZRRE5Db25maWdDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0ZRRE5Db25maWdDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIHRoZSBjb25maWd1cmVkIEZRRE4gaXMgdmFsaWQuJywKICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICBDb21tZW50ICAgICA9PiAnJywKICAgIH07CgogICAgIyBHZXQgdGhlIGNvbmZpZ3VyZWQgRlFETgogICAgbXkgJEZRRE4gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpOwoKICAgICMgRG8gd2UgaGF2ZSBzZXQgb3VyIEZRRE4/CiAgICBpZiAoICRGUUROIGVxICd5b3VyaG9zdC5leGFtcGxlLmNvbScgKSB7CiAgICAgICAgJERhdGEtPntDaGVja30gPSAnRmFpbGVkJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9CiAgICAgICAgICAgID0gIlBsZWFzZSBjb25maWd1cmUgeW91ciBGUUROIGluc2lkZSB0aGUgU3lzQ29uZmlnIG1vZHVsZS4gKGN1cnJlbnRseSB0aGUgZGVmYXVsdCBzZXR0aW5nICckRlFETicgaXMgZW5hYmxlZCkuIjsKICAgIH0KCiAgICAjIEZRRE4gc3ludGF4IGNoZWNrLgogICAgZWxzaWYgKCAkRlFETiA9fiAvXC5cLnxcc3xbXmEtekEtWjAtOS0uXS9nICkgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnRmFpbGVkJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIkludmFsaWQgRlFETiAnJEZRRE4nLiI7CiAgICB9CgogICAgIyBOb3RoaW5nIHRvIGNvbXBsYWluLiA6LSgKICAgIGVsc2UgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnT0snOwogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiRlFETiAnJEZRRE4nIGxvb2tzIGdvb2QuIjsKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKIyBDaGVjayBpZiB0aGUgU3lzdGVtSUQgY29udGFpbnMgb25seSBkaWdpdHMuCnN1YiBfU3lzdGVtSURDb25maWdDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdTeXN0ZW1JRENvbmZpZ0NoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgdGhlIGNvbmZpZ3VyZWQgU3lzdGVtSUQgY29udGFpbnMgb25seSBkaWdpdHMuJywKICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICBDb21tZW50ICAgICA9PiAnJywKICAgIH07CgogICAgIyBHZXQgdGhlIGNvbmZpZ3VyZWQgU3lzdGVtSUQKICAgIG15ICRTeXN0ZW1JRCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTeXN0ZW1JRCcpOwoKICAgICMgRG9lcyB0aGUgU3lzdGVtSUQgY29udGFpbiBub24tZGlnaXRzPwogICAgaWYgKCAkU3lzdGVtSUQgPX4gL15cZCskLyApIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ09LJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIiBZb3VyIFN5c3RlbUlEIHNldHRpbmcgaXMgJFN5c3RlbUlELiIKICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiVGhlIFN5c3RlbUlEICckU3lzdGVtSUQnIG11c3QgY29uc2lzdCBvZiBkaWdpdHMgZXhjbHVzaXZlbHkuIjsKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKIyBDaGVjayBpZiBUaWNrZXQ6OkZyb250ZW5kOjpSZXNwb25zZUZvcm1hdCBpcyB2YWxpZApzdWIgX0NvbmZpZ0NoZWNrVGlja2V0RnJvbnRlbmRSZXNwb25zZUZvcm1hdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdSZXNwb25zZUZvcm1hdENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQgY29udGFpbnMgbm8gJERhdGF7IiJ9LicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJycsCiAgICB9OwoKICAgICMgR2V0IHRoZSBjb25maWcKICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQnKTsKCiAgICAjIERvZXMgdGhlIFN5c3RlbUlEIGNvbnRhaW4gbm9uLWRpZ2l0cz8KICAgIGlmICggJENvbmZpZyAhfiAvXCREYXRheyIvICkgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnT0snOwogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiIE5vIFwkRGF0YXtcIlwifSBmb3VuZC4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9CiAgICAgICAgICAgID0gIkNvbmZpZyBvcHRpb24gVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQgY29pbnRhaW5zIFwkRGF0YXtcIlwifSwgdXNlIFwkUURhdGF7XCJcIn0gaW5zdGFuZCAoc2VlZCBkZWZhdWx0IHNldHRpbmcpLiI7CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfRmlsZVN5c3RlbUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIG15ICREYXRhICAgID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdGaWxlU3lzdGVtQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBpZiBmaWxlIHN5c3RlbSBpcyB3cml0YWJsZS4nLAogICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgIENvbW1lbnQgICAgID0+ICdUaGUgZmlsZSBzeXN0ZW0gaXMgd3JpdGFibGUuJywKICAgIH07CgogICAgbXkgJEhvbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwoKICAgICMgY2hlY2sgSG9tZQogICAgaWYgKCAhLWUgJEhvbWUgKSB7CiAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdGYWlsZWQnOwogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiTm8gc3VjaCBob21lIGRpcmVjdG9yeTogJEhvbWUhIiwKICAgICAgICAgICAgcmV0dXJuICREYXRhOwogICAgfQogICAgZm9yICgKICAgICAgICBxdygvYmluLyAvS2VybmVsLyAvS2VybmVsL1N5c3RlbS8gL0tlcm5lbC9PdXRwdXQvIC9LZXJuZWwvT3V0cHV0L0hUTUwvIC9LZXJuZWwvTW9kdWxlcy8pCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRGaWxlID0gIiRIb21lLyRfL2NoZWNrX3Blcm1pc3NvbnMuJCQiOwogICAgICAgIGlmICggb3BlbiggbXkgJEZJTEUsICc+JywgIiRGaWxlIiApICkgewogICAgICAgICAgICBwcmludCAkRklMRSAidGVzdCI7CiAgICAgICAgICAgIGNsb3NlKCRGSUxFKTsKICAgICAgICAgICAgdW5saW5rICRGaWxlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRGaWxlKCQhKTsiOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIkNhbid0IHdyaXRlIGZpbGU6ICRNZXNzYWdlIiwKICAgICAgICAgICAgcmV0dXJuICREYXRhOwogICAgfQoKICAgICREYXRhLT57Q2hlY2t9ID0gJ09LJzsKCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfUGFja2FnZURlcGxveUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BhY2thZ2VEZXBsb3lDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRlcGxveW1lbnQgb2YgYWxsIHBhY2thZ2VzLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICBDb21tZW50ICAgICA9PiAnQWxsIHBhY2thZ2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkLicsCiAgICB9OwoKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBmb3IgbXkgJFBhY2thZ2UgKCAkU2VsZi0+e1BhY2thZ2VPYmplY3R9LT5SZXBvc2l0b3J5TGlzdCgpICkgewogICAgICAgIG15ICREZXBsb3lDaGVjayA9ICRTZWxmLT57UGFja2FnZU9iamVjdH0tPkRlcGxveUNoZWNrKAogICAgICAgICAgICBOYW1lICAgID0+ICRQYWNrYWdlLT57TmFtZX0tPntDb250ZW50fSwKICAgICAgICAgICAgVmVyc2lvbiA9PiAkUGFja2FnZS0+e1ZlcnNpb259LT57Q29udGVudH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkRGVwbG95Q2hlY2sgKSB7CiAgICAgICAgICAgICRNZXNzYWdlIC49ICRQYWNrYWdlLT57TmFtZX0tPntDb250ZW50fSAuICcgJyAuICRQYWNrYWdlLT57VmVyc2lvbn0tPntDb250ZW50fSAuICc7ICc7CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnQ3JpdGljYWwnOwogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiUGFja2FnZXMgbm90IGNvcnJlY3RseSBpbnN0YWxsZWQ6ICRNZXNzYWdlLiIsCiAgICB9CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0ludmFsaWRVc2VyTG9ja2VkVGlja2V0U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgdGhlIGRlZmF1bHQgbWVzc2FnZQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0ludmFsaWRVc2VyTG9ja2VkVGlja2V0U2VhcmNoJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBpbnZhbGlkIHVzZXIgd2l0aCBsb2NrZWQgdGlja2V0cy4nLAogICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJ1RoZXJlIGFyZSBubyBpbnZhbGlkIHVzZXJzIHdpdGggbG9ja2VkIHRpY2tldHMuJywKICAgIH07CgogICAgIyBnZXQgYWxsIHVzZXJzIChiZWNhdXNlIHRoZXJlIGlzIG5vIGZ1bmN0aW9uIHRvIGdldCBhbGwgaW52YWxpZCB1c2VycykKICAgIG15ICVVc2VyTGlzdCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAwCiAgICApOwoKICAgICMgY3JlYXRlIHRoZSBsaXN0IG9mIGludmFsaWQgdXNlcnMKICAgIG15IEBJbnZhbGlkVXNlciA9ICgpOwogICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVVzZXJMaXN0ICkgewogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFVzZXJ7VmFsaWRJRH0gPT0gMiApIHsKICAgICAgICAgICAgcHVzaCBASW52YWxpZFVzZXIsICRVc2VySUQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRGF0YSBpZiAhQEludmFsaWRVc2VyOwoKICAgIG15IEBUaWNrZXRJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICBSZXN1bHQgICA9PiAnQVJSQVknLAogICAgICAgIExvY2tJRHMgID0+IFsyXSwKICAgICAgICBPd25lcklEcyA9PiBcQEludmFsaWRVc2VyLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkRGF0YSBpZiAhQFRpY2tldElEczsKCiAgICBteSAlTG9ja2VkVGlja2V0VXNlciA9ICgpOwogICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJExvY2tlZFRpY2tldFVzZXJ7ICRUaWNrZXR7T3duZXJJRH0gfSA9ICRVc2VyTGlzdHsgJFRpY2tldHtPd25lcklEfSB9OwogICAgfQoKICAgIG15ICRVc2VyU3RyaW5nID0gam9pbiAnLCAnLCB2YWx1ZXMgJUxvY2tlZFRpY2tldFVzZXI7CiAgICAkRGF0YS0+e0NvbW1lbnR9ICAgPSAiVGhlc2UgaW52YWxpZCB1c2VycyBoYXZlIGxvY2tlZCB0aWNrZXRzOiAkVXNlclN0cmluZyIsCiAgICAgICAgJERhdGEtPntDaGVja30gPSAnQ3JpdGljYWwnOwoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9EZWZhdWx0VXNlckNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgdGhlIGRlZmF1bHQgbWVzc2FnZQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RlZmF1bHRVc2VyQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBpZiByb290QGxvY2FsaG9zdCBhY2NvdW50IGhhcyB0aGUgZGVmYXVsdCBwYXNzd29yZC4nLAogICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJ1RoZXJlIGlzIG5vIGFjdGl2ZSByb290QGxvY2FsaG9zdCB3aXRoIGRlZmF1bHQgcGFzc3dvcmQuJywKICAgIH07CgogICAgIyBnZXQgdXNlcklEIGZvciByb290QGxvY2FsaG9zdCAod2lsbCBwcm9iYWJseSBiZSAxKQogICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMb29rdXAoCiAgICAgICAgVXNlckxvZ2luID0+ICdyb290QGxvY2FsaG9zdCcsCiAgICApOwogICAgcmV0dXJuICREYXRhIGlmICEkVXNlcklEOwoKICAgICMgc2VlIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCBwYXNzd29yZCBhdHRhY2hlZAogICAgbXkgJERlZmF1bHRQYXNzID0gJFNlbGYtPntBdXRoT2JqZWN0fS0+QXV0aCgKICAgICAgICBVc2VyID0+ICdyb290QGxvY2FsaG9zdCcsCiAgICAgICAgUHcgICA9PiAncm9vdCcsCiAgICApOwogICAgcmV0dXJuICREYXRhIGlmICEkRGVmYXVsdFBhc3M7CgogICAgIyBzZWUgaWYgdGhlIGFjY291bnQgaXMgdmFsaWQKICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEICA9PiAkVXNlcklELAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICREYXRhIGlmICElVXNlcjsKCiAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIkNoYW5nZSB0aGUgcGFzc3dvcmQgb3IgaW52YWxpZGF0ZSB0aGUgYWNjb3VudCAncm9vdFxAbG9jYWxob3N0Jy4iOwogICAgJERhdGEtPntDaGVja30gICA9ICdDcml0aWNhbCc7CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RlZmF1bHRTT0FQVXNlckNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1NPQVBDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRlZmF1bHQgU09BUCBjcmVkZW50aWFscy4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICdZb3UgaGF2ZSBub3QgZW5hYmxlZCBTT0FQIG9yIGhhdmUgc2V0IHlvdXIgb3duIHBhc3N3b3JkLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgIH07CgogICAgbXkgJFNPQVBVc2VyICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTT0FQOjpVc2VyJykgICAgIHx8ICcnOwogICAgbXkgJFNPQVBQYXNzd29yZCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTT0FQOjpQYXNzd29yZCcpIHx8ICcnOwoKICAgIGlmICggJFNPQVBVc2VyIGVxICdzb21lX3VzZXInICkgewogICAgICAgIGlmICggJFNPQVBQYXNzd29yZCBlcSAnc29tZV9wYXNzJyB8fCAkU09BUFBhc3N3b3JkIGVxICcnICkgewogICAgICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICdQbGVhc2Ugc2V0IGEgc3Ryb25nIHBhc3N3b3JkIGZvciBTT0FQOjpQYXNzd29yZCBpbiBTeXNDb25maWcuJzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cg==</File>
- <File Location="Kernel/System/Support/Webserver/IIS.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvSUlTLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSUlTLnBtLHYgMS45IDIwMTAvMDIvMDkgMjE6Mjk6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6SUlTOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OldlYnNlcnZlcjo6SUlTJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjaGVja3Mgc2hvdWxkIGFyZSBlbmFibGVkIGluIHN5c2NvbmZpZwogICAgbXkgQEVuYWJsZWRDaGVja0Z1bmN0aW9uczsKICAgIGlmICggJENoZWNrcyAmJiByZWYgJENoZWNrcyBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGFsbCBlbmFibGVkIGNoZWNrIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgQEVuYWJsZWRDaGVja0Z1bmN0aW9ucyA9IHNvcnQgZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfUGVybEV4Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgY2hlY2sgaWYgQXBhY2hlOjpEQkkgaXMgbG9hZGVkCiAgICBteSAkQ2hlY2sgICA9ICcnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIGlmICggJEVOVnsnR0FURVdBWV9JTlRFUkZBQ0UnfSAmJiAkRU5WeydHQVRFV0FZX0lOVEVSRkFDRSd9ID1+IC9eQ0dJLVBlcmxFeC9pICkgewogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAkTWVzc2FnZSA9ICJQZXJsRXggaXMgaW4gdXNlICgkRU5WeydHQVRFV0FZX0lOVEVSRkFDRSd9KS4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZSA9ICdZb3Ugc2hvdWxkIHVzZSBQZXJsRXggdG8gaW5jcmVhc2UgeW91ciBwZXJmb3JtYW5jZS4nOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BlcmxFeCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIFBlcmxFeCBpcyB1c2VkLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK</File>
- <File Location="Kernel/System/Support/Webserver/Apache.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvQXBhY2hlLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQXBhY2hlLnBtLHYgMS4xNCAyMDEwLzAyLzA5IDIxOjI5OjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXI6OkFwYWNoZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5hbWVzIG9mIGF2YWlsYWJsZSBjaGVja3MgZnJvbSBzeXNjb25maWcKICAgIG15ICRDaGVja3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6V2Vic2VydmVyOjpBcGFjaGUnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gc29ydCBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9BcGFjaGVWZXJzaW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSAgICA9IHt9OwogICAgbXkgJENoZWNrICAgPSAnJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBpZiAoICRFTlZ7U0VSVkVSX1NPRlRXQVJFfSApIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAiWW91IGFyZSBydW5uaW5nICRFTlZ7U0VSVkVSX1NPRlRXQVJFfS4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZSA9ICdDb3VsZCBub3QgZGV0ZXJtaW5lIEFwYWNoZSB2ZXJzaW9uLic7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQXBhY2hlIFZlcnNpb24nLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdEaXNwbGF5IHdlYiBzZXJ2ZXIgdmVyc2lvbi4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQXBhY2hlREJJQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgY2hlY2sgaWYgQXBhY2hlOjpEQkkgaXMgbG9hZGVkCiAgICBteSAkQXBhY2hlREJJID0gMDsKICAgIG15ICRDaGVjayAgICAgPSAnJzsKICAgIG15ICRNZXNzYWdlICAgPSAnJzsKICAgIGlmICggJEVOVntNT0RfUEVSTH0gKSB7CiAgICAgICAgZm9yIG15ICRNb2R1bGUgKCBrZXlzICVJTkMgKSB7CiAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLy86Oi9nOwogICAgICAgICAgICAkTW9kdWxlID1+IHMvXC5wbSQvL2c7CiAgICAgICAgICAgIGlmICggJE1vZHVsZSBlcSAnQXBhY2hlOjpEQkknIHx8ICRNb2R1bGUgZXEgJ0FwYWNoZTI6OkRCSScgKSB7CiAgICAgICAgICAgICAgICAkQXBhY2hlREJJID0gJE1vZHVsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICEkQXBhY2hlREJJICkgewogICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAnQXBhY2hlOjpEQkkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGEgYmV0dGVyIHBlcmZvcm1hbmNlIChwcmUtZXN0YWJsaXNoIGRhdGFiYXNlIGNvbm5lY3Rpb25zKS4nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAkTWVzc2FnZSA9ICRBcGFjaGVEQkk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgSnVzdCBza2lwIHRoaXMgdGVzdCBpZiB3ZScgcmUgbm90IHJ1bm5pbmcgbW9kX3BlcmwuCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FwYWNoZTo6REJJJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgdGhlIHN5c3RlbSB1c2VzIEFwYWNoZTo6REJJLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9BcGFjaGVSZWxvYWRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyByZWxvYWQgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgaWYgKCAkRU5We01PRF9QRVJMfSApIHsKICAgICAgICBldmFsICJyZXF1aXJlIG1vZF9wZXJsIjsKICAgICAgICBpZiAoIGRlZmluZWQgJG1vZF9wZXJsOjpWRVJTSU9OICkgewogICAgICAgICAgICBpZiAoICRtb2RfcGVybDo6VkVSU0lPTiA+PSAxLjk5ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgQXBhY2hlOjpSZWxvYWQgaXMgbG9hZGVkCiAgICAgICAgICAgICAgICBteSAkQXBhY2hlUmVsb2FkID0gMDsKICAgICAgICAgICAgICAgIGZvciBteSAkTW9kdWxlICgga2V5cyAlSU5DICkgewogICAgICAgICAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLy86Oi9nOwogICAgICAgICAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLnBtJC8vZzsKICAgICAgICAgICAgICAgICAgICBpZiAoICRNb2R1bGUgZXEgJ0FwYWNoZTo6UmVsb2FkJyB8fCAkTW9kdWxlIGVxICdBcGFjaGUyOjpSZWxvYWQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQXBhY2hlUmVsb2FkID0gJE1vZHVsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkQXBhY2hlUmVsb2FkICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayA9ICdJbmZvJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICA9ICdBcGFjaGU6OlJlbG9hZCBvciBBcGFjaGUyOjpSZWxvYWQgc2hvdWxkIGJlIHVzZWQgYXMgUGVybE1vZHVsZSBhbmQgUGVybEluaXRIYW5kbGVyIHRvIHByZXZlbnQgd2ViIHNlcnZlciByZXN0YXJ0cyB3aGVuIGluc3RhbGxpbmcgYW5kIHVwZ3JhZGluZyBtb2R1bGVzLic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkQXBhY2hlUmVsb2FkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgSnVzdCBza2lwIHRoaXMgdGVzdCBpZiB3ZScgcmUgbm90IHJ1bm5pbmcgbW9kX3BlcmwuCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FwYWNoZTo6UmVsb2FkJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgdGhlIHN5c3RlbSB1c2VzIEFwYWNoZTo6UmVsb2FkL0FwYWNoZTI6OlJlbG9hZC4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQ0dJQWNjZWxlcmF0b3JDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBpZiAoICRFTlZ7TU9EX1BFUkx9ICkgewoKICAgICAgICAjIGNoZWNrIG1vZF9wZXJsIHZlcnNpb24KICAgICAgICBpZiAoICRFTlZ7TU9EX1BFUkx9ID1+IC9cLzEuOTkvICkgewogICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiWW91IHVzZSBhIGJldGEgdmVyc2lvbiBvZiBtb2RfcGVybCAoJEVOVntNT0RfUEVSTH0pLCB5b3Ugc2hvdWxkIHVwZ3JhZGUgdG8gYSBzdGFibGUgdmVyc2lvbi4iOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRFTlZ7TU9EX1BFUkx9ID1+IC9cLzEvICkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIllvdSBzaG91bGQgdXBkYXRlIG1vZF9wZXJsIHRvIDIueCAoJEVOVntNT0RfUEVSTH0pLiI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJEVOVntNT0RfUEVSTH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkRU5We1NFUlZFUl9TT0ZUV0FSRX0gPX4gL2Zhc3RjZ2kvaSApIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAnWW91IGFyZSB1c2luZyBGYXN0Q0dJLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgJE1lc3NhZ2UgPSAnWW91IHNob3VsZCB1c2UgRmFzdENHSSBvciBtb2RfcGVybCB0byBpbmNyZWFzZSB5b3VyIHBlcmZvcm1hbmNlLic7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQ0dJIEFjY2VsZXJhdG9yJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZm9yIENHSSBBY2NlbGVyYXRvci4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cg==</File>
- <File Location="Kernel/System/Support/Database/oracle.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9vcmFjbGUucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBvcmFjbGUucG0sdiAxLjIyIDIwMTAvMDUvMjggMDc6MjM6MjggbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjpvcmFjbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIyICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6T3JhY2xlJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjaGVja3Mgc2hvdWxkIGFyZSBlbmFibGVkIGluIHN5c2NvbmZpZwogICAgbXkgQEVuYWJsZWRDaGVja0Z1bmN0aW9uczsKICAgIGlmICggJENoZWNrcyAmJiByZWYgJENoZWNrcyBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGFsbCBlbmFibGVkIGNoZWNrIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgQEVuYWJsZWRDaGVja0Z1bmN0aW9ucyA9IHNvcnQgZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfT3JhY2xlSG9tZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIGNoZWNrIE9SQUNMRV9IT01FCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gT1JBQ0xFX0hPTUUgc2V0dGluZyBmb3VuZC4nOwogICAgaWYgKCAkRU5We09SQUNMRV9IT01FfSApIHsKICAgICAgICBpZiAoICEtZSAkRU5We09SQUNMRV9IT01FfSApIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiT1JBQ0xFX0hPTUUgZG9uJ3QgZXhpc3RzICgkRU5We09SQUNMRV9IT01FfSkuIjsKICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gIllvdXIgT1JBQ0xFX0hvbWUgY29uZmlndXJhdGlvbiBpcyAkRU5We09SQUNMRV9IT01FfS4iOwogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ09SQUNMRV9IT01FJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgT1JBQ0xFX0hPTUUgY29uZmlndXJhdGlvbi4iLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfTkxTTGFuZ0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBOTFNfTEFORwogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIE5MU19MQU5HIGNvbmZpZ3VyYXRpb24gZm91bmQuJzsKICAgIGlmICggJEVOVntOTFNfTEFOR30gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgICAgICBpZiAoICRFTlZ7TkxTX0xBTkd9ICF+IC91dGYoXC04fDgpLyApIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TkxTX0xBTkd9LCBuZWVkIC51dGY4IGluIE5MU19MQU5HIChlLiBnLiBnZXJtYW5fZ2VybWFueS51dGY4KS4iOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIllvdXIgTkxTX0xBTkcgY29uZmlndXJhdGlvbiBpcyAkRU5We05MU19MQU5HfS4iOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3VyIE5MU19MQU5HIGNvbmZpZ3VyYXRpb24gaXMgJEVOVntOTFNfTEFOR30iOwogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05MU19MQU5HJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgTkxTX0xBTkcuIiwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX05MU0RhdGVGb3JtYXRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgTkxTX0RBVEVfRk9STUFUCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gTkxTX0RBVEVfRk9STUFUIHNldHRpbmcgZm91bmQuJzsKICAgIGlmICggJEVOVntOTFNfREFURV9GT1JNQVR9ICkgewogICAgICAgIGlmICggJEVOVntOTFNfREFURV9GT1JNQVR9IG5lICJZWVlZLU1NLUREIEhIMjQ6TUk6U1MiICkgewogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiTmVlZCBmb3JtYXQgJ1lZWVktTU0tREQgSEgyNDpNSTpTUycgZm9yIE5MU19EQVRFX0ZPUk1BVCAobm90ICRFTlZ7TkxTX0RBVEVfRk9STUFUfSkuIjsKICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3VyIE5MU19EQVRFX0ZPUk1BVCBzZXR0aW5nIGlzICRFTlZ7TkxTX0RBVEVfRk9STUFUfS4iOwogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05MU19EQVRFX0ZPUk1BVCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIE5MU19EQVRFX0ZPUk1BVC4iLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfTkxTRGF0ZUZvcm1hdFNlbGVjdENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBOTFNfREFURV9GT1JNQVQKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdOTFNfREFURV9GT1JNQVQgc2VlbXMgdG8gYmUgd3JvbmcnOwogICAgbXkgJENyZWF0ZVRpbWU7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGNyZWF0ZV90aW1lIEZST00gdmFsaWQiLCBMaW1pdCA9PiAxICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDcmVhdGVUaW1lID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoJENyZWF0ZVRpbWUpIHsKICAgICAgICBpZiAoICRDcmVhdGVUaW1lICF+IC9eXGRcZFxkXGQtKFxkfFxkXGQpLShcZHxcZFxkKVxzKFxkfFxkXGQpOihcZHxcZFxkKTooXGR8XGRcZCkvICkgewogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiJENyZWF0ZVRpbWUgaXMgbm90IHRoZSByaWdodCBmb3JtYXQgJ3l5eXktbW0tZGQgaGg6bW06OnNzJyAocGxlYXNlIGNoZWNrIFwkRU5We05MU19EQVRFX0ZPUk1BVH0pLiI7CiAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiTkxTX0RBVEVfRm9ybWF0IGhhcyB0aGUgcmlnaHQgZm9ybWF0ICgkQ3JlYXRlVGltZSkuIjsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgIH0KICAgIH0KICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdOTFNfREFURV9TRUxFQ1RfRk9STUFUJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgTkxTX0RBVEVfRk9STUFUIGJ5IHVzaW5nIFNFTEVDVCBzdGF0ZW1lbnQuIiwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwiOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICIkRmlsZSIgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkSW4+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkSW4pOwogICAgICAgICAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MUGFyc2UyWE1MSGFzaCggU3RyaW5nID0+ICRDb250ZW50ICk7CiAgICAgICAgICAgIGZvciBteSAkVGFibGUgKCBAeyAkWE1MSGFzaFsxXS0+e2RhdGFiYXNlfS0+WzFdLT57VGFibGV9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoJFRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCAgID0+ICJzZWxlY3QgKiBmcm9tICRUYWJsZS0+e05hbWV9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbWl0ID0+IDEKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiJFRhYmxlLT57TmFtZX0sICI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiVGFibGUgZG9uJ3QgZXhpc3RzOiAkTWVzc2FnZS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENvdW50IHRhYmxlcyBjaGVja2VkLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBvcGVuIGZpbGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLiIsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBmaW5kIGZpbGUgJEZpbGUhIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0N1cnJlbnRUaW1lc3RhbXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgICA9IHt9OwogICAgbXkgJERiVGltZSA9ICcnOwoKICAgICMgQ3VycmVudCBUaW1lc3RhbXAgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgJFNlbGYtPntEQk9iamVjdH0KICAgICAgICAtPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIHRvX2NoYXIoY3VycmVudF90aW1lc3RhbXAsJ1lZWVktTU0tREQgSEgyNDpNSTpTUycpIEZST00gRFVBTCIgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERiVGltZSA9ICRSb3dbMF07CiAgICB9CiAgICBteSAkVGltZUFwcGxpY2F0aW9uU2VydmVyID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgbXkgJFRpbWVEYXRhYmFzZVNlcnZlciAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkRGJUaW1lLAogICAgKTsKCiAgICBteSAkVGltZURpZmZlcmVuY2UgPSAwOwogICAgbXkgJFJhbmdlICAgICAgICAgID0gMTA7CiAgICAkVGltZURpZmZlcmVuY2UgPSAkVGltZUFwcGxpY2F0aW9uU2VydmVyIC0gJFRpbWVEYXRhYmFzZVNlcnZlcjsKICAgIGlmICggKCAkVGltZURpZmZlcmVuY2UgPj0gKCAkUmFuZ2UgKiAtMSApICkgJiYgKCAkVGltZURpZmZlcmVuY2UgPD0gJFJhbmdlICkgKSB7CiAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyIHRpbWUgYW5kIGRhdGFiYXNlIHNlcnZlciB0aW1lLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBhIG1hdGVyaWFsIGRpZmZlcmVuY2UgKCcKICAgICAgICAgICAgLiAkVGltZURpZmZlcmVuY2UKICAgICAgICAgICAgLiAiIHNlY29uZHMpIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyICgkVGltZUFwcGxpY2F0aW9uU2VydmVyKSBhbmQgZGF0YWJhc2Ugc2VydmVyICgkVGltZURhdGFiYXNlU2VydmVyKSB0aW1lLiI7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0N1cnJlbnQgVGltZXN0YW1wIENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgIlN5c3RlbSBUaW1lIiB2cyAiQ3VycmVudCBUaW1lc3RhbXAiLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK</File>
- <File Location="Kernel/System/Support/Database/mssql.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9tc3NxbC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG1zc3FsLnBtLHYgMS4xOCAyMDEwLzA1LzI4IDA3OjI3OjU1IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6bXNzcWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE4ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6TVNTUUwnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfVmVyc2lvbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHZlcnNpb24gY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdDb3VsZCBub3QgZGV0ZXJtaW5lIE1pY3Jvc29mdCBTUUwgU2VydmVyIHZlcnNpb24uJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgQEB2ZXJzaW9uJywKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRNZXNzYWdlID0gJFJvd1swXTsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ZlcnNpb24nLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBkYXRhYmFzZSB2ZXJzaW9uLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHRhYmxlIGNoZWNrCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3NjcmlwdHMvZGF0YWJhc2Uvb3Rycy1zY2hlbWEueG1sJzsKICAgIGlmICggLWYgJEZpbGUgKSB7CiAgICAgICAgbXkgJENvdW50ICAgPSAwOwogICAgICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICAgICBteSAkQ29udGVudCA9ICcnOwogICAgICAgIG15ICRJbjsKICAgICAgICBpZiAoIG9wZW4oICRJbiwgJzwnLCAkRmlsZSApICkgewogICAgICAgICAgICB3aGlsZSAoPCRJbj4pIHsKICAgICAgICAgICAgICAgICRDb250ZW50IC49ICRfOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRJbik7CiAgICAgICAgICAgIG15IEBYTUxIYXNoID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxQYXJzZTJYTUxIYXNoKCBTdHJpbmcgPT4gJENvbnRlbnQgKTsKICAgICAgICAgICAgZm9yIG15ICRUYWJsZSAoIEB7ICRYTUxIYXNoWzFdLT57ZGF0YWJhc2V9LT5bMV0tPntUYWJsZX0gfSApIHsKICAgICAgICAgICAgICAgIGlmICgkVGFibGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRUYWJsZS0+e05hbWV9IGVxICdzeXN0ZW1fdXNlcicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYWJsZS0+e05hbWV9ID0gJ3N5c3RlbV91c2VyMic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgICA9PiAic2VsZWN0ICogZnJvbSAkVGFibGUtPntOYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW1pdCA9PiAxCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRUYWJsZS0+e05hbWV9LCAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlRhYmxlIGRvZXNuJ3QgZXhpc3Q6ICRNZXNzYWdlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRDb3VudCB0YWJsZXMuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IG9wZW4gZmlsZSAkRmlsZTogJCEiLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RhYmxlIENoZWNrJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IGZpbmQgZmlsZSAkRmlsZSEiLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0N1cnJlbnRUaW1lc3RhbXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgICA9IHt9OwogICAgbXkgJERiVGltZSA9ICcnOwoKICAgICMgQ3VycmVudCBUaW1lc3RhbXAgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGN1cnJlbnRfdGltZXN0YW1wIiApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGJUaW1lID0gJFJvd1swXTsKICAgIH0KICAgIG15ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICBteSAkVGltZURhdGFiYXNlU2VydmVyICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICREYlRpbWUsCiAgICApOwoKICAgIG15ICRUaW1lRGlmZmVyZW5jZSA9IDA7CiAgICBteSAkUmFuZ2UgICAgICAgICAgPSAxMDsKICAgICRUaW1lRGlmZmVyZW5jZSA9ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgLSAkVGltZURhdGFiYXNlU2VydmVyOwogICAgaWYgKCAoICRUaW1lRGlmZmVyZW5jZSA+PSAoICRSYW5nZSAqIC0xICkgKSAmJiAoICRUaW1lRGlmZmVyZW5jZSA8PSAkUmFuZ2UgKSApIHsKICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1RoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGltZSBhbmQgZGF0YWJhc2Ugc2VydmVyIHRpbWUuJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1RoZXJlIGlzIGEgbWF0ZXJpYWwgZGlmZmVyZW5jZSAoJwogICAgICAgICAgICAuICRUaW1lRGlmZmVyZW5jZQogICAgICAgICAgICAuICIgc2Vjb25kcykgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgKCRUaW1lQXBwbGljYXRpb25TZXJ2ZXIpIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgKCRUaW1lRGF0YWJhc2VTZXJ2ZXIpIHRpbWUuIjsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQ3VycmVudCBUaW1lc3RhbXAgQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayAiU3lzdGVtIFRpbWUiIHZzICJDdXJyZW50IFRpbWVzdGFtcCIuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CjE7Cg==</File>
- <File Location="Kernel/System/Support/Database/postgresql.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9wb3N0Z3Jlc3FsLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogcG9zdGdyZXNxbC5wbSx2IDEuMTkgMjAxMC8wNS8yOCAwNzoyNzo1NSBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U6OnBvc3RncmVzcWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE5ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6UG9zdGdyZVNRTCcpOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY2hlY2tzIHNob3VsZCBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBzb3J0IGdyZXAgeyAkQ2hlY2tzLT57JF99IH0ga2V5cyAleyRDaGVja3N9OwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIHJlc3VsdAogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQEVuYWJsZWRDaGVja0Z1bmN0aW9ucykgewoKICAgICAgICAjIHByZXBlbmQgYW4gdW5kZXJzY29yZQogICAgICAgICRGdW5jdGlvbk5hbWUgPSAnXycgLiAkRnVuY3Rpb25OYW1lOwoKICAgICAgICAjIHJ1biBmdW5jdGlvbiBhbmQgZ2V0IGNoZWNrIGRhdGEKICAgICAgICBteSAkQ2hlY2sgPSAkU2VsZi0+JEZ1bmN0aW9uTmFtZSgpOwoKICAgICAgICBuZXh0IEZVTkNUSU9OTkFNRSBpZiAhJENoZWNrOwoKICAgICAgICAjIGF0dGFjaCBjaGVjayBkYXRhIGlmIHZhbGlkCiAgICAgICAgcHVzaCBARGF0YUFycmF5LCAkQ2hlY2s7CiAgICB9CgogICAgcmV0dXJuIFxARGF0YUFycmF5Owp9CgpzdWIgX1RhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwnOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICRGaWxlICkgKSB7CiAgICAgICAgICAgIHdoaWxlICg8JEluPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goIFN0cmluZyA9PiAkQ29udGVudCApOwogICAgICAgICAgICBmb3IgbXkgJFRhYmxlICggQHsgJFhNTEhhc2hbMV0tPntkYXRhYmFzZX0tPlsxXS0+e1RhYmxlfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkgewogICAgICAgICAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgICA9PiAic2VsZWN0ICogZnJvbSAkVGFibGUtPntOYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW1pdCA9PiAxCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRUYWJsZS0+e05hbWV9LCAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIm5vbmV4aXN0aW5nIHRhYmxlKHMpOiAkTWVzc2FnZS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENvdW50IHRhYmxlcyBjaGVja2VkLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBvcGVuIGZpbGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLicsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBmaW5kIGZpbGUgJEZpbGUhIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RhdGVTdHlsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIERhdGVzdHlsZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIERhdGVTdHlsZSBmb3VuZC4nOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyBhbGwnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXkRhdGVTdHlsZS9pICkgewogICAgICAgICAgICBpZiAoICRSb3dbMV0gPX4gL15JU08vaSApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRSb3dbMV0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlVua25vd24gRGF0ZVN0eWxlICgkUm93WzFdKSBuZWVkIElTTy4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RhdGVTdHlsZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIERhdGVTdHlsZS4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICB9LAogICAgICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9VVEY4U2VydmVyQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdXRmLTggc2VydmVyIGNoZWNrCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Q2hhcnNldCcpID1+IC91dGYoXC04fDgpL2kgKSB7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICdObyBzZXJ2ZXJfZW5jb2RpbmcgZm91bmQuJzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IGFsbCcgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15zZXJ2ZXJfZW5jb2RpbmcvaSApIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiU2V0dGluZyBzZXJ2ZXJfZW5jb2RpbmcgZm91bmQsIGJ1dCBpdCdzIHNldCB0byAnJFJvd1sxXScgKG5lZWQgdG8gYmUgVU5JQ09ERSBvciBVVEY4KS4iOwogICAgICAgICAgICAgICAgaWYgKCAkUm93WzFdID1+IC8oVU5JQ09ERXx1dGYoOHxcLTgpKS9pICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1NlcnZlciBDb25uZWN0aW9uICh1dGY4KScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayB0aGUgdXRmOCBzZXJ2ZXIgY29ubmVjdGlvbi4nLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVVRGOENsaWVudENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHV0Zi04IGNsaWVudCBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnTm8gY2xpZW50X2VuY29kaW5nIGZvdW5kLic7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyBhbGwnICk7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdID1+IC9eY2xpZW50X2VuY29kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gIlNldHRpbmcgY2xpZW50X2VuY29kaW5nIGZvdW5kLCBidXQgaXQncyBzZXQgdG8gJyRSb3dbMV0nIChuZWVkIHRvIGJlIFVOSUNPREUgb3IgVVRGOCkiOwogICAgICAgICAgICAgICAgaWYgKCAkUm93WzFdID1+IC8oVU5JQ09ERXx1dGYoOHxcLTgpKS9pICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0NsaWVudCBDb25uZWN0aW9uICh1dGY4KScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayB0aGUgdXRmOCBjbGllbnQgY29ubmVjdGlvbi4nLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVmVyc2lvbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHZlcnNpb24gY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyBkYXRhYmFzZSB2ZXJzaW9uIGZvdW5kLic7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHNlcnZlcl92ZXJzaW9uJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL14oXGR7MSwzfSkuKiQvICkgewogICAgICAgICAgICBpZiAoICQxID4gNyApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRSb3dbMF0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIllvdSB1c2UgZGF0YWJhc2UgdmVyc2lvbiAkUm93WzBdLCB5b3Ugc2hvdWxkIHVzZSA4Lnggb3IgaGlnbmVyLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIlVua25vd24gdmVyc2lvbiAkUm93WzBdLiI7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ZlcnNpb24nLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBkYXRhYmFzZSB2ZXJzaW9uLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9DdXJyZW50VGltZXN0YW1wQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhICAgPSB7fTsKICAgIG15ICREYlRpbWUgPSAnJzsKCiAgICAjIEN1cnJlbnQgVGltZXN0YW1wIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICcnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gIlNFTEVDVCBjdXJyZW50X3RpbWVzdGFtcCIgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERiVGltZSA9ICRSb3dbMF07CiAgICB9CiAgICBteSAkVGltZUFwcGxpY2F0aW9uU2VydmVyID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgbXkgJFRpbWVEYXRhYmFzZVNlcnZlciAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkRGJUaW1lLAogICAgKTsKCiAgICBteSAkVGltZURpZmZlcmVuY2UgPSAwOwogICAgbXkgJFJhbmdlICAgICAgICAgID0gMTA7CiAgICAkVGltZURpZmZlcmVuY2UgPSAkVGltZUFwcGxpY2F0aW9uU2VydmVyIC0gJFRpbWVEYXRhYmFzZVNlcnZlcjsKICAgIGlmICggKCAkVGltZURpZmZlcmVuY2UgPj0gKCAkUmFuZ2UgKiAtMSApICkgJiYgKCAkVGltZURpZmZlcmVuY2UgPD0gJFJhbmdlICkgKSB7CiAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyIHRpbWUgYW5kIGRhdGFiYXNlIHNlcnZlciB0aW1lLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBhIG1hdGVyaWFsIGRpZmZlcmVuY2UgKCcKICAgICAgICAgICAgLiAkVGltZURpZmZlcmVuY2UKICAgICAgICAgICAgLiAiIHNlY29uZHMpIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyICgkVGltZUFwcGxpY2F0aW9uU2VydmVyKSBhbmQgZGF0YWJhc2Ugc2VydmVyICgkVGltZURhdGFiYXNlU2VydmVyKSB0aW1lLiI7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0N1cnJlbnQgVGltZXN0YW1wIENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgIlN5c3RlbSBUaW1lIiB2cyAiQ3VycmVudCBUaW1lc3RhbXAiLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoxOwo=</File>
- <File Location="Kernel/System/Support/Database/mysql.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9teXNxbC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG15c3FsLnBtLHYgMS4yNyAyMDEwLzA1LzI4IDA3OjI3OjU1IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6bXlzcWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI3ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OkRhdGFiYXNlOjpNeVNRTCcpOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY2hlY2tzIHNob3VsZCBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBzb3J0IGdyZXAgeyAkQ2hlY2tzLT57JF99IH0ga2V5cyAleyRDaGVja3N9OwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIHJlc3VsdAogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQEVuYWJsZWRDaGVja0Z1bmN0aW9ucykgewoKICAgICAgICAjIHByZXBlbmQgYW4gdW5kZXJzY29yZQogICAgICAgICRGdW5jdGlvbk5hbWUgPSAnXycgLiAkRnVuY3Rpb25OYW1lOwoKICAgICAgICAjIHJ1biBmdW5jdGlvbiBhbmQgZ2V0IGNoZWNrIGRhdGEKICAgICAgICBteSAkQ2hlY2sgPSAkU2VsZi0+JEZ1bmN0aW9uTmFtZSgpOwoKICAgICAgICBuZXh0IEZVTkNUSU9OTkFNRSBpZiAhJENoZWNrOwoKICAgICAgICAjIGF0dGFjaCBjaGVjayBkYXRhIGlmIHZhbGlkCiAgICAgICAgcHVzaCBARGF0YUFycmF5LCAkQ2hlY2s7CiAgICB9CgogICAgcmV0dXJuIFxARGF0YUFycmF5Owp9CgpzdWIgX1ZlcnNpb25DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdmVyc2lvbiBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIGRhdGFiYXNlIHZlcnNpb24gZm91bmQuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBpZiByb3cgbm90IHZlcnNpb24gcm93LCBuZXh0LgogICAgICAgIGlmICggJFJvd1swXSAhfiAvXnZlcnNpb24kL2kgKSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRSb3dbMV0gPX4gL14oXGR7MSwzfSlcLihcZHsxLDN9KS4qJC8gKSB7CiAgICAgICAgICAgIGlmICggJDEgPj0gNCApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIk15U1FMICRSb3dbMV0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlZlcnNpb24gJFJvd1sxXSwgeW91IHNob3VsZCB1c2UgNC4xIG9yIGhpZ2hlci4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIlVua25vd24gZGF0YWJhc2UgdmVyc2lvbiAkUm93WzFdIjsKICAgICAgICB9CiAgICB9CiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnRGF0YWJhc2UgVmVyc2lvbicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRhdGFiYXNlIHZlcnNpb24uJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhTdXBwb3J0Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHV0Zi04IHN1cHBvcnQgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgIX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RhdGFiYXNlICh1dGY4KScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRhdGFiYXNlIHV0Zjggc3VwcG9ydC4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICdObyBkYXRhYmFzZSB2ZXJzaW9uIGZvdW5kLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgIH07CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHZhcmlhYmxlcycgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgbmV4dCByb3cgaWYgbm90IHZlcnNpb24KICAgICAgICBuZXh0IGlmICRSb3dbMF0gIX4gL152ZXJzaW9uJC9pOwoKICAgICAgICAjIGZpbmQgdGhlIHZlcnNpb24gbnVtYmVyCiAgICAgICAgaWYgKCAkUm93WzFdID1+IC9eKDRcLigxfDJ8M3w0fDUpfDVcLnw2XC58N1wuKS8gKSB7CiAgICAgICAgICAgICREYXRhLT57Q29tbWVudH0gPSAnWW91ciBkYXRhYmFzZSB2ZXJzaW9uIHN1cHBvcnRzIHV0ZjguJzsKICAgICAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdPSyc7CgogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICJ1dGY4IGlzIG5vdCBzdXBwb3J0ZWQgKE15U1FMICRSb3dbMV0pLiI7CiAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdGYWlsZWQnOwogICAgfQoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9VVEY4Q2xpZW50Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhID0ge307CgogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIGNoYXJhY3Rlcl9zZXRfY2xpZW50IHNldHRpbmcgZm91bmQuJzsKCiAgICAjIHV0Zi04IGNsaWVudCBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSAhfiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgI25leHQgaWYgcm93IG5vdCBjaGFyYWN0ZXJfc2V0X2NsaWVudAogICAgICAgIG5leHQgaWYgJFJvd1swXSAhfiAvXmNoYXJhY3Rlcl9zZXRfY2xpZW50L2k7CgogICAgICAgIGlmICggJFJvd1sxXSA9fiAvdXRmOC8gKSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91ciBjbGllbnQgY29ubmVjdGlvbiBpcyAkUm93WzFdLiI7CgogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KICAgICAgICAkTWVzc2FnZSA9ICJGb3VuZCBjaGFyYWN0ZXJfc2V0X2NsaWVudCwgYnV0IGl0J3Mgc2V0IHRvICRSb3dbMV0gKG5lZWRzIHRvIGJlIHV0ZjgpLiI7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0NsaWVudCBDb25uZWN0aW9uICh1dGY4KScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIHRoZSBjbGllbnQgdXNlcyB1dGY4IGZvciB0aGUgY29ubmVjdGlvbi4nLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgIH07CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhEYXRhYmFzZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1dGYtOCBkYXRhYmFzZSBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSAhfiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyBjaGFyYWN0ZXJfc2V0X2RhdGFiYXNlIHNldHRpbmcgZm91bmQuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15jaGFyYWN0ZXJfc2V0X2RhdGFiYXNlL2kgKSB7CiAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICA9ICJDaGFyYWN0ZXJfc2V0X2RhdGFiYXNlIHNldHRpbmcgZm91bmQsIGJ1dCBpdCdzIHNldCB0byAkUm93WzFdIChuZWVkcyB0byBiZSB1dGY4KS4iOwogICAgICAgICAgICBpZiAoICRSb3dbMV0gPX4gL3V0ZjgvICkgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91ciBkYXRhYmFzZSBjaGFyYWN0ZXIgc2V0dGluZyBpcyAkUm93WzFdLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RhdGFiYXNlIENoYXJhY3RlciAodXRmOCknLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBpZiB0aGUgZGF0YWJhc2UgdXNlcyB1dGY4IGFzIGNoYXJzZXQuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhUYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdXRmLTggdGFibGUgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgPX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICBteSAkQ2hlY2sgICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSAgPSAnJzsKICAgICAgICBteSAkTWVzc2FnZTIgPSAnJzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHRhYmxlIHN0YXR1cycgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMTRdICF+IC9edXRmOC9pICkgewogICAgICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gJywgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIkUm93WzBdXFskUm93WzE0XVxdIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlMiA9ICRSb3dbMTRdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAkTWVzc2FnZSA9ICJJbnZhbGlkIGNoYXJzZXQgY29sbGF0aW9uIGZvcjogJE1lc3NhZ2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAkTWVzc2FnZSA9ICRNZXNzYWdlMjsKICAgICAgICB9CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDb2xsYXRpb24gKHV0ZjgpJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIHRoZSB1dGY4IHRhYmxlIGNoYXJzZXQgY29sbGF0aW9uLicsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJZb3VyIGNoYXJzZXQgY29sbGF0aW9uIGlzIHNldCB0byAkTWVzc2FnZS4iLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gJERhdGE7CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBfTWF4QWxsb3dlZFBhY2thZ2VDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIG1heF9hbGxvd2VkX3BhY2tldCBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vICJtYXhfYWxsb3dlZF9wYWNrZXQiIGNvbmZpZ3VyYXRpb24gZm91bmQuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15tYXhfYWxsb3dlZF9wYWNrZXQvaSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzFdIDwgMTAyNCAqIDEwMjQgKiA3ICkgewogICAgICAgICAgICAgICAgJFJvd1sxXSAgPSBpbnQoICRSb3dbMV0gLyAxMDI0IC8gMTAyNCApOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlwibWF4X2FsbG93ZWRfcGFja2V0XCIgc2hvdWxkIGJlIGhpZ2hlciB0aGVuIDcgTUIgKGl0J3MgJFJvd1sxXSBNQikuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSb3dbMV0gID0gaW50KCAkUm93WzFdIC8gMTAyNCAvIDEwMjQgKTsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIllvdXIgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzICRSb3dbMV0gTUIuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdNYXggUGFja2FnZSBTaXplJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgIm1heF9hbGxvd2VkX3BhY2tldCIgc2V0dGluZy4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfUXVlcnlDYWNoZVNpemVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHF1ZXJ5X2NhY2hlX3NpemUgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyAicXVlcnlfY2FjaGVfc2l6ZSIgc2V0dGluZyBmb3VuZC4nOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyB2YXJpYWJsZXMnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXnF1ZXJ5X2NhY2hlX3NpemUvaSApIHsKICAgICAgICAgICAgaWYgKCAhJFJvd1sxXSApIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gJ1RoZSBzZXR0aW5nICJxdWVyeV9jYWNoZV9zaXplIiBzaG91bGQgYmUgdXNlZCwgeW91IHdpbGwgZ2V0IGltcHJvdmVtZW50cyB1cCB0byAzMCAlIG9mIHNwZWVkLic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUm93WzFdIDwgMTAyNCAqIDEwMjQgKiAxMCApIHsKICAgICAgICAgICAgICAgICRSb3dbMV0gPSBpbnQoICRSb3dbMV0gLyAxMDI0IC8gMTAyNCApOwogICAgICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiVGhlIHNldHRpbmcgXCJxdWVyeV9jYWNoZV9zaXplXCIgc2hvdWxkIGJlIGhpZ2hlciB0aGFuIDEwIE1CIChpdCdzICRSb3dbMV0gTUIpLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUm93WzFdICA9IGludCggJFJvd1sxXSAvIDEwMjQgLyAxMDI0ICk7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIE1CIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdRdWVyeSBDYWNoZSBTaXplJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgInF1ZXJ5X2NhY2hlX3NpemUiIHNldHRpbmcuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0N1cnJlbnRUaW1lc3RhbXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgICA9IHt9OwogICAgbXkgJERiVGltZSA9ICcnOwoKICAgICMgQ3VycmVudCBUaW1lc3RhbXAgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGN1cnJlbnRfdGltZXN0YW1wIiApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGJUaW1lID0gJFJvd1swXTsKICAgIH0KICAgIG15ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICBteSAkVGltZURhdGFiYXNlU2VydmVyICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICREYlRpbWUsCiAgICApOwoKICAgIG15ICRUaW1lRGlmZmVyZW5jZSA9IDA7CiAgICBteSAkUmFuZ2UgICAgICAgICAgPSAxMDsKICAgICRUaW1lRGlmZmVyZW5jZSA9ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgLSAkVGltZURhdGFiYXNlU2VydmVyOwogICAgaWYgKCAoICRUaW1lRGlmZmVyZW5jZSA+PSAoICRSYW5nZSAqIC0xICkgKSAmJiAoICRUaW1lRGlmZmVyZW5jZSA8PSAkUmFuZ2UgKSApIHsKICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1RoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGltZSBhbmQgZGF0YWJhc2Ugc2VydmVyIHRpbWUuJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1RoZXJlIGlzIGEgbWF0ZXJpYWwgZGlmZmVyZW5jZSAoJwogICAgICAgICAgICAuICRUaW1lRGlmZmVyZW5jZQogICAgICAgICAgICAuICIgc2Vjb25kcykgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgKCRUaW1lQXBwbGljYXRpb25TZXJ2ZXIpIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgKCRUaW1lRGF0YWJhc2VTZXJ2ZXIpIHRpbWUuIjsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQ3VycmVudCBUaW1lc3RhbXAgQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayAiU3lzdGVtIFRpbWUiIHZzICJDdXJyZW50IFRpbWVzdGFtcCIuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhID0ge307CgogICAgIyB0YWJsZSBjaGVjawogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9zY3JpcHRzL2RhdGFiYXNlL290cnMtc2NoZW1hLnhtbCc7CiAgICBpZiAoIC1mICRGaWxlICkgewogICAgICAgIG15ICRDb3VudCAgID0gMDsKICAgICAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICAgICAgbXkgJENvbnRlbnQgPSAnJzsKICAgICAgICBteSAkSW47CiAgICAgICAgaWYgKCBvcGVuKCAkSW4sICc8JywgJEZpbGUgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkSW4+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkSW4pOwogICAgICAgICAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MUGFyc2UyWE1MSGFzaCggU3RyaW5nID0+ICRDb250ZW50ICk7CgogICAgICAgICAgICBteSBAUHJvYmxlbXM7CiAgICAgICAgICAgIGZvciBteSAkVGFibGUgKCBAeyAkWE1MSGFzaFsxXS0+e2RhdGFiYXNlfS0+WzFdLT57VGFibGV9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoJFRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgJENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICMgdXNlICdDSEVDSyBUQUJMRSctc3RhdGVtZW50IHRvIGRldGVybWluZSBzdGF0ZSBvZiBlYWNoIHRhYmxlCiAgICAgICAgICAgICAgICAgICAgIyAod2hpY2ggbWF5IHlpZWxkIHNldmVyYWwgbGluZXMgcGVyIHRhYmxlLCB0aGUgbGFzdCBvZiB3aGljaCB3aWxsCiAgICAgICAgICAgICAgICAgICAgIyBjb250YWluIHRoZSBvdmVyYWxsIHN0YXRlIG9mIHRoYXQgdGFibGUpCiAgICAgICAgICAgICAgICAgICAgIyBEbyBxdWljayBjaGVja3Mgb24gdGFibGVzLCBvdGhlciB3YXkgaXQgdGFrZXMgb3ZlciA0MjAgc2VjCiAgICAgICAgICAgICAgICAgICAgIyBvciBsb25nZXIgdG8gY2hlY2sgaXQuCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICJDSEVDSyBUQUJMRSAkVGFibGUtPntOYW1lfSBGQVNUIFFVSUNLIiApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RhdHVzID0gJFJvd1szXTsgICAgIyBsb29rIGF0IGZpZWxkICdNc2dfdGV4dCcKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlmICRTdGF0dXMgPX4gL14oT0t8VGFibGVcc2lzXHNhbHJlYWR5XHN1cFxzdG9cc2RhdGUpL2k7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFByb2JsZW1zLCAiJFRhYmxlLT57TmFtZX1cWyRTdGF0dXNcXSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBQcm9ibGVtcywgIiRUYWJsZS0+e05hbWV9XFt1bmFibGUgdG8gY2hlY2sgdGFibGVcXSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChAUHJvYmxlbXMpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gam9pbiAiXG4iLCBAUHJvYmxlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkQ291bnQgdGFibGVzIGNoZWNrZWQuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IG9wZW4gZmlsZSAkRmlsZTogJCEiLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RhYmxlIENoZWNrJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IGZpbmQgZmlsZSAkRmlsZSEiLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnQ3JpdGljYWwnLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cg==</File>
- <File Location="Kernel/System/Support/Webserver.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBXZWJzZXJ2ZXIucG0sdiAxLjEwIDIwMTAvMDIvMDkgMTk6NTQ6MTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlciAtIGdsb2JhbCBzeXN0ZW0gaW5mb3JtYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbiB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgV2Vic2VydmVyIGluZm8gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6V2Vic2VydmVyOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJFdlYnNlcnZlckFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgV2Vic2VydmVycwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwogICAgIyAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+Q2hlY2soKTsKICAgICMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCB1c2VkIFdlYnNlcnZlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgdHJ5IHRvIGZpbmQgb3V0IHdoaWNoIFdlYnNlcnZlciBpcyBjb25maWd1cmVkCiAgICBteSAkV2Vic2VydmVyVHlwZSA9ICcnOwogICAgaWYgKCAkRU5We1NFUlZFUl9TT0ZUV0FSRX0gPX4gL2FwYWNoZS9pICkgewogICAgICAgICRXZWJzZXJ2ZXJUeXBlID0gJ0FwYWNoZSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkV2Vic2VydmVyVHlwZSA9ICdJSVMnOwogICAgfQoKICAgICMgdHJ5IHRvIGdldCBhdmFpbGFibGUgbW9kdWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXInOwoKICAgICMgcmVhZCBhbGwgYXZhaWxhYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYiggJERpck5hbWUgLiAnLyoucG0nICk7CiAgICBmb3IgbXkgJEZpbGUgKEBMaXN0KSB7CgogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBpZiAoICRXZWJzZXJ2ZXJUeXBlID1+IC9eJEZpbGUvaSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6JEZpbGUiOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBuZXcgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAgICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBcnJheVJlZiAmJiByZWYoJEFycmF5UmVmKSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCBAeyREYXRhQXJyYXl9LCBAeyRBcnJheVJlZn0gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMCAkICREYXRlOiAyMDEwLzAyLzA5IDE5OjU0OjE3ICQKCj1jdXQK</File>
- <File Location="Kernel/cpan-lib/Archive/Tar/Constant.pm" Permission="644" Encode="Base64">cGFja2FnZSBBcmNoaXZlOjpUYXI6OkNvbnN0YW50OwoKQkVHSU4gewogICAgcmVxdWlyZSBFeHBvcnRlcjsKICAgICRWRVJTSU9OPSAnMC4wMic7CiAgICBASVNBICAgID0gcXdbRXhwb3J0ZXJdOwogICAgQEVYUE9SVCA9IHF3WwogICAgICAgICAgICAgICAgRklMRSBIQVJETElOSyBTWU1MSU5LIENIQVJERVYgQkxPQ0tERVYgRElSIEZJRk8gU09DS0VUIFVOS05PV04KICAgICAgICAgICAgICAgIEJVRkZFUiBIRUFEIFJFQURfT05MWSBXUklURV9PTkxZIFVOUEFDSyBQQUNLIFRJTUVfT0ZGU0VUIFpMSUIKICAgICAgICAgICAgICAgIEJMT0NLX1NJWkUgVEFSX1BBRCBUQVJfRU5EIE9OX1VOSVggQkxPQ0sgQ0FOX1JFQURMSU5LIE1BR0lDIAogICAgICAgICAgICAgICAgVEFSX1ZFUlNJT04gVU5BTUUgR05BTUUgQ0FOX0NIT1dOIE1PREUgQ0hFQ0tfU1VNIFVJRCBHSUQgCiAgICAgICAgICAgICAgICBHWklQX01BR0lDX05VTSBNT0RFX1JFQUQgTE9OR0xJTksgTE9OR0xJTktfTkFNRSBQUkVGSVhfTEVOR1RICiAgICAgICAgICAgICAgICBMQUJFTCBOQU1FX0xFTkdUSCBTVFJJUF9NT0RFCiAgICAgICAgICAgIF07CgogICAgcmVxdWlyZSBUaW1lOjpMb2NhbCBpZiAkXk8gZXEgIk1hY09TIjsKfQoKdXNlIGNvbnN0YW50IEZJTEUgICAgICAgICAgID0+IDA7CnVzZSBjb25zdGFudCBIQVJETElOSyAgICAgICA9PiAxOwp1c2UgY29uc3RhbnQgU1lNTElOSyAgICAgICAgPT4gMjsKdXNlIGNvbnN0YW50IENIQVJERVYgICAgICAgID0+IDM7CnVzZSBjb25zdGFudCBCTE9DS0RFViAgICAgICA9PiA0Owp1c2UgY29uc3RhbnQgRElSICAgICAgICAgICAgPT4gNTsKdXNlIGNvbnN0YW50IEZJRk8gICAgICAgICAgID0+IDY7CnVzZSBjb25zdGFudCBTT0NLRVQgICAgICAgICA9PiA4Owp1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgPT4gOTsKdXNlIGNvbnN0YW50IExPTkdMSU5LICAgICAgID0+ICdMJzsKdXNlIGNvbnN0YW50IExBQkVMICAgICAgICAgID0+ICdWJzsKCnVzZSBjb25zdGFudCBCVUZGRVIgICAgICAgICA9PiA0MDk2Owp1c2UgY29uc3RhbnQgSEVBRCAgICAgICAgICAgPT4gNTEyOwp1c2UgY29uc3RhbnQgQkxPQ0sgICAgICAgICAgPT4gNTEyOwoKdXNlIGNvbnN0YW50IEJMT0NLX1NJWkUgICAgID0+IHN1YiB7IG15ICRuID0gaW50KCRfWzBdL0JMT0NLKTsgJG4rKyBpZiAkX1swXSAlIEJMT0NLOyAkbiAqIEJMT0NLIH07CnVzZSBjb25zdGFudCBUQVJfUEFEICAgICAgICA9PiBzdWIgeyBteSAkeCA9IHNoaWZ0IHx8IHJldHVybjsgcmV0dXJuICJcMCIgeCAoQkxPQ0sgLSAoJHggJSBCTE9DSykgKSB9Owp1c2UgY29uc3RhbnQgVEFSX0VORCAgICAgICAgPT4gIlwwIiB4IEJMT0NLOwoKdXNlIGNvbnN0YW50IFJFQURfT05MWSAgICAgID0+IHN1YiB7IHNoaWZ0KCkgPyAncmInIDogJ3InIH07CnVzZSBjb25zdGFudCBXUklURV9PTkxZICAgICA9PiBzdWIgeyAkX1swXSA/ICd3YicgLiBzaGlmdCA6ICd3JyB9Owp1c2UgY29uc3RhbnQgTU9ERV9SRUFEICAgICAgPT4gc3ViIHsgJF9bMF0gPX4gL15yLyA/IDEgOiAwIH07CgojIFBvaW50bGVzcyBhc3NpZ25tZW50IHRvIG1ha2UgLXcgc2h1dCB1cApteSAkZ2V0cHd1aWQ7ICRnZXRwd3VpZCA9ICd1bmtub3duJyB1bmxlc3MgZXZhbCB7IG15ICRmID0gZ2V0cHd1aWQgKDApOyB9OwpteSAkZ2V0Z3JnaWQ7ICRnZXRncmdpZCA9ICd1bmtub3duJyB1bmxlc3MgZXZhbCB7IG15ICRmID0gZ2V0Z3JnaWQgKDApOyB9Owp1c2UgY29uc3RhbnQgVU5BTUUgICAgICAgICAgPT4gc3ViIHsgJGdldHB3dWlkIHx8IHNjYWxhciBnZXRwd3VpZCggc2hpZnQoKSApIHx8ICcnIH07CnVzZSBjb25zdGFudCBHTkFNRSAgICAgICAgICA9PiBzdWIgeyAkZ2V0Z3JnaWQgfHwgc2NhbGFyIGdldGdyZ2lkKCBzaGlmdCgpICkgfHwgJycgfTsKdXNlIGNvbnN0YW50IFVJRCAgICAgICAgICAgID0+ICQ+Owp1c2UgY29uc3RhbnQgR0lEICAgICAgICAgICAgPT4gKHNwbGl0ICcgJywgJCkgKVswXTsKCnVzZSBjb25zdGFudCBNT0RFICAgICAgICAgICA9PiBkbyB7IDA2NjYgJiAoMDc3NyAmIH51bWFzaykgfTsKdXNlIGNvbnN0YW50IFNUUklQX01PREUgICAgID0+IHN1YiB7IHNoaWZ0KCkgJiAwNzc3IH07CnVzZSBjb25zdGFudCBDSEVDS19TVU0gICAgICA9PiAiICAgICAgIjsKCnVzZSBjb25zdGFudCBVTlBBQ0sgICAgICAgICA9PiAnQTEwMCBBOCBBOCBBOCBBMTIgQTEyIEE4IEExIEExMDAgQTYgQTIgQTMyIEEzMiBBOCBBOCBBMTU1IHgxMic7CnVzZSBjb25zdGFudCBQQUNLICAgICAgICAgICA9PiAnYTEwMCBhOCBhOCBhOCBhMTIgYTEyIEE4IGExIGExMDAgYTYgYTIgYTMyIGEzMiBhOCBhOCBhMTU1IHgxMic7CnVzZSBjb25zdGFudCBOQU1FX0xFTkdUSCAgICA9PiAxMDA7CnVzZSBjb25zdGFudCBQUkVGSVhfTEVOR1RIICA9PiAxNTU7Cgp1c2UgY29uc3RhbnQgVElNRV9PRkZTRVQgICAgPT4gKCReTyBlcSAiTWFjT1MiKSA/IFRpbWU6OkxvY2FsOjp0aW1lbG9jYWwoMCwwLDAsMSwwLDcwKSA6IDA7ICAgIAp1c2UgY29uc3RhbnQgTUFHSUMgICAgICAgICAgPT4gInVzdGFyIjsKdXNlIGNvbnN0YW50IFRBUl9WRVJTSU9OICAgID0+ICIwMCI7CnVzZSBjb25zdGFudCBMT05HTElOS19OQU1FICA9PiAnLi8uL0BMb25nTGluayc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIGFsbG93IFpMSUIgdG8gYmUgdHVybmVkIG9mZiB1c2luZyBFTlYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBERUJVRyBvbmx5CnVzZSBjb25zdGFudCBaTElCICAgICAgICAgICA9PiBkbyB7ICEkRU5WeydQRVJMNV9BVF9OT19aTElCJ30gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsIHsgcmVxdWlyZSBJTzo6WmxpYiB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRU5WeydQRVJMNV9BVF9OT19aTElCJ30gfHwgJEAgPyAwIDogMSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKdXNlIGNvbnN0YW50IEdaSVBfTUFHSUNfTlVNID0+IHFyL14oPzpcMDM3XDIxM3xcMDM3XDIzNSkvOwoKdXNlIGNvbnN0YW50IENBTl9DSE9XTiAgICAgID0+IGRvIHsgKCQ+ID09IDAgYW5kICReTyBuZSAiTWFjT1MiIGFuZCAkXk8gbmUgIk1TV2luMzIiKSB9Owp1c2UgY29uc3RhbnQgQ0FOX1JFQURMSU5LICAgPT4gKCReTyBuZSAnTVNXaW4zMicgYW5kICReTyAhfiAvUklTQyg/OlsgX10pP09TL2kgYW5kICReTyBuZSAnVk1TJyk7CnVzZSBjb25zdGFudCBPTl9VTklYICAgICAgICA9PiAoJF5PIG5lICdNU1dpbjMyJyBhbmQgJF5PIG5lICdNYWNPUycgYW5kICReTyBuZSAnVk1TJyk7CgoxOwo=</File>
- <File Location="Kernel/cpan-lib/Archive/Tar/File.pm" Permission="644" Encode="Base64">cGFja2FnZSBBcmNoaXZlOjpUYXI6OkZpbGU7CnVzZSBzdHJpY3Q7Cgp1c2UgSU86OkZpbGU7CnVzZSBGaWxlOjpTcGVjOjpVbml4ICAgICgpOwp1c2UgRmlsZTo6U3BlYyAgICAgICAgICAoKTsKdXNlIEZpbGU6OkJhc2VuYW1lICAgICAgKCk7Cgp1c2UgQXJjaGl2ZTo6VGFyOjpDb25zdGFudDsKCnVzZSB2YXJzIHF3W0BJU0EgJFZFUlNJT05dOwpASVNBICAgICAgICA9IHF3W0FyY2hpdmU6OlRhcl07CiRWRVJTSU9OICAgID0gJzAuMDInOwoKIyMjIHNldCB2YWx1ZSB0byAxIHRvIG9jdCgpIGl0IGR1cmluZyB0aGUgdW5wYWNrICMjIwpteSAkdG1wbCA9IFsKICAgICAgICBuYW1lICAgICAgICA9PiAwLCAgICMgc3RyaW5nCiAgICAgICAgbW9kZSAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgdWlkICAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgZ2lkICAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgc2l6ZSAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgbXRpbWUgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgY2hrc3VtICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgdHlwZSAgICAgICAgPT4gMCwgICAjIGNoYXJhY3RlcgogICAgICAgIGxpbmtuYW1lICAgID0+IDAsICAgIyBzdHJpbmcKICAgICAgICBtYWdpYyAgICAgICA9PiAwLCAgICMgc3RyaW5nCiAgICAgICAgdmVyc2lvbiAgICAgPT4gMCwgICAjIDIgYnl0ZXMKICAgICAgICB1bmFtZSAgICAgICA9PiAwLCAgICMgc3RyaW5nCiAgICAgICAgZ25hbWUgICAgICAgPT4gMCwgICAjIHN0cmluZwogICAgICAgIGRldm1ham9yICAgID0+IDEsICAgIyBvY3RhbAogICAgICAgIGRldm1pbm9yICAgID0+IDEsICAgIyBvY3RhbAogICAgICAgIHByZWZpeCAgICAgID0+IDAsCgojIyMgZW5kIFVOUEFDSyBpdGVtcyAjIyMKICAgICAgICByYXcgICAgICAgICA9PiAwLCAgICMgdGhlIHJhdyBkYXRhIGNodW5rCiAgICAgICAgZGF0YSAgICAgICAgPT4gMCwgICAjIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSAtLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzICBtaWdodCBiZSB2ZXJ5IG1lbW9yeSBpbnRlbnNpdmUKXTsKCiMjIyBpbnN0YWxsIGdldC9zZXQgYWNjZXNzb3JzIGZvciB0aGlzIG9iamVjdC4KZm9yICggbXkgJGk9MDsgJGk8c2NhbGFyIEAkdG1wbCA7ICRpKz0yICkgewogICAgbXkgJGtleSA9ICR0bXBsLT5bJGldOwogICAgbm8gc3RyaWN0ICdyZWZzJzsKICAgICp7X19QQUNLQUdFX18uIjo6JGtleSJ9ID0gc3ViIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgICRzZWxmLT57JGtleX0gPSAkX1swXSBpZiBAXzsKCiAgICAgICAgIyMjIGp1c3QgaW4gY2FzZSB0aGUga2V5IGlzIG5vdCB0aGVyZSBvciB1bmRlZiBvciBzb21ldGhpbmcgIyMjCiAgICAgICAgeyAgIGxvY2FsICReVyA9IDA7CiAgICAgICAgICAgIHJldHVybiAkc2VsZi0+eyRrZXl9OwogICAgICAgIH0KICAgIH0KfQoKPWhlYWQxIE5BTUUKCkFyY2hpdmU6OlRhcjo6RmlsZSAtIGEgc3ViY2xhc3MgZm9yIGluLW1lbW9yeSBleHRyYWN0ZWQgZmlsZSBmcm9tIEFyY2hpdmU6OlRhcgoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgQGl0ZW1zID0gJHRhci0+Z2V0X2ZpbGVzOwoKICAgIHByaW50ICRfLT5uYW1lLCAnICcsICRfLT5zaXplLCAiXG4iIGZvciBAaXRlbXM7CgogICAgcHJpbnQgJG9iamVjdC0+Z2V0X2NvbnRlbnQ7CiAgICAkb2JqZWN0LT5yZXBsYWNlX2NvbnRlbnQoJ25ldyBjb250ZW50Jyk7CgogICAgJG9iamVjdC0+cmVuYW1lKCAnbmV3L2Z1bGwvcGF0aC90by9maWxlLmMnICk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkFyY2hpdmU6OlRhcjo6RmlsZXMgcHJvdmlkZXMgYSBuZWF0IGxpdHRsZSBvYmplY3QgbGF5ZXIgZm9yIGluLW1lbW9yeQpleHRyYWN0ZWQgZmlsZXMuIEl0J3MgbW9zdGx5IHVzZWQgaW50ZXJuYWxseSBpbiBBcmNoaXZlOjpUYXIgdG8gdGlkeQp1cCB0aGUgY29kZSwgYnV0IHRoZXJlJ3Mgbm8gcmVhc29uIHVzZXJzIHNob3VsZG4ndCB1c2UgdGhpcyBBUEkgYXMKd2VsbC4KCj1oZWFkMiBBY2Nlc3NvcnMKCkEgbG90IG9mIHRoZSBtZXRob2RzIGluIHRoaXMgcGFja2FnZSBhcmUgYWNjZXNzb3JzIHRvIHRoZSB2YXJpb3VzCmZpZWxkcyBpbiB0aGUgdGFyIGhlYWRlcjoKCj1vdmVyIDQKCj1pdGVtIG5hbWUKClRoZSBmaWxlJ3MgbmFtZQoKPWl0ZW0gbW9kZQoKVGhlIGZpbGUncyBtb2RlCgo9aXRlbSB1aWQKClRoZSB1c2VyIGlkIG93bmluZyB0aGUgZmlsZQoKPWl0ZW0gZ2lkCgpUaGUgZ3JvdXAgaWQgb3duaW5nIHRoZSBmaWxlCgo9aXRlbSBzaXplCgpGaWxlIHNpemUgaW4gYnl0ZXMKCj1pdGVtIG10aW1lCgpNb2RpZmljYXRpb24gdGltZS4gQWRqdXN0ZWQgdG8gbWFjLXRpbWUgb24gTWFjT1MgaWYgcmVxdWlyZWQKCj1pdGVtIGNoa3N1bQoKQ2hlY2tzdW0gZmllbGQgZm9yIHRoZSB0YXIgaGVhZGVyCgo9aXRlbSB0eXBlCgpGaWxlIHR5cGUgLS0gbnVtZXJpYywgYnV0IGNvbXBhcmFibGUgdG8gZXhwb3J0ZWQgY29uc3RhbnRzIC0tIHNlZQpBcmNoaXZlOjpUYXIncyBkb2N1bWVudGF0aW9uCgo9aXRlbSBsaW5rbmFtZQoKSWYgdGhlIGZpbGUgaXMgYSBzeW1saW5rLCB0aGUgZmlsZSBpdCdzIHBvaW50aW5nIHRvCgo9aXRlbSBtYWdpYwoKVGFyIG1hZ2ljIHN0cmluZyAtLSBub3QgdXNlZnVsIGZvciBtb3N0IHVzZXJzCgo9aXRlbSB2ZXJzaW9uCgpUYXIgdmVyc2lvbiBzdHJpbmcgLS0gbm90IHVzZWZ1bCBmb3IgbW9zdCB1c2VycwoKPWl0ZW0gdW5hbWUKClRoZSB1c2VyIG5hbWUgdGhhdCBvd25zIHRoZSBmaWxlCgo9aXRlbSBnbmFtZQoKVGhlIGdyb3VwIG5hbWUgdGhhdCBvd25zIHRoZSBmaWxlCgo9aXRlbSBkZXZtYWpvcgoKRGV2aWNlIG1ham9yIG51bWJlciBpbiBjYXNlIG9mIGEgc3BlY2lhbCBmaWxlCgo9aXRlbSBkZXZtaW5vcgoKRGV2aWNlIG1pbm9yIG51bWJlciBpbiBjYXNlIG9mIGEgc3BlY2lhbCBmaWxlCgo9aXRlbSBwcmVmaXgKCkFueSBkaXJlY3RvcnkgdG8gcHJlZml4IHRvIHRoZSBleHRyYWN0aW9uIHBhdGgsIGlmIGFueQoKPWl0ZW0gcmF3CgpSYXcgdGFyIGhlYWRlciAtLSBub3QgdXNlZnVsIGZvciBtb3N0IHVzZXJzCgo9YmFjawoKPWhlYWQxIE1ldGhvZHMKCj1oZWFkMiBuZXcoIGZpbGUgPT4gJHBhdGggKQoKUmV0dXJucyBhIG5ldyBBcmNoaXZlOjpUYXI6OkZpbGUgb2JqZWN0IGZyb20gYW4gZXhpc3RpbmcgZmlsZS4KClJldHVybnMgdW5kZWYgb24gZmFpbHVyZS4KCj1oZWFkMiBuZXcoIGRhdGEgPT4gJHBhdGgsICRkYXRhLCAkb3B0ICkKClJldHVybnMgYSBuZXcgQXJjaGl2ZTo6VGFyOjpGaWxlIG9iamVjdCBmcm9tIGRhdGEuCgpDPCRwYXRoPiBkZWZpbmVzIHRoZSBmaWxlIG5hbWUgKHdoaWNoIG5lZWQgbm90IGV4aXN0KSwgQzwkZGF0YT4gdGhlCmZpbGUgY29udGVudHMsIGFuZCBDPCRvcHQ+IGlzIGEgcmVmZXJlbmNlIHRvIGEgaGFzaCBvZiBhdHRyaWJ1dGVzCndoaWNoIG1heSBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgKGZpZWxkcyBpbiB0aGUKdGFyIGhlYWRlciksIHdoaWNoIGFyZSBkZXNjcmliZWQgYWJvdmUgaW4gdGhlIEFjY2Vzc29ycyBzZWN0aW9uLgoKUmV0dXJucyB1bmRlZiBvbiBmYWlsdXJlLgoKPWhlYWQyIG5ldyggY2h1bmsgPT4gJGNodW5rICkKClJldHVybnMgYSBuZXcgQXJjaGl2ZTo6VGFyOjpGaWxlIG9iamVjdCBmcm9tIGEgcmF3IDUxMi1ieXRlIHRhcgphcmNoaXZlIGNodW5rLgoKUmV0dXJucyB1bmRlZiBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgICA9IHNoaWZ0OwogICAgbXkgJHdoYXQgICAgPSBzaGlmdDsKCiAgICBteSAkb2JqID0gICAoJHdoYXQgZXEgJ2NodW5rJykgPyBfX1BBQ0tBR0VfXy0+X25ld19mcm9tX2NodW5rKCBAXyApIDoKICAgICAgICAgICAgICAgICgkd2hhdCBlcSAnZmlsZScgKSA/IF9fUEFDS0FHRV9fLT5fbmV3X2Zyb21fZmlsZSggQF8gKSA6CiAgICAgICAgICAgICAgICAoJHdoYXQgZXEgJ2RhdGEnICkgPyBfX1BBQ0tBR0VfXy0+X25ld19mcm9tX2RhdGEoIEBfICkgOgogICAgICAgICAgICAgICAgdW5kZWY7CgogICAgcmV0dXJuICRvYmo7Cn0KCiMjIyBjb3BpZXMgdGhlIGRhdGEsIGNyZWF0ZXMgYSBjbG9uZSAjIyMKc3ViIGNsb25lIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gYmxlc3MgeyAlJHNlbGYgfSwgcmVmICRzZWxmOwp9CgpzdWIgX25ld19mcm9tX2NodW5rIHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgJGNodW5rID0gc2hpZnQgb3IgcmV0dXJuOyAgICAjIDUxMiBieXRlcyBvZiB0YXIgaGVhZGVyCiAgICBteSAlaGFzaCAgPSBAXzsKCiAgICAjIyMgZmlsdGVyIGFueSBhcmd1bWVudHMgb24gZGVmaW5lZC1uZXNzIG9mIHZhbHVlcy4KICAgICMjIyB0aGlzIGFsbG93cyBvdmVycmlkaW5nIGZyb20gd2hhdCB0aGUgdGFyLWhlYWRlciBpcyBzYXlpbmcKICAgICMjIyBhYm91dCB0aGlzIHRhci1lbnRyeS4gUGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgQExvbmdMaW5rIGZpbGVzCiAgICBteSAlYXJncyAgPSBtYXAgeyAkXyA9PiAkaGFzaHskX30gfSBncmVwIHsgZGVmaW5lZCAkaGFzaHskX30gfSBrZXlzICVoYXNoOwoKICAgICMjIyBtYWtlcyBpdCBzdGFydCBhdCAwIGFjdHVhbGx5Li4uIDopICMjIwogICAgbXkgJGkgPSAtMTsKICAgIG15ICVlbnRyeSA9IG1hcCB7CiAgICAgICAgJHRtcGwtPlsrKyRpXSA9PiAkdG1wbC0+WysrJGldID8gb2N0ICRfIDogJF8KICAgIH0gbWFwIHsgL14oW15cMF0qKS8gfSB1bnBhY2soIFVOUEFDSywgJGNodW5rICk7CgogICAgbXkgJG9iaiA9IGJsZXNzIHsgJWVudHJ5LCAlYXJncyB9LCAkY2xhc3M7CgoJIyMjIG1hZ2ljIGlzIGEgZmlsZXR5cGUgc3RyaW5nLi4gaXQgc2hvdWxkIGhhdmUgc29tZXRoaW5nIGxpa2UgJ3VzdGFyJyBvcgoJIyMjIHNvbWV0aGluZyBzaW1pbGFyLi4uIGlmIHRoZSBjaHVuayBpcyBnYXJiYWdlLCBza2lwIGl0CglyZXR1cm4gdW5sZXNzICRvYmotPm1hZ2ljICF+IC9cVy87CgogICAgIyMjIHN0b3JlIHRoZSBvcmlnaW5hbCBjaHVuayAjIyMKICAgICRvYmotPnJhdyggJGNodW5rICk7CgogICAgJG9iai0+dHlwZShGSUxFKSBpZiAoICghbGVuZ3RoICRvYmotPnR5cGUpIG9yICgkb2JqLT50eXBlID1+IC9cVy8pICk7CiAgICAkb2JqLT50eXBlKERJUikgIGlmICggKCRvYmotPmlzX2ZpbGUpICYmICgkb2JqLT5uYW1lID1+IG18LyR8KSApOwoKCiAgICByZXR1cm4gJG9iajsKCn0KCnN1YiBfbmV3X2Zyb21fZmlsZSB7CiAgICBteSAkY2xhc3MgICAgICAgPSBzaGlmdDsKICAgIG15ICRwYXRoICAgICAgICA9IHNoaWZ0OyAgICAgICAgCiAgICAKICAgICMjIyBwYXRoIGhhcyB0byBhdCBsZWFzdCBleGlzdAogICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRwYXRoOwogICAgCiAgICBteSAkdHlwZSAgICAgICAgPSBfX1BBQ0tBR0VfXy0+X2ZpbGV0eXBlKCRwYXRoKTsKICAgIG15ICRkYXRhICAgICAgICA9ICcnOwoKICAgIFJFQUQ6IHsgCiAgICAgICAgdW5sZXNzICgkdHlwZSA9PSBESVIgKSB7CiAgICAgICAgICAgIG15ICRmaCA9IElPOjpGaWxlLT5uZXc7CiAgICAgICAgCiAgICAgICAgICAgIHVubGVzcyggJGZoLT5vcGVuKCRwYXRoKSApIHsKICAgICAgICAgICAgICAgICMjIyBkYW5nbGluZyBzeW1saW5rcyBhcmUgZmluZSwgc3RvcCByZWFkaW5nIGJ1dCBjb250aW51ZQogICAgICAgICAgICAgICAgIyMjIGNyZWF0aW5nIHRoZSBvYmplY3QKICAgICAgICAgICAgICAgIGxhc3QgUkVBRCBpZiAkdHlwZSA9PSBTWU1MSU5LOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAjIyMgb3RoZXJ3aXNlLCByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIC0tCiAgICAgICAgICAgICAgICAjIyMgYW55dGhpbmcgdGhhdCdzICpub3QqIGEgc3ltbGluayBzaG91bGQgYmUKICAgICAgICAgICAgICAgICMjIyByZXNvbHZhYmxlCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyBiaW5tb2RlIG5lZWRlZCB0byByZWFkIGZpbGVzIHByb3Blcmx5IG9uIHdpbjMyICMjIwogICAgICAgICAgICBiaW5tb2RlICRmaDsKICAgICAgICAgICAgJGRhdGEgPSBkbyB7IGxvY2FsICQvOyA8JGZoPiB9OwogICAgICAgICAgICBjbG9zZSAkZmg7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBpdGVtcyAgICAgICA9IHF3W21vZGUgdWlkIGdpZCBzaXplIG10aW1lXTsKICAgIG15ICVoYXNoICAgICAgICA9IG1hcCB7IHNoaWZ0KEBpdGVtcyksICRfIH0gKGxzdGF0ICRwYXRoKVsyLDQsNSw3LDldOwoKICAgICMjIyB5b3UgKm11c3QqIHNldCBzaXplID09IDAgb24gc3ltbGlua3MsIG9yIHRoZSBuZXh0IGVudHJ5IHdpbGwgYmUKICAgICMjIyB0aG91Z2ggb2YgYXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1saW5rLCB3aGljaCBpcyB3cm9uZy4KICAgICMjIyB0aGlzIGZpeGVzIGJ1ZyAjNzkzNwogICAgJGhhc2h7c2l6ZX0gICAgID0gMCBpZiAoJHR5cGUgPT0gRElSIG9yICR0eXBlID09IFNZTUxJTkspOwogICAgJGhhc2h7bXRpbWV9ICAgIC09IFRJTUVfT0ZGU0VUOwoKICAgICMjIyBzdHJpcCB0aGUgaGlnaCBiaXRzIG9mZiB0aGUgbW9kZSwgd2hpY2ggd2UgZG9uJ3QgbmVlZCB0byBzdG9yZQogICAgJGhhc2h7bW9kZX0gICAgID0gU1RSSVBfTU9ERS0+KCAkaGFzaHttb2RlfSApOwoKCiAgICAjIyMgcHJvYmFibHkgcmVxdWlyZXMgc29tZSBmaWxlIHBhdGggbXVuZ2luZyBoZXJlIC4uLiAjIyMKICAgICMjIyBuYW1lIGFuZCBwcmVmaXggYXJlIHNldCBsYXRlcgogICAgbXkgJG9iaiA9IHsKICAgICAgICAlaGFzaCwKICAgICAgICBuYW1lICAgICAgICA9PiAnJywKICAgICAgICBjaGtzdW0gICAgICA9PiBDSEVDS19TVU0sCiAgICAgICAgdHlwZSAgICAgICAgPT4gJHR5cGUsCiAgICAgICAgbGlua25hbWUgICAgPT4gKCR0eXBlID09IFNZTUxJTksgYW5kIENBTl9SRUFETElOSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVhZGxpbmsgJHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJycsCiAgICAgICAgbWFnaWMgICAgICAgPT4gTUFHSUMsCiAgICAgICAgdmVyc2lvbiAgICAgPT4gVEFSX1ZFUlNJT04sCiAgICAgICAgdW5hbWUgICAgICAgPT4gVU5BTUUtPiggJGhhc2h7dWlkfSApLAogICAgICAgIGduYW1lICAgICAgID0+IEdOQU1FLT4oICRoYXNoe2dpZH0gKSwKICAgICAgICBkZXZtYWpvciAgICA9PiAwLCAgICMgbm90IGhhbmRsZWQKICAgICAgICBkZXZtaW5vciAgICA9PiAwLCAgICMgbm90IGhhbmRsZWQKICAgICAgICBwcmVmaXggICAgICA9PiAnJywKICAgICAgICBkYXRhICAgICAgICA9PiAkZGF0YSwKICAgIH07CgogICAgYmxlc3MgJG9iaiwgJGNsYXNzOwoKICAgICMjIyBmaXggdXAgdGhlIHByZWZpeCBhbmQgZmlsZSBmcm9tIHRoZSBwYXRoCiAgICBteSgkcHJlZml4LCRmaWxlKSA9ICRvYmotPl9wcmVmaXhfYW5kX2ZpbGUoICRwYXRoICk7CiAgICAkb2JqLT5wcmVmaXgoICRwcmVmaXggKTsKICAgICRvYmotPm5hbWUoICRmaWxlICk7CgogICAgcmV0dXJuICRvYmo7Cn0KCnN1YiBfbmV3X2Zyb21fZGF0YSB7CiAgICBteSAkY2xhc3MgICA9IHNoaWZ0OwogICAgbXkgJHBhdGggICAgPSBzaGlmdDsgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRwYXRoOwogICAgbXkgJGRhdGEgICAgPSBzaGlmdDsgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRkYXRhOwogICAgbXkgJG9wdCAgICAgPSBzaGlmdDsKCiAgICBteSAkb2JqID0gewogICAgICAgIGRhdGEgICAgICAgID0+ICRkYXRhLAogICAgICAgIG5hbWUgICAgICAgID0+ICcnLAogICAgICAgIG1vZGUgICAgICAgID0+IE1PREUsCiAgICAgICAgdWlkICAgICAgICAgPT4gVUlELAogICAgICAgIGdpZCAgICAgICAgID0+IEdJRCwKICAgICAgICBzaXplICAgICAgICA9PiBsZW5ndGggJGRhdGEsCiAgICAgICAgbXRpbWUgICAgICAgPT4gdGltZSAtIFRJTUVfT0ZGU0VULAogICAgICAgIGNoa3N1bSAgICAgID0+IENIRUNLX1NVTSwKICAgICAgICB0eXBlICAgICAgICA9PiBGSUxFLAogICAgICAgIGxpbmtuYW1lICAgID0+ICcnLAogICAgICAgIG1hZ2ljICAgICAgID0+IE1BR0lDLAogICAgICAgIHZlcnNpb24gICAgID0+IFRBUl9WRVJTSU9OLAogICAgICAgIHVuYW1lICAgICAgID0+IFVOQU1FLT4oIFVJRCApLAogICAgICAgIGduYW1lICAgICAgID0+IEdOQU1FLT4oIEdJRCApLAogICAgICAgIGRldm1pbm9yICAgID0+IDAsCiAgICAgICAgZGV2bWFqb3IgICAgPT4gMCwKICAgICAgICBwcmVmaXggICAgICA9PiAnJywKICAgIH07CgogICAgIyMjIG92ZXJ3cml0ZSB3aXRoIHVzZXIgb3B0aW9ucywgaWYgcHJvdmlkZWQgIyMjCiAgICBpZiggJG9wdCBhbmQgcmVmICRvcHQgZXEgJ0hBU0gnICkgewogICAgICAgIGZvciBteSAka2V5ICgga2V5cyAlJG9wdCApIHsKCiAgICAgICAgICAgICMjIyBkb24ndCB3cml0ZSBib2d1cyBvcHRpb25zICMjIwogICAgICAgICAgICBuZXh0IHVubGVzcyBleGlzdHMgJG9iai0+eyRrZXl9OwogICAgICAgICAgICAkb2JqLT57JGtleX0gPSAkb3B0LT57JGtleX07CiAgICAgICAgfQogICAgfQoKICAgIGJsZXNzICRvYmosICRjbGFzczsKCiAgICAjIyMgZml4IHVwIHRoZSBwcmVmaXggYW5kIGZpbGUgZnJvbSB0aGUgcGF0aAogICAgbXkoJHByZWZpeCwkZmlsZSkgPSAkb2JqLT5fcHJlZml4X2FuZF9maWxlKCAkcGF0aCApOwogICAgJG9iai0+cHJlZml4KCAkcHJlZml4ICk7CiAgICAkb2JqLT5uYW1lKCAkZmlsZSApOwoKICAgIHJldHVybiAkb2JqOwp9CgpzdWIgX3ByZWZpeF9hbmRfZmlsZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHBhdGggPSBzaGlmdDsKCiAgICBteSAoJHZvbCwgJGRpcnMsICRmaWxlKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGgsICRzZWxmLT5pc19kaXIgKTsKICAgIG15IEBkaXJzID0gRmlsZTo6U3BlYy0+c3BsaXRkaXIoICRkaXJzICk7CgogICAgIyMjIHNvIHNvbWV0aW1lcyB0aGUgbGFzdCBlbGVtZW50IGlzICcnIC0tIHByb2JhYmx5IHdoZW4gdHJhaWxpbmcKICAgICMjIyBkaXIgc2xhc2hlcyBhcmUgZW5jb3VudGVyZWQuLi4gdGhpcyBpcyBpcyBvZiBjb3Vyc2UgcG9pbnRsZXNzLAogICAgIyMjIHNvIHJlbW92ZSBpdAogICAgcG9wIEBkaXJzIHdoaWxlIEBkaXJzIGFuZCBub3QgbGVuZ3RoICRkaXJzWy0xXTsKCiAgICAjIyMgaWYgaXQncyBhIGRpcmVjdG9yeSwgdGhlbiAkZmlsZSBtaWdodCBiZSBlbXB0eQogICAgJGZpbGUgPSBwb3AgQGRpcnMgaWYgJHNlbGYtPmlzX2RpciBhbmQgbm90IGxlbmd0aCAkZmlsZTsKCiAgICBteSAkcHJlZml4ID0gRmlsZTo6U3BlYzo6VW5peC0+Y2F0ZGlyKAogICAgICAgICAgICAgICAgICAgICAgICBncmVwIHsgbGVuZ3RoIH0gJHZvbCwgQGRpcnMKICAgICAgICAgICAgICAgICAgICApOwogICAgcmV0dXJuKCAkcHJlZml4LCAkZmlsZSApOwp9CgpzdWIgX2ZpbGV0eXBlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkZmlsZSA9IHNoaWZ0OwogICAgCiAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CgogICAgcmV0dXJuIFNZTUxJTksgIGlmICgtbCAkZmlsZSk7CSMgU3ltbGluawoKICAgIHJldHVybiBGSUxFICAgICBpZiAoLWYgXyk7CQkjIFBsYWluIGZpbGUKCiAgICByZXR1cm4gRElSICAgICAgaWYgKC1kIF8pOwkJIyBEaXJlY3RvcnkKCiAgICByZXR1cm4gRklGTyAgICAgaWYgKC1wIF8pOwkJIyBOYW1lZCBwaXBlCgogICAgcmV0dXJuIFNPQ0tFVCAgIGlmICgtUyBfKTsJCSMgU29ja2V0CgogICAgcmV0dXJuIEJMT0NLREVWIGlmICgtYiBfKTsJCSMgQmxvY2sgc3BlY2lhbAoKICAgIHJldHVybiBDSEFSREVWICBpZiAoLWMgXyk7CQkjIENoYXJhY3RlciBzcGVjaWFsCgogICAgIyMjIHNob3VsZG4ndCBoYXBwZW4sIHRoaXMgaXMgd2hlbiBtYWtpbmcgYXJjaGl2ZXMsIG5vdCByZWFkaW5nICMjIwogICAgcmV0dXJuIExPTkdMSU5LIGlmICggJGZpbGUgZXEgTE9OR0xJTktfTkFNRSApOwoKICAgIHJldHVybiBVTktOT1dOOwkJICAgICAgICAgICAgIyBTb21ldGhpbmcgZWxzZSAobGlrZSB3aGF0PykKCn0KCiMjIyB0aGlzIG1ldGhvZCAnZG93bmdyYWRlcycgYSBmaWxlIHRvIHBsYWluIGZpbGUgLS0gdGhpcyBpcyB1c2VkIGZvcgojIyMgc3ltbGlua3Mgd2hlbiBGT0xMT1dfU1lNTElOS1MgaXMgdHJ1ZS4Kc3ViIF9kb3duZ3JhZGVfdG9fcGxhaW5maWxlIHsKICAgIG15ICRlbnRyeSA9IHNoaWZ0OwogICAgJGVudHJ5LT50eXBlKCBGSUxFICk7CiAgICAkZW50cnktPm1vZGUoIE1PREUgKTsKICAgICRlbnRyeS0+bGlua25hbWUoJycpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgZnVsbF9wYXRoCgpSZXR1cm5zIHRoZSBmdWxsIHBhdGggZnJvbSB0aGUgdGFyIGhlYWRlcjsgdGhpcyBpcyBiYXNpY2FsbHkgYQpjb25jYXRlbmF0aW9uIG9mIHRoZSBDPHByZWZpeD4gYW5kIEM8bmFtZT4gZmllbGRzLgoKPWN1dAoKc3ViIGZ1bGxfcGF0aCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgICMjIyBpZiBwcmVmaXggZmllbGQgaXMgZW10cHkKICAgIHJldHVybiAkc2VsZi0+bmFtZSB1bmxlc3MgZGVmaW5lZCAkc2VsZi0+cHJlZml4IGFuZCBsZW5ndGggJHNlbGYtPnByZWZpeDsKCiAgICAjIyMgb3Igb3RoZXJ3aXNlLCBjYXRmaWxlJ2QKICAgIHJldHVybiBGaWxlOjpTcGVjOjpVbml4LT5jYXRmaWxlKCAkc2VsZi0+cHJlZml4LCAkc2VsZi0+bmFtZSApOwp9CgoKPWhlYWQyIHZhbGlkYXRlCgpEb25lIGJ5IEFyY2hpdmU6OlRhciBpbnRlcm5hbGx5IHdoZW4gcmVhZGluZyB0aGUgdGFyIGZpbGU6CnZhbGlkYXRlIHRoZSBoZWFkZXIgYWdhaW5zdCB0aGUgY2hlY2tzdW0gdG8gZW5zdXJlIGludGVnZXIgdGFyIGZpbGUuCgpSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQoKPWN1dAoKc3ViIHZhbGlkYXRlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgbXkgJHJhdyA9ICRzZWxmLT5yYXc7CgogICAgIyMjIGRvbid0IGtub3cgd2h5IHRoaXMgb25lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2UgL3dyaXRlLyAjIyMKICAgIHN1YnN0ciAoJHJhdywgMTQ4LCA4KSA9ICIgICAgICAgICI7CglyZXR1cm4gdW5wYWNrICgiJTE2QyoiLCAkcmF3KSA9PSAkc2VsZi0+Y2hrc3VtID8gMSA6IDA7Cn0KCj1oZWFkMiBoYXNfY29udGVudAoKUmV0dXJucyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgY3VycmVudCBvYmplY3QgaGFzIGNvbnRlbnQuClNvbWUgc3BlY2lhbCBmaWxlcyBsaWtlIGRpcmVjdG9yaWVzIGFuZCBzbyBvbiBuZXZlciB3aWxsIGhhdmUgYW55CmNvbnRlbnQuIFRoaXMgbWV0aG9kIGlzIG1haW5seSB0byBtYWtlIHN1cmUgeW91IGRvbid0IGdldCB3YXJuaW5ncwpmb3IgdXNpbmcgdW5pbml0aWFsaXplZCB2YWx1ZXMgd2hlbiBsb29raW5nIGF0IGFuIG9iamVjdCdzIGNvbnRlbnQuCgo9Y3V0CgpzdWIgaGFzX2NvbnRlbnQgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiBkZWZpbmVkICRzZWxmLT5kYXRhKCkgJiYgbGVuZ3RoICRzZWxmLT5kYXRhKCkgPyAxIDogMDsKfQoKPWhlYWQyIGdldF9jb250ZW50CgpSZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRlbnQgZm9yIHRoZSBpbi1tZW1vcnkgZmlsZQoKPWN1dAoKc3ViIGdldF9jb250ZW50IHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAkc2VsZi0+ZGF0YSggKTsKfQoKPWhlYWQyIGdldF9jb250ZW50X2J5X3JlZgoKUmV0dXJucyB0aGUgY3VycmVudCBjb250ZW50IGZvciB0aGUgaW4tbWVtb3J5IGZpbGUgYXMgYSBzY2FsYXIKcmVmZXJlbmNlLiBOb3JtYWwgdXNlcnMgd29uJ3QgbmVlZCB0aGlzLCBidXQgaXQgd2lsbCBzYXZlIG1lbW9yeSBpZgp5b3UgYXJlIGRlYWxpbmcgd2l0aCB2ZXJ5IGxhcmdlIGRhdGEgZmlsZXMgaW4geW91ciB0YXIgYXJjaGl2ZSwgc2luY2UKaXQgd2lsbCBwYXNzIHRoZSBjb250ZW50cyBieSByZWZlcmVuY2UsIHJhdGhlciB0aGFuIG1ha2UgYSBjb3B5IG9mIGl0CmZpcnN0LgoKPWN1dAoKc3ViIGdldF9jb250ZW50X2J5X3JlZiB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiBcJHNlbGYtPntkYXRhfTsKfQoKPWhlYWQyIHJlcGxhY2VfY29udGVudCggJGNvbnRlbnQgKQoKUmVwbGFjZSB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBmaWxlIHdpdGggdGhlIG5ldyBjb250ZW50LiBUaGlzCm9ubHkgYWZmZWN0cyB0aGUgaW4tbWVtb3J5IGFyY2hpdmUsIG5vdCB0aGUgb24tZGlzayB2ZXJzaW9uIHVudGlsCnlvdSB3cml0ZSBpdC4KClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIHJlcGxhY2VfY29udGVudCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGRhdGEgPSBzaGlmdCB8fCAnJzsKCiAgICAkc2VsZi0+ZGF0YSggJGRhdGEgKTsKICAgICRzZWxmLT5zaXplKCBsZW5ndGggJGRhdGEgKTsKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgcmVuYW1lKCAkbmV3X25hbWUgKQoKUmVuYW1lIHRoZSBjdXJyZW50IGZpbGUgdG8gJG5ld19uYW1lLgoKTm90ZSB0aGF0IHlvdSBtdXN0IHNwZWNpZnkgYSBVbml4IHBhdGggZm9yICRuZXdfbmFtZSwgc2luY2UgcGVyIHRhcgpzdGFuZGFyZCwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlIG11c3QgYmUgVW5peCBwYXRocy4KClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIHJlbmFtZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHBhdGggPSBzaGlmdDsKICAgIAogICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRwYXRoOwoKICAgIG15ICgkcHJlZml4LCRmaWxlKSA9ICRzZWxmLT5fcHJlZml4X2FuZF9maWxlKCAkcGF0aCApOwoKICAgICRzZWxmLT5uYW1lKCAkZmlsZSApOwogICAgJHNlbGYtPnByZWZpeCggJHByZWZpeCApOwoKCXJldHVybiAxOwp9Cgo9aGVhZDEgQ29udmVuaWVuY2UgbWV0aG9kcwoKVG8gcXVpY2tseSBjaGVjayB0aGUgdHlwZSBvZiBhIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3QsIHlvdSBjYW4KdXNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKCj1vdmVyIDQKCj1pdGVtIGlzX2ZpbGUKClJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBvZiB0eXBlIEM8ZmlsZT4KCj1pdGVtIGlzX2RpcgoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxkaXI+Cgo9aXRlbSBpc19oYXJkbGluawoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxoYXJkbGluaz4KCj1pdGVtIGlzX3N5bWxpbmsKClJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBvZiB0eXBlIEM8c3ltbGluaz4KCj1pdGVtIGlzX2NoYXJkZXYKClJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBvZiB0eXBlIEM8Y2hhcmRldj4KCj1pdGVtIGlzX2Jsb2NrZGV2CgpSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgb2YgdHlwZSBDPGJsb2NrZGV2PgoKPWl0ZW0gaXNfZmlmbwoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxmaWZvPgoKPWl0ZW0gaXNfc29ja2V0CgpSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgb2YgdHlwZSBDPHNvY2tldD4KCj1pdGVtIGlzX2xvbmdsaW5rCgpSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgb2YgdHlwZSBDPExvbmdMaW5rPi4KU2hvdWxkIG5vdCBoYXBwZW4gYWZ0ZXIgYSBzdWNjZXNzZnVsIEM8cmVhZD4uCgo9aXRlbSBpc19sYWJlbAoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxMYWJlbD4uClNob3VsZCBub3QgaGFwcGVuIGFmdGVyIGEgc3VjY2Vzc2Z1bCBDPHJlYWQ+LgoKPWl0ZW0gaXNfdW5rbm93bgoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIHR5cGUgaXMgQzx1bmtub3duPgoKPWJhY2sKCj1jdXQKCiNzdHVwaWQgcGVybDUuNS4zIG5lZWRzIHRvIHdhcm4gaWYgaXQncyBub3QgbnVtZXJpYwpzdWIgaXNfZmlsZSAgICAgeyBsb2NhbCAkXlc7ICAgIEZJTEUgICAgICA9PSAkX1swXS0+dHlwZSB9CnN1YiBpc19kaXIgICAgICB7IGxvY2FsICReVzsgICAgRElSICAgICAgID09ICRfWzBdLT50eXBlIH0Kc3ViIGlzX2hhcmRsaW5rIHsgbG9jYWwgJF5XOyAgICBIQVJETElOSyAgPT0gJF9bMF0tPnR5cGUgfQpzdWIgaXNfc3ltbGluayAgeyBsb2NhbCAkXlc7ICAgIFNZTUxJTksgICA9PSAkX1swXS0+dHlwZSB9CnN1YiBpc19jaGFyZGV2ICB7IGxvY2FsICReVzsgICAgQ0hBUkRFViAgID09ICRfWzBdLT50eXBlIH0Kc3ViIGlzX2Jsb2NrZGV2IHsgbG9jYWwgJF5XOyAgICBCTE9DS0RFViAgPT0gJF9bMF0tPnR5cGUgfQpzdWIgaXNfZmlmbyAgICAgeyBsb2NhbCAkXlc7ICAgIEZJRk8gICAgICA9PSAkX1swXS0+dHlwZSB9CnN1YiBpc19zb2NrZXQgICB7IGxvY2FsICReVzsgICAgU09DS0VUICAgID09ICRfWzBdLT50eXBlIH0Kc3ViIGlzX3Vua25vd24gIHsgbG9jYWwgJF5XOyAgICBVTktOT1dOICAgPT0gJF9bMF0tPnR5cGUgfQpzdWIgaXNfbG9uZ2xpbmsgeyBsb2NhbCAkXlc7ICAgIExPTkdMSU5LICBlcSAkX1swXS0+dHlwZSB9CnN1YiBpc19sYWJlbCAgICB7IGxvY2FsICReVzsgICAgTEFCRUwgICAgIGVxICRfWzBdLT50eXBlIH0KCjE7Cg==</File>
- <File Location="Kernel/cpan-lib/Archive/Tar.pm" Permission="644" Encode="Base64">IyMjIHRoZSBnbnUgdGFyIHNwZWNpZmljYXRpb246CiMjIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGFyL21hbnVhbC90YXIuaHRtbAojIyMKIyMjIGFuZCB0aGUgcGF4IGZvcm1hdCBzcGVjLCB3aGljaCB0YXIgZGVyaXZlcyBmcm9tOgojIyMgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9wYXguaHRtbAoKcGFja2FnZSBBcmNoaXZlOjpUYXI7CnJlcXVpcmUgNS4wMDVfMDM7Cgp1c2Ugc3RyaWN0Owp1c2UgdmFycyBxd1skREVCVUcgJGVycm9yICRWRVJTSU9OICRXQVJOICRGT0xMT1dfU1lNTElOSyAkQ0hPV04gJENITU9ECiAgICAgICAgICAgICRET19OT1RfVVNFX1BSRUZJWCAkSEFTX1BFUkxJTyAkSEFTX0lPX1NUUklOR107CgokREVCVUcgICAgICAgICAgICAgID0gMDsKJFdBUk4gICAgICAgICAgICAgICA9IDE7CiRGT0xMT1dfU1lNTElOSyAgICAgPSAwOwokVkVSU0lPTiAgICAgICAgICAgID0gIjEuMzQiOwokQ0hPV04gICAgICAgICAgICAgID0gMTsKJENITU9EICAgICAgICAgICAgICA9IDE7CiRET19OT1RfVVNFX1BSRUZJWCAgPSAwOwoKQkVHSU4gewogICAgdXNlIENvbmZpZzsKICAgICRIQVNfUEVSTElPID0gJENvbmZpZzo6Q29uZmlne3VzZXBlcmxpb307CgogICAgIyMjIHRyeSBhbmQgbG9hZCBJTzo6U3RyaW5nIGFueXdheSwgc28geW91IGNhbiBkeW5hbWljYWxseQogICAgIyMjIHN3aXRjaCBiZXR3ZWVuIHBlcmxpbyBhbmQgSU86OlN0cmluZwogICAgZXZhbCB7CiAgICAgICAgcmVxdWlyZSBJTzo6U3RyaW5nOwogICAgICAgIGltcG9ydCBJTzo6U3RyaW5nOwogICAgfTsKICAgICRIQVNfSU9fU1RSSU5HID0gJEAgPyAwIDogMTsKCn0KCnVzZSBDd2Q7CnVzZSBJTzo6RmlsZTsKdXNlIENhcnAgICAgICAgICAgICAgICAgcXcoY2FycCBjcm9hayk7CnVzZSBGaWxlOjpTcGVjICAgICAgICAgICgpOwp1c2UgRmlsZTo6U3BlYzo6VW5peCAgICAoKTsKdXNlIEZpbGU6OlBhdGggICAgICAgICAgKCk7Cgp1c2UgQXJjaGl2ZTo6VGFyOjpGaWxlOwp1c2UgQXJjaGl2ZTo6VGFyOjpDb25zdGFudDsKCj1oZWFkMSBOQU1FCgpBcmNoaXZlOjpUYXIgLSBtb2R1bGUgZm9yIG1hbmlwdWxhdGlvbnMgb2YgdGFyIGFyY2hpdmVzCgo9aGVhZDEgU1lOT1BTSVMKCiAgICB1c2UgQXJjaGl2ZTo6VGFyOwogICAgbXkgJHRhciA9IEFyY2hpdmU6OlRhci0+bmV3OwoKICAgICR0YXItPnJlYWQoJ29yaWdpbi50Z3onLDEpOwogICAgJHRhci0+ZXh0cmFjdCgpOwoKICAgICR0YXItPmFkZF9maWxlcygnZmlsZS9mb28ucGwnLCAnZG9jcy9SRUFETUUnKTsKICAgICR0YXItPmFkZF9kYXRhKCdmaWxlL2Jhei50eHQnLCAnVGhpcyBpcyB0aGUgY29udGVudHMgbm93Jyk7CgogICAgJHRhci0+cmVuYW1lKCdvbGRuYW1lJywgJ25ldy9maWxlL25hbWUnKTsKCiAgICAkdGFyLT53cml0ZSgnZmlsZXMudGFyJyk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkFyY2hpdmU6OlRhciBwcm92aWRlcyBhbiBvYmplY3Qgb3JpZW50ZWQgbWVjaGFuaXNtIGZvciBoYW5kbGluZyB0YXIKZmlsZXMuICBJdCBwcm92aWRlcyBjbGFzcyBtZXRob2RzIGZvciBxdWljayBhbmQgZWFzeSBmaWxlcyBoYW5kbGluZwp3aGlsZSBhbHNvIGFsbG93aW5nIGZvciB0aGUgY3JlYXRpb24gb2YgdGFyIGZpbGUgb2JqZWN0cyBmb3IgY3VzdG9tCm1hbmlwdWxhdGlvbi4gIElmIHlvdSBoYXZlIHRoZSBJTzo6WmxpYiBtb2R1bGUgaW5zdGFsbGVkLApBcmNoaXZlOjpUYXIgd2lsbCBhbHNvIHN1cHBvcnQgY29tcHJlc3NlZCBvciBnemlwcGVkIHRhciBmaWxlcy4KCkFuIG9iamVjdCBvZiBjbGFzcyBBcmNoaXZlOjpUYXIgcmVwcmVzZW50cyBhIC50YXIoLmd6KSBhcmNoaXZlIGZ1bGwKb2YgZmlsZXMgYW5kIHRoaW5ncy4KCj1oZWFkMSBPYmplY3QgTWV0aG9kcwoKPWhlYWQyIEFyY2hpdmU6OlRhci0+bmV3KCBbJGZpbGUsICRjb21wcmVzc2VkXSApCgpSZXR1cm5zIGEgbmV3IFRhciBvYmplY3QuIElmIGdpdmVuIGFueSBhcmd1bWVudHMsIEM8bmV3KCk+IGNhbGxzIHRoZQpDPHJlYWQoKT4gbWV0aG9kIGF1dG9tYXRpY2FsbHksIHBhc3Npbmcgb24gdGhlIGFyZ3VtZW50cyBwcm92aWRlZCB0bwp0aGUgQzxyZWFkKCk+IG1ldGhvZC4KCklmIEM8bmV3KCk+IGlzIGludm9rZWQgd2l0aCBhcmd1bWVudHMgYW5kIHRoZSBDPHJlYWQoKT4gbWV0aG9kIGZhaWxzCmZvciBhbnkgcmVhc29uLCBDPG5ldygpPiByZXR1cm5zIHVuZGVmLgoKPWN1dAoKbXkgJHRtcGwgPSB7CiAgICBfZGF0YSAgID0+IFsgXSwKICAgIF9maWxlICAgPT4gJ1Vua25vd24nLAp9OwoKIyMjIGluc3RhbGwgZ2V0L3NldCBhY2Nlc3NvcnMgZm9yIHRoaXMgb2JqZWN0Lgpmb3IgbXkgJGtleSAoIGtleXMgJSR0bXBsICkgewogICAgbm8gc3RyaWN0ICdyZWZzJzsKICAgICp7X19QQUNLQUdFX18uIjo6JGtleSJ9ID0gc3ViIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgICRzZWxmLT57JGtleX0gPSAkX1swXSBpZiBAXzsKICAgICAgICByZXR1cm4gJHNlbGYtPnska2V5fTsKICAgIH0KfQoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgICRjbGFzcyA9IHJlZiAkY2xhc3MgaWYgcmVmICRjbGFzczsKCiAgICAjIyMgY29weWluZyAkdG1wbCBoZXJlIHNpbmNlIGEgc2hhbGxvdyBjb3B5IG1ha2VzIGl0IHVzZSB0aGUKICAgICMjIyBzYW1lIGFyZWYsIGNhdXNpbmcgZm9yIGZpbGVzIHRvIHJlbWFpbiBpbiBtZW1vcnkgYWx3YXlzLgogICAgbXkgJG9iaiA9IGJsZXNzIHsgX2RhdGEgPT4gWyBdLCBfZmlsZSA9PiAnVW5rbm93bicgfSwgJGNsYXNzOwoKICAgIGlmIChAXykgewogICAgICAgIHVubGVzcyAoICRvYmotPnJlYWQoIEBfICkgKSB7CiAgICAgICAgICAgICRvYmotPl9lcnJvcihxcVtObyBkYXRhIGNvdWxkIGJlIHJlYWQgZnJvbSBmaWxlXSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRvYmo7Cn0KCj1oZWFkMiAkdGFyLT5yZWFkICggJGZpbGVuYW1lfCRoYW5kbGUsICRjb21wcmVzc2VkLCB7b3B0ID0+ICd2YWwnfSApCgpSZWFkIHRoZSBnaXZlbiB0YXIgZmlsZSBpbnRvIG1lbW9yeS4KVGhlIGZpcnN0IGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgdGhlIG5hbWUgb2YgYSBmaWxlIG9yIGEgcmVmZXJlbmNlIHRvCmFuIGFscmVhZHkgb3BlbiBmaWxlaGFuZGxlIChvciBhbiBJTzo6WmxpYiBvYmplY3QgaWYgaXQncyBjb21wcmVzc2VkKQpUaGUgc2Vjb25kIGFyZ3VtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlIHJlZmVyZW5jZWQgYnkgdGhlIGZpcnN0CmFyZ3VtZW50IGlzIGNvbXByZXNzZWQuCgpUaGUgQzxyZWFkPiB3aWxsIEk8cmVwbGFjZT4gYW55IHByZXZpb3VzIGNvbnRlbnQgaW4gQzwkdGFyPiEKClRoZSBzZWNvbmQgYXJndW1lbnQgbWF5IGJlIGNvbnNpZGVyZWQgb3B0aW9uYWwgaWYgSU86OlpsaWIgaXMKaW5zdGFsbGVkLCBzaW5jZSBpdCB3aWxsIHRyYW5zcGFyZW50bHkgRG8gVGhlIFJpZ2h0IFRoaW5nLgpBcmNoaXZlOjpUYXIgd2lsbCB3YXJuIGlmIHlvdSB0cnkgdG8gcGFzcyBhIGNvbXByZXNzZWQgZmlsZSBpZgpJTzo6WmxpYiBpcyBub3QgYXZhaWxhYmxlIGFuZCBzaW1wbHkgcmV0dXJuLgoKTm90ZSB0aGF0IHlvdSBjYW4gY3VycmVudGx5IEI8bm90PiBwYXNzIGEgQzxnemlwPiBjb21wcmVzc2VkCmZpbGVoYW5kbGUsIHdoaWNoIGlzIG5vdCBvcGVuZWQgd2l0aCBDPElPOjpabGliPiwgbm9yIGEgc3RyaW5nCmNvbnRhaW5pbmcgdGhlIGZ1bGwgYXJjaGl2ZSBpbmZvcm1hdGlvbiAoZWl0aGVyIGNvbXByZXNzZWQgb3IKdW5jb21wcmVzc2VkKS4gVGhlc2UgYXJlIHdvcnRoIHdoaWxlIGZlYXR1cmVzLCBidXQgbm90IGN1cnJlbnRseQppbXBsZW1lbnRlZC4gU2VlIHRoZSBDPFRPRE8+IHNlY3Rpb24uCgpUaGUgdGhpcmQgYXJndW1lbnQgY2FuIGJlIGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBvcHRpb25zLiBOb3RlIHRoYXQKYWxsIG9wdGlvbnMgYXJlIGNhc2Utc2Vuc2l0aXZlLgoKPW92ZXIgNAoKPWl0ZW0gbGltaXQKCkRvIG5vdCByZWFkIG1vcmUgdGhhbiBDPGxpbWl0PiBmaWxlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUKdmVyeSBiaWcgYXJjaGl2ZXMsIGFuZCBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaXJzdCBmZXcgZmlsZXMuCgo9aXRlbSBleHRyYWN0CgpJZiBzZXQgdG8gdHJ1ZSwgaW1tZWRpYXRlbHkgZXh0cmFjdCBlbnRyaWVzIHdoZW4gcmVhZGluZyB0aGVtLiBUaGlzCmdpdmVzIHlvdSB0aGUgc2FtZSBtZW1vcnkgYnJlYWsgYXMgdGhlIEM8ZXh0cmFjdF9hcmNoaXZlPiBmdW5jdGlvbi4KTm90ZSBob3dldmVyIHRoYXQgZW50cmllcyB3aWxsIG5vdCBiZSByZWFkIGludG8gbWVtb3J5LCBidXQgd3JpdHRlbgpzdHJhaWdodCB0byBkaXNrLgoKPWJhY2sKCkFsbCBmaWxlcyBhcmUgc3RvcmVkIGludGVybmFsbHkgYXMgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IG9iamVjdHMuClBsZWFzZSBjb25zdWx0IHRoZSBMPEFyY2hpdmU6OlRhcjo6RmlsZT4gZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KClJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlcyByZWFkIGluIHNjYWxhciBjb250ZXh0LCBhbmQgYSBsaXN0IG9mCkM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3RzIGluIGxpc3QgY29udGV4dC4KCj1jdXQKCnN1YiByZWFkIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkZmlsZSA9IHNoaWZ0OwogICAgbXkgJGd6aXAgPSBzaGlmdCB8fCAwOwogICAgbXkgJG9wdHMgPSBzaGlmdCB8fCB7fTsKCiAgICB1bmxlc3MoIGRlZmluZWQgJGZpbGUgKSB7CiAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbTm8gZmlsZSB0byByZWFkIGZyb20hXSApOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgJHNlbGYtPl9maWxlKCAkZmlsZSApOwogICAgfQoKICAgIG15ICRoYW5kbGUgPSAkc2VsZi0+X2dldF9oYW5kbGUoJGZpbGUsICRnemlwLCBSRUFEX09OTFktPiggWkxJQiApICkKICAgICAgICAgICAgICAgICAgICBvciByZXR1cm47CgogICAgbXkgJGRhdGEgPSAkc2VsZi0+X3JlYWRfdGFyKCAkaGFuZGxlLCAkb3B0cyApIG9yIHJldHVybjsKCiAgICAkc2VsZi0+X2RhdGEoICRkYXRhICk7CgogICAgcmV0dXJuIHdhbnRhcnJheSA/IEAkZGF0YSA6IHNjYWxhciBAJGRhdGE7Cn0KCnN1YiBfZ2V0X2hhbmRsZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZSBpZiByZWYgJGZpbGU7CgogICAgbXkgJGd6aXAgPSBzaGlmdCB8fCAwOwogICAgbXkgJG1vZGUgPSBzaGlmdCB8fCBSRUFEX09OTFktPiggWkxJQiApOyAjIGRlZmF1bHQgdG8gcmVhZCBvbmx5CgogICAgbXkgJGZoOyBteSAkYmluOwoKICAgICMjIyBvbmx5IGRlZmF1bHQgdG8gWkxJQiBpZiB3ZSdyZSBub3QgdHJ5aW5nIHRvIC93cml0ZS8gdG8gYSBoYW5kbGUgIyMjCiAgICBpZiggWkxJQiBhbmQgJGd6aXAgfHwgTU9ERV9SRUFELT4oICRtb2RlICkgKSB7CgogICAgICAgICMjIyBJTzo6WmxpYiB3aWxsIERvIFRoZSBSaWdodCBUaGluZywgZXZlbiB3aGVuIHBhc3NlZAogICAgICAgICMjIyBhIHBsYWluIGZpbGUgIyMjCiAgICAgICAgJGZoID0gbmV3IElPOjpabGliOwoKICAgIH0gZWxzZSB7CiAgICAgICAgaWYoICRnemlwICkgewogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKHFxW0NvbXByZXNzaW9uIG5vdCBhdmFpbGFibGUgLSBJbnN0YWxsIElPOjpabGliIV0pOwogICAgICAgICAgICByZXR1cm47CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRmaCA9IG5ldyBJTzo6RmlsZTsKICAgICAgICAgICAgJGJpbisrOwogICAgICAgIH0KICAgIH0KCiAgICB1bmxlc3MoICRmaC0+b3BlbiggJGZpbGUsICRtb2RlICkgKSB7CiAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IGNyZWF0ZSBmaWxlaGFuZGxlIGZvciAnJGZpbGUnOiAkISFdICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGJpbm1vZGUgJGZoIGlmICRiaW47CgogICAgcmV0dXJuICRmaDsKfQoKc3ViIF9yZWFkX3RhciB7CiAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJGhhbmRsZSAgPSBzaGlmdCBvciByZXR1cm47CiAgICBteSAkb3B0cyAgICA9IHNoaWZ0IHx8IHt9OwoKICAgIG15ICRjb3VudCAgID0gJG9wdHMtPntsaW1pdH0gICAgfHwgMDsKICAgIG15ICRleHRyYWN0ID0gJG9wdHMtPntleHRyYWN0fSAgfHwgMDsKCiAgICAjIyMgc2V0IGEgY2FwIG9uIHRoZSBhbW91bnQgb2YgZmlsZXMgdG8gZXh0cmFjdCAjIyMKICAgIG15ICRsaW1pdCAgID0gMDsKICAgICRsaW1pdCA9IDEgaWYgJGNvdW50ID4gMDsKCiAgICBteSAkdGFyZmlsZSA9IFsgXTsKICAgIG15ICRjaHVuazsKICAgIG15ICRyZWFkID0gMDsKICAgIG15ICRyZWFsX25hbWU7ICAjIHRvIHNldCB0aGUgbmFtZSBvZiBhIGZpbGUgd2hlbgogICAgICAgICAgICAgICAgICAgICMgd2UncmUgZW5jb3VudGVyaW5nIEBsb25nbGluawogICAgbXkgJGRhdGE7CgogICAgTE9PUDoKICAgIHdoaWxlKCAkaGFuZGxlLT5yZWFkKCAkY2h1bmssIEhFQUQgKSApIHsKICAgICAgICAjIyMgSU86OlpsaWIgZG9lc24ndCBzdXBwb3J0IHRoaXMgeWV0CiAgICAgICAgbXkgJG9mZnNldCA9IGV2YWwgeyB0ZWxsICRoYW5kbGUgfSB8fCAndW5rbm93bic7CgogICAgICAgIHVubGVzcyggJHJlYWQrKyApIHsKICAgICAgICAgICAgbXkgJGd6aXAgPSBHWklQX01BR0lDX05VTTsKICAgICAgICAgICAgaWYoICRjaHVuayA9fiAvJGd6aXAvICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ2Fubm90IHJlYWQgY29tcHJlc3NlZCBmb3JtYXQgaW4gdGFyLW1vZGVdICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMjIyBpZiB3ZSBjYW4ndCByZWFkIGluIGFsbCBieXRlcy4uLiAjIyMKICAgICAgICBsYXN0IGlmIGxlbmd0aCAkY2h1bmsgIT0gSEVBRDsKCiAgICAgICAgIyMjIEFwcGFyZW50bHkgdGhpcyBzaG91bGQgcmVhbGx5IGJlIHR3byBibG9ja3Mgb2YgNTEyIHplcm9lcywKICAgICAgICAjIyMgYnV0IEdOVSB0YXIgc29tZXRpbWVzIGdldHMgaXQgd3JvbmcuIFNlZSBjb21tZW50IGluIHRoZQogICAgICAgICMjIyBzb3VyY2UgY29kZSAodGFyLmMpIHRvIEdOVSBjcGlvLgogICAgICAgIG5leHQgaWYgJGNodW5rIGVxIFRBUl9FTkQ7CgogICAgICAgICMjIyBhY2NvcmRpbmcgdG8gdGhlIHBvc2l4IHNwZWMsIHRoZSBsYXN0IDEyIGJ5dGVzIG9mIHRoZSBoZWFkZXIgYXJlCiAgICAgICAgIyMjIG51bGwgYnl0ZXMsIHRvIHBhZCBpdCB0byBhIDUxMiBieXRlIGJsb2NrLiBUaGF0IG1lYW5zIGlmIHRoZXNlCiAgICAgICAgIyMjIGJ5dGVzIGFyZSBOT1QgbnVsbCBieXRlcywgaXQncyBhIGNvcnJydXB0IGhlYWRlci4gU2VlOgogICAgICAgICMjIyB3d3cua29kZXJzLmNvbS9jL2ZpZENFNDczQUQzRDlGODM1RDY5MDI1OUQ2MEFENTY1NDU5MUQ5MUQ1QkEuYXNweAogICAgICAgICMjIyBsaW5lIDExMQogICAgICAgIHsgICBteSAkbnVsbHMgPSBqb2luICcnLCAiXDAiIHggMTI7CiAgICAgICAgICAgIHVubGVzcyggJG51bGxzIGVxIHN1YnN0ciggJGNodW5rLCA1MDAsIDEyICkgKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtJbnZhbGlkIGhlYWRlciBibG9jayBhdCBvZmZzZXQgJG9mZnNldF0gKTsKICAgICAgICAgICAgICAgIG5leHQgTE9PUDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyMjIHBhc3MgdGhlIHJlYWxuYW1lLCBzbyB3ZSBjYW4gc2V0IGl0ICdwcm9wZXInIHJpZ2h0IGF3YXkKICAgICAgICAjIyMgc29tZSBvZiB0aGUgaGV1cmlzdGljcyBhcmUgZG9uZSBvbiB0aGUgbmFtZSwgc28gaW1wb3J0YW50CiAgICAgICAgIyMjIHRvIHNldCBpdCBBU0FQCiAgICAgICAgbXkgJGVudHJ5OwogICAgICAgIHsgICBteSAlZXh0cmFfYXJncyA9ICgpOwogICAgICAgICAgICAkZXh0cmFfYXJnc3snbmFtZSd9ID0gJCRyZWFsX25hbWUgaWYgZGVmaW5lZCAkcmVhbF9uYW1lOwogICAgICAgICAgICAKICAgICAgICAgICAgdW5sZXNzKCAkZW50cnkgPSBBcmNoaXZlOjpUYXI6OkZpbGUtPm5ldyggICBjaHVuayA9PiAkY2h1bmssIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVleHRyYV9hcmdzICkgCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGRuJ3QgcmVhZCBjaHVuayBhdCBvZmZzZXQgJG9mZnNldF0gKTsKICAgICAgICAgICAgICAgIG5leHQgTE9PUDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyMjIGlnbm9yZSBsYWJlbHM6CiAgICAgICAgIyMjIGh0dHA6Ly93d3cuZ251Lm9yZy9tYW51YWwvdGFyL2h0bWxfbm9kZS90YXJfMTM5Lmh0bWwKICAgICAgICBuZXh0IGlmICRlbnRyeS0+aXNfbGFiZWw7CgogICAgICAgIGlmKCBsZW5ndGggJGVudHJ5LT50eXBlIGFuZCAoJGVudHJ5LT5pc19maWxlIHx8ICRlbnRyeS0+aXNfbG9uZ2xpbmspICkgewoKICAgICAgICAgICAgaWYgKCAkZW50cnktPmlzX2ZpbGUgJiYgISRlbnRyeS0+dmFsaWRhdGUgKSB7CiAgICAgICAgICAgICAgICAjIyMgc29tZXRpbWVzIHRoZSBjaHVuayBpcyByYXRoZXIgZnV4MHIzZCBhbmQgYSB3aG9sZSA1MTIKICAgICAgICAgICAgICAgICMjIyBieXRlcyBlbmRzIHVwIGluIHRoZSAtPm5hbWUgYXJlYS4KICAgICAgICAgICAgICAgICMjIyBjbGVhbiBpdCB1cCwgaWYgbmVlZCBiZQogICAgICAgICAgICAgICAgbXkgJG5hbWUgPSAkZW50cnktPm5hbWU7CiAgICAgICAgICAgICAgICAkbmFtZSA9IHN1YnN0cigkbmFtZSwgMCwgMTAwKSBpZiBsZW5ndGggJG5hbWUgPiAxMDA7CiAgICAgICAgICAgICAgICAkbmFtZSA9fiBzL1xuLyAvZzsKCiAgICAgICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCAkbmFtZSAuIHFxWzogY2hlY2tzdW0gZXJyb3JdICk7CiAgICAgICAgICAgICAgICBuZXh0IExPT1A7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRibG9jayA9IEJMT0NLX1NJWkUtPiggJGVudHJ5LT5zaXplICk7CgogICAgICAgICAgICAkZGF0YSA9ICRlbnRyeS0+Z2V0X2NvbnRlbnRfYnlfcmVmOwoKICAgICAgICAgICAgIyMjIGp1c3QgcmVhZCBldmVyeXRoaW5nIGludG8gbWVtb3J5CiAgICAgICAgICAgICMjIyBjYW4ndCBkbyBsYXp5IGxvYWRpbmcgc2luY2UgSU86OlpsaWIgZG9lc24ndCBzdXBwb3J0ICdzZWVrJwogICAgICAgICAgICAjIyMgdGhpcyBpcyBiZWNhdXNlIENvbXByZXNzOjpabGliIGRvZXNuJ3Qgc3VwcG9ydCBpdCA9LwogICAgICAgICAgICAjIyMgdGhpcyByZWFkcyBpbiB0aGUgd2hvbGUgZGF0YSBpbiBvbmUgcmVhZCgpIGNhbGwuCiAgICAgICAgICAgIGlmKCAkaGFuZGxlLT5yZWFkKCAkJGRhdGEsICRibG9jayApIDwgJGJsb2NrICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbUmVhZCBlcnJvciBvbiB0YXJmaWxlIChtaXNzaW5nIGRhdGEpICddLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW50cnktPmZ1bGxfcGF0aCAuIicgYXQgb2Zmc2V0ICRvZmZzZXQiICk7CiAgICAgICAgICAgICAgICBuZXh0IExPT1A7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyB0aHJvdyBhd2F5IHRyYWlsaW5nIGdhcmJhZ2UgIyMjCiAgICAgICAgICAgIHN1YnN0ciAoJCRkYXRhLCAkZW50cnktPnNpemUpID0gIiIgaWYgZGVmaW5lZCAkJGRhdGE7CgogICAgICAgICAgICAjIyMgcGFydCBJSSBvZiB0aGUgQExvbmdMaW5rIG11bmdpbmcgLS0gbmVlZCB0byBkbyAvYWZ0ZXIvCiAgICAgICAgICAgICMjIyB0aGUgY2hlY2tzdW0gY2hlY2suCiAgICAgICAgICAgIGlmKCAkZW50cnktPmlzX2xvbmdsaW5rICkgewogICAgICAgICAgICAgICAgIyMjIHdlaXJkIHRoaW5nIGluIHRhcmZpbGVzIC0tIGlmIHRoZSBmaWxlIGlzIGFjdHVhbGx5IGEKICAgICAgICAgICAgICAgICMjIyBATG9uZ0xpbmssIHRoZSBkYXRhIHBhcnQgc2VlbXMgdG8gaGF2ZSBhIHRyYWlsaW5nIF5ACiAgICAgICAgICAgICAgICAjIyMgKHVucHJpbnRhYmxlKSBjaGFyLiB0byBkaXNwbGF5LCBwaXBlIG91dHB1dCB0aHJvdWdoIGxlc3MuCiAgICAgICAgICAgICAgICAjIyMgYnV0IHRoYXQgZG9lc24ndCAqYWx3YXlzKiBoYXBwZW4uLiBzbyBjaGVjayBpZiB0aGUgbGFzdAogICAgICAgICAgICAgICAgIyMjIGNoYXJhY3RlciBpcyBhIGNvbnRyb2wgY2hhcmFjdGVyLCBhbmQgaWYgc28gcmVtb3ZlIGl0CiAgICAgICAgICAgICAgICAjIyMgYXQgYW55IHJhdGUsIHdlIGJldHRlciByZW1vdmUgdGhhdCBjaGFyYWN0ZXIgaGVyZSwgb3IgdGVzdHMKICAgICAgICAgICAgICAgICMjIyBsaWtlICdlcScgYW5kIGhhc2hsb29rIHVwcyBiYXNlZCBvbiBuYW1lcyB3aWxsIFNPIG5vdCB3b3JrCiAgICAgICAgICAgICAgICAjIyMgcmVtb3ZlIGl0IGJ5IGNhbGN1bGF0aW5nIHRoZSBwcm9wZXIgc2l6ZSwgYW5kIHRoZW4KICAgICAgICAgICAgICAgICMjIyB0b3NzaW5nIG91dCBldmVyeXRoaW5nIHRoYXQncyBsb25nZXIgdGhhbiB0aGF0IHNpemUuCgogICAgICAgICAgICAgICAgIyMjIGNvdW50IG51bWJlciBvZiBudWxscwogICAgICAgICAgICAgICAgbXkgJG51bGxzID0gJCRkYXRhID1+IHRyL1wwL1wwLzsKCiAgICAgICAgICAgICAgICAjIyMgY3V0IGRhdGEgKyBzaXplIGJ5IHRoYXQgbWFueSBieXRlcwogICAgICAgICAgICAgICAgJGVudHJ5LT5zaXplKCAkZW50cnktPnNpemUgLSAkbnVsbHMgKTsKICAgICAgICAgICAgICAgIHN1YnN0ciAoJCRkYXRhLCAkZW50cnktPnNpemUpID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMjIyBjbGVhbiB1cCBvZiB0aGUgZW50cmllcy4uIHBvc2l4IHRhciAvYXBwYXJlbnRseS8gaGFzIHNvbWUKICAgICAgICAjIyMgd2VpcmQgJ2ZlYXR1cmUnIHRoYXQgYWxsb3dzIGZvciBmaWxlbmFtZXMgPiAyNTUgY2hhcmFjdGVycwogICAgICAgICMjIyB0aGV5J2xsIHB1dCBhIGhlYWRlciBpbiB3aXRoIGFzIG5hbWUgJy4vLi9ATG9uZ0xpbmsnIGFuZCB0aGUKICAgICAgICAjIyMgY29udGVudHMgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgL25leHQvIGZpbGUgaW4gdGhlIGFyY2hpdmUKICAgICAgICAjIyMgcHJldHR5IGNyYXBweSBhbmQga2x1ZGd5IGlmIHlvdSBhc2sgbWUKCiAgICAgICAgIyMjIHNldCB0aGUgbmFtZSBmb3IgdGhlIG5leHQgZW50cnkgaWYgdGhpcyBpcyBhIEBMb25nTGluazsKICAgICAgICAjIyMgdGhpcyBpcyBvbmUgdWdseSBoYWNrID0vIGJ1dCBuZWVkZWQgZm9yIGRpcmVjdCBleHRyYWN0aW9uCiAgICAgICAgaWYoICRlbnRyeS0+aXNfbG9uZ2xpbmsgKSB7CiAgICAgICAgICAgICRyZWFsX25hbWUgPSAkZGF0YTsKICAgICAgICAgICAgbmV4dCBMT09QOwogICAgICAgIH0gZWxzaWYgKCBkZWZpbmVkICRyZWFsX25hbWUgKSB7CiAgICAgICAgICAgICRlbnRyeS0+bmFtZSggJCRyZWFsX25hbWUgKTsKICAgICAgICAgICAgJGVudHJ5LT5wcmVmaXgoJycpOwogICAgICAgICAgICB1bmRlZiAkcmVhbF9uYW1lOwogICAgICAgIH0KCiAgICAgICAgJHNlbGYtPl9leHRyYWN0X2ZpbGUoICRlbnRyeSApIGlmICRleHRyYWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRlbnRyeS0+aXNfbG9uZ2xpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhJGVudHJ5LT5pc191bmtub3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRlbnRyeS0+aXNfbGFiZWw7CgogICAgICAgICMjIyBHdWFyZCBhZ2FpbnN0IHRhcmZpbGVzIHdpdGggZ2FyYmFnZSBhdCB0aGUgZW5kCgkgICAgbGFzdCBMT09QIGlmICRlbnRyeS0+bmFtZSBlcSAnJzsKCiAgICAgICAgIyMjIHB1c2ggb25seSB0aGUgbmFtZSBvbiB0aGUgcnYgaWYgd2UncmUgZXh0cmFjdGluZwogICAgICAgICMjIyAtLSBmb3IgZXh0cmFjdF9hcmNoaXZlCiAgICAgICAgcHVzaCBAJHRhcmZpbGUsICgkZXh0cmFjdCA/ICRlbnRyeS0+bmFtZSA6ICRlbnRyeSk7CgogICAgICAgIGlmKCAkbGltaXQgKSB7CiAgICAgICAgICAgICRjb3VudC0tIHVubGVzcyAkZW50cnktPmlzX2xvbmdsaW5rIHx8ICRlbnRyeS0+aXNfZGlyOwogICAgICAgICAgICBsYXN0IExPT1AgdW5sZXNzICRjb3VudDsKICAgICAgICB9CiAgICB9IGNvbnRpbnVlIHsKICAgICAgICB1bmRlZiAkZGF0YTsKICAgIH0KCiAgICByZXR1cm4gJHRhcmZpbGU7Cn0KCj1oZWFkMiAkdGFyLT5jb250YWluc19maWxlKCAkZmlsZW5hbWUgKQoKQ2hlY2sgaWYgdGhlIGFyY2hpdmUgY29udGFpbnMgYSBjZXJ0YWluIGZpbGUuCkl0IHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgaXMgaW4gdGhlIGFyY2hpdmUsIGZhbHNlIG90aGVyd2lzZS4KCk5vdGUgaG93ZXZlciwgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgYW4gZXhhY3QgbWF0Y2ggdXNpbmcgQzxlcT4Kb24gdGhlIGZ1bGwgcGF0aC4gU28gaXQgY2Fubm90IGNvbXBlbnNhdGUgZm9yIGNhc2UtaW5zZW5zaXRpdmUgZmlsZS0Kc3lzdGVtcyBvciBjb21wYXJlIDIgcGF0aHMgdG8gc2VlIGlmIHRoZXkgd291bGQgcG9pbnQgdG8gdGhlIHNhbWUKdW5kZXJseWluZyBmaWxlLgoKPWN1dAoKc3ViIGNvbnRhaW5zX2ZpbGUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRmdWxsID0gc2hpZnQ7CiAgICAKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZnVsbDsKCiAgICAjIyMgZG9uJ3Qgd2FybiBpZiB0aGUgZW50cnkgaXNuJ3QgdGhlcmUuLiB0aGF0J3Mgd2hhdCB0aGlzIGZ1bmN0aW9uCiAgICAjIyMgaXMgZm9yIGFmdGVyIGFsbC4KICAgIGxvY2FsICRXQVJOID0gMDsKICAgIHJldHVybiAxIGlmICRzZWxmLT5fZmluZF9lbnRyeSgkZnVsbCk7CiAgICByZXR1cm47Cn0KCj1oZWFkMiAkdGFyLT5leHRyYWN0KCBbQGZpbGVuYW1lc10gKQoKV3JpdGUgZmlsZXMgd2hvc2UgbmFtZXMgYXJlIGVxdWl2YWxlbnQgdG8gYW55IG9mIHRoZSBuYW1lcyBpbgpDPEBmaWxlbmFtZXM+IHRvIGRpc2ssIGNyZWF0aW5nIHN1YmRpcmVjdG9yaWVzIGFzIG5lY2Vzc2FyeS4gVGhpcwptaWdodCBub3Qgd29yayB0b28gd2VsbCB1bmRlciBWTVMuClVuZGVyIE1hY1BlcmwsIHRoZSBmaWxlJ3MgbW9kaWZpY2F0aW9uIHRpbWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlCk1hY09TIHplcm8gb2YgdGltZSwgYW5kIGFwcHJvcHJpYXRlIGNvbnZlcnNpb25zIHdpbGwgYmUgZG9uZSB0byB0aGUKcGF0aC4gIEhvd2V2ZXIsIHRoZSBsZW5ndGggb2YgZWFjaCBlbGVtZW50IG9mIHRoZSBwYXRoIGlzIG5vdAppbnNwZWN0ZWQgdG8gc2VlIHdoZXRoZXIgaXQncyBsb25nZXIgdGhhbiBNYWNPUyBjdXJyZW50bHkgYWxsb3dzICgzMgpjaGFyYWN0ZXJzKS4KCklmIEM8ZXh0cmFjdD4gaXMgY2FsbGVkIHdpdGhvdXQgYSBsaXN0IG9mIGZpbGUgbmFtZXMsIHRoZSBlbnRpcmUKY29udGVudHMgb2YgdGhlIGFyY2hpdmUgYXJlIGV4dHJhY3RlZC4KClJldHVybnMgYSBsaXN0IG9mIGZpbGVuYW1lcyBleHRyYWN0ZWQuCgo9Y3V0CgpzdWIgZXh0cmFjdCB7CiAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgbXkgQGFyZ3MgICAgPSBAXzsKICAgIG15IEBmaWxlczsKCiAgICAjIHVzZSB0aGUgc3BlZWQgb3B0aW1pemF0aW9uIGZvciBhbGwgZXh0cmFjdGVkIGZpbGVzCiAgICBsb2NhbCgkc2VsZi0+e2N3ZH0pID0gY3dkKCkgdW5sZXNzICRzZWxmLT57Y3dkfTsKCiAgICAjIyMgeW91IHJlcXVlc3RlZCB0aGUgZXh0cmFjdGlvbiBvZiBvbmx5IGNlcnRpYW4gZmlsZXMKICAgIGlmKCBAYXJncyApIHsKICAgICAgICBmb3IgbXkgJGZpbGUgKCBAYXJncyApIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICMjIyBpdCdzIGFscmVhZHkgYW4gb2JqZWN0PwogICAgICAgICAgICBpZiggVU5JVkVSU0FMOjppc2EoICRmaWxlLCAnQXJjaGl2ZTo6VGFyOjpGaWxlJyApICkgewogICAgICAgICAgICAgICAgcHVzaCBAZmlsZXMsICRmaWxlOwogICAgICAgICAgICAgICAgbmV4dDsKCiAgICAgICAgICAgICMjIyBnbyBmaW5kIGl0IHRoZW4KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBteSAkZm91bmQ7CiAgICAgICAgICAgICAgICBmb3IgbXkgJGVudHJ5ICggQHskc2VsZi0+X2RhdGF9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgdW5sZXNzICRmaWxlIGVxICRlbnRyeS0+ZnVsbF9wYXRoOwogICAgCiAgICAgICAgICAgICAgICAgICAgIyMjIHdlIGZvdW5kIHRoZSBmaWxlIHlvdSdyZSBsb29raW5nIGZvcgogICAgICAgICAgICAgICAgICAgIHB1c2ggQGZpbGVzLCAkZW50cnk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kKys7CiAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgIHVubGVzcyggJGZvdW5kICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkc2VsZi0+X2Vycm9yKCAKICAgICAgICAgICAgICAgICAgICAgICAgcXFbQ291bGQgbm90IGZpbmQgJyRmaWxlJyBpbiBhcmNoaXZlXSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICMjIyBqdXN0IGdyYWIgYWxsIHRoZSBmaWxlIGl0ZW1zCiAgICB9IGVsc2UgewogICAgICAgIEBmaWxlcyA9ICRzZWxmLT5nZXRfZmlsZXM7CiAgICB9CgogICAgIyMjIG5vdGhpbmcgZm91bmQ/IHRoYXQncyBhbiBlcnJvcgogICAgdW5sZXNzKCBzY2FsYXIgQGZpbGVzICkgewogICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW05vIGZpbGVzIGZvdW5kIGZvciBdIC4gJHNlbGYtPl9maWxlICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMjIyBub3cgZXh0cmFjdCB0aGVtCiAgICBmb3IgbXkgJGVudHJ5ICggQGZpbGVzICkgewogICAgICAgIHVubGVzcyggJHNlbGYtPl9leHRyYWN0X2ZpbGUoICRlbnRyeSApICkgewogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKHFbQ291bGQgbm90IGV4dHJhY3QgJ10uICRlbnRyeS0+ZnVsbF9wYXRoIC5xWyddICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBmaWxlczsKfQoKPWhlYWQyICR0YXItPmV4dHJhY3RfZmlsZSggJGZpbGUsIFskZXh0cmFjdF9wYXRoXSApCgpXcml0ZSBhbiBlbnRyeSwgd2hvc2UgbmFtZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBmaWxlIG5hbWUgcHJvdmlkZWQgdG8KZGlzay4gT3B0aW9uYWxseSB0YWtlcyBhIHNlY29uZCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBmdWxsICh1bml4KQpwYXRoIChpbmNsdWRpbmcgZmlsZW5hbWUpIHRoZSBlbnRyeSB3aWxsIGJlIHdyaXR0ZW4gdG8uCgpGb3IgZXhhbXBsZToKCiAgICAkdGFyLT5leHRyYWN0X2ZpbGUoICduYW1lL2luL2FyY2hpdmUnLCAnbmFtZS9pL3dhbnQvdG8vZ2l2ZS9pdCcgKTsKCiAgICAkdGFyLT5leHRyYWN0X2ZpbGUoICRhdF9maWxlX29iamVjdCwgICAnbmFtZS9pL3dhbnQvdG8vZ2l2ZS9pdCcgKTsKClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIGV4dHJhY3RfZmlsZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkYWx0ICA9IHNoaWZ0OwoKICAgIG15ICRlbnRyeSA9ICRzZWxmLT5fZmluZF9lbnRyeSggJGZpbGUgKQogICAgICAgIG9yICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCBmaW5kIGFuIGVudHJ5IGZvciAnJGZpbGUnXSApLCByZXR1cm47CgogICAgcmV0dXJuICRzZWxmLT5fZXh0cmFjdF9maWxlKCAkZW50cnksICRhbHQgKTsKfQoKc3ViIF9leHRyYWN0X2ZpbGUgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICRlbnRyeSAgID0gc2hpZnQgb3IgcmV0dXJuOwogICAgbXkgJGFsdCAgICAgPSBzaGlmdDsKCiAgICAjIyMgeW91IHdhbnRlZCBhbiBhbHRlcm5hdGUgZXh0cmFjdGlvbiBsb2NhdGlvbiAjIyMKICAgIG15ICRuYW1lID0gZGVmaW5lZCAkYWx0ID8gJGFsdCA6ICRlbnRyeS0+ZnVsbF9wYXRoOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBzcGxpdHBhdGggdGFrZXMgYSBib29sIGF0IHRoZSBlbmQgdG8gaW5kaWNhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyB0aGF0IGl0J3Mgc3BsaXR0aW5nIGEgZGlyCiAgICBteSAoJHZvbCwkZGlycywkZmlsZSk7CiAgICBpZiAoIGRlZmluZWQgJGFsdCApIHsgIyBJdCdzIGEgbG9jYWwtT1MgcGF0aAogICAgICAgICgkdm9sLCRkaXJzLCRmaWxlKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggICAgICAgJGFsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbnRyeS0+aXNfZGlyICk7CiAgICB9IGVsc2UgewogICAgICAgICgkdm9sLCRkaXJzLCRmaWxlKSA9IEZpbGU6OlNwZWM6OlVuaXgtPnNwbGl0cGF0aCggJG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW50cnktPmlzX2RpciApOwogICAgfQoKICAgIG15ICRkaXI7CiAgICAjIyMgaXMgJG5hbWUgYW4gYWJzb2x1dGUgcGF0aD8gIyMjCiAgICBpZiggRmlsZTo6U3BlYy0+ZmlsZV9uYW1lX2lzX2Fic29sdXRlKCAkZGlycyApICkgewogICAgICAgICRkaXIgPSAkZGlyczsKCiAgICAjIyMgaXQncyBhIHJlbGF0aXZlIHBhdGggIyMjCiAgICB9IGVsc2UgewogICAgICAgIG15ICRjd2QgICAgID0gKGRlZmluZWQgJHNlbGYtPntjd2R9ID8gJHNlbGYtPntjd2R9IDogY3dkKCkpOwogICAgICAgIG15IEBkaXJzICAgID0gRmlsZTo6U3BlYzo6VW5peC0+c3BsaXRkaXIoICRkaXJzICk7CiAgICAgICAgbXkgQGN3ZCAgICAgPSBGaWxlOjpTcGVjLT5zcGxpdGRpciggJGN3ZCApOwogICAgICAgICRkaXIgICAgICAgID0gRmlsZTo6U3BlYy0+Y2F0ZGlyKCBAY3dkLCBAZGlycyApOwoKICAgICAgICAjIGNhdGRpcigpIHJldHVybnMgdW5kZWYgaWYgdGhlIHBhdGggaXMgbG9uZ2VyIHRoYW4gMjU1IGNoYXJzIG9uIFZNUwogICAgICAgIHVubGVzcyAoIGRlZmluZWQgJGRpciApIHsKICAgICAgICAgICAgJF5XICYmICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCBjb21wb3NlIGEgcGF0aCBmb3IgJyRkaXJzJ1xuXSApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgIH0KCiAgICBpZiggLWUgJGRpciAmJiAhLWQgXyApIHsKICAgICAgICAkXlcgJiYgJHNlbGYtPl9lcnJvciggcXFbJyRkaXInIGV4aXN0cywgYnV0IGl0J3Mgbm90IGEgZGlyZWN0b3J5IVxuXSApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB1bmxlc3MgKCAtZCBfICkgewogICAgICAgIGV2YWwgeyBGaWxlOjpQYXRoOjpta3BhdGgoICRkaXIsIDAsIDA3NzcgKSB9OwogICAgICAgIGlmKCAkQCApIHsKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgJyRkaXInOiAkQF0gKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAjIyMgWFhYIGNob3duIGhlcmU/IHRoYXQgbWlnaHQgbm90IGJlIHRoZSBzYW1lIGFzIGluIHRoZSBhcmNoaXZlCiAgICAgICAgIyMjIGFzIHdlJ3JlIG9ubHkgY2hvd24naW5nIHRvIHRoZSBvd25lciBvZiB0aGUgZmlsZSB3ZSdyZSBleHRyYWN0aW5nCiAgICAgICAgIyMjIG5vdCB0byB0aGUgb3duZXIgb2YgdGhlIGRpcmVjdG9yeSBpdHNlbGYsIHdoaWNoIG1heSBvciBtYXkgbm90CiAgICAgICAgIyMjIGJlIGFub3RoZXIgZW50cnkgaW4gdGhlIGFyY2hpdmUKICAgICAgICAjIyMgQW5zd2VyOiBubywgZ251IHRhciBkb2Vzbid0IGRvIGl0IGVpdGhlciwgaXQnZCBiZSB0aGUgd3JvbmcKICAgICAgICAjIyMgd2F5IHRvIGdvLgogICAgICAgICNpZiggJENIT1dOICYmIENBTl9DSE9XTiApIHsKICAgICAgICAjICAgIGNob3duICRlbnRyeS0+dWlkLCAkZW50cnktPmdpZCwgJGRpciBvcgogICAgICAgICMgICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCBzZXQgdWlkL2dpZCBvbiAnJGRpciddICk7CiAgICAgICAgI30KICAgIH0KCiAgICAjIyMgd2UncmUgZG9uZSBpZiB3ZSBqdXN0IG5lZWRlZCB0byBjcmVhdGUgYSBkaXIgIyMjCiAgICByZXR1cm4gMSBpZiAkZW50cnktPmlzX2RpcjsKCiAgICBteSAkZnVsbCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoICRkaXIsICRmaWxlICk7CgogICAgaWYoICRlbnRyeS0+aXNfdW5rbm93biApIHsKICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtVbmtub3duIGZpbGUgdHlwZSBmb3IgZmlsZSAnJGZ1bGwnXSApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiggbGVuZ3RoICRlbnRyeS0+dHlwZSAmJiAkZW50cnktPmlzX2ZpbGUgKSB7CiAgICAgICAgbXkgJGZoID0gSU86OkZpbGUtPm5ldzsKICAgICAgICAkZmgtPm9wZW4oICc+JyAuICRmdWxsICkgb3IgKAogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtDb3VsZCBub3Qgb3BlbiBmaWxlICckZnVsbCc6ICQhXSApLAogICAgICAgICAgICByZXR1cm4KICAgICAgICApOwoKICAgICAgICBpZiggJGVudHJ5LT5zaXplICkgewogICAgICAgICAgICBiaW5tb2RlICRmaDsKICAgICAgICAgICAgc3lzd3JpdGUgJGZoLCAkZW50cnktPmRhdGEgb3IgKAogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IHdyaXRlIGRhdGEgdG8gJyRmdWxsJ10gKSwKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgY2xvc2UgJGZoIG9yICgKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IGNsb3NlIGZpbGUgJyRmdWxsJ10gKSwKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgKTsKCiAgICB9IGVsc2UgewogICAgICAgICRzZWxmLT5fbWFrZV9zcGVjaWFsX2ZpbGUoICRlbnRyeSwgJGZ1bGwgKSBvciByZXR1cm47CiAgICB9CgogICAgdXRpbWUgdGltZSwgJGVudHJ5LT5tdGltZSAtIFRJTUVfT0ZGU0VULCAkZnVsbCBvcgogICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCB1cGRhdGUgdGltZXN0YW1wXSApOwoKICAgIGlmKCAkQ0hPV04gJiYgQ0FOX0NIT1dOICkgewogICAgICAgIGNob3duICRlbnRyeS0+dWlkLCAkZW50cnktPmdpZCwgJGZ1bGwgb3IKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IHNldCB1aWQvZ2lkIG9uICckZnVsbCddICk7CiAgICB9CgogICAgIyMjIG9ubHkgY2htb2QgaWYgd2UncmUgYWxsb3dlZCB0bywgYnV0IG5ldmVyIGNobW9kIHN5bWxpbmtzLCBzaW5jZSB0aGV5J2xsCiAgICAjIyMgY2hhbmdlIHRoZSBwZXJtcyBvbiB0aGUgZmlsZSB0aGV5J3JlIGxpbmtpbmcgdG9vLi4uCiAgICBpZiggJENITU9EIGFuZCBub3QgLWwgJGZ1bGwgKSB7CiAgICAgICAgY2htb2QgJGVudHJ5LT5tb2RlLCAkZnVsbCBvcgogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtDb3VsZCBub3QgY2hvd24gJyRmdWxsJyB0byBdIC4gJGVudHJ5LT5tb2RlICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfbWFrZV9zcGVjaWFsX2ZpbGUgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICRlbnRyeSAgID0gc2hpZnQgICAgIG9yIHJldHVybjsKICAgIG15ICRmaWxlICAgID0gc2hpZnQ7ICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZmlsZTsKCiAgICBteSAkZXJyOwoKICAgIGlmKCAkZW50cnktPmlzX3N5bWxpbmsgKSB7CiAgICAgICAgbXkgJGZhaWw7CiAgICAgICAgaWYoIE9OX1VOSVggKSB7CiAgICAgICAgICAgIHN5bWxpbmsoICRlbnRyeS0+bGlua25hbWUsICRmaWxlICkgb3IgJGZhaWwrKzsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPl9leHRyYWN0X3NwZWNpYWxfZmlsZV9hc19wbGFpbl9maWxlKCAkZW50cnksICRmaWxlICkKICAgICAgICAgICAgICAgIG9yICRmYWlsKys7CiAgICAgICAgfQoKICAgICAgICAkZXJyID0gIHFxW01ha2luZyBzeW1ib2xpbmsgbGluayBmcm9tICddIC4gJGVudHJ5LT5saW5rbmFtZSAuCiAgICAgICAgICAgICAgICBxcVsnIHRvICckZmlsZScgZmFpbGVkXSBpZiAkZmFpbDsKCiAgICB9IGVsc2lmICggJGVudHJ5LT5pc19oYXJkbGluayApIHsKICAgICAgICBteSAkZmFpbDsKICAgICAgICBpZiggT05fVU5JWCApIHsKICAgICAgICAgICAgbGluayggJGVudHJ5LT5saW5rbmFtZSwgJGZpbGUgKSBvciAkZmFpbCsrOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc2VsZi0+X2V4dHJhY3Rfc3BlY2lhbF9maWxlX2FzX3BsYWluX2ZpbGUoICRlbnRyeSwgJGZpbGUgKQogICAgICAgICAgICAgICAgb3IgJGZhaWwrKzsKICAgICAgICB9CgogICAgICAgICRlcnIgPSAgcXFbTWFraW5nIGhhcmQgbGluayBmcm9tICddIC4gJGVudHJ5LT5saW5rbmFtZSAuCiAgICAgICAgICAgICAgICBxcVsnIHRvICckZmlsZScgZmFpbGVkXSBpZiAkZmFpbDsKCiAgICB9IGVsc2lmICggJGVudHJ5LT5pc19maWZvICkgewogICAgICAgIE9OX1VOSVggJiYgIXN5c3RlbSgnbWtub2QnLCAkZmlsZSwgJ3AnKSBvcgogICAgICAgICAgICAkZXJyID0gcXFbTWFraW5nIGZpZm8gJ10uICRlbnRyeS0+bmFtZSAucXFbJyBmYWlsZWRdOwoKICAgIH0gZWxzaWYgKCAkZW50cnktPmlzX2Jsb2NrZGV2IG9yICRlbnRyeS0+aXNfY2hhcmRldiApIHsKICAgICAgICBteSAkbW9kZSA9ICRlbnRyeS0+aXNfYmxvY2tkZXYgPyAnYicgOiAnYyc7CgogICAgICAgIE9OX1VOSVggJiYgIXN5c3RlbSgnbWtub2QnLCAkZmlsZSwgJG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW50cnktPmRldm1ham9yLCAkZW50cnktPmRldm1pbm9yKSBvcgogICAgICAgICAgICAkZXJyID0gIHFxW01ha2luZyBibG9jayBkZXZpY2UgJ10uICRlbnRyeS0+bmFtZSAucXFbJyAobWFqPV0gLgogICAgICAgICAgICAgICAgICAgICRlbnRyeS0+ZGV2bWFqb3IgLiBxcVsgbWluPV0gLiAkZW50cnktPmRldm1pbm9yIC4KICAgICAgICAgICAgICAgICAgICBxcVspIGZhaWxlZC5dOwoKICAgIH0gZWxzaWYgKCAkZW50cnktPmlzX3NvY2tldCApIHsKICAgICAgICAjIyMgdGhlIG9yaWdpbmFsIGRvZXNuJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3Igc29ja2V0cy4uLi4gIyMjCiAgICAgICAgMTsKICAgIH0KCiAgICByZXR1cm4gJGVyciA/ICRzZWxmLT5fZXJyb3IoICRlcnIgKSA6IDE7Cn0KCiMjIyBkb24ndCBrbm93IGhvdyB0byBtYWtlIHN5bWxpbmtzLCBsZXQncyBqdXN0IGV4dHJhY3QgdGhlIGZpbGUgYXMKIyMjIGEgcGxhaW4gZmlsZQpzdWIgX2V4dHJhY3Rfc3BlY2lhbF9maWxlX2FzX3BsYWluX2ZpbGUgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICRlbnRyeSAgID0gc2hpZnQgICAgIG9yIHJldHVybjsKICAgIG15ICRmaWxlICAgID0gc2hpZnQ7ICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZmlsZTsKCiAgICBteSAkZXJyOwogICAgVFJZOiB7CiAgICAgICAgbXkgJG9yaWcgPSAkc2VsZi0+X2ZpbmRfZW50cnkoICRlbnRyeS0+bGlua25hbWUgKTsKCiAgICAgICAgdW5sZXNzKCAkb3JpZyApIHsKICAgICAgICAgICAgJGVyciA9ICBxcVtDb3VsZCBub3QgZmluZCBmaWxlICddIC4gJGVudHJ5LT5saW5rbmFtZSAuCiAgICAgICAgICAgICAgICAgICAgcXFbJyBpbiBtZW1vcnkuXTsKICAgICAgICAgICAgbGFzdCBUUlk7CiAgICAgICAgfQoKICAgICAgICAjIyMgY2xvbmUgdGhlIGVudHJ5LCBtYWtlIGl0IGFwcGVhciBhcyBhIG5vcm1hbCBmaWxlICMjIwogICAgICAgIG15ICRjbG9uZSA9ICRlbnRyeS0+Y2xvbmU7CiAgICAgICAgJGNsb25lLT5fZG93bmdyYWRlX3RvX3BsYWluZmlsZTsKICAgICAgICAkc2VsZi0+X2V4dHJhY3RfZmlsZSggJGNsb25lLCAkZmlsZSApIG9yIGxhc3QgVFJZOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigkZXJyKTsKfQoKPWhlYWQyICR0YXItPmxpc3RfZmlsZXMoIFtcQHByb3BlcnRpZXNdICkKClJldHVybnMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlLgoKSWYgQzxsaXN0X2ZpbGVzKCk+IGlzIHBhc3NlZCBhbiBhcnJheSByZWZlcmVuY2UgYXMgaXRzIGZpcnN0IGFyZ3VtZW50Cml0IHJldHVybnMgYSBsaXN0IG9mIGhhc2ggcmVmZXJlbmNlcyBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQKcHJvcGVydGllcyBvZiBlYWNoIGZpbGUuICBUaGUgZm9sbG93aW5nIGxpc3Qgb2YgcHJvcGVydGllcyBpcwpzdXBwb3J0ZWQ6IG5hbWUsIHNpemUsIG10aW1lIChsYXN0IG1vZGlmaWVkIGRhdGUpLCBtb2RlLCB1aWQsIGdpZCwKbGlua25hbWUsIHVuYW1lLCBnbmFtZSwgZGV2bWFqb3IsIGRldm1pbm9yLCBwcmVmaXguCgpQYXNzaW5nIGFuIGFycmF5IHJlZmVyZW5jZSBjb250YWluaW5nIG9ubHkgb25lIGVsZW1lbnQsICduYW1lJywgaXMKc3BlY2lhbCBjYXNlZCB0byByZXR1cm4gYSBsaXN0IG9mIG5hbWVzIHJhdGhlciB0aGFuIGEgbGlzdCBvZiBoYXNoCnJlZmVyZW5jZXMsIG1ha2luZyBpdCBlcXVpdmFsZW50IHRvIGNhbGxpbmcgQzxsaXN0X2ZpbGVzPiB3aXRob3V0CmFyZ3VtZW50cy4KCj1jdXQKCnN1YiBsaXN0X2ZpbGVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkYXJlZiA9IHNoaWZ0IHx8IFsgXTsKCiAgICB1bmxlc3MoICRzZWxmLT5fZGF0YSApIHsKICAgICAgICAkc2VsZi0+cmVhZCgpIG9yIHJldHVybjsKICAgIH0KCiAgICBpZiggQCRhcmVmID09IDAgb3IgKCBAJGFyZWYgPT0gMSBhbmQgJGFyZWYtPlswXSBlcSAnbmFtZScgKSApIHsKICAgICAgICByZXR1cm4gbWFwIHsgJF8tPmZ1bGxfcGF0aCB9IEB7JHNlbGYtPl9kYXRhfTsKICAgIH0gZWxzZSB7CgogICAgICAgICNteSBAcnY7CiAgICAgICAgI2ZvciBteSAkb2JqICggQHskc2VsZi0+X2RhdGF9ICkgewogICAgICAgICMgICAgcHVzaCBAcnYsIHsgbWFwIHsgJF8gPT4gJG9iai0+JF8oKSB9IEAkYXJlZiB9OwogICAgICAgICN9CiAgICAgICAgI3JldHVybiBAcnY7CgogICAgICAgICMjIyB0aGlzIGRvZXMgdGhlIHNhbWUgYXMgdGhlIGFib3ZlLi4ganVzdCBuZWVkcyBhICt7IH0KICAgICAgICAjIyMgdG8gbWFrZSBzdXJlIHBlcmwgZG9lc24ndCBjb25mdXNlIGl0IGZvciBhIGJsb2NrCiAgICAgICAgcmV0dXJuIG1hcCB7ICAgIG15ICRvPSRfOwogICAgICAgICAgICAgICAgICAgICAgICAreyBtYXAgeyAkXyA9PiAkby0+JF8oKSB9IEAkYXJlZiB9CiAgICAgICAgICAgICAgICAgICAgfSBAeyRzZWxmLT5fZGF0YX07CiAgICB9Cn0KCnN1YiBfZmluZF9lbnRyeSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsKCiAgICB1bmxlc3MoIGRlZmluZWQgJGZpbGUgKSB7CiAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbTm8gZmlsZSBzcGVjaWZpZWRdICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMjIyBpdCdzIGFuIG9iamVjdCBhbHJlYWR5CiAgICByZXR1cm4gJGZpbGUgaWYgVU5JVkVSU0FMOjppc2EoICRmaWxlLCAnQXJjaGl2ZTo6VGFyOjpGaWxlJyApOwoKICAgIGZvciBteSAkZW50cnkgKCBAeyRzZWxmLT5fZGF0YX0gKSB7CiAgICAgICAgbXkgJHBhdGggPSAkZW50cnktPmZ1bGxfcGF0aDsKICAgICAgICByZXR1cm4gJGVudHJ5IGlmICRwYXRoIGVxICRmaWxlOwogICAgfQoKICAgICRzZWxmLT5fZXJyb3IoIHFxW05vIHN1Y2ggZmlsZSBpbiBhcmNoaXZlOiAnJGZpbGUnXSApOwogICAgcmV0dXJuOwp9Cgo9aGVhZDIgJHRhci0+Z2V0X2ZpbGVzKCBbQGZpbGVuYW1lc10gKQoKUmV0dXJucyB0aGUgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IG9iamVjdHMgbWF0Y2hpbmcgdGhlIGZpbGVuYW1lcwpwcm92aWRlZC4gSWYgbm8gZmlsZW5hbWUgbGlzdCB3YXMgcGFzc2VkLCBhbGwgQzxBcmNoaXZlOjpUYXI6OkZpbGU+Cm9iamVjdHMgaW4gdGhlIGN1cnJlbnQgVGFyIG9iamVjdCBhcmUgcmV0dXJuZWQuCgpQbGVhc2UgcmVmZXIgdG8gdGhlIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBkb2N1bWVudGF0aW9uIG9uIGhvdyB0bwpoYW5kbGUgdGhlc2Ugb2JqZWN0cy4KCj1jdXQKCnN1YiBnZXRfZmlsZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gQHsgJHNlbGYtPl9kYXRhIH0gdW5sZXNzIEBfOwoKICAgIG15IEBsaXN0OwogICAgZm9yIG15ICRmaWxlICggQF8gKSB7CiAgICAgICAgcHVzaCBAbGlzdCwgZ3JlcCB7IGRlZmluZWQgfSAkc2VsZi0+X2ZpbmRfZW50cnkoICRmaWxlICk7CiAgICB9CgogICAgcmV0dXJuIEBsaXN0Owp9Cgo9aGVhZDIgJHRhci0+Z2V0X2NvbnRlbnQoICRmaWxlICkKClJldHVybiB0aGUgY29udGVudCBvZiB0aGUgbmFtZWQgZmlsZS4KCj1jdXQKCnN1YiBnZXRfY29udGVudCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGVudHJ5ID0gJHNlbGYtPl9maW5kX2VudHJ5KCBzaGlmdCApIG9yIHJldHVybjsKCiAgICByZXR1cm4gJGVudHJ5LT5kYXRhOwp9Cgo9aGVhZDIgJHRhci0+cmVwbGFjZV9jb250ZW50KCAkZmlsZSwgJGNvbnRlbnQgKQoKTWFrZSB0aGUgc3RyaW5nICRjb250ZW50IGJlIHRoZSBjb250ZW50IGZvciB0aGUgZmlsZSBuYW1lZCAkZmlsZS4KCj1jdXQKCnN1YiByZXBsYWNlX2NvbnRlbnQgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRlbnRyeSA9ICRzZWxmLT5fZmluZF9lbnRyeSggc2hpZnQgKSBvciByZXR1cm47CgogICAgcmV0dXJuICRlbnRyeS0+cmVwbGFjZV9jb250ZW50KCBzaGlmdCApOwp9Cgo9aGVhZDIgJHRhci0+cmVuYW1lKCAkZmlsZSwgJG5ld19uYW1lICkKClJlbmFtZSB0aGUgZmlsZSBvZiB0aGUgaW4tbWVtb3J5IGFyY2hpdmUgdG8gJG5ld19uYW1lLgoKTm90ZSB0aGF0IHlvdSBtdXN0IHNwZWNpZnkgYSBVbml4IHBhdGggZm9yICRuZXdfbmFtZSwgc2luY2UgcGVyIHRhcgpzdGFuZGFyZCwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlIG11c3QgYmUgVW5peCBwYXRocy4KClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIHJlbmFtZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRmaWxlOwogICAgbXkgJG5ldyAgPSBzaGlmdDsgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRuZXc7CgogICAgbXkgJGVudHJ5ID0gJHNlbGYtPl9maW5kX2VudHJ5KCAkZmlsZSApIG9yIHJldHVybjsKCiAgICByZXR1cm4gJGVudHJ5LT5yZW5hbWUoICRuZXcgKTsKfQoKPWhlYWQyICR0YXItPnJlbW92ZSAoQGZpbGVuYW1lbGlzdCkKClJlbW92ZXMgYW55IGVudHJpZXMgd2l0aCBuYW1lcyBtYXRjaGluZyBhbnkgb2YgdGhlIGdpdmVuIGZpbGVuYW1lcwpmcm9tIHRoZSBpbi1tZW1vcnkgYXJjaGl2ZS4gUmV0dXJucyBhIGxpc3Qgb2YgQzxBcmNoaXZlOjpUYXI6OkZpbGU+Cm9iamVjdHMgdGhhdCByZW1haW4uCgo9Y3V0CgpzdWIgcmVtb3ZlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAbGlzdCA9IEBfOwoKICAgIG15ICVzZWVuID0gbWFwIHsgJF8tPmZ1bGxfcGF0aCA9PiAkXyB9IEB7JHNlbGYtPl9kYXRhfTsKICAgIGRlbGV0ZSAkc2VlbnsgJF8gfSBmb3IgQGxpc3Q7CgogICAgJHNlbGYtPl9kYXRhKCBbdmFsdWVzICVzZWVuXSApOwoKICAgIHJldHVybiB2YWx1ZXMgJXNlZW47Cn0KCj1oZWFkMiAkdGFyLT5jbGVhcgoKQzxjbGVhcj4gY2xlYXJzIHRoZSBjdXJyZW50IGluLW1lbW9yeSBhcmNoaXZlLiBUaGlzIGVmZmVjdGl2ZWx5IGdpdmVzCnlvdSBhICdibGFuaycgb2JqZWN0LCByZWFkeSB0byBiZSBmaWxsZWQgYWdhaW4uIE5vdGUgdGhhdCBDPGNsZWFyPgpvbmx5IGhhcyBlZmZlY3Qgb24gdGhlIG9iamVjdCwgbm90IHRoZSB1bmRlcmx5aW5nIHRhcmZpbGUuCgo9Y3V0CgpzdWIgY2xlYXIgewogICAgbXkgJHNlbGYgPSBzaGlmdCBvciByZXR1cm47CgogICAgJHNlbGYtPl9kYXRhKCBbXSApOwogICAgJHNlbGYtPl9maWxlKCAnJyApOwoKICAgIHJldHVybiAxOwp9CgoKPWhlYWQyICR0YXItPndyaXRlICggWyRmaWxlLCAkY29tcHJlc3NlZCwgJHByZWZpeF0gKQoKV3JpdGUgdGhlIGluLW1lbW9yeSBhcmNoaXZlIHRvIGRpc2suICBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGVpdGhlcgpiZSB0aGUgbmFtZSBvZiBhIGZpbGUgb3IgYSByZWZlcmVuY2UgdG8gYW4gYWxyZWFkeSBvcGVuIGZpbGVoYW5kbGUgKGEKR0xPQiByZWZlcmVuY2UpLiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRydWUsIHRoZSBtb2R1bGUgd2lsbCB1c2UKSU86OlpsaWIgdG8gd3JpdGUgdGhlIGZpbGUgaW4gYSBjb21wcmVzc2VkIGZvcm1hdC4gIElmIElPOjpabGliIGlzCm5vdCBhdmFpbGFibGUsIHRoZSBDPHdyaXRlPiBtZXRob2Qgd2lsbCBmYWlsIGFuZCByZXR1cm4uCgpOb3RlIHRoYXQgd2hlbiB5b3UgcGFzcyBpbiBhIGZpbGVoYW5kbGUsIHRoZSBjb21wcmVzc2lvbiBhcmd1bWVudAppcyBpZ25vcmVkLCBhcyBhbGwgZmlsZXMgYXJlIHByaW50ZWQgdmVyYmF0aW0gdG8geW91ciBmaWxlaGFuZGxlLgpJZiB5b3Ugd2lzaCB0byBlbmFibGUgY29tcHJlc3Npb24gd2l0aCBmaWxlaGFuZGxlcywgdXNlIGFuCkM8SU86OlpsaWI+IGZpbGVoYW5kbGUgaW5zdGVhZC4KClNwZWNpZmljIGxldmVscyBvZiBjb21wcmVzc2lvbiBjYW4gYmUgY2hvc2VuIGJ5IHBhc3NpbmcgdGhlIHZhbHVlcyAyCnRocm91Z2ggOSBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KClRoZSB0aGlyZCBhcmd1bWVudCBpcyBhbiBvcHRpb25hbCBwcmVmaXguIEFsbCBmaWxlcyB3aWxsIGJlIHR1Y2tlZAphd2F5IGluIHRoZSBkaXJlY3RvcnkgeW91IHNwZWNpZnkgYXMgcHJlZml4LiBTbyBpZiB5b3UgaGF2ZSBmaWxlcwonYScgYW5kICdiJyBpbiB5b3VyIGFyY2hpdmUsIGFuZCB5b3Ugc3BlY2lmeSAnZm9vJyBhcyBwcmVmaXgsIHRoZXkKd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBhcmNoaXZlIGFzICdmb28vYScgYW5kICdmb28vYicuCgpJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBDPHdyaXRlPiByZXR1cm5zIHRoZSBlbnRpcmUgZm9ybWF0dGVkCmFyY2hpdmUgYXMgYSBzdHJpbmcsIHdoaWNoIGNvdWxkIGJlIHVzZWZ1bCBpZiB5b3UnZCBsaWtlIHRvIHN0dWZmIHRoZQphcmNoaXZlIGludG8gYSBzb2NrZXQgb3IgYSBwaXBlIHRvIGd6aXAgb3Igc29tZXRoaW5nLgoKPWN1dAoKc3ViIHdyaXRlIHsKICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OwogICAgbXkgJGZpbGUgICAgICAgID0gc2hpZnQ7ICRmaWxlID0gJycgdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkZ3ppcCAgICAgICAgPSBzaGlmdCB8fCAwOwogICAgbXkgJGV4dF9wcmVmaXggID0gc2hpZnQ7ICRleHRfcHJlZml4ID0gJycgdW5sZXNzIGRlZmluZWQgJGV4dF9wcmVmaXg7CiAgICBteSAkZHVtbXkgICAgICAgPSAnJzsKICAgIAogICAgIyMjIG9ubHkgbmVlZCBhIGhhbmRsZSBpZiB3ZSBoYXZlIGEgZmlsZSB0byBwcmludCB0byAjIyMKICAgIG15ICRoYW5kbGUgPSBsZW5ndGgoJGZpbGUpCiAgICAgICAgICAgICAgICAgICAgPyAoICRzZWxmLT5fZ2V0X2hhbmRsZSgkZmlsZSwgJGd6aXAsIFdSSVRFX09OTFktPigkZ3ppcCkgKQogICAgICAgICAgICAgICAgICAgICAgICBvciByZXR1cm4gKQogICAgICAgICAgICAgICAgICAgIDogJEhBU19QRVJMSU8gICAgPyBkbyB7IG9wZW4gbXkgJGgsICc+JywgXCRkdW1teTsgJGggfQogICAgICAgICAgICAgICAgICAgIDogJEhBU19JT19TVFJJTkcgPyBJTzo6U3RyaW5nLT5uZXcgCiAgICAgICAgICAgICAgICAgICAgOiBfX1BBQ0tBR0VfXy0+bm9fc3RyaW5nX3N1cHBvcnQoKTsKCgoKICAgIGZvciBteSAkZW50cnkgKCBAeyRzZWxmLT5fZGF0YX0gKSB7CiAgICAgICAgIyMjIGVudHJpZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgdGFyZmlsZSAjIyMKICAgICAgICBteSBAd3JpdGVfbWU7CgogICAgICAgICMjIyBvbmx5IG5vdyB3aWxsIHdlIGNoYW5nZSB0aGUgb2JqZWN0IHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdGUKICAgICAgICAjIyMgb2YgdGhlIG5hbWUgYW5kIHByZWZpeCBmaWVsZHMgLS0gdGhpcyBuZWVkcyB0byBiZSBsaW1pdGVkIHRvCiAgICAgICAgIyMjIHdyaXRlKCkgb25seSEKICAgICAgICBteSAkY2xvbmUgPSAkZW50cnktPmNsb25lOwoKCiAgICAgICAgIyMjIHNvLCBpZiB5b3UgZG9uJ3Qgd2FudCB1c2UgdG8gdXNlIHRoZSBwcmVmaXgsIHdlJ2xsIHN0dWZmIAogICAgICAgICMjIyBldmVyeXRoaW5nIGluIHRoZSBuYW1lIGZpZWxkIGluc3RlYWQKICAgICAgICBpZiggJERPX05PVF9VU0VfUFJFRklYICkgewoKICAgICAgICAgICAgIyMjIHlvdSBtaWdodCBoYXZlIGFuIGV4dGVuZGVkIHByZWZpeCwgaWYgc28sIHNldCBpdCBpbiB0aGUgY2xvbmUKICAgICAgICAgICAgIyMjIFhYWCBpcyA6OlVuaXggcmlnaHQ/CiAgICAgICAgICAgICRjbG9uZS0+bmFtZSggbGVuZ3RoICRleHRfcHJlZml4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZpbGU6OlNwZWM6OlVuaXgtPmNhdGRpciggJGV4dF9wcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsb25lLT5mdWxsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICRjbG9uZS0+ZnVsbF9wYXRoICk7CiAgICAgICAgICAgICRjbG9uZS0+cHJlZml4KCAnJyApOwoKICAgICAgICAjIyMgb3RoZXJ3aXNlLCB3ZSdsbCBoYXZlIHRvIHNldCBpdCBwcm9wZXJseSAtLSBwcmVmaXggcGFydCBpbiB0aGUKICAgICAgICAjIyMgcHJlZml4IGFuZCBuYW1lIHBhcnQgaW4gdGhlIG5hbWUgZmllbGQuCiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICMjIyBzcGxpdCB0aGVtIGhlcmUsIG5vdCBiZWZvcmUhCiAgICAgICAgICAgIG15ICgkcHJlZml4LCRuYW1lKSA9ICRjbG9uZS0+X3ByZWZpeF9hbmRfZmlsZSggJGNsb25lLT5mdWxsX3BhdGggKTsKCiAgICAgICAgICAgICMjIyB5b3UgbWlnaHQgaGF2ZSBhbiBleHRlbmRlZCBwcmVmaXgsIGlmIHNvLCBzZXQgaXQgaW4gdGhlIGNsb25lCiAgICAgICAgICAgICMjIyBYWFggaXMgOjpVbml4IHJpZ2h0PwogICAgICAgICAgICAkcHJlZml4ID0gRmlsZTo6U3BlYzo6VW5peC0+Y2F0ZGlyKCAkZXh0X3ByZWZpeCwgJHByZWZpeCApCiAgICAgICAgICAgICAgICBpZiBsZW5ndGggJGV4dF9wcmVmaXg7CgogICAgICAgICAgICAkY2xvbmUtPnByZWZpeCggJHByZWZpeCApOwogICAgICAgICAgICAkY2xvbmUtPm5hbWUoICRuYW1lICk7CiAgICAgICAgfQoKICAgICAgICAjIyMgbmFtZXMgYXJlIHRvbyBsb25nLCBhbmQgd2lsbCBnZXQgdHJ1bmNhdGVkIGlmIHdlIGRvbid0IGFkZCBhCiAgICAgICAgIyMjICdATG9uZ0xpbmsnIGZpbGUuLi4KICAgICAgICBteSAkbWFrZV9sb25nbGluayA9ICggICBsZW5ndGgoJGNsb25lLT5uYW1lKSAgICA+IE5BTUVfTEVOR1RIIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKCRjbG9uZS0+cHJlZml4KSAgPiBQUkVGSVhfTEVOR1RICiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHx8IDA7CgogICAgICAgICMjIyBwZXJoYXBzIHdlIG5lZWQgdG8gbWFrZSBhIGxvbmdsaW5rIGZpbGU/CiAgICAgICAgaWYoICRtYWtlX2xvbmdsaW5rICkgewogICAgICAgICAgICBteSAkbG9uZ2xpbmsgPSBBcmNoaXZlOjpUYXI6OkZpbGUtPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPT4gTE9OR0xJTktfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbG9uZS0+ZnVsbF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlID0+IExPTkdMSU5LIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHVubGVzcyggJGxvbmdsaW5rICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggIHFxW0NvdWxkIG5vdCBjcmVhdGUgJ0xvbmdMaW5rJyBlbnRyeSBmb3IgXSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFbb3ZlcnNpemUgZmlsZSAnXSAuICRjbG9uZS0+ZnVsbF9wYXRoIC4iJyIgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHB1c2ggQHdyaXRlX21lLCAkbG9uZ2xpbms7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB3cml0ZV9tZSwgJGNsb25lOwoKICAgICAgICAjIyMgd3JpdGUgdGhlIG9uZSwgb3B0aW9uYWxseSAyIGE6OnQ6OmZpbGUgb2JqZWN0cyB0byB0aGUgaGFuZGxlCiAgICAgICAgZm9yIG15ICRjbG9uZSAoQHdyaXRlX21lKSB7CgogICAgICAgICAgICAjIyMgaWYgdGhlIGZpbGUgaXMgYSBzeW1saW5rLCB0aGVyZSBhcmUgMiBvcHRpb25zOgogICAgICAgICAgICAjIyMgZWl0aGVyIHdlIGxlYXZlIHRoZSBzeW1saW5rIGludGFjdCwgYnV0IHRoZW4gd2UgZG9uJ3Qgd3JpdGUgYW55CiAgICAgICAgICAgICMjIyBkYXRhIE9SIHdlIGZvbGxvdyB0aGUgc3ltbGluaywgd2hpY2ggbWVhbnMgd2UgYWN0dWFsbHkgbWFrZSBhCiAgICAgICAgICAgICMjIyBjb3B5LiBpZiB3ZSBkbyB0aGUgbGF0dGVyLCB3ZSBoYXZlIHRvIGNoYW5nZSB0aGUgVFlQRSBvZiB0aGUKICAgICAgICAgICAgIyMjIGNsb25lIHRvICdGSUxFJwogICAgICAgICAgICBteSAkbGlua19vayA9ICAkY2xvbmUtPmlzX3N5bWxpbmsgJiYgJEFyY2hpdmU6OlRhcjo6Rk9MTE9XX1NZTUxJTks7CiAgICAgICAgICAgIG15ICRkYXRhX29rID0gISRjbG9uZS0+aXNfc3ltbGluayAmJiAkY2xvbmUtPmhhc19jb250ZW50OwoKICAgICAgICAgICAgIyMjIGRvd25ncmFkZSB0byBhICdub3JtYWwnIGZpbGUgaWYgaXQncyBhIHN5bWxpbmsgd2UncmUgZ29pbmcgdG8KICAgICAgICAgICAgIyMjIHRyZWF0IGFzIGEgcmVndWxhciBmaWxlCiAgICAgICAgICAgICRjbG9uZS0+X2Rvd25ncmFkZV90b19wbGFpbmZpbGUgaWYgJGxpbmtfb2s7CgogICAgICAgICAgICAjIyMgZ2V0IHRoZSBoZWFkZXIgZm9yIHRoaXMgYmxvY2sKICAgICAgICAgICAgbXkgJGhlYWRlciA9ICRzZWxmLT5fZm9ybWF0X3Rhcl9lbnRyeSggJGNsb25lICk7CiAgICAgICAgICAgIHVubGVzcyggJGhlYWRlciApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fZXJyb3IocVtDb3VsZCBub3QgZm9ybWF0IGhlYWRlciBmb3I6IF0gLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2xvbmUtPmZ1bGxfcGF0aCApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1bmxlc3MoIHByaW50ICRoYW5kbGUgJGhlYWRlciApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fZXJyb3IocVtDb3VsZCBub3Qgd3JpdGUgaGVhZGVyIGZvcjogXSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbG9uZS0+ZnVsbF9wYXRoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoICRsaW5rX29rIG9yICRkYXRhX29rICkgewogICAgICAgICAgICAgICAgdW5sZXNzKCBwcmludCAkaGFuZGxlICRjbG9uZS0+ZGF0YSApIHsKICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X2Vycm9yKHFbQ291bGQgbm90IHdyaXRlIGRhdGEgZm9yOiBdIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsb25lLT5mdWxsX3BhdGgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIyMgcGFkIHRoZSBlbmQgb2YgdGhlIGNsb25lIGlmIHJlcXVpcmVkICMjIwogICAgICAgICAgICAgICAgcHJpbnQgJGhhbmRsZSBUQVJfUEFELT4oICRjbG9uZS0+c2l6ZSApIGlmICRjbG9uZS0+c2l6ZSAlIEJMT0NLCiAgICAgICAgICAgIH0KCiAgICAgICAgfSAjIyMgZG9uZSB3cml0aW5nIHRoZXNlIGVudHJpZXMKICAgIH0KCiAgICAjIyMgd3JpdGUgdGhlIGVuZCBtYXJrZXJzICMjIwogICAgcHJpbnQgJGhhbmRsZSBUQVJfRU5EIHggMiBvcgogICAgICAgICAgICByZXR1cm4gJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IHdyaXRlIHRhciBlbmQgbWFya2Vyc10gKTsKCiAgICAjIyMgZGlkIHlvdSB3YW50IGl0IHdyaXR0ZW4gdG8gYSBmaWxlLCBvciByZXR1cm5lZCBhcyBhIHN0cmluZz8gIyMjCiAgICBteSAkcnYgPSAgbGVuZ3RoKCRmaWxlKSA/IDEKICAgICAgICAgICAgICAgICAgICAgICAgOiAkSEFTX1BFUkxJTyA/ICRkdW1teQogICAgICAgICAgICAgICAgICAgICAgICA6IGRvIHsgc2VlayAkaGFuZGxlLCAwLCAwOyBsb2NhbCAkLzsgPCRoYW5kbGU+IH07CgogICAgIyMjIG1ha2Ugc3VyZSB0byBjbG9zZSB0aGUgaGFuZGxlOwogICAgY2xvc2UgJGhhbmRsZTsKICAgIAogICAgcmV0dXJuICRydjsKfQoKc3ViIF9mb3JtYXRfdGFyX2VudHJ5IHsKICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OwogICAgbXkgJGVudHJ5ICAgICAgID0gc2hpZnQgb3IgcmV0dXJuOwogICAgbXkgJGV4dF9wcmVmaXggID0gc2hpZnQ7ICRleHRfcHJlZml4ID0gJycgdW5sZXNzIGRlZmluZWQgJGV4dF9wcmVmaXg7CiAgICBteSAkbm9fcHJlZml4ICAgPSBzaGlmdCB8fCAwOwoKICAgIG15ICRmaWxlICAgID0gJGVudHJ5LT5uYW1lOwogICAgbXkgJHByZWZpeCAgPSAkZW50cnktPnByZWZpeDsgJHByZWZpeCA9ICcnIHVubGVzcyBkZWZpbmVkICRwcmVmaXg7CgogICAgIyMjIHJlbW92ZSB0aGUgcHJlZml4IGZyb20gdGhlIGZpbGUgbmFtZQogICAgIyMjIG5vdCBzdXJlIGlmIHRoaXMgaXMgc3RpbGwgbmVlZWRlZCAtLWthbmUKICAgICMjIyBubyBpdCdzIG5vdCAtLSBBcmNoaXZlOjpUYXI6OkZpbGUtPl9uZXdfZnJvbV9maWxlIHdpbGwgdGFrZSBjYXJlIG9mCiAgICAjIyMgdGhpcyBmb3IgdXMuIEV2ZW4gd29yc2UsIHRoaXMgd291bGQgYnJlYWsgaWYgd2UgdHJpZWQgdG8gYWRkIGEgZmlsZQogICAgIyMjIGxpa2UgeC94LgogICAgI2lmKCBsZW5ndGggJHByZWZpeCApIHsKICAgICMgICAgJGZpbGUgPX4gcy9eJG1hdGNoLy87CiAgICAjfQoKICAgICRwcmVmaXggPSBGaWxlOjpTcGVjOjpVbml4LT5jYXRkaXIoJGV4dF9wcmVmaXgsICRwcmVmaXgpCiAgICAgICAgICAgICAgICBpZiBsZW5ndGggJGV4dF9wcmVmaXg7CgogICAgIyMjIG5vdCBzdXJlIHdoeSB0aGlzIGlzLi4uICMjIwogICAgbXkgJGwgPSBQUkVGSVhfTEVOR1RIOyAjIGlzIGFtYmlndW91cyBvdGhlcndpc2UuLi4KICAgIHN1YnN0ciAoJHByZWZpeCwgMCwgLSRsKSA9ICIiIGlmIGxlbmd0aCAkcHJlZml4ID49IFBSRUZJWF9MRU5HVEg7CgogICAgbXkgJGYxID0gIiUwNm8iOyBteSAkZjIgID0gIiUxMW8iOwoKICAgICMjIyB0aGlzIG1pZ2h0IGJlIG9wdGltaXphYmxlIHdpdGggYSAnY2hhbmdlZCcgZmxhZyBpbiB0aGUgZmlsZSBvYmplY3RzICMjIwogICAgbXkgJHRhciA9IHBhY2sgKAogICAgICAgICAgICAgICAgUEFDSywKICAgICAgICAgICAgICAgICRmaWxlLAoKICAgICAgICAgICAgICAgIChtYXAgeyBzcHJpbnRmKCAkZjEsICRlbnRyeS0+JF8oKSApIH0gcXdbbW9kZSB1aWQgZ2lkXSksCiAgICAgICAgICAgICAgICAobWFwIHsgc3ByaW50ZiggJGYyLCAkZW50cnktPiRfKCkgKSB9IHF3W3NpemUgbXRpbWVdKSwKCiAgICAgICAgICAgICAgICAiIiwgICMgY2hlY2tzdW0gZmllbGQgLSBzcGFjZSBwYWRkZWQgYSBiaXQgZG93bgoKICAgICAgICAgICAgICAgIChtYXAgeyAkZW50cnktPiRfKCkgfSAgICAgICAgICAgICAgICAgcXdbdHlwZSBsaW5rbmFtZSBtYWdpY10pLAoKICAgICAgICAgICAgICAgICRlbnRyeS0+dmVyc2lvbiB8fCBUQVJfVkVSU0lPTiwKCiAgICAgICAgICAgICAgICAobWFwIHsgJGVudHJ5LT4kXygpIH0gICAgICAgICAgICAgICAgIHF3W3VuYW1lIGduYW1lXSksCiAgICAgICAgICAgICAgICAobWFwIHsgc3ByaW50ZiggJGYxLCAkZW50cnktPiRfKCkgKSB9IHF3W2Rldm1ham9yIGRldm1pbm9yXSksCgogICAgICAgICAgICAgICAgKCRub19wcmVmaXggPyAnJyA6ICRwcmVmaXgpCiAgICApOwoKICAgICMjIyBhZGQgdGhlIGNoZWNrc3VtICMjIwogICAgc3Vic3RyKCR0YXIsMTQ4LDcpID0gc3ByaW50ZigiJTZvXDAiLCB1bnBhY2soIiUxNkMqIiwkdGFyKSk7CgogICAgcmV0dXJuICR0YXI7Cn0KCj1oZWFkMiAkdGFyLT5hZGRfZmlsZXMoIEBmaWxlbmFtZWxpc3QgKQoKVGFrZXMgYSBsaXN0IG9mIGZpbGVuYW1lcyBhbmQgYWRkcyB0aGVtIHRvIHRoZSBpbi1tZW1vcnkgYXJjaGl2ZS4KClRoZSBwYXRoIHRvIHRoZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGEgVW5peCBsaWtlCmVxdWl2YWxlbnQgZm9yIHVzZSBpbiB0aGUgYXJjaGl2ZSwgYW5kLCBpZiBvbiBNYWNPUywgdGhlIGZpbGUncwptb2RpZmljYXRpb24gdGltZSBpcyBjb252ZXJ0ZWQgZnJvbSB0aGUgTWFjT1MgZXBvY2ggdG8gdGhlIFVuaXggZXBvY2guClNvIHRhciBhcmNoaXZlcyBjcmVhdGVkIG9uIE1hY09TIHdpdGggQjxBcmNoaXZlOjpUYXI+IGNhbiBiZSByZWFkCmJvdGggd2l0aCBJPHRhcj4gb24gVW5peCBhbmQgYXBwbGljYXRpb25zIGxpa2UgSTxzdW50YXI+IG9yCkk8U3R1ZmZpdCBFeHBhbmRlcj4gb24gTWFjT1MuCgpCZSBhd2FyZSB0aGF0IHRoZSBmaWxlJ3MgdHlwZS9jcmVhdG9yIGFuZCByZXNvdXJjZSBmb3JrIHdpbGwgYmUgbG9zdCwKd2hpY2ggaXMgdXN1YWxseSB3aGF0IHlvdSB3YW50IGluIGNyb3NzLXBsYXRmb3JtIGFyY2hpdmVzLgoKUmV0dXJucyBhIGxpc3Qgb2YgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IG9iamVjdHMgdGhhdCB3ZXJlIGp1c3QgYWRkZWQuCgo9Y3V0CgpzdWIgYWRkX2ZpbGVzIHsKICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CiAgICBteSBAZmlsZXMgICA9IEBfIG9yIHJldHVybjsKCiAgICBteSBAcnY7CiAgICBmb3IgbXkgJGZpbGUgKCBAZmlsZXMgKSB7CiAgICAgICAgdW5sZXNzKCAtZSAkZmlsZSB8fCAtbCAkZmlsZSApIHsKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbTm8gc3VjaCBmaWxlOiAnJGZpbGUnXSApOwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgbXkgJG9iaiA9IEFyY2hpdmU6OlRhcjo6RmlsZS0+bmV3KCBmaWxlID0+ICRmaWxlICk7CiAgICAgICAgdW5sZXNzKCAkb2JqICkgewogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtVbmFibGUgdG8gYWRkIGZpbGU6ICckZmlsZSddICk7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBydiwgJG9iajsKICAgIH0KCiAgICBwdXNoIEB7JHNlbGYtPntfZGF0YX19LCBAcnY7CgogICAgcmV0dXJuIEBydjsKfQoKPWhlYWQyICR0YXItPmFkZF9kYXRhICggJGZpbGVuYW1lLCAkZGF0YSwgWyRvcHRoYXNocmVmXSApCgpUYWtlcyBhIGZpbGVuYW1lLCBhIHNjYWxhciBmdWxsIG9mIGRhdGEgYW5kIG9wdGlvbmFsbHkgYSByZWZlcmVuY2UgdG8KYSBoYXNoIHdpdGggc3BlY2lmaWMgb3B0aW9ucy4KCldpbGwgYWRkIGEgZmlsZSB0byB0aGUgaW4tbWVtb3J5IGFyY2hpdmUsIHdpdGggbmFtZSBDPCRmaWxlbmFtZT4gYW5kCmNvbnRlbnQgQzwkZGF0YT4uIFNwZWNpZmljIHByb3BlcnRpZXMgY2FuIGJlIHNldCB1c2luZyBDPCRvcHRoYXNocmVmPi4KVGhlIGZvbGxvd2luZyBsaXN0IG9mIHByb3BlcnRpZXMgaXMgc3VwcG9ydGVkOiBuYW1lLCBzaXplLCBtdGltZQoobGFzdCBtb2RpZmllZCBkYXRlKSwgbW9kZSwgdWlkLCBnaWQsIGxpbmtuYW1lLCB1bmFtZSwgZ25hbWUsCmRldm1ham9yLCBkZXZtaW5vciwgcHJlZml4LCB0eXBlLiAgKE9uIE1hY09TLCB0aGUgZmlsZSdzIHBhdGggYW5kCm1vZGlmaWNhdGlvbiB0aW1lcyBhcmUgY29udmVydGVkIHRvIFVuaXggZXF1aXZhbGVudHMuKQoKVmFsaWQgdmFsdWVzIGZvciB0aGUgZmlsZSB0eXBlIGFyZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBkZWZpbmVkIGluCkFyY2hpdmU6OlRhcjo6Q29uc3RhbnRzOgoKPW92ZXIgNAoKPWl0ZW0gRklMRQoKUmVndWxhciBmaWxlLgoKPWl0ZW0gSEFSRExJTksKCj1pdGVtIFNZTUxJTksKCkhhcmQgYW5kIHN5bWJvbGljICgic29mdCIpIGxpbmtzOyBsaW5rbmFtZSBzaG91bGQgc3BlY2lmeSB0YXJnZXQuCgo9aXRlbSBDSEFSREVWCgo9aXRlbSBCTE9DS0RFVgoKQ2hhcmFjdGVyIGFuZCBibG9jayBkZXZpY2VzLiBkZXZtYWpvciBhbmQgZGV2bWlub3Igc2hvdWxkIHNwZWNpZnkgdGhlIG1ham9yCmFuZCBtaW5vciBkZXZpY2UgbnVtYmVycy4KCj1pdGVtIERJUgoKRGlyZWN0b3J5LgoKPWl0ZW0gRklGTwoKRklGTyAobmFtZWQgcGlwZSkuCgo9aXRlbSBTT0NLRVQKClNvY2tldC4KCj1iYWNrCgpSZXR1cm5zIHRoZSBDPEFyY2hpdmU6OlRhcjo6RmlsZT4gb2JqZWN0IHRoYXQgd2FzIGp1c3QgYWRkZWQsIG9yCkM8dW5kZWY+IG9uIGZhaWx1cmUuCgo9Y3V0CgpzdWIgYWRkX2RhdGEgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICgkZmlsZSwgJGRhdGEsICRvcHQpID0gQF87CgogICAgbXkgJG9iaiA9IEFyY2hpdmU6OlRhcjo6RmlsZS0+bmV3KCBkYXRhID0+ICRmaWxlLCAkZGF0YSwgJG9wdCApOwogICAgdW5sZXNzKCAkb2JqICkgewogICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW1VuYWJsZSB0byBhZGQgZmlsZTogJyRmaWxlJ10gKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcHVzaCBAeyRzZWxmLT57X2RhdGF9fSwgJG9iajsKCiAgICByZXR1cm4gJG9iajsKfQoKPWhlYWQyICR0YXItPmVycm9yKCBbJEJPT0xdICkKClJldHVybnMgdGhlIGN1cnJlbnQgZXJyb3JzdHJpbmcgKHVzdWFsbHksIHRoZSBsYXN0IGVycm9yIHJlcG9ydGVkKS4KSWYgYSB0cnVlIHZhbHVlIHdhcyBzcGVjaWZpZWQsIGl0IHdpbGwgZ2l2ZSB0aGUgQzxDYXJwOjpsb25nbWVzcz4KZXF1aXZhbGVudCBvZiB0aGUgZXJyb3IsIGluIGVmZmVjdCBnaXZpbmcgeW91IGEgc3RhY2t0cmFjZS4KCkZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhpcyBlcnJvciBpcyBhbHNvIGF2YWlsYWJsZSBhcwpDPCRBcmNoaXZlOjpUYXI6OmVycm9yPiBhbHRob3VnaCBpdCBpcyBtdWNoIHJlY29tbWVuZGVkIHlvdSB1c2UgdGhlCm1ldGhvZCBjYWxsIGluc3RlYWQuCgo9Y3V0Cgp7CiAgICAkZXJyb3IgPSAnJzsKICAgIG15ICRsb25nbWVzczsKCiAgICBzdWIgX2Vycm9yIHsKICAgICAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgICAgIG15ICRtc2cgICAgID0gJGVycm9yID0gc2hpZnQ7CiAgICAgICAgJGxvbmdtZXNzICAgPSBDYXJwOjpsb25nbWVzcygkZXJyb3IpOwoKICAgICAgICAjIyMgc2V0IEFyY2hpdmU6OlRhcjo6V0FSTiB0byAwIHRvIGRpc2FibGUgcHJpbnRpbmcKICAgICAgICAjIyMgb2YgZXJyb3JzCiAgICAgICAgaWYoICRXQVJOICkgewogICAgICAgICAgICBjYXJwICRERUJVRyA/ICRsb25nbWVzcyA6ICRtc2c7CiAgICAgICAgfQoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgc3ViIGVycm9yIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgIHJldHVybiBzaGlmdCgpID8gJGxvbmdtZXNzIDogJGVycm9yOwogICAgfQp9Cgo9aGVhZDIgJHRhci0+c2V0Y3dkKCAkY3dkICk7CgpDPEFyY2hpdmU6OlRhcj4gbmVlZHMgdG8ga25vdyB0aGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCBpdCB3aWxsIHJ1bgpDPEN3ZDo6Y3dkKCk+IEk8ZXZlcnk+IHRpbWUgaXQgZXh0cmFjdHMgYSBJPHJlbGF0aXZlPiBlbnRyeSBmcm9tIHRoZSAKdGFyZmlsZSBhbmQgc2F2ZXMgaXQgaW4gdGhlIGZpbGUgc3lzdGVtLiAoQXMgb2YgdmVyc2lvbiAxLjMwLCBob3dldmVyLApDPEFyY2hpdmU6OlRhcj4gd2lsbCB1c2UgdGhlIHNwZWVkIG9wdGltaXphdGlvbiBkZXNjcmliZWQgYmVsb3cgCmF1dG9tYXRpY2FsbHksIHNvIGl0J3Mgb25seSByZWxldmFudCBpZiB5b3UncmUgdXNpbmcgQzxleHRyYWN0X2ZpbGUoKT4pLgoKU2luY2UgQzxBcmNoaXZlOjpUYXI+IGRvZXNuJ3QgY2hhbmdlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbnRlcm5hbGx5CndoaWxlIGl0IGlzIGV4dHJhY3RpbmcgdGhlIGl0ZW1zIGluIGEgdGFyYmFsbCwgYWxsIGNhbGxzIHRvIEM8Q3dkOjpjd2QoKT4KY2FuIGJlIGF2b2lkZWQgaWYgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBkb2Vzbid0CmdldCBjaGFuZ2VkIGV4dGVybmFsbHkuCgpUbyB1c2UgdGhpcyBwZXJmb3JtYW5jZSBib29zdCwgc2V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSB2aWEKCiAgICB1c2UgQ3dkOwogICAgJHRhci0+c2V0Y3dkKCBjd2QoKSApOwoKb25jZSBiZWZvcmUgY2FsbGluZyBhIGZ1bmN0aW9uIGxpa2UgQzxleHRyYWN0X2ZpbGU+IGFuZApDPEFyY2hpdmU6OlRhcj4gd2lsbCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNldHRpbmcgZnJvbSB0aGVuIG9uCmFuZCB3b24ndCBjYWxsIEM8Q3dkOjpjd2QoKT4gaW50ZXJuYWxseS4gCgpUbyBzd2l0Y2ggYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvdXIsIHVzZQoKICAgICR0YXItPnNldGN3ZCggdW5kZWYgKTsKCmFuZCBDPEFyY2hpdmU6OlRhcj4gd2lsbCBjYWxsIEM8Q3dkOjpjd2QoKT4gaW50ZXJuYWxseSBhZ2Fpbi4KCklmIHlvdSdyZSB1c2luZyBDPEFyY2hpdmU6OlRhcj4ncyBDPGV4cmFjdCgpPiBtZXRob2QsIEM8c2V0Y3dkKCk+IHdpbGwKYmUgY2FsbGVkIGZvciB5b3UuCgo9Y3V0IAoKc3ViIHNldGN3ZCB7CiAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKICAgIG15ICRjd2QgICAgICA9IHNoaWZ0OwoKICAgICRzZWxmLT57Y3dkfSA9ICRjd2Q7Cn0KCj1oZWFkMiAkYm9vbCA9ICR0YXItPmhhc19pb19zdHJpbmcKClJldHVybnMgdHJ1ZSBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBDPElPOjpTdHJpbmc+IHN1cHBvcnQgbG9hZGVkLgoKRWl0aGVyIEM8SU86OlN0cmluZz4gb3IgQzxwZXJsaW8+IHN1cHBvcnQgaXMgbmVlZGVkIHRvIHN1cHBvcnQgd3JpdGluZyAKc3RyaW5naWZpZWQgYXJjaGl2ZXMuIEN1cnJlbnRseSwgQzxwZXJsaW8+IGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kLCBpZgphdmFpbGFibGUuCgpTZWUgdGhlIEM8R0xPQkFMIFZBUklBQkxFUz4gc2VjdGlvbiB0byBzZWUgaG93IHRvIGNoYW5nZSB0aGlzIHByZWZlcmVuY2UuCgo9Y3V0CgpzdWIgaGFzX2lvX3N0cmluZyB7IHJldHVybiAkSEFTX0lPX1NUUklORzsgfQoKPWhlYWQyICRib29sID0gJHRhci0+aGFzX3BlcmxpbwoKUmV0dXJucyB0cnVlIGlmIHdlIGN1cnJlbnRseSBoYXZlIEM8cGVybGlvPiBzdXBwb3J0IGxvYWRlZC4KClRoaXMgcmVxdWlyZXMgQzxwZXJsLTUuOD4gb3IgaGlnaGVyLCBjb21waWxlZCB3aXRoIEM8cGVybGlvPiAKCkVpdGhlciBDPElPOjpTdHJpbmc+IG9yIEM8cGVybGlvPiBzdXBwb3J0IGlzIG5lZWRlZCB0byBzdXBwb3J0IHdyaXRpbmcgCnN0cmluZ2lmaWVkIGFyY2hpdmVzLiBDdXJyZW50bHksIEM8cGVybGlvPiBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCwgaWYKYXZhaWxhYmxlLgoKU2VlIHRoZSBDPEdMT0JBTCBWQVJJQUJMRVM+IHNlY3Rpb24gdG8gc2VlIGhvdyB0byBjaGFuZ2UgdGhpcyBwcmVmZXJlbmNlLgoKPWN1dAoKc3ViIGhhc19wZXJsaW8geyByZXR1cm4gJEhBU19QRVJMSU87IH0KCgo9aGVhZDEgQ2xhc3MgTWV0aG9kcwoKPWhlYWQyIEFyY2hpdmU6OlRhci0+Y3JlYXRlX2FyY2hpdmUoJGZpbGUsICRjb21wcmVzc2lvbiwgQGZpbGVsaXN0KQoKQ3JlYXRlcyBhIHRhciBmaWxlIGZyb20gdGhlIGxpc3Qgb2YgZmlsZXMgcHJvdmlkZWQuICBUaGUgZmlyc3QKYXJndW1lbnQgY2FuIGVpdGhlciBiZSB0aGUgbmFtZSBvZiB0aGUgdGFyIGZpbGUgdG8gY3JlYXRlIG9yIGEKcmVmZXJlbmNlIHRvIGFuIG9wZW4gZmlsZSBoYW5kbGUgKGUuZy4gYSBHTE9CIHJlZmVyZW5jZSkuCgpUaGUgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgY29tcHJlc3Npb24gdG8gYmUgdXNlZCwgaWYKYW55LiAgQ29tcHJlc3Npb24gb2YgdGFyIGZpbGVzIHJlcXVpcmVzIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlCklPOjpabGliIG1vZHVsZS4gIFNwZWNpZmljIGxldmVscyBvZiBjb21wcmVzc2lvbiBtYXkgYmUKcmVxdWVzdGVkIGJ5IHBhc3NpbmcgYSB2YWx1ZSBiZXR3ZWVuIDIgYW5kIDkgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4KQW55IG90aGVyIHZhbHVlIGV2YWx1YXRpbmcgYXMgdHJ1ZSB3aWxsIHJlc3VsdCBpbiB0aGUgZGVmYXVsdApjb21wcmVzc2lvbiBsZXZlbCBiZWluZyB1c2VkLgoKTm90ZSB0aGF0IHdoZW4geW91IHBhc3MgaW4gYSBmaWxlaGFuZGxlLCB0aGUgY29tcHJlc3Npb24gYXJndW1lbnQKaXMgaWdub3JlZCwgYXMgYWxsIGZpbGVzIGFyZSBwcmludGVkIHZlcmJhdGltIHRvIHlvdXIgZmlsZWhhbmRsZS4KSWYgeW91IHdpc2ggdG8gZW5hYmxlIGNvbXByZXNzaW9uIHdpdGggZmlsZWhhbmRsZXMsIHVzZSBhbgpDPElPOjpabGliPiBmaWxlaGFuZGxlIGluc3RlYWQuCgpUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBsaXN0IHRoZSBmaWxlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgdGFyIGZpbGUuClRoZXNlIGZpbGVzIG11c3QgYWxsIGV4aXN0LiBBbnkgZmlsZXMgd2hpY2ggZG9uJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUKcmVhZCBhcmUgc2lsZW50bHkgaWdub3JlZC4KCklmIHRoZSBhcmNoaXZlIGNyZWF0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLCBDPGNyZWF0ZV9hcmNoaXZlPiB3aWxsCnJldHVybiBmYWxzZS4gUGxlYXNlIHVzZSB0aGUgQzxlcnJvcj4gbWV0aG9kIHRvIGZpbmQgdGhlIGNhdXNlIG9mIHRoZQpmYWlsdXJlLgoKTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHdyaXRlIEM8b24gdGhlIGZseT4gYXMgaXQgd2VyZTsgaXQKc3RpbGwgcmVhZHMgYWxsIHRoZSBmaWxlcyBpbnRvIG1lbW9yeSBiZWZvcmUgd3JpdGluZyBvdXQgdGhlIGFyY2hpdmUuCkNvbnN1bHQgdGhlIEZBUSBiZWxvdyBpZiB0aGlzIGlzIGEgcHJvYmxlbS4KCj1jdXQKCnN1YiBjcmVhdGVfYXJjaGl2ZSB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKCiAgICBteSAkZmlsZSAgICA9IHNoaWZ0OyByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkZ3ppcCAgICA9IHNoaWZ0IHx8IDA7CiAgICBteSBAZmlsZXMgICA9IEBfOwoKICAgIHVubGVzcyggQGZpbGVzICkgewogICAgICAgIHJldHVybiAkY2xhc3MtPl9lcnJvciggcXFbQ293YXJkbHkgcmVmdXNpbmcgdG8gY3JlYXRlIGVtcHR5IGFyY2hpdmUhXSApOwogICAgfQoKICAgIG15ICR0YXIgPSAkY2xhc3MtPm5ldzsKICAgICR0YXItPmFkZF9maWxlcyggQGZpbGVzICk7CiAgICByZXR1cm4gJHRhci0+d3JpdGUoICRmaWxlLCAkZ3ppcCApOwp9Cgo9aGVhZDIgQXJjaGl2ZTo6VGFyLT5saXN0X2FyY2hpdmUgKCRmaWxlLCAkY29tcHJlc3NlZCwgW1xAcHJvcGVydGllc10pCgpSZXR1cm5zIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZS4gIFRoZQpmaXJzdCBhcmd1bWVudCBjYW4gZWl0aGVyIGJlIHRoZSBuYW1lIG9mIHRoZSB0YXIgZmlsZSB0byBsaXN0IG9yIGEKcmVmZXJlbmNlIHRvIGFuIG9wZW4gZmlsZSBoYW5kbGUgKGUuZy4gYSBHTE9CIHJlZmVyZW5jZSkuCgpJZiBDPGxpc3RfYXJjaGl2ZSgpPiBpcyBwYXNzZWQgYW4gYXJyYXkgcmVmZXJlbmNlIGFzIGl0cyB0aGlyZAphcmd1bWVudCBpdCByZXR1cm5zIGEgbGlzdCBvZiBoYXNoIHJlZmVyZW5jZXMgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkCnByb3BlcnRpZXMgb2YgZWFjaCBmaWxlLiAgVGhlIGZvbGxvd2luZyBsaXN0IG9mIHByb3BlcnRpZXMgaXMKc3VwcG9ydGVkOiBmdWxsX3BhdGgsIG5hbWUsIHNpemUsIG10aW1lIChsYXN0IG1vZGlmaWVkIGRhdGUpLCBtb2RlLCAKdWlkLCBnaWQsIGxpbmtuYW1lLCB1bmFtZSwgZ25hbWUsIGRldm1ham9yLCBkZXZtaW5vciwgcHJlZml4LgoKU2VlIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBmb3IgZGV0YWlscyBhYm91dCBzdXBwb3J0ZWQgcHJvcGVydGllcy4KClBhc3NpbmcgYW4gYXJyYXkgcmVmZXJlbmNlIGNvbnRhaW5pbmcgb25seSBvbmUgZWxlbWVudCwgJ25hbWUnLCBpcwpzcGVjaWFsIGNhc2VkIHRvIHJldHVybiBhIGxpc3Qgb2YgbmFtZXMgcmF0aGVyIHRoYW4gYSBsaXN0IG9mIGhhc2gKcmVmZXJlbmNlcy4KCj1jdXQKCnN1YiBsaXN0X2FyY2hpdmUgewogICAgbXkgJGNsYXNzICAgPSBzaGlmdDsKICAgIG15ICRmaWxlICAgID0gc2hpZnQ7IHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZmlsZTsKICAgIG15ICRnemlwICAgID0gc2hpZnQgfHwgMDsKCiAgICBteSAkdGFyID0gJGNsYXNzLT5uZXcoJGZpbGUsICRnemlwKTsKICAgIHJldHVybiB1bmxlc3MgJHRhcjsKCiAgICByZXR1cm4gJHRhci0+bGlzdF9maWxlcyggQF8gKTsKfQoKPWhlYWQyIEFyY2hpdmU6OlRhci0+ZXh0cmFjdF9hcmNoaXZlICgkZmlsZSwgJGd6aXApCgpFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgdGhlIHRhciBmaWxlLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGNhbiBlaXRoZXIKYmUgdGhlIG5hbWUgb2YgdGhlIHRhciBmaWxlIHRvIGNyZWF0ZSBvciBhIHJlZmVyZW5jZSB0byBhbiBvcGVuIGZpbGUKaGFuZGxlIChlLmcuIGEgR0xPQiByZWZlcmVuY2UpLiAgQWxsIHJlbGF0aXZlIHBhdGhzIGluIHRoZSB0YXIgZmlsZSB3aWxsCmJlIGNyZWF0ZWQgdW5kZXJuZWF0aCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KCkM8ZXh0cmFjdF9hcmNoaXZlPiB3aWxsIHJldHVybiBhIGxpc3Qgb2YgZmlsZXMgaXQgZXh0cmFjdGVkLgpJZiB0aGUgYXJjaGl2ZSBleHRyYWN0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLCBDPGV4dHJhY3RfYXJjaGl2ZT4Kd2lsbCByZXR1cm4gZmFsc2UuICBQbGVhc2UgdXNlIHRoZSBDPGVycm9yPiBtZXRob2QgdG8gZmluZCB0aGUgY2F1c2UKb2YgdGhlIGZhaWx1cmUuCgo9Y3V0CgpzdWIgZXh0cmFjdF9hcmNoaXZlIHsKICAgIG15ICRjbGFzcyAgID0gc2hpZnQ7CiAgICBteSAkZmlsZSAgICA9IHNoaWZ0OyByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkZ3ppcCAgICA9IHNoaWZ0IHx8IDA7CgogICAgbXkgJHRhciA9ICRjbGFzcy0+bmV3KCApIG9yIHJldHVybjsKCiAgICByZXR1cm4gJHRhci0+cmVhZCggJGZpbGUsICRnemlwLCB7IGV4dHJhY3QgPT4gMSB9ICk7Cn0KCj1oZWFkMiBBcmNoaXZlOjpUYXItPmNhbl9oYW5kbGVfY29tcHJlc3NlZF9maWxlcwoKQSBzaW1wbGUgY2hlY2tpbmcgcm91dGluZSwgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBpZiBDPEFyY2hpdmU6OlRhcj4KaXMgYWJsZSB0byB1bmNvbXByZXNzIGNvbXByZXNzZWQgYXJjaGl2ZXMgb24gdGhlIGZseSB3aXRoIEM8SU86OlpsaWI+LApvciBmYWxzZSBpZiBDPElPOjpabGliPiBpcyBub3QgaW5zdGFsbGVkLgoKWW91IGNhbiB1c2UgdGhpcyBhcyBhIHNob3J0Y3V0IHRvIGRldGVybWluZSB3aGV0aGVyIEM8QXJjaGl2ZTo6VGFyPgp3aWxsIGRvIHdoYXQgeW91IHRoaW5rIGJlZm9yZSBwYXNzaW5nIGNvbXByZXNzZWQgYXJjaGl2ZXMgdG8gaXRzCkM8cmVhZD4gbWV0aG9kLgoKPWN1dAoKc3ViIGNhbl9oYW5kbGVfY29tcHJlc3NlZF9maWxlcyB7IHJldHVybiBaTElCID8gMSA6IDAgfQoKc3ViIG5vX3N0cmluZ19zdXBwb3J0IHsKICAgIGNyb2FrKCJZb3UgaGF2ZSB0byBpbnN0YWxsIElPOjpTdHJpbmcgdG8gc3VwcG9ydCB3cml0aW5nIGFyY2hpdmVzIHRvIHN0cmluZ3MiKTsKfQoKMTsKCl9fRU5EX18KCj1oZWFkMSBHTE9CQUwgVkFSSUFCTEVTCgo9aGVhZDIgJEFyY2hpdmU6OlRhcjo6Rk9MTE9XX1NZTUxJTksKClNldCB0aGlzIHZhcmlhYmxlIHRvIEM8MT4gdG8gbWFrZSBDPEFyY2hpdmU6OlRhcj4gZWZmZWN0aXZlbHkgbWFrZSBhCmNvcHkgb2YgdGhlIGZpbGUgd2hlbiBleHRyYWN0aW5nLiBEZWZhdWx0IGlzIEM8MD4sIHdoaWNoCm1lYW5zIHRoZSBzeW1saW5rIHN0YXlzIGludGFjdC4gT2YgY291cnNlLCB5b3Ugd2lsbCBoYXZlIHRvIHBhY2sgdGhlCmZpbGUgbGlua2VkIHRvIGFzIHdlbGwuCgpUaGlzIG9wdGlvbiBpcyBjaGVja2VkIHdoZW4geW91IHdyaXRlIG91dCB0aGUgdGFyZmlsZSB1c2luZyBDPHdyaXRlPgpvciBDPGNyZWF0ZV9hcmNoaXZlPi4KClRoaXMgd29ya3MganVzdCBsaWtlIEM8L2Jpbi90YXI+J3MgQzwtaD4gb3B0aW9uLgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkNIT1dOCgpCeSBkZWZhdWx0LCBDPEFyY2hpdmU6OlRhcj4gd2lsbCB0cnkgdG8gQzxjaG93bj4geW91ciBmaWxlcyBpZiBpdCBpcwphYmxlIHRvLiBJbiBzb21lIGNhc2VzLCB0aGlzIG1heSBub3QgYmUgZGVzaXJlZC4gSW4gdGhhdCBjYXNlLCBzZXQKdGhpcyB2YXJpYWJsZSB0byBDPDA+IHRvIGRpc2FibGUgQzxjaG93bj4taW5nLCBldmVuIGlmIGl0IHdlcmUKcG9zc2libGUuCgpUaGUgZGVmYXVsdCBpcyBDPDE+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkNITU9ECgpCeSBkZWZhdWx0LCBDPEFyY2hpdmU6OlRhcj4gd2lsbCB0cnkgdG8gQzxjaG1vZD4geW91ciBmaWxlcyB0bwp3aGF0ZXZlciBtb2RlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIGZpbGUgaW4gdGhlIGFyY2hpdmUuCkluIHNvbWUgY2FzZXMsIHRoaXMgbWF5IG5vdCBiZSBkZXNpcmVkLiBJbiB0aGF0IGNhc2UsIHNldCB0aGlzCnZhcmlhYmxlIHRvIEM8MD4gdG8gZGlzYWJsZSBDPGNobW9kPi1pbmcuCgpUaGUgZGVmYXVsdCBpcyBDPDE+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkRPX05PVF9VU0VfUFJFRklYCgpCeSBkZWZhdWx0LCBDPEFyY2hpdmU6OlRhcj4gd2lsbCB0cnkgdG8gcHV0IHBhdGhzIHRoYXQgYXJlIG92ZXIgCjEwMCBjaGFyYWN0ZXJzIGluIHRoZSBDPHByZWZpeD4gZmllbGQgb2YgeW91ciB0YXIgaGVhZGVyLCBhcwpkZWZpbmVkIHBlciBQT1NJWC1zdGFuZGFyZC4gSG93ZXZlciwgc29tZSAob2xkZXIpIHRhciBwcm9ncmFtcyAKZG8gbm90IGltcGxlbWVudCB0aGlzIHNwZWMuIFRvIHJldGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlc2Ugb2xkZXIgCm9yIG5vbi1QT1NJWCBjb21wbGlhbnQgdmVyc2lvbnMsIHlvdSBjYW4gc2V0IHRoZSBDPCRET19OT1RfVVNFX1BSRUZJWD4gCnZhcmlhYmxlIHRvIGEgdHJ1ZSB2YWx1ZSwgYW5kIEM8QXJjaGl2ZTo6VGFyPiB3aWxsIHVzZSBhbiBhbHRlcm5hdGUgCndheSBvZiBkZWFsaW5nIHdpdGggcGF0aHMgb3ZlciAxMDAgY2hhcmFjdGVycyBieSB1c2luZyB0aGUgCkM8R05VIEV4dGVuZGVkIEhlYWRlcj4gZmVhdHVyZS4KCk5vdGUgdGhhdCBjbGllbnRzIHdobyBkbyBub3Qgc3VwcG9ydCB0aGUgQzxHTlUgRXh0ZW5kZWQgSGVhZGVyPgpmZWF0dXJlIHdpbGwgbm90IGJlIGFibGUgdG8gcmVhZCB0aGVzZSBhcmNoaXZlcy4gU3VjaCBjbGllbnRzIGluY2x1ZGUKdGFycyBvbiBDPFNvbGFyaXM+LCBDPElyaXg+IGFuZCBDPEFJWD4uCgpUaGUgZGVmYXVsdCBpcyBDPDA+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkRFQlVHCgpTZXQgdGhpcyB2YXJpYWJsZSB0byBDPDE+IHRvIGFsd2F5cyBnZXQgdGhlIEM8Q2FycDo6bG9uZ21lc3M+IG91dHB1dApvZiB0aGUgd2FybmluZ3MsIGluc3RlYWQgb2YgdGhlIHJlZ3VsYXIgQzxjYXJwPi4gVGhpcyBpcyB0aGUgc2FtZQptZXNzYWdlIHlvdSB3b3VsZCBnZXQgYnkgZG9pbmc6CgogICAgJHRhci0+ZXJyb3IoMSk7CgpEZWZhdWx0cyB0byBDPDA+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OldBUk4KClNldCB0aGlzIHZhcmlhYmxlIHRvIEM8MD4gaWYgeW91IGRvIG5vdCB3YW50IGFueSB3YXJuaW5ncyBwcmludGVkLgpQZXJzb25hbGx5IEkgcmVjb21tZW5kIGFnYWluc3QgZG9pbmcgdGhpcywgYnV0IHBlb3BsZSBhc2tlZCBmb3IgdGhlCm9wdGlvbi4gQWxzbywgYmUgYWR2aXNlZCB0aGF0IHRoaXMgaXMgb2YgY291cnNlIG5vdCB0aHJlYWRzYWZlLgoKRGVmYXVsdHMgdG8gQzwxPi4KCj1oZWFkMiAkQXJjaGl2ZTo6VGFyOjplcnJvcgoKSG9sZHMgdGhlIGxhc3QgcmVwb3J0ZWQgZXJyb3IuIEtlcHQgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgYnV0IGl0cwp1c2UgaXMgdmVyeSBtdWNoIGRpc2NvdXJhZ2VkLiBVc2UgdGhlIEM8ZXJyb3IoKT4gbWV0aG9kIGluc3RlYWQ6CgogICAgd2FybiAkdGFyLT5lcnJvciB1bmxlc3MgJHRhci0+ZXh0cmFjdDsKCj1oZWFkMiAkQXJjaGl2ZTo6VGFyOjpIQVNfUEVSTElPCgpUaGlzIHZhcmlhYmxlIGhvbGRzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHdlIGN1cnJlbnRseSBoYXZlIApDPHBlcmxpbz4gc3VwcG9ydCBsb2FkZWQuIFRoaXMgd2lsbCBiZSBlbmFibGVkIGZvciBhbnkgcGVybApncmVhdGVyIHRoYW4gQzw1Ljg+IGNvbXBpbGVkIHdpdGggQzxwZXJsaW8+LiAKCklmIHlvdSBmZWVsIHN0cm9uZ2x5IGFib3V0IGRpc2FibGluZyBpdCwgc2V0IHRoaXMgdmFyaWFibGUgdG8KQzxmYWxzZT4uIE5vdGUgdGhhdCB5b3Ugd2lsbCB0aGVuIG5lZWQgQzxJTzo6U3RyaW5nPiBpbnN0YWxsZWQKdG8gc3VwcG9ydCB3cml0aW5nIHN0cmluZ2lmaWVkIGFyY2hpdmVzLgoKRG9uJ3QgY2hhbmdlIHRoaXMgdmFyaWFibGUgdW5sZXNzIHlvdSBCPHJlYWxseT4ga25vdyB3aGF0IHlvdSdyZQpkb2luZy4KCj1oZWFkMiAkQXJjaGl2ZTo6VGFyOjpIQVNfSU9fU1RSSU5HCgpUaGlzIHZhcmlhYmxlIGhvbGRzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHdlIGN1cnJlbnRseSBoYXZlIApDPElPOjpTdHJpbmc+IHN1cHBvcnQgbG9hZGVkLiBUaGlzIHdpbGwgYmUgZW5hYmxlZCBmb3IgYW55IHBlcmwKdGhhdCBoYXMgYSBsb2FkYWJsZSBDPElPOjpTdHJpbmc+IG1vZHVsZS4KCklmIHlvdSBmZWVsIHN0cm9uZ2x5IGFib3V0IGRpc2FibGluZyBpdCwgc2V0IHRoaXMgdmFyaWFibGUgdG8KQzxmYWxzZT4uIE5vdGUgdGhhdCB5b3Ugd2lsbCB0aGVuIG5lZWQgQzxwZXJsaW8+IHN1cHBvcnQgZnJvbQp5b3VyIHBlcmwgdG8gYmUgYWJsZSB0byAgd3JpdGUgc3RyaW5naWZpZWQgYXJjaGl2ZXMuCgpEb24ndCBjaGFuZ2UgdGhpcyB2YXJpYWJsZSB1bmxlc3MgeW91IEI8cmVhbGx5PiBrbm93IHdoYXQgeW91J3JlCmRvaW5nLgoKPWhlYWQxIEZBUQoKPW92ZXIgNAoKPWl0ZW0gV2hhdCdzIHRoZSBtaW5pbXVtIHBlcmwgdmVyc2lvbiByZXF1aXJlZCB0byBydW4gQXJjaGl2ZTo6VGFyPwoKWW91IHdpbGwgbmVlZCBwZXJsIHZlcnNpb24gNS4wMDVfMDMgb3IgbmV3ZXIuCgo9aXRlbSBJc24ndCBBcmNoaXZlOjpUYXIgc2xvdz8KClllcyBpdCBpcy4gSXQncyBwdXJlIHBlcmwsIHNvIGl0J3MgYSBsb3Qgc2xvd2VyIHRoZW4geW91ciBDPC9iaW4vdGFyPgpIb3dldmVyLCBpdCdzIHZlcnkgcG9ydGFibGUuIElmIHNwZWVkIGlzIGFuIGlzc3VlLCBjb25zaWRlciB1c2luZwpDPC9iaW4vdGFyPiBpbnN0ZWFkLgoKPWl0ZW0gSXNuJ3QgQXJjaGl2ZTo6VGFyIGhlYXZpZXIgb24gbWVtb3J5IHRoYW4gL2Jpbi90YXI/CgpZZXMgaXQgaXMsIHNlZSBwcmV2aW91cyBhbnN3ZXIuIFNpbmNlIEM8Q29tcHJlc3M6OlpsaWI+IGFuZCB0aGVyZWZvcmUKQzxJTzo6WmxpYj4gZG9lc24ndCBzdXBwb3J0IEM8c2Vlaz4gb24gdGhlaXIgZmlsZWhhbmRsZXMsIHRoZXJlIGlzIGxpdHRsZQpjaG9pY2UgYnV0IHRvIHJlYWQgdGhlIGFyY2hpdmUgaW50byBtZW1vcnkuClRoaXMgaXMgb2sgaWYgeW91IHdhbnQgdG8gZG8gaW4tbWVtb3J5IG1hbmlwdWxhdGlvbiBvZiB0aGUgYXJjaGl2ZS4KSWYgeW91IGp1c3Qgd2FudCB0byBleHRyYWN0LCB1c2UgdGhlIEM8ZXh0cmFjdF9hcmNoaXZlPiBjbGFzcyBtZXRob2QKaW5zdGVhZC4gSXQgd2lsbCBvcHRpbWl6ZSBhbmQgd3JpdGUgdG8gZGlzayBpbW1lZGlhdGVseS4KCj1pdGVtIENhbid0IHlvdSBsYXp5LWxvYWQgZGF0YSBpbnN0ZWFkPwoKTm8sIG5vdCBlYXNpbHkuIFNlZSBwcmV2aW91cyBxdWVzdGlvbi4KCj1pdGVtIEhvdyBtdWNoIG1lbW9yeSB3aWxsIGFuIFgga2IgdGFyIGZpbGUgbmVlZD8KClByb2JhYmx5IG1vcmUgdGhhbiBYIGtiLCBzaW5jZSBpdCB3aWxsIGFsbCBiZSByZWFkIGludG8gbWVtb3J5LiBJZgp0aGlzIGlzIGEgcHJvYmxlbSwgYW5kIHlvdSBkb24ndCBuZWVkIHRvIGRvIGluIG1lbW9yeSBtYW5pcHVsYXRpb24Kb2YgdGhlIGFyY2hpdmUsIGNvbnNpZGVyIHVzaW5nIEM8L2Jpbi90YXI+IGluc3RlYWQuCgo9aXRlbSBXaGF0IGRvIHlvdSBkbyB3aXRoIHVuc3VwcG9ydGVkIGZpbGV0eXBlcyBpbiBhbiBhcmNoaXZlPwoKQzxVbml4PiBoYXMgYSBmZXcgZmlsZXR5cGVzIHRoYXQgYXJlbid0IHN1cHBvcnRlZCBvbiBvdGhlciBwbGF0Zm9ybXMsCmxpa2UgQzxXaW4zMj4uIElmIHdlIGVuY291bnRlciBhIEM8aGFyZGxpbms+IG9yIEM8c3ltbGluaz4gd2UnbGwganVzdAp0cnkgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGZpbGUsIHJhdGhlciB0aGFuIHRocm93aW5nIGFuIGVycm9yLgoKVGhpcyBkb2VzIHJlcXVpcmUgeW91IHRvIHJlYWQgdGhlIGVudGlyZSBhcmNoaXZlIGluIHRvIG1lbW9yeSBmaXJzdCwKc2luY2Ugb3RoZXJ3aXNlIHdlIHdvdWxkbid0IGtub3cgd2hhdCBkYXRhIHRvIGZpbGwgdGhlIGNvcHkgd2l0aC4KKFRoaXMgbWVhbnMgdGhhdCB5b3UgY2Fubm90IHVzZSB0aGUgY2xhc3MgbWV0aG9kcyBvbiBhcmNoaXZlcyB0aGF0CmhhdmUgaW5jb21wYXRpYmxlIGZpbGV0eXBlcyBhbmQgc3RpbGwgZXhwZWN0IHRoaW5ncyB0byB3b3JrKS4KCkZvciBvdGhlciBmaWxldHlwZXMsIGxpa2UgQzxjaGFyZGV2cz4gYW5kIEM8YmxvY2tkZXZzPiB3ZSdsbCB3YXJuIHRoYXQKdGhlIGV4dHJhY3Rpb24gb2YgdGhpcyBwYXJ0aWN1bGFyIGl0ZW0gZGlkbid0IHdvcmsuCgo9aXRlbSBJJ20gdXNpbmcgV2luWmlwLCBvciBzb21lIG90aGVyIG5vbi1QT1NJWCBjbGllbnQsIGFuZCBmaWxlcyBhcmUgbm90IGJlaW5nIGV4dHJhY3RlZCBwcm9wZXJseSEKCkJ5IGRlZmF1bHQsIEM8QXJjaGl2ZTo6VGFyPiBpcyBpbiBhIGNvbXBsZXRlbHkgUE9TSVgtY29tcGF0aWJsZQptb2RlLCB3aGljaCB1c2VzIHRoZSBQT1NJWC1zcGVjaWZpY2F0aW9uIG9mIEM8dGFyPiB0byBzdG9yZSBmaWxlcy4KRm9yIHBhdGhzIGdyZWF0aGVyIHRoYW4gMTAwIGNoYXJhY3RlcnMsIHRoaXMgaXMgZG9uZSB1c2luZyB0aGUKQzxQT1NJWCBoZWFkZXIgcHJlZml4Pi4gTm9uLVBPU0lYLWNvbXBhdGlibGUgY2xpZW50cyBtYXkgbm90IHN1cHBvcnQKdGhpcyBwYXJ0IG9mIHRoZSBzcGVjaWZpY2F0aW9uLCBhbmQgbWF5IG9ubHkgc3VwcG9ydCB0aGUgQzxHTlUgRXh0ZW5kZWQKSGVhZGVyPiBmdW5jdGlvbmFsaXR5LiBUbyBmYWNpbGl0YXRlIHRob3NlIGNsaWVudHMsIHlvdSBjYW4gc2V0IHRoZQpDPCRBcmNoaXZlOjpUYXI6OkRPX05PVF9VU0VfUFJFRklYPiB2YXJpYWJsZSB0byBDPHRydWU+LiBTZWUgdGhlIApDPEdMT0JBTCBWQVJJQUJMRVM+IHNlY3Rpb24gZm9yIGRldGFpbHMgb24gdGhpcyB2YXJpYWJsZS4KCk5vdGUgdGhhdCBHTlUgdGFyIGVhcmxpZXIgdGhhbiB2ZXJzaW9uIDEuMTQgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGgKdGhlIEM8UE9TSVggaGVhZGVyIHByZWZpeD4uIElmIHlvdSB1c2Ugc3VjaCBhIHZlcnNpb24sIGNvbnNpZGVyIHNldHRpbmcKdGhlIEM8JEFyY2hpdmU6OlRhcjo6RE9fTk9UX1VTRV9QUkVGSVg+IHZhcmlhYmxlIHRvIEM8dHJ1ZT4uCgo9aXRlbSBIb3cgZG8gSSBleHRyYWN0IG9ubHkgZmlsZXMgdGhhdCBoYXZlIHByb3BlcnR5IFggZnJvbSBhbiBhcmNoaXZlPwoKU29tZXRpbWVzLCB5b3UgbWlnaHQgbm90IHdpc2ggdG8gZXh0cmFjdCBhIGNvbXBsZXRlIGFyY2hpdmUsIGp1c3QKdGhlIGZpbGVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHlvdSwgYmFzZWQgb24gc29tZSBjcml0ZXJpYS4KCllvdSBjYW4gZG8gdGhpcyBieSBmaWx0ZXJpbmcgYSBsaXN0IG9mIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3RzCmJhc2VkIG9uIHlvdXIgY3JpdGVyaWEuIEZvciBleGFtcGxlLCB0byBleHRyYWN0IG9ubHkgZmlsZXMgdGhhdCBoYXZlCnRoZSBzdHJpbmcgQzxmb28+IGluIHRoZWlyIHRpdGxlLCB5b3Ugd291bGQgdXNlOgoKICAgICR0YXItPmV4dHJhY3QoIAogICAgICAgIGdyZXAgeyAkXy0+ZnVsbF9wYXRoID1+IC9mb28vIH0gJHRhci0+Z2V0X2ZpbGVzCiAgICApOyAKClRoaXMgd2F5LCB5b3UgY2FuIGZpbHRlciBvbiBhbnkgYXR0cmlidXRlIG9mIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZS4KQ29uc3VsdCB0aGUgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IGRvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGVzZQpvYmplY3RzLgoKPWl0ZW0gSG93IGRvIEkgYWNjZXNzIC50YXIuWiBmaWxlcz8KClRoZSBDPEFyY2hpdmU6OlRhcj4gbW9kdWxlIGNhbiBvcHRpb25hbGx5IHVzZSBDPENvbXByZXNzOjpabGliPiAodmlhCnRoZSBDPElPOjpabGliPiBtb2R1bGUpIHRvIGFjY2VzcyB0YXIgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZAp3aXRoIEM8Z3ppcD4uIFVuZm9ydHVuYXRlbHkgdGFyIGZpbGVzIGNvbXByZXNzZWQgd2l0aCB0aGUgVW5peCBDPGNvbXByZXNzPgp1dGlsaXR5IGNhbm5vdCBiZSByZWFkIGJ5IEM8Q29tcHJlc3M6OlpsaWI+IGFuZCBzbyBjYW5ub3QgYmUgZGlyZWN0bHkKYWNjZXNzZXMgYnkgQzxBcmNoaXZlOjpUYXI+LgoKSWYgdGhlIEM8dW5jb21wcmVzcz4gb3IgQzxndW56aXA+IHByb2dyYW1zIGFyZSBhdmFpbGFibGUsIHlvdSBjYW4gdXNlCm9uZSBvZiB0aGVzZSB3b3JrYXJvdW5kcyB0byByZWFkIEM8LnRhci5aPiBmaWxlcyBmcm9tIEM8QXJjaGl2ZTo6VGFyPgoKRmlyc3RseSB3aXRoIEM8dW5jb21wcmVzcz4KCiAgICB1c2UgQXJjaGl2ZTo6VGFyOwoKICAgIG9wZW4gRiwgInVuY29tcHJlc3MgLWMgJGZpbGVuYW1lIHwiOwogICAgbXkgJHRhciA9IEFyY2hpdmU6OlRhci0+bmV3KCpGKTsKICAgIC4uLgoKYW5kIHRoaXMgd2l0aCBDPGd1bnppcD4KCiAgICB1c2UgQXJjaGl2ZTo6VGFyOwoKICAgIG9wZW4gRiwgImd1bnppcCAtYyAkZmlsZW5hbWUgfCI7CiAgICBteSAkdGFyID0gQXJjaGl2ZTo6VGFyLT5uZXcoKkYpOwogICAgLi4uCgpTaW1pbGFybHksIGlmIHRoZSBDPGNvbXByZXNzPiBwcm9ncmFtIGlzIGF2YWlsYWJsZSwgeW91IGNhbiB1c2UgdGhpcyB0bwp3cml0ZSBhIEM8LnRhci5aPiBmaWxlCgogICAgdXNlIEFyY2hpdmU6OlRhcjsKICAgIHVzZSBJTzo6RmlsZTsKCiAgICBteSAkZmggPSBuZXcgSU86OkZpbGUgInwgY29tcHJlc3MgLWMgPiRmaWxlbmFtZSI7CiAgICBteSAkdGFyID0gQXJjaGl2ZTo6VGFyLT5uZXcoKTsKICAgIC4uLgogICAgJHRhci0+d3JpdGUoJGZoKTsKICAgICRmaC0+Y2xvc2UgOwoKPWl0ZW0gSG93IGRvIEkgaGFuZGxlIFVuaWNvZGUgc3RyaW5ncz8KCkM8QXJjaGl2ZTo6VGFyPiB1c2VzIGJ5dGUgc2VtYW50aWNzIGZvciBhbnkgZmlsZXMgaXQgcmVhZHMgZnJvbSBvciB3cml0ZXMKdG8gZGlzay4gVGhpcyBpcyBub3QgYSBwcm9ibGVtIGlmIHlvdSBvbmx5IGRlYWwgd2l0aCBmaWxlcyBhbmQgbmV2ZXIKbG9vayBhdCB0aGVpciBjb250ZW50IG9yIHdvcmsgc29sZWx5IHdpdGggYnl0ZSBzdHJpbmdzLiBCdXQgaWYgeW91IHVzZQpVbmljb2RlIHN0cmluZ3Mgd2l0aCBjaGFyYWN0ZXIgc2VtYW50aWNzLCBzb21lIGFkZGl0aW9uYWwgc3RlcHMgbmVlZAp0byBiZSB0YWtlbi4KCkZvciBleGFtcGxlLCBpZiB5b3UgYWRkIGEgVW5pY29kZSBzdHJpbmcgbGlrZQoKICAgICMgUHJvYmxlbQogICAgJHRhci0+YWRkX2RhdGEoJ2ZpbGUudHh0JywgIkV1cm86IFx4ezIwQUN9Iik7Cgp0aGVuIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIGxhdGVyIHdoZW4gdGhlIHRhcmZpbGUgZ2V0cyB3cml0dGVuIG91dAp0byBkaXNrIHZpYSBDPCR0YXItPndyaXRlKCk+OgoKICAgIFdpZGUgY2hhcmFjdGVyIGluIHByaW50IGF0IC4uLi9BcmNoaXZlL1Rhci5wbSBsaW5lIDEwMTQuCgpUaGUgZGF0YSB3YXMgYWRkZWQgYXMgYSBVbmljb2RlIHN0cmluZyBhbmQgd2hlbiB3cml0aW5nIGl0IG91dCB0byBkaXNrLAp0aGUgQzw6dXRmOD4gbGluZSBkaXNjaXBsaW5lIHdhc24ndCBzZXQgYnkgQzxBcmNoaXZlOjpUYXI+LCBzbyBQZXJsCnRyaWVkIHRvIGNvbnZlcnQgdGhlIHN0cmluZyB0byBJU08tODg1OSBhbmQgZmFpbGVkLiBUaGUgd3JpdHRlbiBmaWxlCm5vdyBjb250YWlucyBnYXJiYWdlLgoKRm9yIHRoaXMgcmVhc29uLCBVbmljb2RlIHN0cmluZ3MgbmVlZCB0byBiZSBjb252ZXJ0ZWQgdG8gVVRGLTgtZW5jb2RlZApieXRlc3RyaW5ncyBiZWZvcmUgdGhleSBhcmUgaGFuZGVkIG9mZiB0byBDPGFkZF9kYXRhKCk+OgoKICAgIHVzZSBFbmNvZGU7CiAgICBteSAkZGF0YSA9ICJBY2NlbnRlZCBjaGFyYWN0ZXI6IFx4ezIwQUN9IjsKICAgICRkYXRhID0gZW5jb2RlKCd1dGY4JywgJGRhdGEpOwoKICAgICR0YXItPmFkZF9kYXRhKCdmaWxlLnR4dCcsICRkYXRhKTsKCkEgb3Bwb3NpdGUgcHJvYmxlbSBvY2N1cnMgaWYgeW91IGV4dHJhY3QgYSBVVEY4LWVuY29kZWQgZmlsZSBmcm9tIGEgCnRhcmJhbGwuIFVzaW5nIEM8Z2V0X2NvbnRlbnQoKT4gb24gdGhlIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3QKd2lsbCByZXR1cm4gaXRzIGNvbnRlbnQgYXMgYSBieXRlc3RyaW5nLCBub3QgYXMgYSBVbmljb2RlIHN0cmluZy4KCklmIHlvdSB3YW50IGl0IHRvIGJlIGEgVW5pY29kZSBzdHJpbmcgKGJlY2F1c2UgeW91IHdhbnQgY2hhcmFjdGVyCnNlbWFudGljcyB3aXRoIG9wZXJhdGlvbnMgbGlrZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcpLCB5b3UgbmVlZAp0byBkZWNvZGUgdGhlIFVURjgtZW5jb2RlZCBjb250ZW50IGFuZCBoYXZlIFBlcmwgY29udmVydCBpdCBpbnRvIAphIFVuaWNvZGUgc3RyaW5nOgoKICAgIHVzZSBFbmNvZGU7CiAgICBteSAkZGF0YSA9ICR0YXItPmdldF9jb250ZW50KCk7CiAgICAKICAgICMgTWFrZSBpdCBhIFVuaWNvZGUgc3RyaW5nCiAgICAkZGF0YSA9IGRlY29kZSgndXRmOCcsICRkYXRhKTsKClRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IGluIEM8QXJjaGl2ZTo6VGFyPiwgCmJlY2F1c2UgYSB0YXJiYWxsIGNhbiBjb250YWluIG1hbnkgZmlsZXMsIGFuZCBlYWNoIG9mIHdoaWNoIGNvdWxkIGJlCmVuY29kZWQgaW4gYSBkaWZmZXJlbnQgd2F5LgoKPWJhY2sKCj1oZWFkMSBUT0RPCgo9b3ZlciA0Cgo9aXRlbSBDaGVjayBpZiBwYXNzZWQgaW4gaGFuZGxlcyBhcmUgb3BlbiBmb3IgcmVhZC93cml0ZQoKQ3VycmVudGx5IEkgZG9uJ3Qga25vdyBvZiBhbnkgcG9ydGFibGUgcHVyZSBwZXJsIHdheSB0byBkbyB0aGlzLgpTdWdnZXN0aW9ucyB3ZWxjb21lLgoKPWl0ZW0gQWxsb3cgYXJjaGl2ZXMgdG8gYmUgcGFzc2VkIGluIGFzIHN0cmluZwoKQ3VycmVudGx5LCB3ZSBvbmx5IGFsbG93IG9wZW5lZCBmaWxlaGFuZGxlcyBvciBmaWxlbmFtZXMsIGJ1dApub3Qgc3RyaW5ncy4gVGhlIGludGVybmFscyB3b3VsZCBuZWVkIHNvbWUgcmV3b3JraW5nIHRvIGZhY2lsaXRhdGUKc3RyaW5naWZpZWQgYXJjaGl2ZXMuCgo9aXRlbSBGYWNpbGl0YXRlIHByb2Nlc3NpbmcgYW4gb3BlbmVkIGZpbGVoYW5kbGUgb2YgYSBjb21wcmVzc2VkIGFyY2hpdmUKCkN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IHRoaXMgaWYgdGhlIGZpbGVoYW5kbGUgaXMgYW4gSU86OlpsaWIgb2JqZWN0LgpFbnZpcm9ubWVudHMsIGxpa2UgYXBhY2hlLCB3aWxsIHByZXNlbnQgeW91IHdpdGggYW4gb3BlbmVkIGZpbGVoYW5kbGUKdG8gYW4gdXBsb2FkZWQgZmlsZSwgd2hpY2ggbWlnaHQgYmUgYSBjb21wcmVzc2VkIGFyY2hpdmUuCgo9YmFjawoKPWhlYWQxIFNFRSBBTFNPCgo9b3ZlciA0Cgo9aXRlbSBUaGUgR05VIHRhciBzcGVjaWZpY2F0aW9uCgpDPGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90YXIvbWFudWFsL3Rhci5odG1sPgoKPWl0ZW0gVGhlIFBBWCBmb3JtYXQgc3BlY2ljYXRpb24KClRoZSBzcGVjaWZjYXRpb24gd2hpY2ggdGFyIGRlcml2ZXMgZnJvbTsgQzwgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9wYXguaHRtbD4KCj1pdGVtIEEgY29tcGFyaXNvbiBvZiBHTlUgYW5kIFBPU0lYIHRhciBzdGFuZGFyZHM7IEM8aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy90YXIvdGFyXzExNC5odG1sPgoKPWl0ZW0gR05VIHRhciBpbnRlbmRzIHRvIHN3aXRjaCB0byBQT1NJWCBjb21wYXRpYmlsaXR5CgpHTlUgVGFyIGF1dGhvcnMgaGF2ZSBleHByZXNzZWQgdGhlaXIgaW50ZW50aW9uIHRvIGJlY29tZSBjb21wbGV0ZWx5ClBPU0lYLWNvbXBhdGlibGU7IEM8aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3Rhci9tYW51YWwvaHRtbF9ub2RlL0Zvcm1hdHMuaHRtbD4KCj1pdGVtIEEgQ29tcGFyaXNvbiBiZXR3ZWVuIHZhcmlvdXMgdGFyIGltcGxlbWVudGF0aW9ucwoKTGlzdHMga25vd24gaXNzdWVzIGFuZCBpbmNvbXBhdGliaWxpdGllczsgQzxodHRwOi8vZ2QudHV3aWVuLmFjLmF0L3V0aWxzL2FyY2hpdmVycy9zdGFyL1JFQURNRS5vdGhlcmJ1Z3M+Cgo9YmFjawoKPWhlYWQxIEFVVEhPUgoKVGhpcyBtb2R1bGUgYnkgSm9zIEJvdW1hbnMgRTxsdD5rYW5lQGNwYW4ub3JnRTxndD4uCgpQbGVhc2UgcmVwb3J0cyBidWdzIHRvIEU8bHQ+YnVnLWFyY2hpdmUtdGFyQHJ0LmNwYW4ub3JnRTxndD4uCgo9aGVhZDEgQUNLTk9XTEVER0VNRU5UUwoKVGhhbmtzIHRvIFNlYW4gQnVya2UsIENocmlzIE5hbmRvciwgQ2hpcCBTYWx6ZW5iZXJnLCBUaW0gSGVhbmV5IGFuZAplc3BlY2lhbGx5IEFuZHJldyBTYXZpZ2UgZm9yIHRoZWlyIGhlbHAgYW5kIHN1Z2dlc3Rpb25zLgoKPWhlYWQxIENPUFlSSUdIVAoKVGhpcyBtb2R1bGUgaXMgY29weXJpZ2h0IChjKSAyMDAyIC0gMjAwNyBKb3MgQm91bWFucyAKRTxsdD5rYW5lQGNwYW4ub3JnRTxndD4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSAKaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9Y3V0Cg==</File>
- <File Location="Kernel/Modules/AdminSupport.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU3VwcG9ydC5wbSAtIHNob3cgc3VwcG9ydCBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TdXBwb3J0LnBtLHYgMS4yOSAyMDEwLzA3LzMwIDEwOjA0OjMyIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5TdXBwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yOSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIE9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVGltZU9iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1VzZXJPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTdXBwb3J0T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VyIGRhdGEKICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgc2VuZGVyIGVtYWlsIGFkcmVzcwogICAgbXkgJFNlbmRlckFkcmVzcyA9ICcnOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6U2VuZGVyRW1haWwnKSApIHsKICAgICAgICAkU2VuZGVyQWRyZXNzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OlNlbmRlckVtYWlsJyk7CiAgICB9CiAgICBlbHNpZiAoICRVc2Vye1VzZXJFbWFpbH0gJiYgJFVzZXJ7VXNlckVtYWlsfSAhfiAvcm9vdFxAbG9jYWxob3N0LyApIHsKICAgICAgICAkU2VuZGVyQWRyZXNzID0gJFVzZXJ7VXNlckVtYWlsfTsKICAgIH0KICAgIGVsc2lmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQWRtaW5FbWFpbCcpCiAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FkbWluRW1haWwnKSAhfiAvcm9vdFxAbG9jYWxob3N0LwogICAgICAgICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZG1pbkVtYWlsJykgIX4gL2FkbWluXEBleGFtcGxlLmNvbS8KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbmRlckFkcmVzcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZG1pbkVtYWlsJyk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBDb25maWRlbnRpYWwKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ29uZmlkZW50aWFsJyApIHsKCiAgICAgICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlkZW50aWFsJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRVc2Vye1VzZXJMYW5ndWFnZX0gJiYgJFVzZXJ7VXNlckxhbmd1YWdlfSA9fiAvZGUvICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlkZW50aWFsQ29udGVudERFJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlkZW50aWFsQ29udGVudEVOJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU3VwcG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7fSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFNlbmRlciBJbmZvcm1hdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZW5kZXJJbmZvcm1hdGlvbicgKSB7CgogICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlbmRlckluZm9ybWF0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTZW5kZXJBZHJlc3MgICAgID0+ICRTZW5kZXJBZHJlc3MsCiAgICAgICAgICAgICAgICBTZW5kZXJTYWx1dGF0aW9uID0+ICRVc2Vye1VzZXJTYWx1dGF0aW9ufSwKICAgICAgICAgICAgICAgIFNlbmRlck5hbWUgICAgICAgPT4gJFVzZXJ7VXNlckZpcnN0bmFtZX0gLiAnICcgLiAkVXNlcntVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TdXBwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHt9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgVXBsb2FkU3VwcG9ydEluZm8KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3VibWl0JyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJUN1c3RvbWVySW5mbzsKICAgICAgICBmb3IgbXkgJEtleSAocXcoU2VuZGVyIENvbXBhbnkgU2FsdXRhdGlvbiBOYW1lIFN0cmVldCBaaXAgQ2l0eSBQaG9uZSBTZW5kSW5mbyBCdWd6aWxsYUlEKSkgewogICAgICAgICAgICAkQ3VzdG9tZXJJbmZveyRLZXl9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZSBidXR0b24gc2VuZCBiZWNvbWVzIHRoZSBzdWJtaXQKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbmQnICkgKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VuZGVySW5mb3JtYXRpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU2VuZGVyQWRyZXNzICAgICA9PiAkU2VuZGVyQWRyZXNzLAogICAgICAgICAgICAgICAgICAgIFNlbmRlclNhbHV0YXRpb24gPT4gJFVzZXJ7VXNlclNhbHV0YXRpb259LAogICAgICAgICAgICAgICAgICAgIFNlbmRlck5hbWUgICAgICAgPT4gJFVzZXJ7VXNlckZpcnN0bmFtZX0gLiAnICcgLiAkVXNlcntVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTZW5kTWVzc2FnZSA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPlNlbmRJbmZvKAogICAgICAgICAgICAgICAgJUN1c3RvbWVySW5mbywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRTZW5kTWVzc2FnZSkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnd2FybmluZycsCiAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gIlNlbnQgdG8gKChvdHJzKSkhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICd3YXJuaW5nJywKICAgICAgICAgICAgICAgICAgICBJbmZvICAgICA9PiAnQ2FuIG5vdCBzZW5kIGVtYWlsIHRvIHRoZSAoKG90cnMpKSBzdXBwb3J0IHRlYW0hJyAuICJcblxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICJZb3Ugd2lsbCBmaW5kIHRoZSBvdHJzIHN5c3RlbSBpbmZvcm1hdGlvbiBwYWNrYWdlIGF0XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIklmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBPVFJTIHN1cHBvcnQgc2VydmljZXMgcGxlYXNlIHNlbmQgdGhlIHBhY2thZ2UgdG8gc3VwcG9ydFxAb3Rycy5jb20gb3IgY2FsbFxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICJvdXIgc3VwcG9ydCB0ZWFtIGJ5IHBob25lIHRvIHJldmlldyB0aGUgbmV4dCBzdGVwLlxuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIllvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IE9UUlMgc3VwcG9ydCBvciBmYWNlLXRvLWZhY2UgY29udGFjdCBpbmZvcm1hdGlvbiBhdFxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICdodHRwOi8vd3d3Lm90cnMuY29tLycgLiAiXG5cbiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGUgYnV0dG9uIGRvd25sb2FkIGJlY29tZXMgdGhlIHN1Ym1pdAogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAoICRDb250ZW50LCAkRmlsZW5hbWUgKSA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPkRvd25sb2FkKAogICAgICAgICAgICAgICAgJUN1c3RvbWVySW5mbywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmV0dXJuIGZpbGUKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJHskQ29udGVudH0sCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNoZWQnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFNRTCBiZW5jaAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdCZW5jaG1hcmtTUUwnICkgewoKICAgICAgICBteSAkSW5zZXJ0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnSW5zZXJ0JyApIHx8IDEwMDAwOwogICAgICAgIG15ICRVcGRhdGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdVcGRhdGUnICkgfHwgMTAwMDA7CiAgICAgICAgbXkgJFNlbGVjdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdCcgKSB8fCAxMDAwMDsKICAgICAgICBteSAkTW9kZSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTW9kZScgKTsKCiAgICAgICAgbXkgJUJlbmNoVGVzdCA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPkJlbmNobWFyaygKCiAgICAgICAgICAgIEluc2VydCA9PiAkSW5zZXJ0LAogICAgICAgICAgICBVcGRhdGUgPT4gJFVwZGF0ZSwKICAgICAgICAgICAgU2VsZWN0ID0+ICRTZWxlY3QsCiAgICAgICAgICAgIE1vZGUgICA9PiAkTW9kZSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCZW5jaG1hcmtSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVCZW5jaFRlc3QsCiAgICAgICAgICAgICAgICBIZWFkID0+ICdTUUwnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICAgID0+ICdJbnNlcnQgVGltZScsCiAgICAgICAgICAgICAgICBUaW1lICAgID0+ICIkQmVuY2hUZXN0e0luc2VydFRpbWV9IHMgJEJlbmNoVGVzdHtJbnNlcnRNb29kfSIsCiAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICggJEluc2VydCAqICRNb2RlICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICRCZW5jaFRlc3R7SW5zZXJ0Q29tbWVudH0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICAgID0+ICdVcGRhdGUgVGltZScsCiAgICAgICAgICAgICAgICBUaW1lICAgID0+ICIkQmVuY2hUZXN0e1VwZGF0ZVRpbWV9IHMgJEJlbmNoVGVzdHtVcGRhdGVNb29kfSIsCiAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICggJFVwZGF0ZSAqICRNb2RlICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICRCZW5jaFRlc3R7VXBkYXRlQ29tbWVudH0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICAgID0+ICdTZWxlY3QgVGltZScsCiAgICAgICAgICAgICAgICBUaW1lICAgID0+ICIkQmVuY2hUZXN0e1NlbGVjdFRpbWV9IHMgJEJlbmNoVGVzdHtTZWxlY3RNb29kfSIsCiAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICggJFNlbGVjdCAqICRNb2RlICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICRCZW5jaFRlc3R7U2VsZWN0Q29tbWVudH0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICAgID0+ICdEZWxldGUgVGltZScsCiAgICAgICAgICAgICAgICBUaW1lICAgID0+ICIkQmVuY2hUZXN0e0RlbGV0ZVRpbWV9IHMgJEJlbmNoVGVzdHtEZWxldGVNb29kfSIsCiAgICAgICAgICAgICAgICBWYWx1ZSAgID0+ICggJEluc2VydCAqICRNb2RlICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICRCZW5jaFRlc3R7RGVsZXRlQ29tbWVudH0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCZW5jaG1hcmtSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdNdWx0aXBsaWVyJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICIqICRNb2RlIiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVCZW5jaFRlc3QsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2UgewoKICAgICAgICAjIGdldCByZXN1bHQgb2YgYWxsIGFkbWluIGNoZWNrcwogICAgICAgIG15ICREYXRhSGFzaCA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPkFkbWluQ2hlY2tzR2V0KCk7CgogICAgICAgICMgc2VsZWN0aW9uIGRhdGEgZm9yIGJlbmNobWFyayBkcm9wZG93biBsaXN0CiAgICAgICAgbXkgJVNlbGVjdGlvbkRhdGEgPSAoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAnMSAqIE5vcm1hbCAoY2EuIDI1IHNlYyknLAogICAgICAgICAgICAgICAgMyA9PiAnMyAqIEhpZ2ggICAoY2EuIDc1IHNlYyknLAogICAgICAgICAgICAgICAgNSA9PiAnNSAqIEhlYXZ5ICAoY2EuIDEyNSBzZWMpJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSA9PiAnTW9kZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBMYXlvdXQgb2JqZWN0IGtub3dzIHRoZSBmdW5jdGlvbiBCdWlsZFNlbGVjdGlvbgogICAgICAgICMgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvbGRlciBvdHJzIHZlcnNpb25zIHVzZSBPcHRpb25TdHJnSGFzaFJlZiBpbnN0ZWFkCiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPmNhbignQnVpbGRTZWxlY3Rpb24nKSApIHsKCiAgICAgICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIGZvciBiZW5jaG1hcmsgdGVzdAogICAgICAgICAgICAkUGFyYW17TW9kZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbiglU2VsZWN0aW9uRGF0YSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBidWlsZCBzZWxlY3Rpb24gZm9yIGJlbmNobWFyayB0ZXN0CiAgICAgICAgICAgICRQYXJhbXtNb2RlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKCVTZWxlY3Rpb25EYXRhKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJXskRGF0YUhhc2h9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdNb2R1bGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IE1vZHVsZSA9PiAkTW9kdWxlLCB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBjc3Mgcm90YXRvcnkKICAgICAgICAgICAgbXkgJENzc0NsYXNzOwogICAgICAgICAgICBmb3IgbXkgJFJvd0hhc2ggKCBAeyAkRGF0YUhhc2gtPnskTW9kdWxlfSB9ICkgewoKICAgICAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAgICAgaWYgKCAkQ3NzQ2xhc3MgJiYgJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnICkgewogICAgICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJEZvbnRDb2xvciA9ICdyZWQnOwogICAgICAgICAgICAgICAgaWYgKCAkUm93SGFzaC0+e0NoZWNrfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRSb3dIYXNoLT57Q2hlY2t9IGVxICdPSycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGb250Q29sb3IgPSAnZ3JlZW4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRSb3dIYXNoLT57Q2hlY2t9IGVxICdJbmZvJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZvbnRDb2xvciA9ICdkYXJrYmx1ZSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFJvd0hhc2gtPntDaGVja30gZXEgJ0NyaXRpY2FsJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZvbnRDb2xvciA9ICdvcmFuZ2UnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBuZXcgYmxvY2sgd2l0aCByb3RhdG9yeSBjc3MKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdNb2R1bGVSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyRSb3dIYXNofSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgRm9udENvbG9yID0+ICRGb250Q29sb3IsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==</File>
- <File Location="Kernel/Config/Files/Support.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q1ZTPiRJZDogU3VwcG9ydC54bWwsdiAxLjcgMjAxMC8wNS8xMyAxNTo1MzozNyBjZyBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluU3VwcG9ydCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pblN5c3RlbVN0YXR1cyBvYmplY3QgaW4gdGhlIGFkbWluIGFyZWEuPC9EZXNjcmlwdGlvbj5EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZG1pblN5c3RlbVN0YXR1cy1PYmpla3RzIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj5EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPFRpdGxlPlN1cHBvcnQgSW5mbzwvVGl0bGU+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluLVN1cHBvcnQgT3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U3VwcG9ydCBBc3Nlc3NtZW50PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazQ8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpTZW5kZXJFbWFpbCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSB1c2VkIHNlbmRlciBtYWlsIGFkZHJlc3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSB2ZXJ3ZW5kZXRlIEFic2VuZGVyYWRyZXNzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6RGF0YWJhc2U6OkRCMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIERCMiBkYXRhYmFzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgRGF0ZW5iYW5rLUNoZWNrcyBm/HIgZGllIERCMiBEYXRlbmJhbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFibGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6RGF0YWJhc2U6Ok1TU1FMIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgY2hlY2tzIGZvciB0aGUgTVNTUUwgZGF0YWJhc2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIERhdGVuYmFuay1DaGVja3MgZvxyIGRpZSBNU1NRTCBEYXRlbmJhbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFibGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJWZXJzaW9uQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpEYXRhYmFzZTo6TXlTUUwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbml0aW9uIG9mIHRoZSBkYXRhYmFzZSBjaGVja3MgZm9yIHRoZSBNeVNRTCBkYXRhYmFzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgRGF0ZW5iYW5rLUNoZWNrcyBm/HIgZGllIE15U1FMIERhdGVuYmFuay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYWJsZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXhBbGxvd2VkUGFja2FnZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJRdWVyeUNhY2hlU2l6ZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4U3VwcG9ydENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4Q2xpZW50Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVURjhEYXRhYmFzZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4VGFibGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJWZXJzaW9uQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpEYXRhYmFzZTo6T3JhY2xlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgY2hlY2tzIGZvciB0aGUgT3JhY2xlIGRhdGFiYXNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBEYXRlbmJhbmstQ2hlY2tzIGb8ciBkaWUgT3JhY2xlIERhdGVuYmFuay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYWJsZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOTFNEYXRlRm9ybWF0Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9yYWNsZUhvbWVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTkxTTGFuZ0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOTFNEYXRlRm9ybWF0U2VsZWN0Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1cnJlbnRUaW1lc3RhbXBDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cHBvcnQ6OkRhdGFiYXNlOjpQb3N0Z3JlU1FMIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgY2hlY2tzIGZvciB0aGUgUG9zdGdyZVNRTCBkYXRhYmFzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgRGF0ZW5iYW5rLUNoZWNrcyBm/HIgZGllIFBvc3RncmVTUUwgRGF0ZW5iYW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhYmxlQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGVTdHlsZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4U2VydmVyQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVURjhDbGllbnRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJWZXJzaW9uQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpPUyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIE9wZXJhdGluZyBTeXN0ZW0gY2hlY2tzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBCZXRyaWVic3N5c3RlbS1DaGVja3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1BVTG9hZENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaXNrVXNhZ2VDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWVtb3J5U3dhcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaXN0cmlidXRpb25DaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2VybmVsSW5mb0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQZXJsQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpPVFJTIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiB0aGUgT1RSUyBjaGVja3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIE9UUlMtQ2hlY2tzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9wZW5UaWNrZXRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGlja2V0SW5kZXhNb2R1bGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGlja2V0U3RhdGljREJPcnBoYW5lZFJlY29yZHMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpY2tldEZ1bGx0ZXh0SW5kZXhNb2R1bGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRlFETkNvbmZpZ0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTeXN0ZW1JRENvbmZpZ0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMb2dDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRmlsZVN5c3RlbUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQYWNrYWdlRGVwbG95Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkludmFsaWRVc2VyTG9ja2VkVGlja2V0U2VhcmNoIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb25maWdDaGVja1RpY2tldEZyb250ZW5kUmVzcG9uc2VGb3JtYXQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRVc2VyQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRTT0FQVXNlckNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6V2Vic2VydmVyOjpBcGFjaGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbml0aW9uIG9mIHRoZSB3ZWJzZXJ2ZXIgY2hlY2tzIGZvciB0aGUgQXBhY2hlIHdlYnNlcnZlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgV2Vic2VydmVyLUNoZWNrcyBm/HIgZGVuIEFwYWNoZSBXZWJzZXJ2ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXBhY2hlVmVyc2lvbkNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDR0lBY2NlbGVyYXRvckNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcGFjaGVEQklDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXBhY2hlUmVsb2FkQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpXZWJzZXJ2ZXI6OklJUyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIHdlYnNlcnZlciBjaGVja3MgZm9yIHRoZSBJSVMgd2Vic2VydmVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBXZWJzZXJ2ZXItQ2hlY2tzIGb8ciBkZW4gSUlTIFdlYnNlcnZlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQZXJsRXhDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cHBvcnQ6OkNyb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbml0aW9uIG9mIHRoZSBDcm9uIGNoZWNrcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgQ3Jvbi1DaGVja3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=</File>
- </Filelist>
- <DatabaseInstall>
- <TableCreate Type="post" Name="support_bench_test">
- <Column Name="name_a" Required="true" Size="60" Type="VARCHAR"></Column>
- <Column Name="name_b" Required="true" Size="60" Type="VARCHAR"></Column>
- <Index Name="support_index_bench_test_name_a">
- <IndexColumn Name="name_a">
- </IndexColumn>
- </Index>
- </TableCreate>
- </DatabaseInstall>
- <DatabaseUpgrade>
- <TableCreate Type="post" Name="support_bench_test" Version="1.0.8">
- <Column Name="name_a" Required="true" Size="60" Type="VARCHAR"></Column>
- <Column Name="name_b" Required="true" Size="60" Type="VARCHAR"></Column>
- <Index Name="support_index_bench_test_name_a">
- <IndexColumn Name="name_a">
- </IndexColumn>
- </Index>
- </TableCreate>
- </DatabaseUpgrade>
- <DatabaseUninstall>
- <TableDrop Type="post" Name="support_bench_test">
- </TableDrop>
- </DatabaseUninstall>
-</otrs_package>
\ No newline at end of file
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/pics
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/pics/images
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/pics/stats
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/sessions
^
|
-(directory)
|
[-]
[+]
|
Deleted |
otrs-2.4.11.tar.bz2/var/spool
^
|
-(directory)
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/ARCHIVE
^
|
@@ -2,7 +2,7 @@
2d0d5fe16a870a247213b4427bd27d0a::bin/cgi-bin/index.pl
158953b95fcee754e672486f6012d268::bin/cgi-bin/installer.pl
90065ca34d092797d6293673e301eaa5::bin/cgi-bin/public.pl
-b4b911241b2f83c9edcb6ce6031ab8c6::bin/cgi-bin/rpc.pl
+d6fba8bc99aad408785247a690f88b36::bin/cgi-bin/rpc.pl
92eb0ef9d2bed66ba689bec61c0b16ab::bin/CheckDB.pl
f386bbb6b9a55c457ca3d8097dc336ca::bin/CheckSum.pl
96f133e79389efb83ee033453df6c450::bin/CleanUp.pl
@@ -50,14 +50,14 @@
c46d65e2405d3b0376fa8975840cb887::bin/UnlockTickets.pl
e827622ff73643645636b8edd1d767c4::bin/xml2sql.pl
e386f0774fa7ae4821f7b8195af9958d::bin/XMLMaster.pl
-d3102dcfcf6356e1820c824181f210b8::CHANGES
+0c6330831bd93f21e74cf91c5cc7ee43::CHANGES
73f1eb20517c55bf9493b7dd6e480788::COPYING
f009ad016f20dc8f3e30c1dc6cb7386e::COPYING-Third-Party
ad5c561982eb8d596942964a33340221::CREDITS
8ce8541ad4caa32bcaca86033dc3c51c::INSTALL
61e0f462b8592f1ec2ffd7c610ded5b2::INSTALL.RedHat
359440e757cf8c11259c139fa7c9dc34::INSTALL.SuSE
-15edd8d1c0c83519cd271b33a52c9a4a::Kernel/Config/Defaults.pm
+126983c1a66edc508ab024137f3eac87::Kernel/Config/Defaults.pm
9b47043dd1b407b4fefbf935efeadc1e::Kernel/Config/Files/Framework.xml
96f998c11c35f1df6eb9fd98513cd71a::Kernel/Config/Files/Ticket.xml
479c9fbf578433daf1533d2f872cc629::Kernel/Config/GenericAgent.pm.dist
@@ -163,7 +163,7 @@
a0a4eb5512fbd770ce3a22074d921366::Kernel/Language/ct.pm
cd55cf6da8d88f63613c67c91a09ddf9::Kernel/Language/cz.pm
d8812e1d40d436da1fc67b161965982b::Kernel/Language/da.pm
-a47e2d5bedada978339a1fe57bb36ff0::Kernel/Language/de.pm
+087f3bef937b4771060e5c4200194e79::Kernel/Language/de.pm
cd17c0ab008117379f6ecbb9a21a2d8f::Kernel/Language/el.pm
47e30209d19ef823fb5b0523e0ec60f6::Kernel/Language/en.pm
cffaeb2a1d5903b59747ccdd5175126a::Kernel/Language/en_CA.pm
@@ -204,7 +204,7 @@
413a63e7cbdca12e96f95336eba91f09::Kernel/Modules/AdminGroup.pm
c903febeeaf9d43dfc77f6a3db19e320::Kernel/Modules/AdminInit.pm
767beb3fec95542944f1036c61cb607a::Kernel/Modules/AdminLog.pm
-91460900aa5022b3ae2747bd18cb3c20::Kernel/Modules/AdminMailAccount.pm
+95882ca8f9cf9a9c2735ea570e55408e::Kernel/Modules/AdminMailAccount.pm
afcb3bf65f0196dd8f777db0e41b9c4a::Kernel/Modules/AdminNotification.pm
353f6120c4258c6103623c3f0a72bc81::Kernel/Modules/AdminNotificationEvent.pm
df5cd0661edf5dca129c358789648346::Kernel/Modules/AdminPackageManager.pm
@@ -243,15 +243,15 @@
39e7bf15d561b13e18c75f21c5bdb891::Kernel/Modules/AgentPreferences.pm
e122c8f47e4e39056cb7997d43591901::Kernel/Modules/AgentSpelling.pm
a9a1fefc77dc716210603212ea3f2da0::Kernel/Modules/AgentStats.pm
-98a71839c001960c9f16109f67a4b946::Kernel/Modules/AgentTicketAttachment.pm
-14368057c7378fa62775a2fe27e92a80::Kernel/Modules/AgentTicketBounce.pm
+83d940404dfb83721824146a4d3791f4::Kernel/Modules/AgentTicketAttachment.pm
+3a56d87a8fde066364b06f584a16ea80::Kernel/Modules/AgentTicketBounce.pm
ee408b876d918c09a6204c019883f5df::Kernel/Modules/AgentTicketBulk.pm
3b56d4fdbdf47156bde7dbf6c873a029::Kernel/Modules/AgentTicketClose.pm
b02b9b76d84f7ccef24f2998e7999226::Kernel/Modules/AgentTicketCompose.pm
70827fc6f72e9f73bfd8b664095da267::Kernel/Modules/AgentTicketCustomer.pm
b41866dc46dbaae87eb0ae20d9c5d24f::Kernel/Modules/AgentTicketEmail.pm
fc1fb579d832555afaa38cc56a1617dd::Kernel/Modules/AgentTicketEscalationView.pm
-736c57e21a2da4291536e1f1567d5c61::Kernel/Modules/AgentTicketForward.pm
+4e1844703026e8212ec4e96473caf3bb::Kernel/Modules/AgentTicketForward.pm
c268ac0b203cf8b9bc957882edffee56::Kernel/Modules/AgentTicketFreeText.pm
1c2a574007244d5e22d038f053644b4d::Kernel/Modules/AgentTicketHistory.pm
1a0f18aa5f0b0cd506d754badb14bdce::Kernel/Modules/AgentTicketLock.pm
@@ -262,7 +262,7 @@
00232aa2d7bb0ba402cf3c68390da4cc::Kernel/Modules/AgentTicketNote.pm
3d5d2f64cdcbe01181977befdd7ddd00::Kernel/Modules/AgentTicketOwner.pm
6f18d6ba9886fce1818c6851ff01f24b::Kernel/Modules/AgentTicketPending.pm
-6b04807ea19948dc7a944c450b53a1a0::Kernel/Modules/AgentTicketPhone.pm
+efb2567c0069f455bba055e211fff3e1::Kernel/Modules/AgentTicketPhone.pm
2a93d371b7ffb2bcb1aea5afdb596bad::Kernel/Modules/AgentTicketPhoneOutbound.pm
3dff37ce8ab18465e323f5fb9d5ea1fe::Kernel/Modules/AgentTicketPlain.pm
b5f29b52660637fe6508fc5bef191cfa::Kernel/Modules/AgentTicketPrint.pm
@@ -279,12 +279,12 @@
0696b57ae14ef85ae79eaa8ad60e6ad5::Kernel/Modules/CustomerAccept.pm
f2f0f27a6cfdd4fdc4b885223abd2137::Kernel/Modules/CustomerCalendarSmall.pm
31eebb9e006b78bac14b477a5aab011b::Kernel/Modules/CustomerPreferences.pm
-913a57007d0d2e3b5fac39b32a6c96a8::Kernel/Modules/CustomerTicketAttachment.pm
+5caf27296bb184d034ff348a3ca7c3e8::Kernel/Modules/CustomerTicketAttachment.pm
b147f19dc16c56eafde891119911cbc3::Kernel/Modules/CustomerTicketMessage.pm
474dff7c8e6cca418c2c6326d4e1f285::Kernel/Modules/CustomerTicketOverView.pm
ee40615bacf256c9267e8ab6e598b632::Kernel/Modules/CustomerTicketPrint.pm
0dec9be0f82fd3ff194d97eff575dfc1::Kernel/Modules/CustomerTicketSearch.pm
-ccfd51ddabc5540e55e990c8f34e8621::Kernel/Modules/CustomerTicketZoom.pm
+c0db9d17111c13b80ada9af33992a350::Kernel/Modules/CustomerTicketZoom.pm
455313d356c7471a4e55069c6cd2ff77::Kernel/Modules/CustomerZoom.pm
77697e93a23b25d059ee0f70a7ddfadb::Kernel/Modules/Installer.pm
aa7697b65c8d983e408d8833f41de737::Kernel/Modules/PictureUpload.pm
@@ -309,10 +309,10 @@
21afa5f6b37598aec484de43ff577bd7::Kernel/Output/HTML/DashboardUserOnline.pm
afdcdc911bc054e1ccf9646ffd3c4c9b::Kernel/Output/HTML/HeaderMetaRefresh.pm
f0b2d9a4eca3a9d6599da9781192492a::Kernel/Output/HTML/HeaderMetaTicketSearch.pm
-277f40355882833702a6e1876ac09e74::Kernel/Output/HTML/Layout.pm
+8a482ba71a1100714d91a088e66394df::Kernel/Output/HTML/Layout.pm
81840de42b0bf6a72bb94957f4886922::Kernel/Output/HTML/LayoutAJAX.pm
347cc5fd685eda8541af7de1ec8be0d0::Kernel/Output/HTML/LayoutLinkObject.pm
-a90589174d9ba21b957dbe05072665a5::Kernel/Output/HTML/LayoutTicket.pm
+266b60c9b86a159dca62ad2ac3c658d3::Kernel/Output/HTML/LayoutTicket.pm
b8108fed4dab8c5ca822a005b2250da5::Kernel/Output/HTML/LinkObjectTicket.pm
5aab4e8810fbcf598335d8f7c10ee165::Kernel/Output/HTML/Lite/AgentNavigationBar.dtl
1d4e1f69ccecf4e7dff4c0ec3b4f8c43::Kernel/Output/HTML/Lite/AgentTicketQueue.dtl
@@ -373,7 +373,7 @@
f7d8657dc9044445503f138854c0f7a6::Kernel/Output/HTML/Standard/AdminNavigationBar.dtl
85ff63c33fdc0b3b32056e5b99499da5::Kernel/Output/HTML/Standard/AdminNotificationEventForm.dtl
1bd2872e89f2c2b6c486565dab2b2c54::Kernel/Output/HTML/Standard/AdminNotificationForm.dtl
-fe6697e266a79801c4cc4ff222b74162::Kernel/Output/HTML/Standard/AdminPackageManager.dtl
+7e6b029e2c4302930a4a85580f6f8923::Kernel/Output/HTML/Standard/AdminPackageManager.dtl
4a01cb76a376855900bf17b3e924c9c6::Kernel/Output/HTML/Standard/AdminPerformanceLog.dtl
2535d7b45c4422d609748c08acfa4674::Kernel/Output/HTML/Standard/AdminPGPForm.dtl
33b8366bce0d7f09a00116e6d0b21de1::Kernel/Output/HTML/Standard/AdminPostMasterFilter.dtl
@@ -407,7 +407,7 @@
75219ddece97e5efc9bba7b1c1203e83::Kernel/Output/HTML/Standard/AdminUserGroupChangeForm.dtl
7775851ee5674e3e877b9358f9ebe84c::Kernel/Output/HTML/Standard/AdminUserGroupForm.dtl
af731fc485326c1951c64af554732301::Kernel/Output/HTML/Standard/AgentBook.dtl
-32d8708b269eeac8ae3aabb25a6a1bd4::Kernel/Output/HTML/Standard/AgentCalendarSmall.dtl
+b890a31bab23944c67935e495943f489::Kernel/Output/HTML/Standard/AgentCalendarSmall.dtl
b52cde71c4a9e2a0757d8d0dfbeef9f1::Kernel/Output/HTML/Standard/AgentCalendarSmallIcon.dtl
9d392fc1573712bd14021298e584da62::Kernel/Output/HTML/Standard/AgentCustomerSearch.dtl
10f6053824eeeb658fb3d0fba60daf32::Kernel/Output/HTML/Standard/AgentCustomerTableView.dtl
@@ -468,7 +468,7 @@
0a0bb63d58b25bd212edcc3c4300f56e::Kernel/Output/HTML/Standard/AgentTicketSearchOpenSearchDescriptionFulltext.dtl
cc96e5113ffa30c6b9d0db9677198028::Kernel/Output/HTML/Standard/AgentTicketSearchOpenSearchDescriptionTicketNumber.dtl
e5457897982c617c8b5fa0c9b7b9f72b::Kernel/Output/HTML/Standard/AgentTicketSearchResultPrint.dtl
-930ca93d73c5e913d4d695079333f824::Kernel/Output/HTML/Standard/AgentTicketZoom.dtl
+3e50863d79e7f3996aef23e77886d110::Kernel/Output/HTML/Standard/AgentTicketZoom.dtl
5dda2cf57d7db25a397c7fe18d7b17a3::Kernel/Output/HTML/Standard/AgentTicketZoomArticleFilterDialog.dtl
8478e58681c48b082a9d4e9add7bc54a::Kernel/Output/HTML/Standard/AgentWindowTab.dtl
2318916ed092d4ea2f1fad7f6cae5041::Kernel/Output/HTML/Standard/AJAX.dtl
@@ -492,9 +492,9 @@
859f91cb8d9cfe79ca45fc0b5ba61f55::Kernel/Output/HTML/Standard/CustomerTicketSearchResultCSV.dtl
912bd1489c56b1c97e4702a3f4f8a9a2::Kernel/Output/HTML/Standard/CustomerTicketSearchResultPrint.dtl
080cbf95e2362b3e73141180dc345d3d::Kernel/Output/HTML/Standard/CustomerTicketSearchResultShort.dtl
-0e79ed21e487eb676b65b22f2554ec5a::Kernel/Output/HTML/Standard/CustomerTicketZoom.dtl
+41a6477c4d013a93969cb40fd9906c71::Kernel/Output/HTML/Standard/CustomerTicketZoom.dtl
1be2bdbfeede072abb6834ab8643f468::Kernel/Output/HTML/Standard/CustomerWarning.dtl
-70e1bc89c8eac3f68038770de704b022::Kernel/Output/HTML/Standard/Error.dtl
+d9951a97bdbaeee788dfc59e1a16b6be::Kernel/Output/HTML/Standard/Error.dtl
2f2bd217c50f973df7701fe85ba4595e::Kernel/Output/HTML/Standard/Footer.dtl
e241ddcdad811a9ecdd2bfa1d9306420::Kernel/Output/HTML/Standard/FooterSmall.dtl
84fcea351e313cdd5fabbd68c6971834::Kernel/Output/HTML/Standard/Header.dtl
@@ -508,7 +508,7 @@
7c16d9b7a5b9325a661afa8c8a5548b8::Kernel/Output/HTML/Standard/PrintFooter.dtl
c84411f250599c6e4ab621ab032c243f::Kernel/Output/HTML/Standard/PrintHeader.dtl
6b7c7e327ea03443ed6e7ff3b5e051bc::Kernel/Output/HTML/Standard/PublicDefault.dtl
-baec769c0bf8ddf7db6d44c4481b5a1d::Kernel/Output/HTML/Standard/Redirect.dtl
+1dcc2bebf0faa1059cc123ba194da702::Kernel/Output/HTML/Standard/Redirect.dtl
118c74e550b39554c5c822798eb41259::Kernel/Output/HTML/Standard/RichTextEditor.dtl
6ca37a72a8ca9370ef047e0837fe6d5e::Kernel/Output/HTML/Standard/SpellingInline.dtl
dd40d5c9878d3b178497958c4485fd87::Kernel/Output/HTML/Standard/Test.dtl
@@ -525,7 +525,7 @@
604aec6624d0ef33a91b5fa766df3a9e::Kernel/System/Auth/LDAP.pm
2ea133df3337fe8a3ec90de831cfee99::Kernel/System/Auth/Radius.pm
5711a2d3fd9f81894a2020aee5abd42d::Kernel/System/Auth/Sync/LDAP.pm
-b7fba2867da5a6c208d038fe25e02931::Kernel/System/Auth.pm
+f745e0f73d75d45024d90a79d4ba43d3::Kernel/System/Auth.pm
d24521fd94303aba6b82c2abe11ed69a::Kernel/System/AuthSession/DB.pm
adea9ef30686a096314e45dd1270b962::Kernel/System/AuthSession/FS.pm
995b81f0a27ec5d16a56e2492cb645eb::Kernel/System/AuthSession/IPC.pm
@@ -561,7 +561,7 @@
29805aabb2b3b7936d001f3f9da5d0fc::Kernel/System/Email/Sendmail.pm
8af44aed53791e5d498abd884b372650::Kernel/System/Email/SMTP.pm
f4f7d826f509950e5cad1b075b1ebe9b::Kernel/System/Email/SMTPS.pm
-7fc3893f3517752a1716d17fdf331baf::Kernel/System/Email.pm
+de1d6e5ca23d0cbb0cd1f628f93d65ee::Kernel/System/Email.pm
d73b84763ad836f16914b60e5f3d87ca::Kernel/System/EmailParser.pm
0b8858fb8bdebbff6d3b0d3742aa69d2::Kernel/System/Encode.pm
143a21f815ffc2cb230bc49572843edf::Kernel/System/FileTemp.pm
@@ -654,18 +654,18 @@
13dc68293796f5473eaae170d56eb122::Kernel/System/Ticket/Permission/OwnerCheck.pm
2cfceb219e9cf1f33c9301d22606eb1a::Kernel/System/Ticket/Permission/ResponsibleCheck.pm
4276dca661ee8e8fb33e5b416f696f24::Kernel/System/Ticket/Permission/WatcherCheck.pm
-30a9fd102fe140c6e292097e67bc0429::Kernel/System/Ticket.pm
+c37fd0a1a869b35899f22ac3142fad60::Kernel/System/Ticket.pm
3e9af9c3cebf1af8861cef84cbbcb2b8::Kernel/System/Time.pm
bc255fae6f6e8948a6ab6704201999f9::Kernel/System/Type.pm
044c3793e08b12ffc9d8290e9e861755::Kernel/System/UnitTest.pm
24ccf8b41dd2f9e48c52bde5fbd1a5aa::Kernel/System/User/Preferences/DB.pm
a443ae4420bf4b86984c305d76912b06::Kernel/System/User.pm
6e431d589d219e9788b420b2e76505bc::Kernel/System/Valid.pm
-f551f73fbec4709eabb65975f21609ed::Kernel/System/Web/InterfaceAgent.pm
-21f5f9d7c44ff2ef61d4e0c272e35f8e::Kernel/System/Web/InterfaceCustomer.pm
+bb1c33b76c5917281846691f714bd3da::Kernel/System/Web/InterfaceAgent.pm
+ccd1550cf841d30c67eff46f7b000b76::Kernel/System/Web/InterfaceCustomer.pm
a63eb339c778821f3384ae5d0b9356ff::Kernel/System/Web/InterfaceInstaller.pm
587a8062f25138ee844e2ed366d87016::Kernel/System/Web/InterfacePublic.pm
-a7219cb2c3712756ae047a3aded52074::Kernel/System/Web/Request.pm
+6581e9741caf0eecfd27df931bb6721b::Kernel/System/Web/Request.pm
c94f5c8256b567eaaeb789bf62a7b581::Kernel/System/Web/UploadCache/DB.pm
eb59e0ae2cc0e6d7ca3c0eeec5f1fbd0::Kernel/System/Web/UploadCache/FS.pm
5cfd23529bd2f467a6ff134eb594c897::Kernel/System/Web/UploadCache.pm
@@ -675,7 +675,7 @@
4612599bf4ac19eb80b82745b8a2d9b1::README
717c2c3c8cad12bfacbdc0b7d150509a::README.database
4fca2595977cb613f4f01d70a554f5d1::README.webserver
-8e3f96cac952dd2130803c92c4332972::RELEASE
+784a3ce45b4a27c45052a55225b91de5::RELEASE
3e133aef21e2c9126dd0e39e6dd1eaad::scripts/apache-httpd.conf
c418f359395a4776a8ff8f8a1255477f::scripts/apache-httpd.include.conf
927266ebf61c52d5573dfb8f884eeccc::scripts/apache-perl-startup.pl
@@ -684,9 +684,9 @@
c0eb37580871e50ee75404deb7f47e65::scripts/apache2-perl-startup.pl
318accebbe8a84c2b079a9d5c52656d3::scripts/auto_build/description.txt
0f141bb8bde5be85cd8c2d940d0c9eca::scripts/auto_build/docbuild.sh
-001393bef9c58ac7d7c1e8232d55bd24::scripts/auto_build/files.txt
+b2d3753d313028a9b26e2ca415a2b90b::scripts/auto_build/files.txt
5f9c6a279a55224b7febc60f5136a111::scripts/auto_build/xml2docbook.pl
-47b7032282c98eec1919c9721d38af23::scripts/auto_build.sh
+f08863f564304e90050adc28dbb810bc::scripts/auto_build.sh
d1380eece3cfee2c510ba72d57d319c0::scripts/auto_docbuild.sh
08786896635fcdf22fc464025e0ae065::scripts/backup.pl
bf4f60256f128061598c0a786f9eae84::scripts/database/otrs-initial_insert.db2.sql
@@ -753,13 +753,13 @@
4c69951be1a7c7af7719611378263be3::scripts/DBUpdate-to-2.4-post.mysql.sql
3438870fb42927590962af28f342d64c::scripts/DBUpdate-to-2.4-post.oracle.sql
bb071920f5fbe3bee627e7b056bfc620::scripts/DBUpdate-to-2.4-post.postgresql.sql
-3580c562606abf4fb5348db80c264dc7::scripts/DBUpdate-to-2.4.db2.sql
-c741e4dbc05074dec67af2355abb17fa::scripts/DBUpdate-to-2.4.ingres.sql
-1d58c470b5f9225f6c57aec0e92b6bbe::scripts/DBUpdate-to-2.4.mssql.sql
-9996beda7baf82980f5f72ffa111ce7f::scripts/DBUpdate-to-2.4.mysql.sql
-0bdfb9c896d005d805029a038aea14d2::scripts/DBUpdate-to-2.4.oracle.sql
+5d6d1f07f8d590265269a69e17deed06::scripts/DBUpdate-to-2.4.db2.sql
+edf70020b827e58feb2c377a4c8c84bd::scripts/DBUpdate-to-2.4.ingres.sql
+318abd0fa6d392485d46dfb7dfcf8bdf::scripts/DBUpdate-to-2.4.mssql.sql
+15dd23efbf4e8a4f2fa35922e8962eeb::scripts/DBUpdate-to-2.4.mysql.sql
+b57dc555839239383c8ee554913aac39::scripts/DBUpdate-to-2.4.oracle.sql
365d3e173ef058b23ca0f2ad17e33b8a::scripts/DBUpdate-to-2.4.pl
-b2c4fadf6a75cf14f342083cf26f018e::scripts/DBUpdate-to-2.4.postgresql.sql
+7877f7326388cf0b906850cea4766da5::scripts/DBUpdate-to-2.4.postgresql.sql
3e50b21728994a9a30668e923fb10364::scripts/fedora-otrs-4.spec
e10978799db7c998f48a148abb9ec400::scripts/login.php
a59fc10b4137c23f815641ad27b5dbb3::scripts/login.pl
@@ -771,10 +771,8 @@
3d84260aaf520304e586d81223a41548::scripts/restore.pl
f0cb558407cbc23ad86c77387c8aa1fe::scripts/rpc-example.pl
336223856f26624a4d61a9a2f67bde1b::scripts/sles-otrs-11.0.spec
-f8fa30da87ad5a2e6bbe53e92cebac0a::scripts/suse-fillup-template-rc.config.otrs
b97f34d1bcdf84e6d827b6dcb336f04d::scripts/suse-otrs-10.0.spec
2773cd708e2d921b43f0660cfaa25213::scripts/suse-otrs-11.0.spec
-ec0665418188a19137102ed717475301::scripts/suse-otrs-7.3.spec
9a3156f008fe47c13617b381b3df42c1::scripts/suse-otrs-8.0.spec
cc93969549236aa77277d23e146bfd5c::scripts/suse-otrs-9.0.spec
882c53249c7b92e9829cc395551acf1b::scripts/suse-otrs-9.1.spec
@@ -798,8 +796,8 @@
5cbc30b3decc0695775d2ce829418ace::scripts/test/FileTemp.t
19ea1afe40ce03ce2cbf5f3e97fe8c92::scripts/test/GenericAgent.t
98814f9674a244093511537f296645a6::scripts/test/Group.t
-a7713aab5d351e0a90392c83ede99f6a::scripts/test/HTMLUtils.t
-ee42386d40761144e49e4c227ccd454e::scripts/test/Layout.t
+3f023c03815e8912b7db8ff587b8b1ad::scripts/test/HTMLUtils.t
+1e56b291a3aae6801845c4126f6601ef::scripts/test/Layout.t
e851760839d227233df3622af1cf1b75::scripts/test/LayoutTicket.t
d1f9755ca65bc55a11beadb5ee8ccdfb::scripts/test/LinkObject.t
d863588b3a9eb7963f7f380b76b9fa26::scripts/test/MailAccount.t
@@ -856,11 +854,11 @@
3e5386edbdcac9d3d3d1c6423c3e1aa9::scripts/test/sample/SMIMECACertificate-dz.crt
e1c080ec0b9dcb93580a28bdb841bf1b::scripts/test/sample/SMIMECACertificate-otrslab.crt
86c17b4151d4fcae32ea3af7da04f56a::scripts/test/sample/SMIMECACertificate-otrsrd.crt
-6f39db0b7a4b89c985dcda587d8347ca::scripts/test/sample/SMIMECertificate-1.asc
-9e51685090c54253cdd55bea63c7497d::scripts/test/sample/SMIMECertificate-2.asc
+0d496e661a1575033bc569c2f722852c::scripts/test/sample/SMIMECertificate-1.asc
+83f4e221202147d27d468d36b933e5c5::scripts/test/sample/SMIMECertificate-2.asc
95bd8e61fc3ab08c8bb2f974c63bc151::scripts/test/sample/SMIMECertificate-smimeuser1.crt
-b066a53e796f080d01a08f2a34150de9::scripts/test/sample/SMIMEPrivateKey-1.asc
-da0fc63436c0bc5a92802358e1aad5f2::scripts/test/sample/SMIMEPrivateKey-2.asc
+8f923d93ed4eebec8a3fa4ea04b69d4c::scripts/test/sample/SMIMEPrivateKey-1.asc
+452cee7f08bda92e0e3421c3037f0c3f::scripts/test/sample/SMIMEPrivateKey-2.asc
d70ecfc62197e13767637abd6f870e71::scripts/test/sample/SMIMEPrivateKey-smimeuser1.crt
4eaa5853d81c996ab63a65e3be04ccc8::scripts/test/sample/SMIMEPrivateKeyPass-1.asc
799050e05bf654c9c358a8805656cf44::scripts/test/sample/SMIMEPrivateKeyPass-2.asc
@@ -893,7 +891,7 @@
2d56b55828672dc25c7bdd9bbe221bfb::scripts/test/Service.t
d5abfa445f379438cc9c6cb5b0de32b4::scripts/test/Signature.t
15f895af88ef86c7beaa1ec49f55c386::scripts/test/SLA.t
-2537b57f270bd5dcaff85284849c3684::scripts/test/SMIME.t
+515cb37b2e5ced3796842049c52ce111::scripts/test/SMIME.t
d10296d17ff69014792521ce51e18cca::scripts/test/State.t
c62f68977c8af4d5a5bd1ca3d1839891::scripts/test/Stats.t
75b2e82002716d34611954de86ce136b::scripts/test/StdAttachment.t
@@ -904,7 +902,7 @@
f12a59e02c7aeb770f85c037320a7f37::scripts/test/Type.t
5fed82950fad29953ccb80fb47105bf3::scripts/test/UnitTest.t
b99f7cdfbf53545d79fd54a3c64f8279::scripts/test/User.t
-bb92b4dc2e40311b2bb0179bdc2f5198::scripts/test/WebUploadCache.t
+87b5136075688bad01f43c952a59ee6d::scripts/test/WebUploadCache.t
f02cfdcb25038d39a761fc076eea874a::scripts/test/XML.t
1788acbb170379a53848d1b4beaf9c68::scripts/tools/base64.pl
755ca9e1d9c19f000c62d0ad68c56dd6::scripts/tools/charset-convert.pl
@@ -913,7 +911,7 @@
b8a191a3d6ad8120301653b7e2df658b::scripts/tools/xml2html.pl
6505d4f7b028a7de370ec433e5f3cee5::scripts/webform.pl
5c4e93ec9983dee9662746f458ea6cea::TODO
-394739ee738df55acb72eb2dc1eeca1c::UPGRADING
+a4427db9ebf19fee861748385294f31f::UPGRADING
0837bf90f617db7c019b549ecb6285a5::var/cron/aaa_base.dist
b3ab64e158f0c0ef3301365fa6fc462e::var/cron/fetchmail.dist
6d3f353cb3ad47f6fbf98bfb3b77a90b::var/cron/generic_agent-database.dist
@@ -961,6 +959,7 @@
6941e5f8861593f3608cc73e9f54b113::var/httpd/htdocs/images/Standard/exit.png
bddbf63864b76098f72206ee89191b0c::var/httpd/htdocs/images/Standard/expand-down.png
39e4f98a71efd0d9b9dea5aa3fefdb2c::var/httpd/htdocs/images/Standard/expand.png
+81e102548dc4653c4960577b7f7ecd47::var/httpd/htdocs/images/Standard/feature_add_ons.png
8055a45c6731e1728fcce3ab56963c03::var/httpd/htdocs/images/Standard/fileopen.png
e0598e3898b9edb20d4618031ef2641d::var/httpd/htdocs/images/Standard/folder.png
86172eb9bcdf89c20704126d61acb1e9::var/httpd/htdocs/images/Standard/folder_green.png
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/CHANGES
^
|
@@ -1,14 +1,40 @@
# --
# CHANGES - change log of OTRS
-# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: CHANGES,v 1.993.2.197 2011/07/28 11:50:38 mg Exp $
+# $Id: CHANGES,v 1.993.2.214 2012/08/28 08:22:28 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
# --
+2.4.14 (2012/08/30)
+ - 2012-08-28 Improved HTML security filter to detect tag nesting.
+
+2.4.13 (2012/08/21)
+ - 2012-08-17 HTML mails will now be displayed in an HTML5 sandbox iframe.
+ This means that modern browsers will not execute plugins or JavaScript on the content
+ any more. Currently, this is supported by Chrome and Safari, but IE10 and FF16 are also
+ - 2012-08-17 HTML mails will now be displayed in the restricted zone in IE.
+ This means that more restrictive security settings will apply, such as blocking of
+ JavaScript content by default.
+ - 2012-03-08 Fixed bug#8300 - Database upgrade issue when upgrading from 2.3 > 2.4 > 3.0 > 3.1:
+ table smime_signer_cert_relations' already exists.
+ - 2012-03-05 Fixed bug#7545 - AgentTicketBounce lacks permission checks.
+ - 2012-02-23 Fixed bug#8227 - LDAP user syncronisation doesn't work.
+ - 2011-12-09 Fixed bug#7997 - Fetching mail via AdminMailAccount does not work.
+ - 2011-12-02 Fixed bug#5086 - Emails with a long subject are not handled.
+ - 2011-11-21 Use the secure attribute to restrict coookies to HTTPS if it is used.
+ - 2011-11-21 Fixed bug#7909 - Errors should be logged in web server error log only.
+ - 2011-11-10 Fixed bug#7879 - Ticket forward not working if content-id exists.
+ - 2011-11-07 Fixed bug#7362 - AuthSyncModule::LDAP::UserSyncMap with multiple auth backends.
+ - 2011-11-02 Fixed bug#7465 - Out-of-office unlock does not work upon customer's web reply.
+ - 2011-10-21 Fixed bug#7845 - No DispatchMultiple Method in rpc.pl script.
+
+2.4.12 (2011/10/18)
+ - 2011-09-22 Fixed bug#7776 - Double encoding for AJAX responses on ActiveState perl.
+
2.4.11 (2011/08/16)
- 2011-07-28 Fixed bug#7518 - Escalation Notify by not working properly.
- 2011-05-09 Fixed bug#7010 - Latest version of PDF::API2 no longer includes DejaVu fonts.
@@ -68,7 +94,7 @@
- (2010/07/13) Fixed bug#5550 - Broken linebreaks in textareas of Google Chrome.
- (2010/07/07) Fixed bug#5541 - Dashboard Chart generates error in webserver log.
- (2010/07/01) Fixed bug#5512 - Bulk Action No Access is displayed incorrectly.
- - (2010/06/25) Updated Danish translation, thanks to Jesper Rønnov,
+ - (2010/06/25) Updated Danish translation, thanks to Jesper R�nnov,
Faaborg-Midtfyn Kommune!
- (2010/06/24) Fixed bug#5445 - Reflected XSS vulnerability.
- (2010/06/16) Fixed bug#5488 - AutoPriorityIncrease runs into failures.
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Config/Defaults.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/Config/Defaults.pm - Default Config file for OTRS kernel
-# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: Defaults.pm,v 1.323.2.3 2011/03/11 13:55:15 mg Exp $
+# $Id: Defaults.pm,v 1.323.2.5 2012/02/23 11:23:30 des Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -29,7 +29,7 @@
use 5.008_006;
use vars qw(@ISA $VERSION);
-$VERSION = qw($Revision: 1.323.2.3 $) [1];
+$VERSION = qw($Revision: 1.323.2.5 $) [1];
sub LoadDefaults {
my $Self = shift;
@@ -336,6 +336,11 @@
# This is the auth. module againt the otrs db
$Self->{'AuthModule'} = 'Kernel::System::Auth::DB';
+ # defines AuthSyncBackend (AuthSyncModule) for AuthModule
+ # if this key exists and is empty, there won't be a sync.
+ # example values: AuthSyncBackend, AuthSyncBackend2
+# $Self->{'AuthModule::UseSyncBackend'} = '';
+
# password crypt type (md5|crypt|plain)
# $Self->{'AuthModule::DB::CryptType'} = 'md5';
@@ -2413,6 +2418,6 @@
=head1 VERSION
-$Revision: 1.323.2.3 $ $Date: 2011/03/11 13:55:15 $
+$Revision: 1.323.2.5 $ $Date: 2012/02/23 11:23:30 $
=cut
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Language/de.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/Language/de.pm - provides de language translation
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: de.pm,v 1.208.2.10 2010/10/26 12:35:38 mg Exp $
+# $Id: de.pm,v 1.208.2.11 2011/10/11 07:56:42 mab Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -14,7 +14,7 @@
use warnings;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.208.2.10 $) [1];
+$VERSION = qw($Revision: 1.208.2.11 $) [1];
sub Data {
my $Self = shift;
@@ -878,6 +878,7 @@
'AutoIncrement' => 'AutoIncrement',
'SQL' => 'SQL',
'Diff' => 'Diff',
+ 'Did not find a required feature? OTRS Group provides their subscription customers with exclusive Add-Ons:' => 'Der Turbo für Ihr OTRS - Exklusive Feature Add-Ons für Subscription-Kunden:',
# Template: AdminPerformanceLog
'Performance Log' => 'Performance Log',
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Modules/AdminMailAccount.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/Modules/AdminMailAccount.pm - to add/update/delete MailAccount acounts
-# Copyright (C) 2001-2009 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: AdminMailAccount.pm,v 1.7 2009/02/17 23:37:11 martin Exp $
+# $Id: AdminMailAccount.pm,v 1.7.2.2 2012/02/09 15:05:53 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -19,7 +19,7 @@
use Kernel::System::Valid;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.7 $) [1];
+$VERSION = qw($Revision: 1.7.2.2 $) [1];
sub new {
my ( $Type, %Param ) = @_;
@@ -67,7 +67,7 @@
if ( !$Ok ) {
return $Self->{LayoutObject}->ErrorScreen();
}
- return $Self->{LayoutObject}->Redirect( OP => 'Action=$Env{"Action"}&Ok=1' );
+ return $Self->{LayoutObject}->Redirect( OP => 'Action=AdminMailAccount&Ok=1' );
}
# ------------------------------------------------------------ #
@@ -78,7 +78,7 @@
if ( !$Delete ) {
return $Self->{LayoutObject}->ErrorScreen();
}
- return $Self->{LayoutObject}->Redirect( OP => 'Action=$Env{"Action"}' );
+ return $Self->{LayoutObject}->Redirect( OP => 'Action=AdminMailAccount' );
}
# ------------------------------------------------------------ #
@@ -101,7 +101,7 @@
return $Self->{LayoutObject}->ErrorScreen();
}
return $Self->{LayoutObject}->Redirect(
- OP => 'Action=$Env{"Action"}&Subaction=Update&ID=' . $ID,
+ OP => 'Action=AdminMailAccount&Subaction=Update&ID=' . $ID,
);
}
@@ -131,7 +131,7 @@
if ( !$Update ) {
return $Self->{LayoutObject}->ErrorScreen();
}
- return $Self->{LayoutObject}->Redirect( OP => 'Action=$Env{"Action"}' );
+ return $Self->{LayoutObject}->Redirect( OP => 'Action=AdminMailAccount' );
}
# ------------------------------------------------------------ #
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Modules/AgentTicketAttachment.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/Modules/AgentTicketAttachment.pm - to get the attachments
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: AgentTicketAttachment.pm,v 1.22.2.6 2010/10/06 09:54:28 martin Exp $
+# $Id: AgentTicketAttachment.pm,v 1.22.2.7 2012/08/28 08:22:28 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -17,7 +17,7 @@
use Kernel::System::FileTemp;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.22.2.6 $) [1];
+$VERSION = qw($Revision: 1.22.2.7 $) [1];
sub new {
my ( $Type, %Param ) = @_;
@@ -365,108 +365,147 @@
my %Safety;
- # remove script tags
- if ( $Param{NoJavaScript} ) {
- $Safety{Replace} ||= ${$String} =~ s{
- <scrip.+?>(.+?|.?)</script>
- }
- {}sgxim;
- $Safety{Replace} ||= ${$String} =~ s{
- <scrip.+?>.+?(<|>)
- }
- {}sgxim;
- }
+ my $Replaced;
- # remove <applet> tags
- if ( $Param{NoApplet} ) {
- $Safety{Replace} ||= ${$String} =~ s{
- <apple.+?>(.+?)</applet>
- }
- {}sgxim;
- }
-
- # remove <Object> tags
- if ( $Param{NoObject} ) {
- $Safety{Replace} ||= ${$String} =~ s{
- <objec.+?>(.+?)</object>
- }
- {}sgxim;
- }
+ # In UTF-7, < and > can be encoded to mask them from security filters like this one.
+ my $TagStart = '(?:<|[+]ADw-)';
+ my $TagEnd = '(?:>|[+]AD4-)';
+
+ # Replace as many times as it is needed to avoid nesting tag attacks.
+ do {
+ $Replaced = undef;
+
+ # remove script tags
+ if ( $Param{NoJavaScript} ) {
+ $Replaced += ${$String} =~ s{
+ $TagStart script.*? $TagEnd .*? $TagStart /script \s* $TagEnd
+ }
+ {}sgxim;
+ $Replaced += ${$String} =~ s{
+ $TagStart script.*? $TagEnd .+? ($TagStart|$TagEnd)
+ }
+ {}sgxim;
- # remove style/javascript parts
- if ( $Param{NoJavaScript} ) {
- $Safety{Replace} ||= ${$String} =~ s{
- <style.+?javascript(.+?|)>(.*)</style>
- }
- {}sgxim;
- }
+ # remove style/javascript parts
+ $Replaced += ${$String} =~ s{
+ $TagStart style[^>]+?javascript(.+?|) $TagEnd (.*?) $TagStart /style \s* $TagEnd
+ }
+ {}sgxim;
- # remove <embed> tags
- if ( $Param{NoEmbed} ) {
- $Safety{Replace} ||= ${$String} =~ s{
- <embed\s.+?>
+ # remove MS CSS expressions (JavaScript embedded in CSS)
+ ${$String} =~ s{
+ ($TagStart style[^>]+? $TagEnd .*? $TagStart /style \s* $TagEnd)
+ }
+ {
+ if ( index($1, 'expression(' ) > -1 ) {
+ $Replaced = 1;
+ '';
+ }
+ else {
+ $1;
+ }
+ }egsxim;
}
- {}sgxim;
- }
-
- # check each html tag
- ${$String} =~ s{
- (<.+?>)
- }
- {
- my $Tag = $1;
- if ($Param{NoJavaScript}) {
- # remove on action sub tags
- $Safety{Replace} ||= $Tag =~ s{
- \son.+?=(".+?"|'.+?'|.+?)(>|\s)
+ # remove <applet> tags
+ if ( $Param{NoApplet} ) {
+ $Replaced += ${$String} =~ s{
+ $TagStart applet.*? $TagEnd (.*?) $TagStart /applet \s* $TagEnd
}
- {
- $2;
- }sgxime;
+ {}sgxim;
+ }
- # remove entities sub tags
- $Safety{Replace} ||= $Tag =~ s{
- (&\{.+?\})
+ # remove <Object> tags
+ if ( $Param{NoObject} ) {
+ $Replaced += ${$String} =~ s{
+ $TagStart object.*? $TagEnd (.*?) $TagStart /object \s* $TagEnd
}
{}sgxim;
+ }
- # remove javascript in a href links or src links
- $Safety{Replace} ||= $Tag =~ s{
- ((\s|;)(background|url|src|href)=)('|"|)(javascript.+?)('|"|)(\s|>)
+ # remove <svg> tags
+ if ( $Param{NoSVG} ) {
+ $Replaced += ${$String} =~ s{
+ $TagStart svg.*? $TagEnd (.*?) $TagStart /svg \s* $TagEnd
}
- {
- "$1\"\"$7";
- }sgxime;
+ {}sgxim;
+ }
- # remove link javascript tags
- $Safety{Replace} ||= $Tag =~ s{
- (<link.+?javascript(.+?|)>)
+ # remove <embed> tags
+ if ( $Param{NoEmbed} ) {
+ $Replaced += ${$String} =~ s{
+ $TagStart embed.*? $TagEnd
}
{}sgxim;
+ }
+ # check each html tag
+ ${$String} =~ s{
+ ($TagStart.+?$TagEnd)
}
+ {
+ my $Tag = $1;
+ if ($Param{NoJavaScript}) {
- # remove load tags
- if ($Param{NoIntSrcLoad} || $Param{NoExtSrcLoad}) {
- $Tag =~ s{
- (<(.+?)\ssrc=(.+?)(\s.+?|)>)
- }
- {
- my $URL = $3;
- if ($Param{NoIntSrcLoad} || ($Param{NoExtSrcLoad} && $URL =~ /(http|ftp|https):\//i)) {
- $Safety{Replace} = 1;
- '';
+ # remove on action attributes
+ $Replaced += $Tag =~ s{
+ \son.+?=(".+?"|'.+?'|.+?)($TagEnd|\s)
}
- else {
- $1;
+ {$2}sgxim;
+
+ # remove entities in tag
+ $Replaced += $Tag =~ s{
+ (&\{.+?\})
}
- }segxim;
- }
+ {}sgxim;
+
+ # remove javascript in a href links or src links
+ $Replaced += $Tag =~ s{
+ ((\s|;)(background|url|src|href)=)('|"|)(javascript.+?)('|"|)(\s|$TagEnd)
+ }
+ {
+ "$1\"\"$7";
+ }sgxime;
+
+ # remove link javascript tags
+ $Replaced += $Tag =~ s{
+ ($TagStart link .+? javascript (.+?|) $TagEnd)
+ }
+ {}sgxim;
+
+ # remove MS CSS expressions (JavaScript embedded in CSS)
+ $Replaced += $Tag =~ s{
+ \sstyle=("|')[^\1]*?expression[(][^\1]*?\1($TagEnd|\s)
+ }
+ {
+ $2;
+ }egsxim;
+ }
+
+ # remove load tags
+ if ($Param{NoIntSrcLoad} || $Param{NoExtSrcLoad}) {
+ $Tag =~ s{
+ ($TagStart (.+?) \s src=(.+?) (\s.+?|) $TagEnd)
+ }
+ {
+ my $URL = $3;
+ if ($Param{NoIntSrcLoad} || ($Param{NoExtSrcLoad} && $URL =~ /(http|ftp|https):\//i)) {
+ $Replaced = 1;
+ '';
+ }
+ else {
+ $1;
+ }
+ }segxim;
+ }
+
+ # replace original tag with clean tag
+ $Tag;
+ }segxim;
+
+ $Safety{Replace} += $Replaced;
- # replace original tag with clean tag
- $Tag;
- }segxim;
+ } while ($Replaced);
# check ref && return result like called
if ($StringScalar) {
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Modules/AgentTicketBounce.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/Modules/AgentTicketBounce.pm - to bounce articles of tickets
-# Copyright (C) 2001-2009 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: AgentTicketBounce.pm,v 1.35 2009/07/20 10:36:04 mh Exp $
+# $Id: AgentTicketBounce.pm,v 1.35.2.2 2012/03/05 09:51:40 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -21,7 +21,7 @@
use Mail::Address;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.35 $) [1];
+$VERSION = qw($Revision: 1.35.2.2 $) [1];
sub new {
my ( $Type, %Param ) = @_;
@@ -141,6 +141,13 @@
# get article data
my %Article = $Self->{TicketObject}->ArticleGet( ArticleID => $Self->{ArticleID}, );
+ # Check if article is from the same TicketID as we checked permissions for.
+ if ( $Article{TicketID} ne $Self->{TicketID} ) {
+ return $Self->{LayoutObject}->ErrorScreen(
+ Message => "Article does not belong to ticket $Self->{TicketID}!",
+ );
+ }
+
# prepare to (ReplyTo!) ...
if ( $Article{ReplyTo} ) {
$Article{To} = $Article{ReplyTo};
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Modules/AgentTicketForward.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/Modules/AgentTicketForward.pm - to forward a message
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: AgentTicketForward.pm,v 1.54.2.8 2010/04/02 15:19:28 martin Exp $
+# $Id: AgentTicketForward.pm,v 1.54.2.11 2012/03/05 09:47:47 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -23,7 +23,7 @@
use Mail::Address;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.54.2.8 $) [1];
+$VERSION = qw($Revision: 1.54.2.11 $) [1];
sub new {
my ( $Type, %Param ) = @_;
@@ -176,6 +176,13 @@
my %Data;
if ( $GetParam{ArticleID} ) {
%Data = $Self->{TicketObject}->ArticleGet( ArticleID => $GetParam{ArticleID}, );
+
+ # Check if article is from the same TicketID as we checked permissions for.
+ if ( $Data{TicketID} ne $Self->{TicketID} ) {
+ return $Self->{LayoutObject}->ErrorScreen(
+ Message => "Article does not belong to ticket $Self->{TicketID}!",
+ );
+ }
}
else {
%Data = $Self->{TicketObject}->ArticleLastCustomerArticle( TicketID => $Self->{TicketID}, );
@@ -631,7 +638,7 @@
REMOVEINLINE:
for my $Attachment (@AttachmentData) {
my $ContentID = $Attachment->{ContentID};
- if ($ContentID) {
+ if ( $ContentID && ( $Attachment->{ContentType} =~ /image/i ) ) {
my $ContentIDHTMLQuote = $Self->{LayoutObject}->Ascii2Html(
Text => $ContentID,
);
@@ -909,7 +916,15 @@
# show attachments
for my $DataRef ( @{ $Param{Attachments} } ) {
- next if $DataRef->{ContentID} && $Self->{ConfigObject}->Get('Frontend::RichText');
+ if (
+ $DataRef->{ContentID}
+ && $Self->{ConfigObject}->Get('Frontend::RichText')
+ && ( $DataRef->{ContentType} =~ /image/i )
+ )
+ {
+ next;
+ }
+
$Self->{LayoutObject}->Block(
Name => 'Attachment',
Data => $DataRef,
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Modules/AgentTicketPhone.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/Modules/AgentTicketPhone.pm - to handle phone calls
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: AgentTicketPhone.pm,v 1.113.2.5 2010/04/01 17:59:53 martin Exp $
+# $Id: AgentTicketPhone.pm,v 1.113.2.6 2012/03/05 09:47:47 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -23,7 +23,7 @@
use Mail::Address;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.113.2.5 $) [1];
+$VERSION = qw($Revision: 1.113.2.6 $) [1];
sub new {
my ( $Type, %Param ) = @_;
@@ -172,6 +172,14 @@
my %CustomerData = ();
if ( $GetParam{ArticleID} ) {
%Article = $Self->{TicketObject}->ArticleGet( ArticleID => $GetParam{ArticleID} );
+
+ # Check if article is from the same TicketID as we checked permissions for.
+ if ( $Article{TicketID} ne $Self->{TicketID} ) {
+ return $Self->{LayoutObject}->ErrorScreen(
+ Message => "Article does not belong to ticket $Self->{TicketID}!",
+ );
+ }
+
$Article{Subject} = $Self->{TicketObject}->TicketSubjectClean(
TicketNumber => $Article{TicketNumber},
Subject => $Article{Subject} || '',
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Modules/CustomerTicketAttachment.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/Modules/CustomerTicketAttachment.pm - to get the attachments
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: CustomerTicketAttachment.pm,v 1.17.2.6 2010/10/06 09:54:28 martin Exp $
+# $Id: CustomerTicketAttachment.pm,v 1.17.2.7 2012/08/28 08:22:28 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -15,7 +15,7 @@
use warnings;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.17.2.6 $) [1];
+$VERSION = qw($Revision: 1.17.2.7 $) [1];
sub new {
my ( $Type, %Param ) = @_;
@@ -326,108 +326,147 @@
my %Safety;
- # remove script tags
- if ( $Param{NoJavaScript} ) {
- $Safety{Replace} ||= ${$String} =~ s{
- <scrip.+?>(.+?|.?)</script>
- }
- {}sgxim;
- $Safety{Replace} ||= ${$String} =~ s{
- <scrip.+?>.+?(<|>)
- }
- {}sgxim;
- }
+ my $Replaced;
- # remove <applet> tags
- if ( $Param{NoApplet} ) {
- $Safety{Replace} ||= ${$String} =~ s{
- <apple.+?>(.+?)</applet>
- }
- {}sgxim;
- }
-
- # remove <Object> tags
- if ( $Param{NoObject} ) {
- $Safety{Replace} ||= ${$String} =~ s{
- <objec.+?>(.+?)</object>
- }
- {}sgxim;
- }
+ # In UTF-7, < and > can be encoded to mask them from security filters like this one.
+ my $TagStart = '(?:<|[+]ADw-)';
+ my $TagEnd = '(?:>|[+]AD4-)';
+
+ # Replace as many times as it is needed to avoid nesting tag attacks.
+ do {
+ $Replaced = undef;
+
+ # remove script tags
+ if ( $Param{NoJavaScript} ) {
+ $Replaced += ${$String} =~ s{
+ $TagStart script.*? $TagEnd .*? $TagStart /script \s* $TagEnd
+ }
+ {}sgxim;
+ $Replaced += ${$String} =~ s{
+ $TagStart script.*? $TagEnd .+? ($TagStart|$TagEnd)
+ }
+ {}sgxim;
- # remove style/javascript parts
- if ( $Param{NoJavaScript} ) {
- $Safety{Replace} ||= ${$String} =~ s{
- <style.+?javascript(.+?|)>(.*)</style>
- }
- {}sgxim;
- }
+ # remove style/javascript parts
+ $Replaced += ${$String} =~ s{
+ $TagStart style[^>]+?javascript(.+?|) $TagEnd (.*?) $TagStart /style \s* $TagEnd
+ }
+ {}sgxim;
- # remove <embed> tags
- if ( $Param{NoEmbed} ) {
- $Safety{Replace} ||= ${$String} =~ s{
- <embed\s.+?>
+ # remove MS CSS expressions (JavaScript embedded in CSS)
+ ${$String} =~ s{
+ ($TagStart style[^>]+? $TagEnd .*? $TagStart /style \s* $TagEnd)
+ }
+ {
+ if ( index($1, 'expression(' ) > -1 ) {
+ $Replaced = 1;
+ '';
+ }
+ else {
+ $1;
+ }
+ }egsxim;
}
- {}sgxim;
- }
- # check each html tag
- ${$String} =~ s{
- (<.+?>)
- }
- {
- my $Tag = $1;
- if ($Param{NoJavaScript}) {
-
- # remove on action sub tags
- $Safety{Replace} ||= $Tag =~ s{
- \son.+?=(".+?"|'.+?'|.+?)(>|\s)
+ # remove <applet> tags
+ if ( $Param{NoApplet} ) {
+ $Replaced += ${$String} =~ s{
+ $TagStart applet.*? $TagEnd (.*?) $TagStart /applet \s* $TagEnd
}
- {
- $2;
- }sgxime;
+ {}sgxim;
+ }
- # remove entities sub tags
- $Safety{Replace} ||= $Tag =~ s{
- (&\{.+?\})
+ # remove <Object> tags
+ if ( $Param{NoObject} ) {
+ $Replaced += ${$String} =~ s{
+ $TagStart object.*? $TagEnd (.*?) $TagStart /object \s* $TagEnd
}
{}sgxim;
+ }
- # remove javascript in a href links or src links
- $Safety{Replace} ||= $Tag =~ s{
- ((\s|;)(background|url|src|href)=)('|"|)(javascript.+?)('|"|)(\s|>)
+ # remove <svg> tags
+ if ( $Param{NoSVG} ) {
+ $Replaced += ${$String} =~ s{
+ $TagStart svg.*? $TagEnd (.*?) $TagStart /svg \s* $TagEnd
}
- {
- "$1\"\"$7";
- }sgxime;
+ {}sgxim;
+ }
- # remove link javascript tags
- $Safety{Replace} ||= $Tag =~ s{
- (<link.+?javascript(.+?|)>)
+ # remove <embed> tags
+ if ( $Param{NoEmbed} ) {
+ $Replaced += ${$String} =~ s{
+ $TagStart embed.*? $TagEnd
}
{}sgxim;
+ }
+ # check each html tag
+ ${$String} =~ s{
+ ($TagStart.+?$TagEnd)
}
+ {
+ my $Tag = $1;
+ if ($Param{NoJavaScript}) {
- # remove load tags
- if ($Param{NoIntSrcLoad} || $Param{NoExtSrcLoad}) {
- $Tag =~ s{
- (<(.+?)\ssrc=(.+?)(\s.+?|)>)
- }
- {
- my $URL = $3;
- if ($Param{NoIntSrcLoad} || ($Param{NoExtSrcLoad} && $URL =~ /(http|ftp|https):\//i)) {
- $Safety{Replace} = 1;
- '';
+ # remove on action attributes
+ $Replaced += $Tag =~ s{
+ \son.+?=(".+?"|'.+?'|.+?)($TagEnd|\s)
}
- else {
- $1;
+ {$2}sgxim;
+
+ # remove entities in tag
+ $Replaced += $Tag =~ s{
+ (&\{.+?\})
}
- }segxim;
- }
+ {}sgxim;
+
+ # remove javascript in a href links or src links
+ $Replaced += $Tag =~ s{
+ ((\s|;)(background|url|src|href)=)('|"|)(javascript.+?)('|"|)(\s|$TagEnd)
+ }
+ {
+ "$1\"\"$7";
+ }sgxime;
+
+ # remove link javascript tags
+ $Replaced += $Tag =~ s{
+ ($TagStart link .+? javascript (.+?|) $TagEnd)
+ }
+ {}sgxim;
+
+ # remove MS CSS expressions (JavaScript embedded in CSS)
+ $Replaced += $Tag =~ s{
+ \sstyle=("|')[^\1]*?expression[(][^\1]*?\1($TagEnd|\s)
+ }
+ {
+ $2;
+ }egsxim;
+ }
+
+ # remove load tags
+ if ($Param{NoIntSrcLoad} || $Param{NoExtSrcLoad}) {
+ $Tag =~ s{
+ ($TagStart (.+?) \s src=(.+?) (\s.+?|) $TagEnd)
+ }
+ {
+ my $URL = $3;
+ if ($Param{NoIntSrcLoad} || ($Param{NoExtSrcLoad} && $URL =~ /(http|ftp|https):\//i)) {
+ $Replaced = 1;
+ '';
+ }
+ else {
+ $1;
+ }
+ }segxim;
+ }
+
+ # replace original tag with clean tag
+ $Tag;
+ }segxim;
+
+ $Safety{Replace} += $Replaced;
- # replace original tag with clean tag
- $Tag;
- }segxim;
+ } while ($Replaced);
# check ref && return result like called
if ($StringScalar) {
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Modules/CustomerTicketZoom.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/Modules/CustomerTicketZoom.pm - to get a closer view
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: CustomerTicketZoom.pm,v 1.48.2.2 2010/05/31 15:14:32 mb Exp $
+# $Id: CustomerTicketZoom.pm,v 1.48.2.3 2011/11/02 18:12:47 jp Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -16,9 +16,10 @@
use Kernel::System::Web::UploadCache;
use Kernel::System::State;
+use Kernel::System::User;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.48.2.2 $) [1];
+$VERSION = qw($Revision: 1.48.2.3 $) [1];
sub new {
my ( $Type, %Param ) = @_;
@@ -42,6 +43,7 @@
# needed objects
$Self->{StateObject} = Kernel::System::State->new(%Param);
$Self->{UploadCachObject} = Kernel::System::Web::UploadCache->new(%Param);
+ $Self->{AgentUserObject} = Kernel::System::User->new(%Param);
# get article id
$Self->{ArticleID} = $Self->{ParamObject}->GetParam( Param => 'ArticleID' );
@@ -176,14 +178,36 @@
}
if ( !%Error ) {
+ # unlock ticket if agent is on vacation
+ my $LockAction;
+ if ( $Ticket{OwnerID} ) {
+ my %User = $Self->{AgentUserObject}->GetUserData(
+ UserID => $Ticket{OwnerID},
+ );
+ if ( %User && $User{OutOfOffice} && $User{OutOfOfficeMessage} ) {
+ $LockAction = 'unlock';
+ }
+ }
+
# set lock if ticket was closed
- if ( $Lock && $State{TypeName} =~ /^close/i && $Ticket{OwnerID} ne '1' ) {
+ if (
+ !$LockAction
+ && $Lock
+ && $State{TypeName} =~ /^close/i && $Ticket{OwnerID} ne '1'
+ )
+ {
+
+ $LockAction = 'lock';
+ }
+
+ if ($LockAction) {
$Self->{TicketObject}->LockSet(
TicketID => $Self->{TicketID},
- Lock => 'lock',
- UserID => => $Self->{ConfigObject}->Get('CustomerPanelUserID'),
+ Lock => $LockAction,
+ UserID => $Self->{ConfigObject}->Get('CustomerPanelUserID'),
);
}
+
my $From = "$Self->{UserFirstname} $Self->{UserLastname} <$Self->{UserEmail}>";
my $MimeType = 'text/plain';
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Output/HTML/Layout.pm
^
|
@@ -2,7 +2,7 @@
# Kernel/Output/HTML/Layout.pm - provides generic HTML output
# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: Layout.pm,v 1.176.2.26 2011/04/04 22:49:38 en Exp $
+# $Id: Layout.pm,v 1.176.2.28 2011/09/22 10:20:42 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -20,7 +20,7 @@
use Kernel::System::HTMLUtils;
use vars qw(@ISA $VERSION);
-$VERSION = qw($Revision: 1.176.2.26 $) [1];
+$VERSION = qw($Revision: 1.176.2.28 $) [1];
=head1 NAME
@@ -3225,7 +3225,7 @@
}
# reset binmode, don't use utf8
- binmode STDOUT;
+ binmode STDOUT, ':bytes';
return $Output;
}
@@ -4360,7 +4360,7 @@
# replace image link with content id for uploaded images
${ $Param{String} } =~ s{
- (<img.+?src=("|')).+?ContentID=(.+?)("|')(.*?>)
+ (<img.+?src=("|'))[^>]+ContentID=(.+?)("|')([^>]+>)
}
{
$1 . 'cid:' . $3 . $4 . $5;
@@ -4416,6 +4416,6 @@
=head1 VERSION
-$Revision: 1.176.2.26 $ $Date: 2011/04/04 22:49:38 $
+$Revision: 1.176.2.28 $ $Date: 2011/09/22 10:20:42 $
=cut
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Output/HTML/LayoutTicket.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/Output/HTML/LayoutTicket.pm - provides generic ticket HTML output
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: LayoutTicket.pm,v 1.50.2.8 2010/12/17 13:40:27 martin Exp $
+# $Id: LayoutTicket.pm,v 1.50.2.10 2011/09/08 10:33:53 te Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -15,7 +15,7 @@
use warnings;
use vars qw(@ISA $VERSION);
-$VERSION = qw($Revision: 1.50.2.8 $) [1];
+$VERSION = qw($Revision: 1.50.2.10 $) [1];
sub TicketStdResponseString {
my ( $Self, %Param ) = @_;
@@ -715,7 +715,7 @@
StripPlainBodyAsAttachment => 1,
);
- my @NotInlineAttachments;
+ my %NotInlineAttachments;
ARTICLE:
for my $ArticleTmp (@ArticleBox) {
@@ -752,8 +752,7 @@
);
# display inline images if exists
- my %Attachments = %{ $ArticleTmp->{Atms} };
- my $SessionID = '';
+ my $SessionID = '';
if ( $Self->{SessionID} && !$Self->{SessionIDCookie} ) {
$SessionID = "&" . $Self->{SessionName} . "=" . $Self->{SessionID};
}
@@ -765,6 +764,7 @@
. '&ContentID=';
# search inline documents in body and add it to upload cache
+ my %Attachments = %{ $ArticleTmp->{Atms} };
my %AttachmentAlreadyUsed;
$Body =~ s{
(=|"|')cid:(.*?)("|'|>|\/>|\s)
@@ -784,17 +784,14 @@
# find attachment to include
ATMCOUNT:
- for my $AttachmentID ( keys %Attachments ) {
- next if $AttachmentAlreadyUsed{$AttachmentID};
+ for my $AttachmentID ( sort keys %Attachments ) {
- # remember not included real attachments
+ # next is cid is not matchin
if ( lc $Attachments{$AttachmentID}->{ContentID} ne lc "<$ContentID>" ) {
- push @NotInlineAttachments, $AttachmentID;
- $AttachmentAlreadyUsed{$AttachmentID} = 1;
next ATMCOUNT;
}
- # add to upload cache
+ # get whole attachment
my %AttachmentPicture = $Self->{TicketObject}->ArticleAttachment(
ArticleID => $Param{ArticleID},
FileID => $AttachmentID,
@@ -805,37 +802,33 @@
$AttachmentPicture{ContentID} =~ s/^<//;
$AttachmentPicture{ContentID} =~ s/>$//;
- $Param{UploadCachObject}->FormIDAddFile(
- FormID => $Param{FormID},
- Disposition => 'inline',
- %{ $Attachments{$AttachmentID} },
- %AttachmentPicture,
- );
- my @Attachments = $Param{UploadCachObject}->FormIDGetAllFilesMeta(
- FormID => $Param{FormID},
- );
- CONTENTIDRETURN:
- for my $Attachment (@Attachments) {
- next CONTENTIDRETURN
- if $Attachments{$AttachmentID}->{Filename} ne $Attachment->{Filename};
- $ContentID = $AttachmentLink . $Attachment->{ContentID};
- last CONTENTIDRETURN;
+ # find cid, add attachment URL and remeber, file is already uploaded
+ $ContentID = $AttachmentLink . $AttachmentPicture{ContentID};
+
+ # add to upload cache if not uploaded and remember
+ if (!$AttachmentAlreadyUsed{$AttachmentID}) {
+
+ # remember
+ $AttachmentAlreadyUsed{$AttachmentID} = 1;
+
+ # write attachment to upload cache
+ $Param{UploadCachObject}->FormIDAddFile(
+ FormID => $Param{FormID},
+ Disposition => 'inline',
+ %{ $Attachments{$AttachmentID} },
+ %AttachmentPicture,
+ );
}
- $AttachmentAlreadyUsed{$AttachmentID} = 1;
}
# return link
$Start . $ContentID . $End;
}egxi;
- # attach also other attachments (add all if no "cid:" was in html reply)
- my @Attachments = $Param{UploadCachObject}->FormIDGetAllFilesMeta(
- FormID => $Param{FormID},
- );
- if ( !@Attachments ) {
- for my $Index ( keys %Attachments ) {
- push @NotInlineAttachments, $Index;
- }
+ # find not inline images
+ for my $AttachmentID ( sort keys %Attachments ) {
+ next if $AttachmentAlreadyUsed{$AttachmentID};
+ $NotInlineAttachments{$AttachmentID} = 1;
}
# do no more article
@@ -844,7 +837,7 @@
# attach also other attachments on article forward
if ( $Body && $Param{AttachmentsInclude} ) {
- for my $AttachmentID (@NotInlineAttachments) {
+ for my $AttachmentID ( sort keys %NotInlineAttachments ) {
my %Attachment = $Self->{TicketObject}->ArticleAttachment(
ArticleID => $Param{ArticleID},
FileID => $AttachmentID,
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Output/HTML/Standard/AdminPackageManager.dtl
^
|
@@ -2,7 +2,7 @@
# AdminPackageManager.dtl - provides global HTML AdminPackageManager
# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: AdminPackageManager.dtl,v 1.47.2.1 2011/02/18 00:00:57 en Exp $
+# $Id: AdminPackageManager.dtl,v 1.47.2.5 2011/10/11 07:59:16 mab Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -263,6 +263,30 @@
</tr>
</table>
</form>
+ <br/>
+ <table border="0" width="100%" cellspacing="0" cellpadding="4">
+ <tr>
+ <td class="contenthead">$Text{"Hint"}:</td>
+ </tr>
+ <tr>
+ <td class="contentbody">
+ <p>
+ $Text{"Did not find a required feature? OTRS Group provides their subscription customers with exclusive Add-Ons:"}
+ <a href="http://add-ons.otrs.com/">http://add-ons.otrs.com</a>.
+ </p>
+ <p style="text-align: center;">
+ <a href="http://add-ons.otrs.com">
+ <img src="$Config{"Frontend::ImagePath"}/feature_add_ons.png" border="0" />
+ </a>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td class="contentfooter">
+
+ </td>
+ </tr>
+ </table>
</td>
<td width="70%" class="mainbody">
<table border="0" width="100%" cellspacing="0" cellpadding="4">
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Output/HTML/Standard/AgentCalendarSmall.dtl
^
|
@@ -1,8 +1,8 @@
# --
# AgentCalendarSmall.dtl - provides HTML form for AgentSpelling
-# Copyright (C) 2001-2009 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: AgentCalendarSmall.dtl,v 1.16 2009/02/16 11:07:25 tr Exp $
+# $Id: AgentCalendarSmall.dtl,v 1.16.2.1 2011/11/21 09:13:46 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -13,19 +13,19 @@
<!--
<!-- dtl:block:DateFormatOption -->
function SelectDay(tt, mm, yyyy) {
- for(var z=0;z < opener.document.compose["$Data{"Prefix"}Day"].length;z++) {
- if (opener.document.compose["$Data{"Prefix"}Day"].options[z].value == tt) {
- opener.document.compose["$Data{"Prefix"}Day"].options[z].selected = true;
+ for(var z=0;z < opener.document.compose["$QData{"Prefix"}Day"].length;z++) {
+ if (opener.document.compose["$QData{"Prefix"}Day"].options[z].value == tt) {
+ opener.document.compose["$QData{"Prefix"}Day"].options[z].selected = true;
}
}
- for(var z=0;z < opener.document.compose["$Data{"Prefix"}Month"].length;z++) {
- if (opener.document.compose["$Data{"Prefix"}Month"].options[z].value == mm) {
- opener.document.compose["$Data{"Prefix"}Month"].options[z].selected = true;
+ for(var z=0;z < opener.document.compose["$QData{"Prefix"}Month"].length;z++) {
+ if (opener.document.compose["$QData{"Prefix"}Month"].options[z].value == mm) {
+ opener.document.compose["$QData{"Prefix"}Month"].options[z].selected = true;
}
}
- for(var z=0;z < opener.document.compose["$Data{"Prefix"}Year"].length;z++) {
- if (opener.document.compose["$Data{"Prefix"}Year"].options[z].value == yyyy) {
- opener.document.compose["$Data{"Prefix"}Year"].options[z].selected = true;
+ for(var z=0;z < opener.document.compose["$QData{"Prefix"}Year"].length;z++) {
+ if (opener.document.compose["$QData{"Prefix"}Year"].options[z].value == yyyy) {
+ opener.document.compose["$QData{"Prefix"}Year"].options[z].selected = true;
}
}
this.close();
@@ -33,9 +33,9 @@
<!-- dtl:block:DateFormatOption -->
<!-- dtl:block:DateFormatInput -->
function SelectDay(tt, mm, yyyy) {
- opener.document.compose["$Data{"Prefix"}Day"].value = tt;
- opener.document.compose["$Data{"Prefix"}Month"].value = mm;
- opener.document.compose["$Data{"Prefix"}Year"].value = yyyy;
+ opener.document.compose["$QData{"Prefix"}Day"].value = tt;
+ opener.document.compose["$QData{"Prefix"}Month"].value = mm;
+ opener.document.compose["$QData{"Prefix"}Year"].value = yyyy;
this.close();
}
@@ -45,36 +45,36 @@
</script>
<table border="0" width="225" cellspacing="0" cellpadding="3">
- <tr>
- <th class="mainhead"><a href="$Env{"Baselink"}Action=$Env{"Action"}&Month=$LQData{"Back"}&Prefix=$LQData{"Prefix"}" class="headeritem"><<</a></th>
- <th class="mainhead">$Text{"$QData{"Month"}"} $QData{"Year"}</th>
- <th class="mainhead"><a href="$Env{"Baselink"}Action=$Env{"Action"}&Month=$LQData{"Next"}&Prefix=$LQData{"Prefix"}" class="headeritem">>></a></th>
- </tr>
- <tr>
- <td class="mainbody" colspan="3">
- <table border="0" width="100%" cellspacing="0" cellpadding="2">
- <tr class="contenthead">
- <td>$Text{"Mon"}</td>
- <td>$Text{"Tue"}</td>
- <td>$Text{"Wed"}</td>
- <td>$Text{"Thu"}</td>
- <td>$Text{"Fri"}</td>
- <td>$Text{"Sat"}</td>
- <td>$Text{"Sun"}</td>
- </tr>
+ <tr>
+ <th class="mainhead"><a href="$Env{"Baselink"}Action=$Env{"Action"}&Month=$LQData{"Back"}&Prefix=$LQData{"Prefix"}" class="headeritem"><<</a></th>
+ <th class="mainhead">$Text{"$Data{"Month"}"} $QData{"Year"}</th>
+ <th class="mainhead"><a href="$Env{"Baselink"}Action=$Env{"Action"}&Month=$LQData{"Next"}&Prefix=$LQData{"Prefix"}" class="headeritem">>></a></th>
+ </tr>
+ <tr>
+ <td class="mainbody" colspan="3">
+ <table border="0" width="100%" cellspacing="0" cellpadding="2">
+ <tr class="contenthead">
+ <td>$Text{"Mon"}</td>
+ <td>$Text{"Tue"}</td>
+ <td>$Text{"Wed"}</td>
+ <td>$Text{"Thu"}</td>
+ <td>$Text{"Fri"}</td>
+ <td>$Text{"Sat"}</td>
+ <td>$Text{"Sun"}</td>
+ </tr>
<!-- dtl:block:Row -->
- <tr>
+ <tr>
<!-- dtl:block:ColEmpty -->
- <th></th>
+ <th></th>
<!-- dtl:block:ColEmpty -->
<!-- dtl:block:Col -->
- <td $Data{"Style"} align="center">
- <a href="#" onClick="SelectDay($Data{"Day"}, $Data{"Month"}, $Data{"Year"})">$Data{"Day"}</a>
- </td>
+ <td $Data{"Style"} align="center">
+ <a href="#" onClick="SelectDay($QData{"Day"}, $QData{"Month"}, $QData{"Year"})">$QData{"Day"}</a>
+ </td>
<!-- dtl:block:Col -->
- </tr>
+ </tr>
<!-- dtl:block:Row -->
- </table>
- </td>
- </tr>
+ </table>
+ </td>
+ </tr>
</table>
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Output/HTML/Standard/AgentTicketZoom.dtl
^
|
@@ -1,8 +1,8 @@
# --
# AgentTicketZoom.dtl - provides HTML for AgentTicketZoom.pm
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: AgentTicketZoom.dtl,v 1.62.2.2 2010/01/31 16:41:01 ub Exp $
+# $Id: AgentTicketZoom.dtl,v 1.62.2.4 2012/08/17 09:00:01 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -35,7 +35,7 @@
-
<!-- dtl:block:MenuItemSplit -->
<!-- dtl:block:MenuItem -->
- <a href="$Env{"Baselink"}$Data{"Link"}" $Data{"LinkParam"} onmouseover="window.status='$JSText{"$QData{"Name"}"}'; return true;" onmouseout="window.status='';" class="menuitem" title="$Text{"$QData{"Description"}"}">$Text{"$QData{"Name"}"}</a>
+ <a href="$Env{"Baselink"}$Data{"Link"}" $Data{"LinkParam"} onmouseover="window.status='$JSText{"$Data{"Name"}"}'; return true;" onmouseout="window.status='';" class="menuitem" title="$Text{"$Data{"Description"}"}">$Text{"$Data{"Name"}"}</a>
<!-- dtl:block:MenuItem -->
<!-- dtl:block:Menu -->
</td>
@@ -71,10 +71,10 @@
<td>
<table border="0" width="100%" cellspacing="0" cellpadding="1">
<!-- dtl:block:TreeItem -->
- <tr class="$QData{"SenderType"}-$QData{"ArticleType"}" onmouseover="this.className='highlight';" onmouseout="this.className='$QData{"SenderType"}-$QData{"ArticleType"}';">
+ <tr class="$QData{"SenderType"}-$QData{"ArticleType"}" onmouseover="this.className='highlight';" onmouseout="this.className=' $QData{"SenderType"}-$QData{"ArticleType"}';">
<td class="small">
<div title="$QData{"From","70"}: $QData{"Subject","200"} - $TimeShort{"$QData{"Created"}"}">
- $Data{"Start2"}$Data{"Space"}$Data{"Stop2"}$Data{"Start"}$Data{"Start2"} $QData{"Count"}. $Data{"Stop2"} <a href="$Env{"Baselink"}Action=AgentTicketZoom&TicketID=$QData{"TicketID"}&ArticleID=$QData{"ArticleID"}&ZoomExpand=$LQData{"ZoomExpand"}#$QData{"ArticleID"}" onmouseover="window.status='$JSText{"$QData{"SenderType"}"} ($Text{"$QData{"ArticleType"}"})'; return true;" onmouseout="window.status='';">$Text{"$QData{"SenderType"}"} ($Text{"$QData{"ArticleType"}"})</a>$Data{"Stop"}
+ $Data{"Start2"}$Data{"Space"}$Data{"Stop2"}$Data{"Start"}$Data{"Start2"} $QData{"Count"}. $Data{"Stop2"} <a href="$Env{"Baselink"}Action=AgentTicketZoom&TicketID=$QData{"TicketID"}&ArticleID=$QData{"ArticleID"}&ZoomExpand=$LQData{"ZoomExpand"}#$QData{"ArticleID"}" onmouseover="window.status='$JSText{"$Data{"SenderType"}"} ($Text{"$Data{"ArticleType"}"})'; return true;" onmouseout="window.status='';">$Text{"$Data{"SenderType"}"} ($Text{"$Data{"ArticleType"}"})</a>$Data{"Stop"}
<!-- dtl:block:TreeItemEmail -->
(<a href="$Env{"Baselink"}Action=AgentTicketPlain&TicketID=$QData{"TicketID"}&ArticleID=$QData{"ArticleID"}" onmouseover="window.status='$JSText{"plain"}'; return true;" onmouseout="window.status='';" title="$Text{"plain"}">$Text{"plain"}</a>)
<!-- dtl:block:TreeItemEmail -->
@@ -155,10 +155,10 @@
<td>$QData{"Filename"}</td>
<td>
<!-- dtl:block:ArticleAttachmentRowLink -->
- <a href="$Data{"Link"}" $Data{"Target"} onmouseover="window.status='$JSText{"$QData{"Action"}"}: $JSText{"$QData{"Filename"}"}';return true;" onmouseout="window.status='';"><img src="$Config{"Frontend::ImagePath"}$QData{"Image"}" border="0" alt="$Text{"$QData{"Action"}"}" title="$Text{"$QData{"Action"}"}"></a>
+ <a href="$Data{"Link"}" $Data{"Target"} onmouseover="window.status='$JSText{"$Data{"Action"}"}: $JSText{"$Data{"Filename"}"}';return true;" onmouseout="window.status='';"><img src="$Config{"Frontend::ImagePath"}$QData{"Image"}" border="0" alt="$Text{"$Data{"Action"}"}" title="$Text{"$Data{"Action"}"}"></a>
<!-- dtl:block:ArticleAttachmentRowLink -->
<!-- dtl:block:ArticleAttachmentRowNoLink -->
- <img src="$Config{"Frontend::ImagePath"}$QData{"Image"}" border="0" alt="$Text{"$QData{"Action"}"}" title="$Text{"$QData{"Action"}"}">
+ <img src="$Config{"Frontend::ImagePath"}$QData{"Image"}" border="0" alt="$Text{"$Data{"Action"}"}" title="$Text{"$Data{"Action"}"}">
<!-- dtl:block:ArticleAttachmentRowNoLink -->
</td>
<td align="right">$QData{"Filesize"}</td>
@@ -198,7 +198,9 @@
}
//-->
</script>
- <iframe width="100%" frameborder="0" border="0" marginwidth="0" marginheight="0" leftmargin="0" topmargin="0" style="width: 100%;" id="iframe$QData{"ArticleID"}" onload="IframeAutoHeight('iframe$QData{"ArticleID"}');" src="$Env{"Baselink"}Action=AgentTicketAttachment&Subaction=HTMLView&ArticleID=$QData{"ArticleID"}&FileID=$QData{"AttachmentIDOfHTMLBody"}"></iframe>
+# Use the HTML5 sandbox attribute to prevent plugins and scripts from being executed in the browser.
+# Use IE's (non-standard) security attribute to achieve something similar in older IE browsers. Append session info to URL because IE will not send cookies.
+ <iframe sandbox="allow-same-origin" security="restricted" width="100%" frameborder="0" border="0" marginwidth="0" marginheight="0" leftmargin="0" topmargin="0" style="width: 100%;" id="iframe$QData{"ArticleID"}" onload="IframeAutoHeight('iframe$QData{"ArticleID"}');" src="$Env{"Baselink"}Action=AgentTicketAttachment&Subaction=HTMLView&ArticleID=$QData{"ArticleID"}&FileID=$QData{"AttachmentIDOfHTMLBody"}&$QEnv{"SessionName"}=$QEnv{"SessionID"}"></iframe>
</div>
<!-- dtl:block:BodyHTML -->
</td>
@@ -419,7 +421,7 @@
# use this if you want to show TicketFreeTime1-6
<!-- dtl:block:TicketFreeTime -->
<tr valign="top">
- <td><b>$Text{"$QData{"TicketFreeTimeKey"}"}:</b></td>
+ <td><b>$Text{"$Data{"TicketFreeTimeKey"}"}:</b></td>
<td><div title="$TimeShort{"$QData{"TicketFreeTime"}"}">$TimeShort{"$QData{"TicketFreeTime"}"}</div></td>
</tr>
<!-- dtl:block:TicketFreeTime -->
@@ -510,7 +512,7 @@
# check if split should be shown
<!-- dtl:block:AgentArticleComPhone -->
<dtl if ($Data{"SenderType"} eq "customer") { $Data{"ArticleSplitString"} = "Split"; }>
- <a href="$Env{"Baselink"}Action=AgentTicketPhone&ArticleID=$Data{"ArticleID"}&QueueID=$Data{"QueueID"}&LinkTicketID=$QData{"TicketID"}" onmouseover="window.status='$JSText{"Split"}'; return true;" onmouseout="window.status='';">$Text{"$Data{"ArticleSplitString"}"}</a>
+ <a href="$Env{"Baselink"}Action=AgentTicketPhone&TicketID=$Data{"TicketID"}&ArticleID=$Data{"ArticleID"}&QueueID=$Data{"QueueID"}&LinkTicketID=$QData{"TicketID"}" onmouseover="window.status='$JSText{"Split"}'; return true;" onmouseout="window.status='';">$Text{"$Data{"ArticleSplitString"}"}</a>
<!-- dtl:block:AgentArticleComPhone -->
</td>
</tr>
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Output/HTML/Standard/CustomerTicketZoom.dtl
^
|
@@ -1,8 +1,8 @@
# --
# CustomerTicketZoom.dtl - provides HTML TicketZoom for CustomerTicketZoom.pm
-# Copyright (C) 2001-2009 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: CustomerTicketZoom.dtl,v 1.44.2.3 2009/10/01 14:14:16 ub Exp $
+# $Id: CustomerTicketZoom.dtl,v 1.44.2.4 2012/08/17 09:00:01 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -67,10 +67,10 @@
<!-- dtl:block:Tree -->
<table border="0" width="100%" cellspacing="0" cellpadding="1">
<!-- dtl:block:TreeItem -->
- <tr class="$QData{"SenderType"}-$QData{"ArticleType"}" onmouseover="this.className='highlight';" onmouseout="this.className='$QData{"SenderType"}-$QData{"ArticleType"}';">
+ <tr class="$QData{"SenderType"}-$QData{"ArticleType"}" onmouseover="this.className='highlight';" onmouseout="this.className=' $QData{"SenderType"}-$QData{"ArticleType"}';">
<td class="small">
<div title="$QData{"From","50"}: $QData{"Subject","200"} - $TimeLong{"$QData{"Created"}"}">
- $Data{"Start2"}$Data{"Space"}$Data{"Stop2"}$Data{"Start"}$Data{"Start2"} $QData{"Count"}. $Data{"Stop2"} <a href="$Env{"Baselink"}Action=CustomerTicketZoom&TicketID=$QData{"TicketID"}&ArticleID=$QData{"ArticleID"}#$QData{"ArticleID"}" onmouseover="window.status='$JSText{"$QData{"SenderType"}"} ($Text{"$QData{"ArticleType"}"})'; return true;" onmouseout="window.status='';">$Text{"$QData{"SenderType"}"} ($Text{"$QData{"ArticleType"}"})</a>
+ $Data{"Start2"}$Data{"Space"}$Data{"Stop2"}$Data{"Start"}$Data{"Start2"} $QData{"Count"}. $Data{"Stop2"} <a href="$Env{"Baselink"}Action=CustomerTicketZoom&TicketID=$QData{"TicketID"}&ArticleID=$QData{"ArticleID"}#$QData{"ArticleID"}" onmouseover="window.status='$JSText{"$Data{"SenderType"}"} ($Text{"$Data{"ArticleType"}"})'; return true;" onmouseout="window.status='';">$Text{"$Data{"SenderType"}"} ($Text{"$Data{"ArticleType"}"})</a>
$QData{"From","24"}: $QData{"Subject","30"}$Data{"Stop"}
</div>
</td>
@@ -117,10 +117,10 @@
<td>$QData{"Filename"}</td>
<td>
<!-- dtl:block:ArticleAttachmentRowLink -->
- <a href="$Data{"Link"}" $Data{"Target"} onmouseover="window.status='$JSText{"$QData{"Action"}"}: $QData{"Filename"}';return true;" onmouseout="window.status='';"><img src="$Config{"Frontend::ImagePath"}$QData{"Image"}" border="0" alt="$Text{"$QData{"Action"}"}" title="$Text{"$QData{"Action"}"}"></a>
+ <a href="$Data{"Link"}" $Data{"Target"} onmouseover="window.status='$JSText{"$Data{"Action"}"}: $QData{"Filename"}';return true;" onmouseout="window.status='';"><img src="$Config{"Frontend::ImagePath"}$QData{"Image"}" border="0" alt="$Text{"$Data{"Action"}"}" title="$Text{"$Data{"Action"}"}"></a>
<!-- dtl:block:ArticleAttachmentRowLink -->
<!-- dtl:block:ArticleAttachmentRowNoLink -->
- <img src="$Config{"Frontend::ImagePath"}$QData{"Image"}" border="0" alt="$Text{"$QData{"Action"}"}" title="$Text{"$QData{"Action"}"}">
+ <img src="$Config{"Frontend::ImagePath"}$QData{"Image"}" border="0" alt="$Text{"$Data{"Action"}"}" title="$Text{"$Data{"Action"}"}">
<!-- dtl:block:ArticleAttachmentRowNoLink -->
</td>
<td align="right">$QData{"Filesize"}</td>
@@ -160,7 +160,9 @@
}
//-->
</script>
- <iframe width="100%" frameborder="0" border="0" marginwidth="0" marginheight="0" leftmargin="0" topmargin="0" style="width: 100%;" id="iframe$QData{"ArticleID"}" onload="IframeAutoHeight('iframe$QData{"ArticleID"}');" src="$Env{"Baselink"}Action=CustomerTicketAttachment&Subaction=HTMLView&ArticleID=$QData{"ArticleID"}&FileID=$QData{"AttachmentIDOfHTMLBody"}"></iframe>
+# Use the HTML5 sandbox attribute to prevent plugins and scripts from being executed in the browser.
+# Use IE's (non-standard) security attribute to achieve something similar in older IE browsers. Append session info to URL because IE will not send cookies.
+ <iframe sandbox="allow-same-origin" security="restricted" width="100%" frameborder="0" border="0" marginwidth="0" marginheight="0" leftmargin="0" topmargin="0" style="width: 100%;" id="iframe$QData{"ArticleID"}" onload="IframeAutoHeight('iframe$QData{"ArticleID"}');" src="$Env{"Baselink"}Action=CustomerTicketAttachment&Subaction=HTMLView&ArticleID=$QData{"ArticleID"}&FileID=$QData{"AttachmentIDOfHTMLBody"}&$QEnv{"SessionName"}=$QEnv{"SessionID"}"></iframe>
</div>
<!-- dtl:block:BodyHTML -->
</p>
@@ -312,7 +314,7 @@
# use this if you want to show TicketFreeTime1-6
<!-- dtl:block:TicketFreeTime -->
<tr>
- <td class="contentkey">$Text{"$QData{"TicketFreeTimeKey"}"}:</td>
+ <td class="contentkey">$Text{"$Data{"TicketFreeTimeKey"}"}:</td>
<td class="contentvalue"><div title="$TimeShort{"$QData{"TicketFreeTime"}"}">$TimeShort{"$QData{"TicketFreeTime"}"}</div></td>
</tr>
<!-- dtl:block:TicketFreeTime -->
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Output/HTML/Standard/Error.dtl
^
|
@@ -2,7 +2,7 @@
# Error.dtl - provides HTML Error screen
# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: Error.dtl,v 1.19.2.1 2011/03/16 11:54:44 mg Exp $
+# $Id: Error.dtl,v 1.19.2.2 2011/11/21 08:39:48 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -31,13 +31,13 @@
<form action="http://bugs.otrs.org/enter_bug.cgi">
<input type="hidden" name="comment" value="
Message:
-$Data{"Message"}
+$QData{"Message"}
Comment:
-$Data{"Comment"}
+$QData{"Comment"}
Traceback:
-$Data{"BackendTraceback"}
+$QData{"BackendTraceback"}
"/>
<input type="hidden" name="bug_file_loc" value="$QEnv{"SERVER_NAME"}$QEnv{"REQUEST_URI"}"/>
<input class="button" type="submit" value="$Text{"Click here to report a bug!"}"/>
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/Output/HTML/Standard/Redirect.dtl
^
|
@@ -1,8 +1,8 @@
# --
# Redirect.dtl - provides global HTML redirect header
-# Copyright (C) 2001-2009 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: Redirect.dtl,v 1.11 2009/02/16 11:07:25 tr Exp $
+# $Id: Redirect.dtl,v 1.11.2.1 2011/11/21 08:26:55 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -12,6 +12,6 @@
# http redirect headers
Content-Type: text/html; charset=$Env{"UserCharset"};
Status: 302 Moved
-location: $Data{"Redirect"}
+location: $QData{"Redirect"}
-document <a href="$Data{"Redirect"}">moved</a>
+document <a href="$QData{"Redirect"}">moved</a>
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/System/Auth.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/System/Auth.pm - provides the authentification
-# Copyright (C) 2001-2009 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: Auth.pm,v 1.42 2009/09/03 16:12:13 tr Exp $
+# $Id: Auth.pm,v 1.42.2.2 2011/11/15 10:29:40 des Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -17,7 +17,7 @@
use Kernel::System::Valid;
use vars qw(@ISA $VERSION);
-$VERSION = qw($Revision: 1.42 $) [1];
+$VERSION = qw($Revision: 1.42.2.2 $) [1];
=head1 NAME
@@ -183,14 +183,30 @@
# next on no success
next if !$User;
+ # configured auth sync backend
+ my $AuthSyncBackend = $Self->{ConfigObject}->Get("AuthModule${Count}::UseSyncBackend");
+
+ # sync with configured auth backend
+ if ( defined $AuthSyncBackend ) {
+
+ # if $AuthSyncBackend is defined but empty, don't sync with any backend
+ if ($AuthSyncBackend) {
+
+ # sync configured backend
+ $Self->{$AuthSyncBackend}->Sync( %Param, User => $User );
+ }
+ }
+
# use all 11 sync backends
- for my $Count ( '', 1 .. 10 ) {
+ else {
+ for my $Count ( '', 1 .. 10 ) {
- # return on no config setting
- next if !$Self->{"AuthSyncBackend$Count"};
+ # return on no config setting
+ next if !$Self->{"AuthSyncBackend$Count"};
- # sync backend
- $Self->{"AuthSyncBackend$Count"}->Sync( %Param, User => $User );
+ # sync backend
+ $Self->{"AuthSyncBackend$Count"}->Sync( %Param, User => $User );
+ }
}
# remember auth backend
@@ -290,12 +306,12 @@
This software comes with ABSOLUTELY NO WARRANTY. For details, see
the enclosed file COPYING for license information (AGPL). If you
-did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
+did not receive this file, see L<http://www.gnu.org/licenses/agpl.txt>.
=cut
=head1 VERSION
-$Revision: 1.42 $ $Date: 2009/09/03 16:12:13 $
+$Revision: 1.42.2.2 $ $Date: 2011/11/15 10:29:40 $
=cut
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/System/Email.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/System/Email.pm - the global email send module
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: Email.pm,v 1.64.2.2 2010/04/15 19:49:15 mh Exp $
+# $Id: Email.pm,v 1.64.2.4 2012/05/10 05:54:17 cg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -21,7 +21,7 @@
use Kernel::System::HTMLUtils;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.64.2.2 $) [1];
+$VERSION = qw($Revision: 1.64.2.4 $) [1];
=head1 NAME
@@ -837,12 +837,12 @@
This software comes with ABSOLUTELY NO WARRANTY. For details, see
the enclosed file COPYING for license information (AGPL). If you
-did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
+did not receive this file, see L<http://www.gnu.org/licenses/agpl.txt>.
=cut
=head1 VERSION
-$Revision: 1.64.2.2 $ $Date: 2010/04/15 19:49:15 $
+$Revision: 1.64.2.4 $ $Date: 2012/05/10 05:54:17 $
=cut
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/System/Ticket.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/System/Ticket.pm - all ticket functions
-# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: Ticket.pm,v 1.416.2.15 2011/04/06 09:16:50 mg Exp $
+# $Id: Ticket.pm,v 1.416.2.18 2012/03/09 12:06:28 mh Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -36,7 +36,7 @@
use Kernel::System::HTMLUtils;
use vars qw(@ISA $VERSION);
-$VERSION = qw($Revision: 1.416.2.15 $) [1];
+$VERSION = qw($Revision: 1.416.2.18 $) [1];
=head1 NAME
@@ -439,6 +439,11 @@
$Param{Title} = '';
}
+ # substitute title if needed
+ else {
+ $Param{Title} = substr( $Param{Title}, 0, 255 );
+ }
+
# check database undef/NULL (set value to undef/NULL to prevent database errors)
$Param{ServiceID} ||= undef;
$Param{SLAID} ||= undef;
@@ -7392,6 +7397,7 @@
TicketID => $Param{TicketID},
UserID => $Param{UserID},
);
+ ARTICLEID:
for my $ArticleID (@ArticleIndex) {
# create source object
@@ -7437,11 +7443,11 @@
my $MD5Sum = $Self->{MainObject}->MD5sum(
String => $Attachment{Content},
);
- $MD5Sums{$MD5Sum} = 1;
+ $MD5Sums{$MD5Sum}++;
}
# nothing to transfer
- return 1 if !@Attachments && !$Plain;
+ next ARTICLEID if !@Attachments && !$Plain;
# write target attachments
$Self->{ConfigObject}->Set(
@@ -7462,36 +7468,39 @@
if (%Index) {
$Self->{LogObject}->Log(
Priority => 'error',
- Message => "Attachments already in $Param{Destination}!"
+ Message =>
+ "Attachments of TicketID:$Param{TicketID}/ArticleID:$ArticleID already in $Param{Destination}!"
);
- return 1;
}
+ else {
- # write attachments to destination
- for my $Attachment (@Attachments) {
- $TicketObjectDestination->ArticleWriteAttachment(
- %{$Attachment},
- ArticleID => $ArticleID,
- UserID => $Param{UserID},
- Force => 1,
- );
- }
+ # write attachments to destination
+ for my $Attachment (@Attachments) {
+ $TicketObjectDestination->ArticleWriteAttachment(
+ %{$Attachment},
+ ArticleID => $ArticleID,
+ UserID => $Param{UserID},
+ Force => 1,
+ );
+ }
- # write destination plain
- if ($Plain) {
- $TicketObjectDestination->ArticleWritePlain(
- Email => $Plain,
- ArticleID => $ArticleID,
- UserID => $Param{UserID},
+ # write destination plain
+ if ($Plain) {
+ $TicketObjectDestination->ArticleWritePlain(
+ Email => $Plain,
+ ArticleID => $ArticleID,
+ UserID => $Param{UserID},
+ );
+ }
+
+ # verify destination attachments
+ %Index = $TicketObjectDestination->ArticleAttachmentIndex(
+ ArticleID => $ArticleID,
+ UserID => $Param{UserID},
+ OnlyMyBackend => 1,
);
}
- # verify destination attachments
- %Index = $TicketObjectDestination->ArticleAttachmentIndex(
- ArticleID => $ArticleID,
- UserID => $Param{UserID},
- OnlyMyBackend => 1,
- );
for my $FileID ( keys %Index ) {
my %Attachment = $TicketObjectDestination->ArticleAttachment(
ArticleID => $ArticleID,
@@ -7504,7 +7513,10 @@
String => \$Attachment{Content},
);
if ( $MD5Sums{$MD5Sum} ) {
- delete $MD5Sums{$MD5Sum};
+ $MD5Sums{$MD5Sum}--;
+ if ( !$MD5Sums{$MD5Sum} ) {
+ delete $MD5Sums{$MD5Sum};
+ }
}
else {
$Self->{LogObject}->Log(
@@ -7513,6 +7525,13 @@
"Corrupt file: $Attachment{Filename} (TicketID:$Param{TicketID}/ArticleID:$ArticleID)!",
);
+ # delete corrupt attachments from destination
+ $TicketObjectDestination->ArticleDeleteAttachment(
+ ArticleID => $ArticleID,
+ UserID => 1,
+ OnlyMyBackend => 1,
+ );
+
# set events
$Self->{ConfigObject}->{'Ticket::EventModulePost'} = $EventConfig;
return;
@@ -7527,6 +7546,13 @@
"Not all files are moved! (TicketID:$Param{TicketID}/ArticleID:$ArticleID)!",
);
+ # delete incomplete attachments from destination
+ $TicketObjectDestination->ArticleDeleteAttachment(
+ ArticleID => $ArticleID,
+ UserID => 1,
+ OnlyMyBackend => 1,
+ );
+
# set events
$Self->{ConfigObject}->{'Ticket::EventModulePost'} = $EventConfig;
return;
@@ -7551,6 +7577,13 @@
"Corrupt plain file: ArticleID: $ArticleID ($PlainMD5Sum/$PlainMD5SumVerify)",
);
+ # delete corrupt plain file from destination
+ $TicketObjectDestination->ArticleDeletePlain(
+ ArticleID => $ArticleID,
+ UserID => 1,
+ OnlyMyBackend => 1,
+ );
+
# set events
$Self->{ConfigObject}->{'Ticket::EventModulePost'} = $EventConfig;
return;
@@ -7631,6 +7664,6 @@
=head1 VERSION
-$Revision: 1.416.2.15 $ $Date: 2011/04/06 09:16:50 $
+$Revision: 1.416.2.18 $ $Date: 2012/03/09 12:06:28 $
=cut
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/System/Web/InterfaceAgent.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/System/Web/InterfaceAgent.pm - the agent interface file (incl. auth)
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: InterfaceAgent.pm,v 1.43.2.2 2010/11/25 10:17:49 mg Exp $
+# $Id: InterfaceAgent.pm,v 1.43.2.4 2011/11/21 10:29:25 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -15,7 +15,7 @@
use warnings;
use vars qw($VERSION @INC);
-$VERSION = qw($Revision: 1.43.2.2 $) [1];
+$VERSION = qw($Revision: 1.43.2.4 $) [1];
# all framework needed modules
use Kernel::Config;
@@ -280,12 +280,21 @@
if ( !$Self->{ConfigObject}->Get('SessionUseCookieAfterBrowserClose') ) {
$Expires = '';
}
+
+ my $SecureAttribute;
+ if ( $Self->{ConfigObject}->Get('HttpType') eq 'https' ) {
+
+ # Restrict Cookie to HTTPS if it is used.
+ $SecureAttribute = 1;
+ }
+
my $LayoutObject = Kernel::Output::HTML::Layout->new(
SetCookies => {
SessionIDCookie => $Self->{ParamObject}->SetCookie(
Key => $Param{SessionName},
Value => $NewSessionID,
Expires => $Expires,
+ Secure => scalar $SecureAttribute,
),
},
SessionID => $NewSessionID,
@@ -894,6 +903,6 @@
=head1 VERSION
-$Revision: 1.43.2.2 $ $Date: 2010/11/25 10:17:49 $
+$Revision: 1.43.2.4 $ $Date: 2011/11/21 10:29:25 $
=cut
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/System/Web/InterfaceCustomer.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/System/Web/InterfaceCustomer.pm - the customer interface file (incl. auth)
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: InterfaceCustomer.pm,v 1.41.2.2 2010/11/25 10:17:49 mg Exp $
+# $Id: InterfaceCustomer.pm,v 1.41.2.4 2011/11/21 10:29:25 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -15,7 +15,7 @@
use warnings;
use vars qw($VERSION @INC);
-$VERSION = qw($Revision: 1.41.2.2 $) [1];
+$VERSION = qw($Revision: 1.41.2.4 $) [1];
# all framework needed modules
use Kernel::Config;
@@ -263,12 +263,21 @@
if ( !$Self->{ConfigObject}->Get('SessionUseCookieAfterBrowserClose') ) {
$Expires = '';
}
+
+ my $SecureAttribute;
+ if ( $Self->{ConfigObject}->Get('HttpType') eq 'https' ) {
+
+ # Restrict Cookie to HTTPS if it is used.
+ $SecureAttribute = 1;
+ }
+
my $LayoutObject = Kernel::Output::HTML::Layout->new(
SetCookies => {
SessionIDCookie => $Self->{ParamObject}->SetCookie(
Key => $Param{SessionName},
Value => $NewSessionID,
Expires => $Expires,
+ Secure => scalar $SecureAttribute,
),
},
SessionID => $NewSessionID,
@@ -923,6 +932,6 @@
=head1 VERSION
-$Revision: 1.41.2.2 $ $Date: 2010/11/25 10:17:49 $
+$Revision: 1.41.2.4 $ $Date: 2011/11/21 10:29:25 $
=cut
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/Kernel/System/Web/Request.pm
^
|
@@ -1,8 +1,8 @@
# --
# Kernel/System/Web/Request.pm - a wrapper for CGI.pm or Apache::Request.pm
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: Request.pm,v 1.31.2.1 2010/01/04 13:13:44 mn Exp $
+# $Id: Request.pm,v 1.31.2.3 2011/11/21 10:21:02 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -17,7 +17,7 @@
use Kernel::System::CheckItem;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.31.2.1 $) [1];
+$VERSION = qw($Revision: 1.31.2.3 $) [1];
=head1 NAME
@@ -81,8 +81,8 @@
# Simple Common Gateway Interface Class
use CGI qw(:cgi);
- # to get the errors on screen
- use CGI::Carp qw(fatalsToBrowser);
+ # send errors to web server error log
+ use CGI::Carp;
# max 5 MB posts
$CGI::POST_MAX = $Self->{ConfigObject}->Get('WebMaxFileUpload') || 1024 * 1024 * 5;
@@ -307,8 +307,10 @@
set a cookie
$ParamObject->SetCookie(
- Key => ID,
- Value => 123456,
+ Key => ID,
+ Value => 123456,
+ Expires => '+3660s',
+ Secure => 1, # optional, set secure attribute to disable cookie on HTTP (HTTPS only)
);
=cut
@@ -320,6 +322,7 @@
-name => $Param{Key},
-value => $Param{Value},
-expires => $Param{Expires},
+ -secure => $Param{Secure},
);
}
@@ -349,12 +352,12 @@
This software comes with ABSOLUTELY NO WARRANTY. For details, see
the enclosed file COPYING for license information (AGPL). If you
-did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
+did not receive this file, see L<http://www.gnu.org/licenses/agpl.txt>.
=cut
=head1 VERSION
-$Revision: 1.31.2.1 $ $Date: 2010/01/04 13:13:44 $
+$Revision: 1.31.2.3 $ $Date: 2011/11/21 10:21:02 $
=cut
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/RELEASE
^
|
@@ -1,4 +1,4 @@
PRODUCT = OTRS
-VERSION = 2.4.11
-BUILDDATE = Fri Jul 29 15:45:14 CEST 2011
-BUILDHOST = lusen.otrs.org
+VERSION = 2.4.14
+BUILDDATE = Tue Aug 28 10:42:22 CEST 2012
+BUILDHOST = otrsbuild.otrs.com
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/UPGRADING
^
|
@@ -1,8 +1,8 @@
# --
# UPGRADING - upgrading OTRS
-# Copyright (C) 2001-2009 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: UPGRADING,v 1.37 2009/08/28 14:52:26 mb Exp $
+# $Id: UPGRADING,v 1.37.2.1 2011/10/24 08:51:29 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -119,7 +119,13 @@
shell> /etc/init.d/cron start
-12) Well done!
+12) Check installed packages
+ ------------------------
+ In the package manager, check if all packages are still marked as
+ correctly installed or if any require reinstallation or even a package upgrade.
+
+
+13) Well done!
----------
Log in as 'root@localhost' and select Admin -> SysConfig to make
sure that OTRS updates the configuration files.
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/bin/cgi-bin/rpc.pl
^
|
@@ -1,9 +1,9 @@
#!/usr/bin/perl -w
# --
# bin/cgi-bin/rpc.pl - soap handle
-# Copyright (C) 2001-2009 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: rpc.pl,v 1.14 2009/06/29 21:25:56 martin Exp $
+# $Id: rpc.pl,v 1.14.2.2 2011/10/21 09:16:53 des Exp $
# --
# 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
@@ -45,7 +45,7 @@
use Kernel::System::LinkObject;
use vars qw($VERSION);
-$VERSION = qw($Revision: 1.14 $) [1];
+$VERSION = qw($Revision: 1.14.2.2 $) [1];
SOAP::Transport::HTTP::CGI->dispatch_to('Core')->handle;
@@ -120,4 +120,100 @@
return $CommonObject{$Object}->$Method(%Param);
}
+=item DispatchMultipleTicketMethods()
+
+to dispatch multiple ticket methods and get the TicketID
+
+ my $TicketID = $RPC->DispatchMultipleTicketMethods(
+ $SOAP_User,
+ $SOAP_Pass,
+ 'TicketObject',
+ [ { Method => 'TicketCreate', Parameter => \%TicketData }, { Method => 'ArticleCreate', Parameter => \%ArticleData } ],
+ );
+
+=cut
+
+sub DispatchMultipleTicketMethods {
+ my ( $Self, $User, $Pw, $Object, $MethodParamArrayRef ) = @_;
+
+ $User ||= '';
+ $Pw ||= '';
+
+ # common objects
+ my %CommonObject = ();
+ $CommonObject{ConfigObject} = Kernel::Config->new();
+ $CommonObject{EncodeObject} = Kernel::System::Encode->new(%CommonObject);
+ $CommonObject{LogObject} = Kernel::System::Log->new(
+ LogPrefix => 'OTRS-RPC',
+ %CommonObject,
+ );
+ $CommonObject{MainObject} = Kernel::System::Main->new(%CommonObject);
+ $CommonObject{DBObject} = Kernel::System::DB->new(%CommonObject);
+ $CommonObject{PIDObject} = Kernel::System::PID->new(%CommonObject);
+ $CommonObject{TimeObject} = Kernel::System::Time->new(%CommonObject);
+ $CommonObject{UserObject} = Kernel::System::User->new(%CommonObject);
+ $CommonObject{GroupObject} = Kernel::System::Group->new(%CommonObject);
+ $CommonObject{QueueObject} = Kernel::System::Queue->new(%CommonObject);
+ $CommonObject{CustomerUserObject} = Kernel::System::CustomerUser->new(%CommonObject);
+ $CommonObject{TicketObject} = Kernel::System::Ticket->new(%CommonObject);
+ $CommonObject{LinkObject} = Kernel::System::LinkObject->new(%CommonObject);
+
+ my $RequiredUser = $CommonObject{ConfigObject}->Get('SOAP::User');
+ my $RequiredPassword = $CommonObject{ConfigObject}->Get('SOAP::Password');
+
+ if (
+ !defined $RequiredUser
+ || !length $RequiredUser
+ || !defined $RequiredPassword || !length $RequiredPassword
+ )
+ {
+ $CommonObject{LogObject}->Log(
+ Priority => 'notice',
+ Message => "SOAP::User or SOAP::Password is empty, SOAP access denied!",
+ );
+ return;
+ }
+
+ if ( $User ne $RequiredUser || $Pw ne $RequiredPassword ) {
+ $CommonObject{LogObject}->Log(
+ Priority => 'notice',
+ Message => "Auth for user $User (pw $Pw) failed!",
+ );
+ return;
+ }
+
+ if ( !$CommonObject{$Object} ) {
+ $CommonObject{LogObject}->Log(
+ Priority => 'error',
+ Message => "No such Object $Object!",
+ );
+ return "No such Object $Object!";
+ }
+
+ my $TicketID;
+ my $Counter;
+
+ for my $MethodParamEntry ( @{$MethodParamArrayRef} ) {
+
+ my $Method = $MethodParamEntry->{Method};
+ my %Parameter = %{ $MethodParamEntry->{Parameter} };
+
+ # push ticket id to params if there is no ticket id
+ if ( !$Parameter{TicketID} && $TicketID ) {
+ $Parameter{TicketID} = $TicketID;
+ }
+
+ my $ReturnValue = $CommonObject{$Object}->$Method(%Parameter);
+
+ # remember ticket id if method was TicketCreate
+ if ( !$Counter && $Object eq 'TicketObject' && $Method eq 'TicketCreate' ) {
+ $TicketID = $ReturnValue;
+ }
+
+ $Counter++;
+ }
+
+ return $TicketID;
+}
+
1;
|
|
Changed |
otrs-2.4.14.tar.bz2/doc/manual/de/otrs_admin_book.pdf
^
|
|
Changed |
otrs-2.4.14.tar.bz2/doc/manual/en/otrs_admin_book.pdf
^
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/DBUpdate-to-2.4.db2.sql
^
|
@@ -1,5 +1,5 @@
-- ----------------------------------------------------------
--- driver: db2, generated: 2011-05-19 10:40:51
+-- driver: db2, generated: 2009-07-13 14:35:40
-- ----------------------------------------------------------
-- ----------------------------------------------------------
-- create table notification_event
@@ -179,22 +179,6 @@
-- ----------------------------------------------------------
ALTER TABLE web_upload_cache ADD content_id VARCHAR (250);
--- ----------------------------------------------------------
--- create table smime_signer_cert_relations
--- ----------------------------------------------------------
-CREATE TABLE smime_signer_cert_relations (
- id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
- cert_hash VARCHAR (8) NOT NULL,
- cert_fingerprint VARCHAR (59) NOT NULL,
- ca_hash VARCHAR (8) NOT NULL,
- ca_fingerprint VARCHAR (59) NOT NULL,
- create_time TIMESTAMP NOT NULL,
- create_by INTEGER NOT NULL,
- change_time TIMESTAMP NOT NULL,
- change_by INTEGER NOT NULL,
- PRIMARY KEY(id)
-);
-
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_create_by_id FOREIGN KEY (create_by) REFERENCES users (id);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_change_by_id FOREIGN KEY (change_by) REFERENCES users (id);
@@ -206,7 +190,3 @@
ALTER TABLE service_preferences ADD CONSTRAINT FK_service_preferences_service_id_id FOREIGN KEY (service_id) REFERENCES service (id);
ALTER TABLE sla_preferences ADD CONSTRAINT FK_sla_preferences_sla_id_id FOREIGN KEY (sla_id) REFERENCES sla (id);
-
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT FK_smime_signer_cert_relations_create_by_id FOREIGN KEY (create_by) REFERENCES users (id);
-
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT FK_smime_signer_cert_relations_change_by_id FOREIGN KEY (change_by) REFERENCES users (id);
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/DBUpdate-to-2.4.ingres.sql
^
|
@@ -1,9 +1,9 @@
-- ----------------------------------------------------------
--- driver: ingres, generated: 2011-05-19 10:40:58
+-- driver: ingres, generated: 2009-07-13 14:35:40
-- ----------------------------------------------------------
-CREATE SEQUENCE notification_event_125;\g
+CREATE SEQUENCE notification_event_231;\g
CREATE TABLE notification_event (
- id INTEGER NOT NULL DEFAULT notification_event_125.NEXTVAL,
+ id INTEGER NOT NULL DEFAULT notification_event_231.NEXTVAL,
name VARCHAR(200) NOT NULL,
subject VARCHAR(200) NOT NULL,
text VARCHAR(4000) NOT NULL,
@@ -121,25 +121,9 @@
-- alter table web_upload_cache
-- ----------------------------------------------------------
ALTER TABLE web_upload_cache ADD COLUMN content_id VARCHAR(250);\g
-CREATE SEQUENCE smime_signer_cert_relations_106;\g
-CREATE TABLE smime_signer_cert_relations (
- id INTEGER NOT NULL DEFAULT smime_signer_cert_relations_106.NEXTVAL,
- cert_hash VARCHAR(8) NOT NULL,
- cert_fingerprint VARCHAR(59) NOT NULL,
- ca_hash VARCHAR(8) NOT NULL,
- ca_fingerprint VARCHAR(59) NOT NULL,
- create_time TIMESTAMP NOT NULL,
- create_by INTEGER NOT NULL,
- change_time TIMESTAMP NOT NULL,
- change_by INTEGER NOT NULL
-);\g
-MODIFY smime_signer_cert_relations TO btree unique ON id WITH unique_scope = statement;\g
-ALTER TABLE smime_signer_cert_relations ADD PRIMARY KEY ( id ) WITH index = base table structure;\g
ALTER TABLE notification_event ADD FOREIGN KEY (create_by) REFERENCES users(id);\g
ALTER TABLE notification_event ADD FOREIGN KEY (change_by) REFERENCES users(id);\g
ALTER TABLE notification_event ADD FOREIGN KEY (valid_id) REFERENCES valid(id);\g
ALTER TABLE notification_event_item ADD FOREIGN KEY (notification_id) REFERENCES notification_event(id);\g
ALTER TABLE service_preferences ADD FOREIGN KEY (service_id) REFERENCES service(id);\g
ALTER TABLE sla_preferences ADD FOREIGN KEY (sla_id) REFERENCES sla(id);\g
-ALTER TABLE smime_signer_cert_relations ADD FOREIGN KEY (create_by) REFERENCES users(id);\g
-ALTER TABLE smime_signer_cert_relations ADD FOREIGN KEY (change_by) REFERENCES users(id);\g
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/DBUpdate-to-2.4.mssql.sql
^
|
@@ -1,5 +1,5 @@
-- ----------------------------------------------------------
--- driver: mssql, generated: 2011-05-19 10:41:02
+-- driver: mssql, generated: 2009-07-13 14:35:40
-- ----------------------------------------------------------
-- ----------------------------------------------------------
-- create table notification_event
@@ -136,26 +136,9 @@
-- alter table web_upload_cache
-- ----------------------------------------------------------
ALTER TABLE web_upload_cache ADD content_id VARCHAR (250) NULL;
--- ----------------------------------------------------------
--- create table smime_signer_cert_relations
--- ----------------------------------------------------------
-CREATE TABLE smime_signer_cert_relations (
- id INTEGER NOT NULL IDENTITY(1,1) ,
- cert_hash VARCHAR (8) NOT NULL,
- cert_fingerprint VARCHAR (59) NOT NULL,
- ca_hash VARCHAR (8) NOT NULL,
- ca_fingerprint VARCHAR (59) NOT NULL,
- create_time DATETIME NOT NULL,
- create_by INTEGER NOT NULL,
- change_time DATETIME NOT NULL,
- change_by INTEGER NOT NULL,
- PRIMARY KEY(id)
-);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_create_by_id FOREIGN KEY (create_by) REFERENCES users (id);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_change_by_id FOREIGN KEY (change_by) REFERENCES users (id);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_valid_id_id FOREIGN KEY (valid_id) REFERENCES valid (id);
ALTER TABLE notification_event_item ADD CONSTRAINT FK_notification_event_item_notification_id_id FOREIGN KEY (notification_id) REFERENCES notification_event (id);
ALTER TABLE service_preferences ADD CONSTRAINT FK_service_preferences_service_id_id FOREIGN KEY (service_id) REFERENCES service (id);
ALTER TABLE sla_preferences ADD CONSTRAINT FK_sla_preferences_sla_id_id FOREIGN KEY (sla_id) REFERENCES sla (id);
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT FK_smime_signer_cert_relations_create_by_id FOREIGN KEY (create_by) REFERENCES users (id);
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT FK_smime_signer_cert_relations_change_by_id FOREIGN KEY (change_by) REFERENCES users (id);
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/DBUpdate-to-2.4.mysql.sql
^
|
@@ -1,5 +1,5 @@
# ----------------------------------------------------------
-# driver: mysql, generated: 2011-05-19 10:41:06
+# driver: mysql, generated: 2009-07-13 14:35:40
# ----------------------------------------------------------
# ----------------------------------------------------------
# create table notification_event
@@ -136,26 +136,9 @@
# alter table web_upload_cache
# ----------------------------------------------------------
ALTER TABLE web_upload_cache ADD content_id VARCHAR (250) NULL;
-# ----------------------------------------------------------
-# create table smime_signer_cert_relations
-# ----------------------------------------------------------
-CREATE TABLE smime_signer_cert_relations (
- id INTEGER NOT NULL AUTO_INCREMENT,
- cert_hash VARCHAR (8) NOT NULL,
- cert_fingerprint VARCHAR (59) NOT NULL,
- ca_hash VARCHAR (8) NOT NULL,
- ca_fingerprint VARCHAR (59) NOT NULL,
- create_time DATETIME NOT NULL,
- create_by INTEGER NOT NULL,
- change_time DATETIME NOT NULL,
- change_by INTEGER NOT NULL,
- PRIMARY KEY(id)
-);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_create_by_id FOREIGN KEY (create_by) REFERENCES users (id);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_change_by_id FOREIGN KEY (change_by) REFERENCES users (id);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_valid_id_id FOREIGN KEY (valid_id) REFERENCES valid (id);
ALTER TABLE notification_event_item ADD CONSTRAINT FK_notification_event_item_notification_id_id FOREIGN KEY (notification_id) REFERENCES notification_event (id);
ALTER TABLE service_preferences ADD CONSTRAINT FK_service_preferences_service_id_id FOREIGN KEY (service_id) REFERENCES service (id);
ALTER TABLE sla_preferences ADD CONSTRAINT FK_sla_preferences_sla_id_id FOREIGN KEY (sla_id) REFERENCES sla (id);
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT FK_smime_signer_cert_relations_create_by_id FOREIGN KEY (create_by) REFERENCES users (id);
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT FK_smime_signer_cert_relations_change_by_id FOREIGN KEY (change_by) REFERENCES users (id);
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/DBUpdate-to-2.4.oracle.sql
^
|
@@ -1,5 +1,5 @@
-- ----------------------------------------------------------
--- driver: oracle, generated: 2011-05-19 10:41:10
+-- driver: oracle, generated: 2009-07-13 14:35:40
-- ----------------------------------------------------------
SET DEFINE OFF;
-- ----------------------------------------------------------
@@ -146,37 +146,6 @@
-- alter table web_upload_cache
-- ----------------------------------------------------------
ALTER TABLE web_upload_cache ADD content_id VARCHAR2 (250) NULL;
--- ----------------------------------------------------------
--- create table smime_signer_cert_relations
--- ----------------------------------------------------------
-CREATE TABLE smime_signer_cert_relations (
- id NUMBER (12, 0) NOT NULL,
- cert_hash VARCHAR2 (8) NOT NULL,
- cert_fingerprint VARCHAR2 (59) NOT NULL,
- ca_hash VARCHAR2 (8) NOT NULL,
- ca_fingerprint VARCHAR2 (59) NOT NULL,
- create_time DATE NOT NULL,
- create_by NUMBER (12, 0) NOT NULL,
- change_time DATE NOT NULL,
- change_by NUMBER (12, 0) NOT NULL
-);
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT PK_smime_signer_cert_relations PRIMARY KEY (id);
-DROP SEQUENCE SE_smime_signer_cert_relatef;
-CREATE SEQUENCE SE_smime_signer_cert_relatef;
-CREATE OR REPLACE TRIGGER SE_smime_signer_cert_relatef_t
-before insert on smime_signer_cert_relations
-for each row
-begin
- if :new.id IS NULL then
- select SE_smime_signer_cert_relatef.nextval
- into :new.id
- from dual;
- end if;
-end;
-/
---;
-CREATE INDEX FK_smime_signer_cert_relatiob7 ON smime_signer_cert_relations (change_by);
-CREATE INDEX FK_smime_signer_cert_relatiobb ON smime_signer_cert_relations (create_by);
SET DEFINE OFF;
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_create23 FOREIGN KEY (create_by) REFERENCES users (id);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_changefb FOREIGN KEY (change_by) REFERENCES users (id);
@@ -184,5 +153,3 @@
ALTER TABLE notification_event_item ADD CONSTRAINT FK_notification_event_item_nf6 FOREIGN KEY (notification_id) REFERENCES notification_event (id);
ALTER TABLE service_preferences ADD CONSTRAINT FK_service_preferences_servi62 FOREIGN KEY (service_id) REFERENCES service (id);
ALTER TABLE sla_preferences ADD CONSTRAINT FK_sla_preferences_sla_id_id FOREIGN KEY (sla_id) REFERENCES sla (id);
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT FK_smime_signer_cert_relatio60 FOREIGN KEY (create_by) REFERENCES users (id);
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT FK_smime_signer_cert_relatio77 FOREIGN KEY (change_by) REFERENCES users (id);
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/DBUpdate-to-2.4.postgresql.sql
^
|
@@ -1,5 +1,5 @@
-- ----------------------------------------------------------
--- driver: postgresql, generated: 2011-05-19 10:41:14
+-- driver: postgresql, generated: 2009-07-13 14:35:40
-- ----------------------------------------------------------
-- ----------------------------------------------------------
-- create table notification_event
@@ -136,26 +136,9 @@
-- alter table web_upload_cache
-- ----------------------------------------------------------
ALTER TABLE web_upload_cache ADD content_id VARCHAR (250) NULL;
--- ----------------------------------------------------------
--- create table smime_signer_cert_relations
--- ----------------------------------------------------------
-CREATE TABLE smime_signer_cert_relations (
- id serial NOT NULL,
- cert_hash VARCHAR (8) NOT NULL,
- cert_fingerprint VARCHAR (59) NOT NULL,
- ca_hash VARCHAR (8) NOT NULL,
- ca_fingerprint VARCHAR (59) NOT NULL,
- create_time timestamp(0) NOT NULL,
- create_by INTEGER NOT NULL,
- change_time timestamp(0) NOT NULL,
- change_by INTEGER NOT NULL,
- PRIMARY KEY(id)
-);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_create_by_id FOREIGN KEY (create_by) REFERENCES users (id);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_change_by_id FOREIGN KEY (change_by) REFERENCES users (id);
ALTER TABLE notification_event ADD CONSTRAINT FK_notification_event_valid_id_id FOREIGN KEY (valid_id) REFERENCES valid (id);
ALTER TABLE notification_event_item ADD CONSTRAINT FK_notification_event_item_notification_id_id FOREIGN KEY (notification_id) REFERENCES notification_event (id);
ALTER TABLE service_preferences ADD CONSTRAINT FK_service_preferences_service_id_id FOREIGN KEY (service_id) REFERENCES service (id);
ALTER TABLE sla_preferences ADD CONSTRAINT FK_sla_preferences_sla_id_id FOREIGN KEY (sla_id) REFERENCES sla (id);
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT FK_smime_signer_cert_relations_create_by_id FOREIGN KEY (create_by) REFERENCES users (id);
-ALTER TABLE smime_signer_cert_relations ADD CONSTRAINT FK_smime_signer_cert_relations_change_by_id FOREIGN KEY (change_by) REFERENCES users (id);
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/auto_build.sh
^
|
@@ -3,7 +3,7 @@
# auto_build.sh - build automatically OTRS tar, rpm and src-rpm
# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: auto_build.sh,v 1.61.2.10 2011/07/28 12:47:12 mb Exp $
+# $Id: auto_build.sh,v 1.61.2.16 2011/12/19 16:22:26 cg Exp $
# --
# 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
@@ -21,7 +21,7 @@
# or see http://www.gnu.org/licenses/agpl.txt.
# --
-echo "auto_build.sh - build automatically OTRS tar, rpm and src-rpm <\$Revision: 1.61.2.10 $>"
+echo "auto_build.sh - build automatically OTRS tar, rpm and src-rpm <\$Revision: 1.61.2.16 $>"
echo "Copyright (C) 2001-2011 OTRS AG, http://otrs.org/\n";
PATH_TO_CVS_SRC=$1
@@ -36,10 +36,13 @@
PACKAGE_BUILD_DIR="/tmp/$PACKAGE-build"
PACKAGE_DEST_DIR="/tmp/$PACKAGE-packages"
PACKAGE_TMP_SPEC="/tmp/$PACKAGE.spec"
-#RPM_BUILD="rpmbuild"
-RPM_BUILD="rpm"
-SUPPORT_PACKAGE="http://ftp.otrs.org/pub/otrs/packages/Support-1.1.3.opm"
+RPM_BUILD="rpmbuild"
+#RPM_BUILD="rpm"
+
+SUPPORT_PACKAGE="http://ftp.otrs.org/pub/otrs/packages/Support-1.1.4.opm"
IPHONE_PACKAGE="http://ftp.otrs.org/pub/otrs/packages/iPhoneHandle-0.9.7.opm"
+MANUAL_EN="http://ftp.otrs.org/pub/otrs/doc/doc-admin/2.4/en/pdf/otrs_admin_book.pdf"
+MANUAL_DE="http://ftp.otrs.org/pub/otrs/doc/doc-admin/2.4/de/pdf/otrs_admin_book.pdf"
if ! test $PATH_TO_CVS_SRC || ! test $VERSION || ! test $RELEASE; then
# --
@@ -189,10 +192,14 @@
rm -rf Kernel/cpan-lib/CGI.pm
rm -rf Kernel/cpan-lib/CGI/
-# build html docu
-#$PATH_TO_CVS_SRC/scripts/auto_docbuild.sh $PATH_TO_CVS_SRC/../doc/ > /dev/null
-mkdir doc/manual
-cp -R /tmp/OTRSDOC-package/* doc/manual/
+# include pdf docs
+mkdir -p doc/manual/en
+wget "$MANUAL_EN" || exit 1;
+mv otrs_admin_book.pdf doc/manual/en
+
+mkdir -p doc/manual/de
+wget "$MANUAL_DE" || exit 1;
+mv otrs_admin_book.pdf doc/manual/de
# mk ARCHIVE
bin/CheckSum.pl -a create
@@ -210,6 +217,8 @@
# --
cd $PACKAGE_BUILD_DIR/ || exit 1;
SOURCE_LOCATION=$SYSTEM_SOURCE_DIR/$PACKAGE-$VERSION.tar.gz
+rm $SOURCE_LOCATION
+echo "Building tar.gz..."
tar -czf $SOURCE_LOCATION $ARCHIVE_DIR/ || exit 1;
cp $SOURCE_LOCATION $PACKAGE_DEST_DIR/
@@ -218,16 +227,20 @@
# --
cd $PACKAGE_BUILD_DIR/ || exit 1;
SOURCE_LOCATION=$SYSTEM_SOURCE_DIR/$PACKAGE-$VERSION.tar.bz2
+rm $SOURCE_LOCATION
+echo "Building tar.bz2..."
tar -cjf $SOURCE_LOCATION $ARCHIVE_DIR/ || exit 1;
cp $SOURCE_LOCATION $PACKAGE_DEST_DIR/
# --
# create zip
# --
-#cd $PACKAGE_BUILD_DIR/ || exit 1;
-#SOURCE_LOCATION=$SYSTEM_SOURCE_DIR/$PACKAGE-$VERSION.zip
-#zip -r $SOURCE_LOCATION $ARCHIVE_DIR/ || exit 1;
-#cp $SOURCE_LOCATION $PACKAGE_DEST_DIR/
+cd $PACKAGE_BUILD_DIR/ || exit 1;
+SOURCE_LOCATION=$SYSTEM_SOURCE_DIR/$PACKAGE-$VERSION.zip
+rm $SOURCE_LOCATION
+echo "Building zip..."
+zip -r $SOURCE_LOCATION $ARCHIVE_DIR/ || exit 1;
+cp $SOURCE_LOCATION $PACKAGE_DEST_DIR/
# --
# create rpm spec files
@@ -331,21 +344,6 @@
mv $SYSTEM_SRPM_DIR/$PACKAGE*$VERSION*$RELEASE*.src.rpm $PACKAGE_DEST_DIR/SRPMS/suse/8.x/
# --
-# build SuSE 7.3 rpm
-# --
-specfile=$PACKAGE_TMP_SPEC
-cat $ARCHIVE_DIR/scripts/suse-otrs-7.3.spec | sed "s/^Version:.*/Version: $VERSION/" | sed "s/^Release:.*/Release: $RELEASE/" > $specfile.tmp
-# replace sourced files
-perl -e "open(SPEC, '< $specfile.tmp');while(<SPEC>){\$spec.=\$_;};open(IN, '< $FILES');while(<IN>){\$i.=\$_;}\$spec=~s/<FILES>/\$i/g;print \$spec;" > $specfile.tmp1
-# replace package description
-perl -e "open(SPEC, '< $specfile.tmp1');while(<SPEC>){\$spec.=\$_;};open(IN, '< $DESCRIPTION');while(<IN>){\$i.=\$_;}\$spec=~s/<DESCRIPTION>/\$i/g;print \$spec;" > $specfile
-$RPM_BUILD -ba --clean $specfile || exit 1;
-rm $specfile || exit 1;
-
-mv $SYSTEM_RPM_DIR/*/$PACKAGE*$VERSION*$RELEASE*.rpm $PACKAGE_DEST_DIR/RPMS/suse/7.3/
-mv $SYSTEM_SRPM_DIR/$PACKAGE*$VERSION*$RELEASE*.src.rpm $PACKAGE_DEST_DIR/SRPMS/suse/7.3/
-
-# --
# build Redhat 7.3 rpm
# --
cp $ARCHIVE_DIR/scripts/redhat-rpmmacros ~/.rpmmacros || exit 1
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/auto_build/files.txt
^
|
@@ -1,7 +1,6 @@
%config(noreplace) /opt/otrs/Kernel/Config.pm
%config(noreplace) /opt/otrs/Kernel/Config/GenericAgent.pm
-%config(noreplace) /opt/otrs/var/log/TicketCounter.log
%config(noreplace) /opt/otrs/.procmailrc
%config(noreplace) /opt/otrs/.fetchmailrc
%config(noreplace) /opt/otrs/.mailfilter
@@ -39,6 +38,7 @@
%dir /opt/otrs/var/packages/*.opm
%dir /opt/otrs/var/article/
/opt/otrs/var/httpd/
+/opt/otrs/var/fonts/
%dir /opt/otrs/var/log/
%dir /opt/otrs/var/sessions/
%dir /opt/otrs/var/spool/
@@ -47,7 +47,6 @@
%dir /opt/otrs/var/stats/
/opt/otrs/var/stats/*.xml
%dir /opt/otrs/var/tmp/Cache
-%dir /opt/otrs/var/pics/stats/
/opt/otrs/Kernel/cpan-lib*
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/test/HTMLUtils.t
^
|
@@ -2,7 +2,7 @@
# HTMLUtils.t - HTMLUtils tests
# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: HTMLUtils.t,v 1.13.2.10 2011/01/04 16:08:01 mg Exp $
+# $Id: HTMLUtils.t,v 1.13.2.11 2011/09/20 12:21:37 mh Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -711,7 +711,7 @@
my $EndSeconds = $Self->{TimeObject}->SystemTime();
$Self->True(
- ( $EndSeconds - $StartSeconds ) < 5,
+ ( $EndSeconds - $StartSeconds ) < 10,
'LinkQuote - Performance on large data set',
);
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/test/Layout.t
^
|
@@ -1,8 +1,8 @@
# --
# scripts/test/Layout.t - layout module testscript
-# Copyright (C) 2001-2009 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: Layout.t,v 1.26.2.2 2009/12/08 14:35:33 martin Exp $
+# $Id: Layout.t,v 1.26.2.3 2011/08/09 16:17:00 te Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -753,6 +753,13 @@
Result =>
"<img width=\"343\" height=\"563\" alt=\"\"\nsrc=\"cid:inline244217.547683276.1255961382.1012148.29113074\@vo7.vo.otrs.com\" />",
},
+ {
+ Name => '_RichTextReplaceLinkOfInlineContent() - generated it self',
+ String =>
+ '<img width="140" vspace="10" hspace="1" height="38" border="0" alt="AltText" src="http://www.otrs.com/fileadmin/templates/skins/skin_otrs/css/images/logo.gif" /> This text should be displayed <img width="400" height="81" border="0" alt="Description: cid:image001.jpg@01CC3AFE.F81F0B30" src="/otrs/index.pl?Action=PictureUpload&FormID=1311080525.12118416.3676164&ContentID=image001.jpg@01CC4216.1E22E9A0" id="Picture_x0020_1" />',
+ Result =>
+ '<img width="140" vspace="10" hspace="1" height="38" border="0" alt="AltText" src="http://www.otrs.com/fileadmin/templates/skins/skin_otrs/css/images/logo.gif" /> This text should be displayed <img width="400" height="81" border="0" alt="Description: cid:image001.jpg@01CC3AFE.F81F0B30" src="cid:image001.jpg@01CC4216.1E22E9A0" id="Picture_x0020_1" />',
+ },
);
for my $Test (@Tests) {
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/test/SMIME.t
^
|
@@ -1,8 +1,8 @@
# --
# SMIME.t - SMIME tests
-# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2012 OTRS AG, http://otrs.org/
# --
-# $Id: SMIME.t,v 1.7.2.4 2011/05/19 21:28:01 dz Exp $
+# $Id: SMIME.t,v 1.7.2.5 2012/05/08 13:53:34 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -62,81 +62,92 @@
my %Check = (
1 => {
Modulus =>
- 'B5D12B210C8EF3E6B404162157022CEFF46AF6519571F985C116A3CF096B5BD9DBE306CA6683221F08858C8BA1422F934916FE29EF89DA1F1DD55AA47443F796CB882843E16CB4F722F8038768B6FDCE8F4ADEC5E81DB46F9B300A765737B698FC0B7D1E57410BCF810E4B3B4F74FD5C805378879E8C23CD5CB6A0A160AE42E9',
- EndDate => 'Mar 29 11:20:56 2012 GMT',
+ 'B686AD697981A5A387792F3F301062EF520F6966AE21421995C1AB63BF4AB974D250E8764F9B341364B0842FA59C9FFECCB0243ABF802FAF28DFDCE3C2315FC74D6BA81F09AB5F333A0EDAFFDDCB941792F4C0E57AC0413E205E89D4E61D39B0F144FAF3E7064FD97131DC1E723044E4B0DEAA17E83C0B0697C1BB65B11D997C6A3EAB148FFAB3ECF60CB9E17BE0DABAE087F488BCA29C14D597DE024F1A0EBA6F435EFA03B1EBCBBB5D1107CBBD72CC8B0202AE76BEA0672B24A75C82031BC2DE9B82CDC25316F7DDEC9D32BF9C4FF2858424AA371D2E96F71170AAB3167ED9FA5A2C525C53B8ECE725034339DC3DAC32D3840D1D3ACFB42DB67C9817142019',
Subject =>
' C= DE ST= Bayern L= Straubing O= OTRS AG CN= unittest emailAddress= unittest@example.org',
- Hash => '980a83c7',
- Private => 'No',
- Serial => 'serial=D51FC7523893BCFD',
- ShortEndDate => '2012-03-29',
- Type => 'cert',
- Fingerprint => 'E1:FB:F1:3E:6B:83:9F:C3:29:8A:3E:C3:19:51:33:1C:73:7F:2C:0B',
+ Hash => '980a83c7',
+ Private => 'No',
+ Serial => 'serial=F20143205EFC76E9',
+ Type => 'cert',
+ Fingerprint => 'E9:F9:8D:54:74:35:E6:AC:9F:81:E5:D5:82:0E:6C:27:B2:B0:D4:18',
Issuer =>
'issuer= /C= DE/ST= Bayern/L= Straubing/O= OTRS AG/CN= unittest/emailAddress= unittest@example.org',
Email => 'unittest@example.org',
- StartDate => 'Feb 19 11:20:56 2008 GMT',
- ShortStartDate => '2008-02-19',
+ ShortEndDate => '2026-01-15',
+ EndDate => 'Jan 15 13:11:32 2026 GMT',
+ StartDate => 'May 8 13:11:32 2012 GMT',
+ ShortStartDate => '2012-05-08',
},
2 => {
Modulus =>
- 'C37422BAB1D6CDE930ED44E79C4D3BD3BECBD4E391FB80C3FC74B639A926D670FDDF6A75EBC304E42FD83311C64356C3DF4E468484CF0A71CAACA333BB99B1ACF418B72020A4D44FA28DF97F0DC2E8D64A0926673FBAC1F29A669E6F3776601CC27937A3212228856CAB9396923B60998198FFD2BB10E8667C02C66F11BA5787',
- EndDate => 'Mar 29 11:32:20 2012 GMT',
+ 'CFAF52AC9AD837F66289E6BAB9BBF96BD3173FE26EA06E72939E921528AFA6197C1FF941BEBEE1FD424353E725531A5521BA8BE7A796C0668E3FBFBEC9926D6B972E0513EDF12A81299328B62C132BB63D0B3942A2A194DE46814E84E2E959437DC5FC36F2F51E3B6913A0AF9DC1275495DE10EB2DA57913D725CAFBBCB8A2A476EF71B70A66AD7BFD9A2E37EB9C26BE41D5C5F9207C4CBA24AC0CE97367622CC14D717ACF54FF6111EA0BD62EB2D73D684FF8119AFDFA196233EF8DD2F31001F86621146A187236F30677E4639377AE53B7FAFE7B2C497832F736E566D86260DBC0E4720FE267E61646462CECF8A8353034CD6F8C9D617B86E3EB2EC3477237',
Subject =>
' C= DE ST= Bayern L= Straubing O= OTRS AG CN= unittest2 emailAddress= unittest2@example.org',
- Hash => '999bcb2f',
- Private => 'No',
- Serial => 'serial=9BCC39BD2A958C37',
- ShortEndDate => '2012-03-29',
- Fingerprint => '3F:EE:1A:D2:E1:29:06:03:BF:AB:18:8C:F4:BA:E0:9C:FD:47:5D:0A',
- Type => 'cert',
+ Hash => '999bcb2f',
+ Private => 'No',
+ Serial => 'serial=F510FC0C8A46E2A1',
+ Fingerprint => 'AD:E4:99:93:45:CB:82:E3:1E:4B:0F:92:12:8D:21:26:3D:16:77:87',
+ Type => 'cert',
Issuer =>
'issuer= /C= DE/ST= Bayern/L= Straubing/O= OTRS AG/CN= unittest2/emailAddress= unittest2@example.org',
Email => 'unittest2@example.org',
- StartDate => 'Feb 19 11:32:20 2008 GMT',
- ShortStartDate => '2008-02-19',
+ EndDate => 'Jan 15 13:29:18 2026 GMT',
+ ShortEndDate => '2026-01-15',
+ StartDate => 'May 8 13:29:18 2012 GMT',
+ ShortStartDate => '2012-05-08',
},
'cert-1' => '-----BEGIN CERTIFICATE-----
-MIIDWTCCAsKgAwIBAgIJANUfx1I4k7z9MA0GCSqGSIb3DQEBBQUAMHwxCzAJBgNV
+MIIEXjCCA0agAwIBAgIJAPIBQyBe/HbpMA0GCSqGSIb3DQEBBQUAMHwxCzAJBgNV
BAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4xEjAQBgNVBAcTCVN0cmF1YmluZzEQMA4G
A1UEChMHT1RSUyBBRzERMA8GA1UEAxMIdW5pdHRlc3QxIzAhBgkqhkiG9w0BCQEW
-FHVuaXR0ZXN0QGV4YW1wbGUub3JnMB4XDTA4MDIxOTExMjA1NloXDTEyMDMyOTEx
-MjA1NlowfDELMAkGA1UEBhMCREUxDzANBgNVBAgTBkJheWVybjESMBAGA1UEBxMJ
+FHVuaXR0ZXN0QGV4YW1wbGUub3JnMB4XDTEyMDUwODEzMTEzMloXDTI2MDExNTEz
+MTEzMlowfDELMAkGA1UEBhMCREUxDzANBgNVBAgTBkJheWVybjESMBAGA1UEBxMJ
U3RyYXViaW5nMRAwDgYDVQQKEwdPVFJTIEFHMREwDwYDVQQDEwh1bml0dGVzdDEj
-MCEGCSqGSIb3DQEJARYUdW5pdHRlc3RAZXhhbXBsZS5vcmcwgZ8wDQYJKoZIhvcN
-AQEBBQADgY0AMIGJAoGBALXRKyEMjvPmtAQWIVcCLO/0avZRlXH5hcEWo88Ja1vZ
-2+MGymaDIh8IhYyLoUIvk0kW/invidofHdVapHRD95bLiChD4Wy09yL4A4dotv3O
-j0rexegdtG+bMAp2Vze2mPwLfR5XQQvPgQ5LO090/VyAU3iHnowjzVy2oKFgrkLp
-AgMBAAGjgeIwgd8wHQYDVR0OBBYEFHcbSoH3e7LcaizNIja//BPUrMkjMIGvBgNV
-HSMEgacwgaSAFHcbSoH3e7LcaizNIja//BPUrMkjoYGApH4wfDELMAkGA1UEBhMC
-REUxDzANBgNVBAgTBkJheWVybjESMBAGA1UEBxMJU3RyYXViaW5nMRAwDgYDVQQK
-EwdPVFJTIEFHMREwDwYDVQQDEwh1bml0dGVzdDEjMCEGCSqGSIb3DQEJARYUdW5p
-dHRlc3RAZXhhbXBsZS5vcmeCCQDVH8dSOJO8/TAMBgNVHRMEBTADAQH/MA0GCSqG
-SIb3DQEBBQUAA4GBABIu7YxiWIstI9XXAFtEA3dQzQNOPP5vh7zju7Zi8WHmkMC6
-3OnVz5v5bazcBxDcIGVSGe0IUElvMXGDgFzbVnIWGb3lhDcjKiLjshR7tUSs4eeR
-w1mJrbFPWksw+fr6vUQwtU0YaNU0mKhE/e0WGDQw6d3/sU/XCM6zKEdrRDum
+MCEGCSqGSIb3DQEJARYUdW5pdHRlc3RAZXhhbXBsZS5vcmcwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC2hq1peYGlo4d5Lz8wEGLvUg9pZq4hQhmVwatj
+v0q5dNJQ6HZPmzQTZLCEL6Wcn/7MsCQ6v4Avryjf3OPCMV/HTWuoHwmrXzM6Dtr/
+3cuUF5L0wOV6wEE+IF6J1OYdObDxRPrz5wZP2XEx3B5yMETksN6qF+g8CwaXwbtl
+sR2ZfGo+qxSP+rPs9gy54Xvg2rrgh/SIvKKcFNWX3gJPGg66b0Ne+gOx68u7XREH
+y71yzIsCAq52vqBnKySnXIIDG8Lem4LNwlMW993snTK/nE/yhYQkqjcdLpb3EXCq
+sxZ+2fpaLFJcU7js5yUDQzncPawy04QNHTrPtC22fJgXFCAZAgMBAAGjgeIwgd8w
+HQYDVR0OBBYEFBZG1kwr7OFhLzYO9PEsPJT5OxbaMIGvBgNVHSMEgacwgaSAFBZG
+1kwr7OFhLzYO9PEsPJT5OxbaoYGApH4wfDELMAkGA1UEBhMCREUxDzANBgNVBAgT
+BkJheWVybjESMBAGA1UEBxMJU3RyYXViaW5nMRAwDgYDVQQKEwdPVFJTIEFHMREw
+DwYDVQQDEwh1bml0dGVzdDEjMCEGCSqGSIb3DQEJARYUdW5pdHRlc3RAZXhhbXBs
+ZS5vcmeCCQDyAUMgXvx26TAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IB
+AQBE2M1dcTkQyPJUXzchMGIWD5nkUDs0iHqIPNfeTWcTW3iuzZHA6rj4Lw7RFOs+
+seYl14DywnYFUM5UZz4ko9t+uqECp4LK6qdkYomjSw+E8Zs5se8QlRYhDEjEDqwR
+c0xg0lgybQoceMJ7ub+V/yp/EIyfKbaJBtYIDucQ6yB1EECVm1hfKKLg+gUk4rLY
+WgEFDKCVadkItr5yLLMp9CGKWpiv7sW/5f2YVTEZGCcbp2hQRCMPpQYCtvbdfyh5
+lZbOYUaP6zWPsKjftcev2Q5ik1L7N9eCynBF3a2U0TPVkfFyzuO58k96vUhKltOb
+nj2wbQO4KjM12YLUuvahk5se
-----END CERTIFICATE-----
',
'cert-2' => '-----BEGIN CERTIFICATE-----
-MIIDYDCCAsmgAwIBAgIJAJvMOb0qlYw3MA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNV
+MIIEZTCCA02gAwIBAgIJAPUQ/AyKRuKhMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNV
BAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4xEjAQBgNVBAcTCVN0cmF1YmluZzEQMA4G
A1UEChMHT1RSUyBBRzESMBAGA1UEAxMJdW5pdHRlc3QyMSQwIgYJKoZIhvcNAQkB
-FhV1bml0dGVzdDJAZXhhbXBsZS5vcmcwHhcNMDgwMjE5MTEzMjIwWhcNMTIwMzI5
-MTEzMjIwWjB+MQswCQYDVQQGEwJERTEPMA0GA1UECBMGQmF5ZXJuMRIwEAYDVQQH
+FhV1bml0dGVzdDJAZXhhbXBsZS5vcmcwHhcNMTIwNTA4MTMyOTE4WhcNMjYwMTE1
+MTMyOTE4WjB+MQswCQYDVQQGEwJERTEPMA0GA1UECBMGQmF5ZXJuMRIwEAYDVQQH
EwlTdHJhdWJpbmcxEDAOBgNVBAoTB09UUlMgQUcxEjAQBgNVBAMTCXVuaXR0ZXN0
-MjEkMCIGCSqGSIb3DQEJARYVdW5pdHRlc3QyQGV4YW1wbGUub3JnMIGfMA0GCSqG
-SIb3DQEBAQUAA4GNADCBiQKBgQDDdCK6sdbN6TDtROecTTvTvsvU45H7gMP8dLY5
-qSbWcP3fanXrwwTkL9gzEcZDVsPfTkaEhM8KccqsozO7mbGs9Bi3ICCk1E+ijfl/
-DcLo1koJJmc/usHymmaebzd2YBzCeTejISIohWyrk5aSO2CZgZj/0rsQ6GZ8AsZv
-EbpXhwIDAQABo4HlMIHiMB0GA1UdDgQWBBSnQFo3v5xSzt4e1XEUbqFmpSDurzCB
-sgYDVR0jBIGqMIGngBSnQFo3v5xSzt4e1XEUbqFmpSDur6GBg6SBgDB+MQswCQYD
-VQQGEwJERTEPMA0GA1UECBMGQmF5ZXJuMRIwEAYDVQQHEwlTdHJhdWJpbmcxEDAO
-BgNVBAoTB09UUlMgQUcxEjAQBgNVBAMTCXVuaXR0ZXN0MjEkMCIGCSqGSIb3DQEJ
-ARYVdW5pdHRlc3QyQGV4YW1wbGUub3JnggkAm8w5vSqVjDcwDAYDVR0TBAUwAwEB
-/zANBgkqhkiG9w0BAQUFAAOBgQCjOBwiSBW2GBKh9uoobhpgl/O6J2yfCKFXcfTh
-JN9H2yH0QEUpG0eTsSY25Ns5vXS7WmYkMsIemTz5knkhmjSR7uqx6+OMQDGVjfID
-nLcdi8Cg4aLtoofolDSgyMbwYPBIuO8W3+WXvEXgZdWGiOlfs/25GVflLPh7haPC
-/4ruQw==
+MjEkMCIGCSqGSIb3DQEJARYVdW5pdHRlc3QyQGV4YW1wbGUub3JnMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz69SrJrYN/Ziiea6ubv5a9MXP+JuoG5y
+k56SFSivphl8H/lBvr7h/UJDU+clUxpVIbqL56eWwGaOP7++yZJta5cuBRPt8SqB
+KZMotiwTK7Y9CzlCoqGU3kaBToTi6VlDfcX8NvL1HjtpE6CvncEnVJXeEOstpXkT
+1yXK+7y4oqR273G3Cmate/2aLjfrnCa+QdXF+SB8TLokrAzpc2diLMFNcXrPVP9h
+EeoL1i6y1z1oT/gRmv36GWIz743S8xAB+GYhFGoYcjbzBnfkY5N3rlO3+v57LEl4
+Mvc25WbYYmDbwORyD+Jn5hZGRizs+Kg1MDTNb4ydYXuG4+suw0dyNwIDAQABo4Hl
+MIHiMB0GA1UdDgQWBBQJSIvelTIWMmkrSc92Jf2Z2tFlojCBsgYDVR0jBIGqMIGn
+gBQJSIvelTIWMmkrSc92Jf2Z2tFloqGBg6SBgDB+MQswCQYDVQQGEwJERTEPMA0G
+A1UECBMGQmF5ZXJuMRIwEAYDVQQHEwlTdHJhdWJpbmcxEDAOBgNVBAoTB09UUlMg
+QUcxEjAQBgNVBAMTCXVuaXR0ZXN0MjEkMCIGCSqGSIb3DQEJARYVdW5pdHRlc3Qy
+QGV4YW1wbGUub3JnggkA9RD8DIpG4qEwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B
+AQUFAAOCAQEASYgs16erFua1ayilG14OL+/qxgOa5UOi/+i1SGK0srNAE89ShTVv
+XVJbEtYwJIZBUzGj6oOP6EhcV1HzMoyKnkR32JzxOF8JTdVfmFq/+g1+2WY82ONf
+dgfqUWZK7FD7iiMQTAQwQ2ZsfRUeysufi45ZxIZd7G9vyDh83XyVR5P6rop56BZF
+TtZDIk1lGfM1ZuXWeQfOUE4N0bOM+idDDMk3mcyy9wpkxAgq++FUQXwhwUnpeiZi
+m012tpyvuaVVcNTY5MXgvonWtH2Vv8VnnBJ/at//961DX9u67qIQaIqReU18HjJ3
+w/5UXrBm/VSYu01mcpSN4rCPM9onzepmEA==
-----END CERTIFICATE-----
'
);
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/test/WebUploadCache.t
^
|
@@ -1,8 +1,8 @@
# --
# WebUploadCache.t - test of the web upload cache mechanism
-# Copyright (C) 2001-2010 OTRS AG, http://otrs.org/
+# Copyright (C) 2001-2011 OTRS AG, http://otrs.org/
# --
-# $Id: WebUploadCache.t,v 1.12.2.1 2010/01/18 19:48:41 martin Exp $
+# $Id: WebUploadCache.t,v 1.12.2.2 2011/09/29 21:28:38 mh Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
@@ -32,6 +32,7 @@
# file checks
for my $File (qw(xls txt doc png pdf)) {
+
my $Content = '';
open( IN,
"< "
@@ -45,9 +46,11 @@
}
close(IN);
$Self->{EncodeObject}->EncodeOutput( \$Content );
+
my $MD5 = md5_hex($Content);
- my $ContentID = int rand 1234;
- my $Add = $Self->{UploadCacheObject}->FormIDAddFile(
+ my $ContentID = ( int rand 99999 ) + 1;
+
+ my $Add = $Self->{UploadCacheObject}->FormIDAddFile(
FormID => $FormID,
Filename => 'UploadCache Test1äöüß.' . $File,
Content => $Content,
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/test/sample/SMIMECertificate-1.asc
^
|
@@ -1,20 +1,26 @@
-----BEGIN CERTIFICATE-----
-MIIDWTCCAsKgAwIBAgIJANUfx1I4k7z9MA0GCSqGSIb3DQEBBQUAMHwxCzAJBgNV
+MIIEXjCCA0agAwIBAgIJAPIBQyBe/HbpMA0GCSqGSIb3DQEBBQUAMHwxCzAJBgNV
BAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4xEjAQBgNVBAcTCVN0cmF1YmluZzEQMA4G
A1UEChMHT1RSUyBBRzERMA8GA1UEAxMIdW5pdHRlc3QxIzAhBgkqhkiG9w0BCQEW
-FHVuaXR0ZXN0QGV4YW1wbGUub3JnMB4XDTA4MDIxOTExMjA1NloXDTEyMDMyOTEx
-MjA1NlowfDELMAkGA1UEBhMCREUxDzANBgNVBAgTBkJheWVybjESMBAGA1UEBxMJ
+FHVuaXR0ZXN0QGV4YW1wbGUub3JnMB4XDTEyMDUwODEzMTEzMloXDTI2MDExNTEz
+MTEzMlowfDELMAkGA1UEBhMCREUxDzANBgNVBAgTBkJheWVybjESMBAGA1UEBxMJ
U3RyYXViaW5nMRAwDgYDVQQKEwdPVFJTIEFHMREwDwYDVQQDEwh1bml0dGVzdDEj
-MCEGCSqGSIb3DQEJARYUdW5pdHRlc3RAZXhhbXBsZS5vcmcwgZ8wDQYJKoZIhvcN
-AQEBBQADgY0AMIGJAoGBALXRKyEMjvPmtAQWIVcCLO/0avZRlXH5hcEWo88Ja1vZ
-2+MGymaDIh8IhYyLoUIvk0kW/invidofHdVapHRD95bLiChD4Wy09yL4A4dotv3O
-j0rexegdtG+bMAp2Vze2mPwLfR5XQQvPgQ5LO090/VyAU3iHnowjzVy2oKFgrkLp
-AgMBAAGjgeIwgd8wHQYDVR0OBBYEFHcbSoH3e7LcaizNIja//BPUrMkjMIGvBgNV
-HSMEgacwgaSAFHcbSoH3e7LcaizNIja//BPUrMkjoYGApH4wfDELMAkGA1UEBhMC
-REUxDzANBgNVBAgTBkJheWVybjESMBAGA1UEBxMJU3RyYXViaW5nMRAwDgYDVQQK
-EwdPVFJTIEFHMREwDwYDVQQDEwh1bml0dGVzdDEjMCEGCSqGSIb3DQEJARYUdW5p
-dHRlc3RAZXhhbXBsZS5vcmeCCQDVH8dSOJO8/TAMBgNVHRMEBTADAQH/MA0GCSqG
-SIb3DQEBBQUAA4GBABIu7YxiWIstI9XXAFtEA3dQzQNOPP5vh7zju7Zi8WHmkMC6
-3OnVz5v5bazcBxDcIGVSGe0IUElvMXGDgFzbVnIWGb3lhDcjKiLjshR7tUSs4eeR
-w1mJrbFPWksw+fr6vUQwtU0YaNU0mKhE/e0WGDQw6d3/sU/XCM6zKEdrRDum
+MCEGCSqGSIb3DQEJARYUdW5pdHRlc3RAZXhhbXBsZS5vcmcwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC2hq1peYGlo4d5Lz8wEGLvUg9pZq4hQhmVwatj
+v0q5dNJQ6HZPmzQTZLCEL6Wcn/7MsCQ6v4Avryjf3OPCMV/HTWuoHwmrXzM6Dtr/
+3cuUF5L0wOV6wEE+IF6J1OYdObDxRPrz5wZP2XEx3B5yMETksN6qF+g8CwaXwbtl
+sR2ZfGo+qxSP+rPs9gy54Xvg2rrgh/SIvKKcFNWX3gJPGg66b0Ne+gOx68u7XREH
+y71yzIsCAq52vqBnKySnXIIDG8Lem4LNwlMW993snTK/nE/yhYQkqjcdLpb3EXCq
+sxZ+2fpaLFJcU7js5yUDQzncPawy04QNHTrPtC22fJgXFCAZAgMBAAGjgeIwgd8w
+HQYDVR0OBBYEFBZG1kwr7OFhLzYO9PEsPJT5OxbaMIGvBgNVHSMEgacwgaSAFBZG
+1kwr7OFhLzYO9PEsPJT5OxbaoYGApH4wfDELMAkGA1UEBhMCREUxDzANBgNVBAgT
+BkJheWVybjESMBAGA1UEBxMJU3RyYXViaW5nMRAwDgYDVQQKEwdPVFJTIEFHMREw
+DwYDVQQDEwh1bml0dGVzdDEjMCEGCSqGSIb3DQEJARYUdW5pdHRlc3RAZXhhbXBs
+ZS5vcmeCCQDyAUMgXvx26TAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IB
+AQBE2M1dcTkQyPJUXzchMGIWD5nkUDs0iHqIPNfeTWcTW3iuzZHA6rj4Lw7RFOs+
+seYl14DywnYFUM5UZz4ko9t+uqECp4LK6qdkYomjSw+E8Zs5se8QlRYhDEjEDqwR
+c0xg0lgybQoceMJ7ub+V/yp/EIyfKbaJBtYIDucQ6yB1EECVm1hfKKLg+gUk4rLY
+WgEFDKCVadkItr5yLLMp9CGKWpiv7sW/5f2YVTEZGCcbp2hQRCMPpQYCtvbdfyh5
+lZbOYUaP6zWPsKjftcev2Q5ik1L7N9eCynBF3a2U0TPVkfFyzuO58k96vUhKltOb
+nj2wbQO4KjM12YLUuvahk5se
-----END CERTIFICATE-----
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/test/sample/SMIMECertificate-2.asc
^
|
@@ -1,21 +1,26 @@
-----BEGIN CERTIFICATE-----
-MIIDYDCCAsmgAwIBAgIJAJvMOb0qlYw3MA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNV
+MIIEZTCCA02gAwIBAgIJAPUQ/AyKRuKhMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNV
BAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4xEjAQBgNVBAcTCVN0cmF1YmluZzEQMA4G
A1UEChMHT1RSUyBBRzESMBAGA1UEAxMJdW5pdHRlc3QyMSQwIgYJKoZIhvcNAQkB
-FhV1bml0dGVzdDJAZXhhbXBsZS5vcmcwHhcNMDgwMjE5MTEzMjIwWhcNMTIwMzI5
-MTEzMjIwWjB+MQswCQYDVQQGEwJERTEPMA0GA1UECBMGQmF5ZXJuMRIwEAYDVQQH
+FhV1bml0dGVzdDJAZXhhbXBsZS5vcmcwHhcNMTIwNTA4MTMyOTE4WhcNMjYwMTE1
+MTMyOTE4WjB+MQswCQYDVQQGEwJERTEPMA0GA1UECBMGQmF5ZXJuMRIwEAYDVQQH
EwlTdHJhdWJpbmcxEDAOBgNVBAoTB09UUlMgQUcxEjAQBgNVBAMTCXVuaXR0ZXN0
-MjEkMCIGCSqGSIb3DQEJARYVdW5pdHRlc3QyQGV4YW1wbGUub3JnMIGfMA0GCSqG
-SIb3DQEBAQUAA4GNADCBiQKBgQDDdCK6sdbN6TDtROecTTvTvsvU45H7gMP8dLY5
-qSbWcP3fanXrwwTkL9gzEcZDVsPfTkaEhM8KccqsozO7mbGs9Bi3ICCk1E+ijfl/
-DcLo1koJJmc/usHymmaebzd2YBzCeTejISIohWyrk5aSO2CZgZj/0rsQ6GZ8AsZv
-EbpXhwIDAQABo4HlMIHiMB0GA1UdDgQWBBSnQFo3v5xSzt4e1XEUbqFmpSDurzCB
-sgYDVR0jBIGqMIGngBSnQFo3v5xSzt4e1XEUbqFmpSDur6GBg6SBgDB+MQswCQYD
-VQQGEwJERTEPMA0GA1UECBMGQmF5ZXJuMRIwEAYDVQQHEwlTdHJhdWJpbmcxEDAO
-BgNVBAoTB09UUlMgQUcxEjAQBgNVBAMTCXVuaXR0ZXN0MjEkMCIGCSqGSIb3DQEJ
-ARYVdW5pdHRlc3QyQGV4YW1wbGUub3JnggkAm8w5vSqVjDcwDAYDVR0TBAUwAwEB
-/zANBgkqhkiG9w0BAQUFAAOBgQCjOBwiSBW2GBKh9uoobhpgl/O6J2yfCKFXcfTh
-JN9H2yH0QEUpG0eTsSY25Ns5vXS7WmYkMsIemTz5knkhmjSR7uqx6+OMQDGVjfID
-nLcdi8Cg4aLtoofolDSgyMbwYPBIuO8W3+WXvEXgZdWGiOlfs/25GVflLPh7haPC
-/4ruQw==
+MjEkMCIGCSqGSIb3DQEJARYVdW5pdHRlc3QyQGV4YW1wbGUub3JnMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz69SrJrYN/Ziiea6ubv5a9MXP+JuoG5y
+k56SFSivphl8H/lBvr7h/UJDU+clUxpVIbqL56eWwGaOP7++yZJta5cuBRPt8SqB
+KZMotiwTK7Y9CzlCoqGU3kaBToTi6VlDfcX8NvL1HjtpE6CvncEnVJXeEOstpXkT
+1yXK+7y4oqR273G3Cmate/2aLjfrnCa+QdXF+SB8TLokrAzpc2diLMFNcXrPVP9h
+EeoL1i6y1z1oT/gRmv36GWIz743S8xAB+GYhFGoYcjbzBnfkY5N3rlO3+v57LEl4
+Mvc25WbYYmDbwORyD+Jn5hZGRizs+Kg1MDTNb4ydYXuG4+suw0dyNwIDAQABo4Hl
+MIHiMB0GA1UdDgQWBBQJSIvelTIWMmkrSc92Jf2Z2tFlojCBsgYDVR0jBIGqMIGn
+gBQJSIvelTIWMmkrSc92Jf2Z2tFloqGBg6SBgDB+MQswCQYDVQQGEwJERTEPMA0G
+A1UECBMGQmF5ZXJuMRIwEAYDVQQHEwlTdHJhdWJpbmcxEDAOBgNVBAoTB09UUlMg
+QUcxEjAQBgNVBAMTCXVuaXR0ZXN0MjEkMCIGCSqGSIb3DQEJARYVdW5pdHRlc3Qy
+QGV4YW1wbGUub3JnggkA9RD8DIpG4qEwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B
+AQUFAAOCAQEASYgs16erFua1ayilG14OL+/qxgOa5UOi/+i1SGK0srNAE89ShTVv
+XVJbEtYwJIZBUzGj6oOP6EhcV1HzMoyKnkR32JzxOF8JTdVfmFq/+g1+2WY82ONf
+dgfqUWZK7FD7iiMQTAQwQ2ZsfRUeysufi45ZxIZd7G9vyDh83XyVR5P6rop56BZF
+TtZDIk1lGfM1ZuXWeQfOUE4N0bOM+idDDMk3mcyy9wpkxAgq++FUQXwhwUnpeiZi
+m012tpyvuaVVcNTY5MXgvonWtH2Vv8VnnBJ/at//961DX9u67qIQaIqReU18HjJ3
+w/5UXrBm/VSYu01mcpSN4rCPM9onzepmEA==
-----END CERTIFICATE-----
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/test/sample/SMIMEPrivateKey-1.asc
^
|
@@ -1,18 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,CB71918E5233F3FD
-
-RztelKaPlp4T0flazNmMCA0wesR73uAW6XU/pR+pxrO24JR8n8hDlTug5q6mc83t
-XaBdTNHKGnsbDDuEvv1p7kq31EOKau+V1HFE7lLjruUq0mDvlmix5Er02pq1BWj1
-9Ue4xB7ST7ma9KZT2C95gCOcnq7bMB6lvAvLYmzoMDz7iTzyMi8vCP5QdVZq/dem
-Gz09eD3B3kQN0p5ifieOXiID0X853NM+P7nR2PAtTnR0GvUo12I2URzhqW6EogLC
-TSWpzIgIceZvHLpWdzYnkyAlu3C1oETaIUGtgCITXuumhLB+cLUvSVjTz9r+xx1C
-6rU8mz2jCW5prQQLkfk/t/U+K6ISi3c1bYG2Y19zpqvkAr5hPvjV/fWewQeeOuAD
-jGgQWQg5r3HZ5lEzZHFTa1GpBozCAvyn1qUgQ0NHk6njvi04Z9YC9hRIaVsrtibb
-V3vFo6jQKmmy6an/kwCB+0Tc6xDt2ZWYDL07sxUcLN4GxXl8NVuC3qhWgh7swta1
-jg/WzEn5X5AiPV5xUurtVMImwdI+p9xBVdKsef6j8GU4C8KGJ95+hQAQdzHrWlMm
-WVpUxG95nBmCZJHhtk1YmUb7FUgOPeYFl5XWxn2RGhQXnswaGoxlyRFdwrmVHaL2
-ZgN8TF/y+0q/jfS0Zy3JqS1eC/P0SrhMGDv75O6FqQ2hdVLmuBoyOneOMSMt4PM9
-rRMuAQCW19X5tz7ew8bt/3rngWLjh2LE5jQzZVMh7lwicNuUPLTlNiroduSpu6LT
-wV/xgN+3OQwSqBc2aTCW0uIfRFKzV2KkHb4YPaXuTpe32PRxmGFn2A==
+MIIEpAIBAAKCAQEAtoataXmBpaOHeS8/MBBi71IPaWauIUIZlcGrY79KuXTSUOh2
+T5s0E2SwhC+lnJ/+zLAkOr+AL68o39zjwjFfx01rqB8Jq18zOg7a/93LlBeS9MDl
+esBBPiBeidTmHTmw8UT68+cGT9lxMdwecjBE5LDeqhfoPAsGl8G7ZbEdmXxqPqsU
+j/qz7PYMueF74Nq64If0iLyinBTVl94CTxoOum9DXvoDsevLu10RB8u9csyLAgKu
+dr6gZyskp1yCAxvC3puCzcJTFvfd7J0yv5xP8oWEJKo3HS6W9xFwqrMWftn6WixS
+XFO47OclA0M53D2sMtOEDR06z7QttnyYFxQgGQIDAQABAoIBABBP7vWLL2P/Pl89
+Mrd372+V9NylmZBNWP4CRe/vK51xbE5gyBoLM9c7226k13cs8VeXslUxwiIA1HVV
+R2GWignEyIdI5tNS+cAJjdbqGoSMqsyG5LtYrTwBJpHI3hvkiQS29nqPvgeq1ivv
+kSUBXVbW2791zYJ4NcmgPcAz2QJbbm2S88mLudpSXx7auQpZwe9FxFe9o0TxFxmc
+2XXc8zLprW6jorttlM2tKt+1ckZ0Nc+sboUJ5syARAydBdhNhQVaiA3TCD4jxQ2J
++MG555u5O23QfL+0qsL46YlMOTL5G/ZGj5AtTvZd8UmdUx05xWL1evZJSaei2YOi
+Xpr8OQECgYEA5DobsjsZmNN75qf3BGoi+b2zxN2HpaC6Y84e1EnYiWuw73j8WXWb
+1TO44fRBH8r5N4wrtSs4z+ceTZ/CaetecC/pWPgnYHwo+gNbM2Qt0/4Gp0a9mykd
+9bE1aZjg6jX7P5ICUt3JGh2CNljX2sDGGjEzy76bkY4Ukgj1kZpT7zkCgYEAzLzc
+mdz2/IBmjEtEpEL51Dw8iPFcG1V22mUtDzf7wmr8B2UXhixjiMRPUmXq8ydNN5RW
+a0QS6YcKaXVDW01PYdrROOXyzHCV16jJb9T/1/o6c9Vnn6j/3oYrNHkzqif85Cgr
+JDiGuWYmDQ/4j7sNKEmeD/7yQau5sgkO0RqW1+ECgYEAszZF5VCvKuh2VIr0V00Y
+pc8myKHEEHUDp7eFUeGi3VXpHEJ+tai6c1IoDZYFRXfW9p1k/OAxvl+X1hBrU0z1
+XVbh/3DtSsB0VM4p4VL7AYppoxTTcnF5CyLZ9E+N3ZwB7Ms0c+mgLpeZVh+xcB8L
+8ClOqODFvCg7UukiG/F5k1ECgYEAgU1tzUa+Pe4h1czbhxo9igqY+KvmTeUF8Rwg
+/xGOUNUcYtc3qidynTfOGO4BGpvhqo5mncwaXZ5Jtxy18325+sUlidfAJdmc6NzS
+i2xsQEzqialnjnA/WJxHwRYiyP4EO1wbEv8YJxMaSPmjM7Mgtib4SoXrHgqEdqo9
+z1YJmkECgYAc29+1H77LjjfyVWfyIGSU21bwHPNf0drXU60O03MgZlQRpXJhwWLp
+ziBklk/rkN4sLPXjjZniI2OSzWq7z1eQLYrXZUOjqDfucaPl1CgJrsjJd4nXx/wN
+ciPpuLJ2wIIk4S2S3Nr5Ph2N7zkDjgYPAaa5ZtywphPv5YTGvZEJHQ==
-----END RSA PRIVATE KEY-----
|
[-]
[+]
|
Changed |
otrs-2.4.14.tar.bz2/scripts/test/sample/SMIMEPrivateKey-2.asc
^
|
@@ -1,18 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,407A16FDC93CF849
-
-lqsF6GvmJeB5hZxZOW2J4TzJusiKYAxLgnS0RlnVM+MDB7rkfhiAWInmV3NTrA4Y
-ALv9ppqVAxzGmpaLkfGrlHWNgUeTXTlkrKc/SqdC3sU9XOhbGzzltRAzt4+fQSid
-WPK5rfw9clHZuMwFXRPLpkuZ03qWZMvHGz/MeB3wICI8PO8j4jECg7DJO+gjGZv0
-m1nvLar8aMWOWkLZW3R9ZuLtQEHe6rs2SQIHfDTrhngb5syDm3ZrEZ1eQsj3RCOL
-gOoYdtC3M+RJVHdL6pVWxfmPw4gyGKewdxYwm/nvB/skt16c2qkiRBm1bB6IdN5R
-n3v8LHIOPkVfohBXqtKccbVTq1+xB0bNtXacb3dBYBOkDLVXOcrj7d/1nIiK2cGI
-4BUKYreuc5L3XhkYa/e6qSvsny7RVlsA50HlmwSGoUNzqm8XlonVoeJiyG099daz
-UG0PgCgipCDzpn7yXDmqbusUlNALIMYNyzsUDWxbqjW7ouuAFcJSdo3IqYaZUZ7E
-oiOK84I4ll3tGBWXv3lp4UcJeKLgRmuP2vYpImG3aXTEbmEa1JJulqjcb2eVV2CP
-5uCSMYi2gE8kGQgLpraUgqJmF1NRiomXiShzLmTnqtL0BfCVbntQ7ms9n2W7zkKM
-XVoHcDG6Km310Ae0JaJvIrPJ+u4L/xdUvV3bWgYagyjexRBhVNm5ALTr51JH4P7+
-uxBoKUZUDYx/aRem7WfckDxed1+NEyzXggIDnzx5V4Vy9pLmD7YUVa2fduex0Bv8
-SBLGxe/OJp91XVOfHhJKSoV6qI0IMR1DpYgRDQypIfVadtjs0tMboQ==
+MIIEpgIBAAKCAQEAz69SrJrYN/Ziiea6ubv5a9MXP+JuoG5yk56SFSivphl8H/lB
+vr7h/UJDU+clUxpVIbqL56eWwGaOP7++yZJta5cuBRPt8SqBKZMotiwTK7Y9CzlC
+oqGU3kaBToTi6VlDfcX8NvL1HjtpE6CvncEnVJXeEOstpXkT1yXK+7y4oqR273G3
+Cmate/2aLjfrnCa+QdXF+SB8TLokrAzpc2diLMFNcXrPVP9hEeoL1i6y1z1oT/gR
+mv36GWIz743S8xAB+GYhFGoYcjbzBnfkY5N3rlO3+v57LEl4Mvc25WbYYmDbwORy
+D+Jn5hZGRizs+Kg1MDTNb4ydYXuG4+suw0dyNwIDAQABAoIBAQCvTrbiq/JHitqy
+vOhxT5LCyXSeoGvxUEm3AesdoTJjaq+z7ZrpgAcS2JQshrii5V9nESh3aqd90RPS
+C/DoBYoHf52A+8mmANL2XRnIbHviMfplNvhgfzRCTBFqThGcF5U43Z6AY6U018Fi
+qAiViS3B4J+KeHoXa5Srz2MAC9Vusw6uUtF4M/Hzzy0mDln6cnR0oHVao0ddc7dn
+WFYFepBvE+tW6ooCL6sQ8+kda9GvAu/wPc6/Afi3tV994CxCu4gmKneo2etogYE+
+g/Tc5zTwD2YYxyY0+t2S/2xpNP+uRIUQjH/EBNUwlvCGx2Js8KtHJ1aupmBv3KqD
+zIKoHUPBAoGBAPi35cEf9ZpObIQWAx7b5/R4npE6xgjIMZsYz+HtP5Nyg+hnhTUG
+D8UlPH86n4+AhRPy1U0/vM7kU96mXVmfyfs5dGodYrL0nq6BlMsBpbIsld7WoKNG
+812Ql4Sl59rKGUb5TjNTfshPHJPOK6SGl9/5J7XFkxabcprr2ZkV31wFAoGBANXD
+4uMFZ6lfijIrVHPcI3jJ0n/0snpTgNoB7qsOR2VlLrkjLjQbzWCdMtopEUVZEWgn
+wxKPOosVcuw+DC75RspbWH62+a3Rf6P+/sZzmyHXKnnsXdkZMqBKNCmQTmo8fDWm
+OUixMAK08XkrvgKkGhGBJ676XGBtkXGvxXCPmuYLAoGBALSoRu9fenMpsbLDlmKs
+0rAFiQ/uQ/gPCdEhVaZCQOKl1GBUCTK5g2zsniO//jQq4v7ZbMvelxMkUDMyXi4C
+XaDoW8HUNGPOQRB6OQy31pYzwmyJM0dF+vGkXBpSs7V9BJ1D6uRnKnju1dAaeiLY
+TKq3/HsQ1sUeBkG3PGfwtjvNAoGBAKlc7eIYYi0beQ6Orfatr5z/qjuez9mDV09i
+wIneYkq/g+lDKlQ2wt2NLsESUJC1JMl012VY/XU8pTTvZA/DiIbDILYkmmVQ2uRA
+H/NznLGPHCRFVYWwJSBCKlnT74zUJ0UKUdB6MiOy4K60LXNCOTUtMxe7XH050kZU
+kQXBgWRJAoGBANZ1tkXcC9muHsgvMFVlX7IqkZNIzt1Gd5gnlMM7Sq0y8xthQtvB
+I3waYua96DJiiSsWimsxUReF1IuRHAHjD2MWbokhtUNKFhGV9E/CWhOMz+6nxlRH
+kPAU8OzHw898J/Rm7yUG3xG+yPU09PzdJcO0dUSVW34bXD+vfihG+d7h
-----END RSA PRIVATE KEY-----
|
|
Added |
otrs-2.4.14.tar.bz2/var/httpd/htdocs/images/Standard/feature_add_ons.png
^
|
[-]
[+]
|
Added |
otrs-2.4.14.tar.bz2/var/packages/Support-1.1.4.opm
^
|
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<otrs_package version="1.1">
+ <Name>Support</Name>
+ <Version>1.1.4</Version>
+ <Vendor>OTRS AG</Vendor>
+ <URL>http://otrs.org/</URL>
+ <License>GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007</License>
+ <ChangeLog Date="2011-12-17 00:16:39" Version="1.1.4">Fixed bug#7152 - Description should match current offered solutions.</ChangeLog>
+ <ChangeLog Date="2010-07-30 13:57:13" Version="1.1.3">Added OTRS::ITSM version detection.</ChangeLog>
+ <ChangeLog Date="2010-05-28 09:33:51" Version="1.1.2">Fixed bug#5369 - Support Module fails on Oracle databases.</ChangeLog>
+ <ChangeLog Date="2010-05-13 18:14:29" Version="1.1.1">Added new check to compare the application and DB servers timestamp.</ChangeLog>
+ <ChangeLog Date="2010-02-23 16:28:03" Version="1.0.99">Fixed bug with check.xml files containing no information.</ChangeLog>
+ <ChangeLog Date="2010-02-16 20:09:33" Version="1.0.98">Fixed bug# 4992 - Support package 1.0.96 and 1.0.97 not working on OTRS 2.1.9.</ChangeLog>
+ <ChangeLog Date="2010-02-15 13:55:24" Version="1.0.97">Fixed error message in log about missing cron check.</ChangeLog>
+ <ChangeLog Date="2010-02-09 22:38:30" Version="1.0.96">Made it possible to enable/disable each check via sysconfig.</ChangeLog>
+ <ChangeLog Date="2010-01-07 21:15:31" Version="1.0.95">Fixed some performance issues of tar files with OTRS 2.4 (support package took 100% cpu time up to 30 min.).</ChangeLog>
+ <ChangeLog Date="2009-12-01 18:32:16" Version="1.0.94">Added some debug info to fnd out where a support package stop the process and added max file count protection of application archive file.</ChangeLog>
+ <ChangeLog Date="2009-10-01 18:06:11" Version="1.0.93">Added new checks for root@otrs password and SOAP, improved Win32 version detection, improved PostgreSQL version detection, fixed typos.</ChangeLog>
+ <ChangeLog Date="2009-08-01 13:48:51" Version="1.0.92">Improved DirectoryFiles() to exclude TempDir und ArticleDir based on current config setting (prevent possible Mail Bomb mail rejects).</ChangeLog>
+ <ChangeLog Date="2009-04-17 16:58:02" Version="1.0.91">Init release for OTRS 2.4. Add new Encode handling.</ChangeLog>
+ <Description Lang="en">Verifies System settings and gives performance tips.</Description>
+ <Description Lang="de">Das Support Assessment Modul prüft fehlerhafte System-Einstellungen und gibt Performance-Tips.</Description>
+ <Framework>2.4.x</Framework>
+ <Framework>2.3.x</Framework>
+ <Framework>2.2.x</Framework>
+ <Framework>2.1.x</Framework>
+ <IntroInstallPost Lang="en" Title="Notice - Introduction">The Support assessment module provides system checks and can help to find setup errors. After installation it can be accessed from the Administration Interface, in the rightmost column.</IntroInstallPost>
+ <IntroInstallPost Lang="de" Title="Hinweis - Einführung">Die Verknüpfung zum Support Assessment Modul ist in der vierten Spalte des Administrations-Bereichs hinterlegt. Mit ihr können System-Checks ausgeführt werden, um Fehler im Setup zu finden.</IntroInstallPost>
+ <BuildDate>2011-12-17 00:16:39</BuildDate>
+ <BuildHost>opms.otrs.com</BuildHost>
+ <Filelist>
+ <File Location="Kernel/Output/HTML/Standard/AdminSupport.dtl" Permission="644" Encode="Base64">IyAtLQojIEFkbWluU3VwcG9ydC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU3VwcG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TdXBwb3J0LmR0bCx2IDEuMjAuMi4xIDIwMTEvMTIvMTYgMjM6MTA6MTkgY2cgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjwhLS0gc3RhcnQgZm9ybSAtLT4KCiMgLS0tCiMgLUphdmEgc2NyaXB0IGZ1bmN0aW9ucwojIC0tLQoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlNlbmRlci52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJDYW4ndCBjcmVhdGUgc3VwcG9ydCBwYWNrYWdlLCBiZWNhdXNlIHlvdSB3b3JrIGN1cnJlbnRseSB3aXRoIHRoZSBzeXN0ZW0gdXNlciByb290QGxvY2FsaG9zdCBhbmQgeW91ciBhZG1pbiBlbWFpbCBhZGRyZXNzIGlzIG5vdCB5ZXQgY29uZmlndXJlZC4gUGxlYXNlIGRlZmluZSB0aGUgYWRtaW4gZW1haWwgc2V0dGluZyBpbiB0aGUgU3lzQ29uZmlnIG1vZHVsZSBhbmQgZG9uJ3QgdXNlIHRoZSB1c2VyIHJvb3RAbG9jYWxob3N0IGZvciB3b3JraW5nIHdpdGggT1RSUy4ifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU2VuZGVyLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KCmZ1bmN0aW9uIHN1Ym1pdF9jb25maWRlbnRpYWwoKSB7CiAgICBpZiAoIWRvY3VtZW50LmNvbXBvc2Vjb25maWRlbnRpYWwuY29uZmlkZW50aWFsaW5mby5jaGVja2VkKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlBsZWFzZSBjb25maXJtIHRoZSBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gdG8gY29udGludWUuIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlY29uZmlkZW50aWFsLmNvbmZpZGVudGlhbGluZm8uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfQovLy0tPgo8L3NjcmlwdD4KCiMgLS0tCiMgLSBTdXBwb3J0bW9kdWxlIG92ZXJ2aWV3IHBhZ2UKIyAtLS0KCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTdXBwb3J0In0kRW52eyJCb3gxIn0KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgd2lkdGg9IjMwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDb25maWRlbnRpYWwiLz4KICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTdXBwb3J0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRm9yIHF1aWNrIGhlbHAgcGxlYXNlIHN1Ym1pdCB5b3VyIHN5c3RlbSBpbmZvcm1hdGlvbiBhbmQgY3JlYXRlIGEgc3VwcG9ydCB0aWNrZXQgYXQgdGhlIHZlbmRvcidzIHNpdGUuIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRm9yIG1vcmUgaW5mbyBwbGVhc2UgY2hlY2sifSA8YSBocmVmPSJodHRwOi8vb3Rycy5jb20vIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL290cnMuY29tLzwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3RhcnQifSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQmVuY2htYXJrU1FMIi8+CiAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU1FMIEJlbmNobWFyayJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkV4ZWN1dGUgYSBTUUwgYmVuY2htYXJrIHRlc3Qgb24geW91ciBkYXRhYmFzZSB0byBmaW5kIG91dCBob3cgZmFzdCB5b3VyIGRhdGFiYXNlIGlzIChkb25lIG9uIGRlZGljYXRlZCBiZW5jaG1hcmsgdGFibGUpLiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik5vdGU6IFRoaXMgc2hvdWxkIG5vdCBiZSBkb25lIG9uIHByb2R1Y3Rpb24gc3lzdGVtcyEifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxpZXI6ICREYXRheyJNb2RlU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN0YXJ0In0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8YnIvPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+Cgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZSAtLT4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRRRGF0YXsiTW9kdWxlIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMzAlIj4kVGV4dHsiQ2hlY2sifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNTUlIj4kVGV4dHsiQ29tbWVudCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRUZXh0eyJTdGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlUm93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkUURhdGF7IkRlc2NyaXB0aW9uIn0iPiRRRGF0YXsiRGVzY3JpcHRpb24ifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiQ29tbWVudCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGZvbnQgY29sb3I9IiRRRGF0YXsiRm9udENvbG9yIn0iPiRRRGF0YXsiQ2hlY2sifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGVSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGUgLS0+CiAgICAgICAgICAgIDxicj4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CgojIC0tLQojIC0gU3VwcG9ydG1vZHVsZSBjb25maWRlbnRpYWwgcGFnZQojIC0tLQoKPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4kRW52eyJCb3gwIn0kVGV4dHsiQWRtaW4gU3VwcG9ydCBJbmZvIn0kRW52eyJCb3gxIn08L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluU3VwcG9ydCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjAwcHgiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50Ym9keSIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbENvbnRlbnRERSAtLT4KICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJDb25maWRlbnRpYWwiIHJvd3M9IjIyIiBjb2xzPSI3OCIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSIgcmVhZG9ubHk+RGF0ZW5zY2h1dHoKCldpciwgZGllIEZpcm1hIE9UUlMgQUcsIG5laG1lbiBkZW4gU2NodXR6IElocmVyIHBlcnMmb3VtbDtubGljaGVuIERhdGVuIHNlaHIgZXJuc3QgdW5kIGhhbHRlbiB1bnMgc3RyaWt0IGFuIGRpZSBSZWdlbG4gZGVyIERhdGVuc2NodXR6Z2VzZXR6ZS4gQWxsZSBQYXNzdyZvdW1sO3J0ZXIgd2VyZGVuIHZvciBkZW0gVmVyc2VuZGVuIGRlciBJbmZvcm1hdGlvbmVuIGF1dG9tYXRpc2llcnQgdW5rZW5udGxpY2ggZ2VtYWNodC4gSW4ga2VpbmVtIEZhbGwgd2VyZGVuIGRpZSBlcmhvYmVuZW4gRGF0ZW4gdmVya2F1ZnQgb2RlciBhdXMgYW5kZXJlbiBHciZ1dW1sO25kZW4gYW4gdW5hdXRvcmlzaWVydGUgRHJpdHRlIHdlaXRlcmdlZ2ViZW4uCgpEaWUgbmFjaGZvbGdlbmRlIEVya2wmYXVtbDtydW5nIGdpYnQgSWhuZW4gZWluZW4gJlV1bWw7YmVyYmxpY2sgZGFyJnV1bWw7YmVyLCB3aWUgd2lyIGRpZXNlbiBTY2h1dHogZ2V3JmF1bWw7aHJsZWlzdGVuIHVuZCB3ZWxjaGUgQXJ0IHZvbiBEYXRlbiB6dSB3ZWxjaGVtIFp3ZWNrICZ1dW1sO2Jlcm1pdHRlbHQgd2VyZGVuLgoKRGF0ZW4mdXVtbDtiZXJtaXR0bHVuZyBkdXJjaCBkYXMgJ1N1cHBvcnRtb2R1bCcKRGllIEZpcm1hIE9UUlMgQUcgJnV1bWw7YmVybWl0dGVsdCB1bmQgc3BlaWNoZXJ0IEluZm9ybWF0aW9uZW4sIGRpZSBkdXJjaCBkYXMgJ1N1cHBvcnRtb2R1bCcgYW4gZGllIEZpcm1hIE9UUlMgQUcgdmVyc2VuZGV0IHdlcmRlbi4gRGFiZWkgaGFuZGVsdCBlcyBzaWNoIHVtIGF1c3NjaGxpZSZzemxpZztsaWNoIHVtIERhdGVuLCBkaWUgZGllIEZpcm1hIE9UUlMgQUcgYmVuJm91bWw7dGlndCwgdW0gRnVua3Rpb25zZiZhdW1sO2hpZ2tlaXQgdW5kIExlaXN0dW5nc2YmYXVtbDtoaWdrZWl0IGRlcyBiZXRyb2ZmZW5lbiBPVFJTLVNlcnZlcnMgenUgYW5hbHlzaWVyZW4sIG9kZXIgdW0gZWluZSBLb250YWt0YXVmbmFobWUgenUgZXJtJm91bWw7Z2xpY2hlbi4KClNpY2hlcmhlaXQgSWhyZXIgcGVycyZvdW1sO25saWNoZW4gRGF0ZW4KRGllIEZpcm1hIE9UUlMgQUcgc2NoJnV1bWw7dHp0IElocmUgcGVycyZvdW1sO25saWNoZW4gRGF0ZW4gdm9yIHVuZXJsYXVidGVuIFp1Z3JpZmYsIFZlcndlbmR1bmcgb2RlciBWZXImb3VtbDtmZmVudGxpY2h1bmcuIERpZSBGaXJtYSBPVFJTIEFHIHNvcmd0IGRhZiZ1dW1sO3IsIGRhc3Mgdm9uIElobmVuIGF1ZiBkZW0gU2VydmVyIGdlc3BlaWNoZXJ0ZSBwZXJzJm91bWw7bmxpY2hlIEluZm9ybWF0aW9uZW4gaW4gZWluZXIga29udHJvbGxpZXJ0ZW4sIHNpY2hlcmVuIFVtZ2VidW5nIHZvciB1bmVybGF1YnRlbSBadWdyaWZmIHVuZCBWZXImb3VtbDtmZmVudGxpY2h1bmcgZ2VzY2gmVXVtbDt0enQgc2luZC4KCldlaXRlcmdhYmUgSWhyZXIgRGF0ZW4KRGllIEZpcm1hIE9UUlMgQUcgZ2lidCBJaHJlIERhdGVuIG5pY2h0IGFuIERyaXR0ZSB3ZWl0ZXIsIHNvZmVybiBkaWVzIG5pY2h0IHp1ciBBYndpY2tsdW5nIGRlcyBHZXNjaCZhdW1sO2Z0c3ZlcmtlaHJlcyBuJm91bWw7dGlnIGlzdC4KU293ZWl0IGRpZSBGaXJtYSBPVFJTIEFHIGdlc2V0emxpY2ggb2RlciBwZXIgR2VyaWNodHNiZXNjaGx1c3MgZGF6dSB2ZXJwZmxpY2h0ZXQgaXN0LCBnZWJlbiB3aXIgSWhyZSBEYXRlbiBudXIgYW4gYXVza3VuZnRzYmVyZWNodGlndGUgc3RhYXRsaWNoZSBJbnN0aXR1dGlvbmVuIHVuZCBCZWgmb3VtbDtyZGVuIHdlaXRlci4KCiZBdW1sO25kZXJ1bmcgZGllc2VyIERhdGVuc2NodXR6YmVzdGltbXVuZ2VuCkRpZSBGaXJtYSBPVFJTIEFHIGJlaCZhdW1sO2x0IHNpY2ggZGFzIFJlY2h0IHZvciwgZGllc2UgU2ljaGVyaGVpdHMtIHVuZCBEYXRlbnNjaHV0em1hJnN6bGlnO25haG1lbiB6dSB2ZXImYXVtbDtuZGVybiwgc293ZWl0IGRpZXMgd2VnZW4gZGVyIHRlY2huaXNjaGVuIEVudHdpY2tsdW5nIGVyZm9yZGVybGljaCB3aXJkLiBJbiBzb2xjaGVuIEYmYXVtbDtsbGVuIHdlcmRlbiB3aXIgYXVjaCB1bnNlcmUgSGlud2Vpc2UgenVtIERhdGVuc2NodXR6IGVudHNwcmVjaGVuZCBhbnBhc3Nlbi4gQml0dGUgYmVhY2h0ZW4gU2llIGRhaGVyIGRpZSBqZXdlaWxzIGFrdHVlbGxlIFZlcnNpb24gdW5zZXJlciBEYXRlbnNjaHV0emVya2wmYXVtbDtydW5nLgoKQXVza3VuZnRzcmVjaHQKU2llIGhhYmVuIGplZGVyemVpdCBkYXMgUmVjaHQgYXVmIEF1c2t1bmZ0ICZ1dW1sO2JlciBkaWUgYmV6JnV1bWw7Z2xpY2ggSWhyZXIgUGVyc29uIGdlc3BlaWNoZXJ0ZW4gRGF0ZW4sIGRlcmVuIEhlcmt1bmZ0IHVuZCBFbXBmJmF1bWw7bmdlciBzb3dpZSBkZW4gWndlY2sgZGVyIERhdGVudmVyYXJiZWl0dW5nLiBBdXNrdW5mdCAmdXVtbDtiZXIgZGllIGdlc3BlaWNoZXJ0ZW4gRGF0ZW4gayZvdW1sO25uZW4gU2llIHVudGVyIGluZm9Ab3Rycy5jb20gYW5mb3JkZXJuLgoKV2VpdGVyZSBJbmZvcm1hdGlvbmVuCklociBWZXJ0cmF1ZW4gaXN0IHVucyB3aWNodGlnLiBEYWhlciBnZWJlbiB3aXIgSWhuZW4gZ2VybmUgamVkZXJ6ZWl0IEF1c2t1bmZ0ICZ1dW1sO2JlciBkaWUgVmVyYXJiZWl0dW5nIElocmVyIHBlcnNvbmVuYmV6b2dlbmVuIERhdGVuLiBXZW5uIFNpZSBGcmFnZW4gaGFiZW4sIGRpZSBJaG5lbiBkaWVzZSBEYXRlbnNjaHV0emVya2wmYXVtbDtydW5nIG5pY2h0IGJlYW50d29ydGVuIGtvbm50ZSBvZGVyIHdlbm4gU2llIHdlaXRlcmUgSW5mb3JtYXRpb25lbiB6dSBlaW5lbSBQdW5rdCB3JnV1bWw7bnNjaGVuLCB3ZW5kZW4gU2llIHNpY2ggYml0dGUgbWl0IGVpbmVyIEUtTWFpbCBhbiBpbmZvQG90cnMuY29tLgogICAgICAgICAgPC90ZXh0YXJlYT4KPCEtLSBkdGw6YmxvY2s6Q29uZmlkZW50aWFsQ29udGVudERFIC0tPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWxDb250ZW50RU4gLS0+CiAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ29uZmlkZW50aWFsIiByb3dzPSIyMiIgY29scz0iNzgiIHdyYXA9IiRFbnZ7IkJyb3dzZXJXcmFwIn0iIHJlYWRvbmx5PkRhdGEgUHJvdGVjdGlvbgoKSGVyZSBhdCBPVFJTIEFHIHdlIHRha2UgdGhlIHByb3RlY3Rpb24gb2YgeW91ciBwZXJzb25hbCBkZXRhaWxzIHZlcnkgc2VyaW91c2x5IGFuZCBzdHJpY3RseSBhZGhlcmUgdG8gZGF0YSBwcm90ZWN0aW9uIGxhd3MuIEFsbCBwYXNzd29yZHMgYXJlIGF1dG9tYXRpY2FsbHkgbWFkZSB1bnJlY29nbml6YWJsZSBiZWZvcmUgdGhlIGluZm9ybWF0aW9uIGlzIHNlbnQuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCBhbnkgZGF0YSB3ZSBvYnRhaW4gYmUgc29sZCBvciBwYXNzZWQgb24gdG8gdW5hdXRob3JpemVkIHRoaXJkIHBhcnRpZXMuClRoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb24gcHJvdmlkZXMgeW91IHdpdGggYW4gb3ZlcnZpZXcgb2YgaG93IHdlIGd1YXJhbnRlZSB0aGlzIHByb3RlY3Rpb24gYW5kIHdoaWNoIHR5cGUgb2YgZGF0YSBpcyBjb2xsZWN0ZWQgZm9yIHdoaWNoIHB1cnBvc2UuCgpEYXRhIEhhbmRsaW5nIHdpdGggJ1N1cHBvcnQgTW9kdWxlJwpJbmZvcm1hdGlvbiByZWNlaXZlZCB0aHJvdWdoIHRoZSAnU3VwcG9ydCBNb2R1bGUnIGlzIHNhdmVkIGJ5IE9UUlMgQUcuIFRoaXMgb25seSBhcHBsaWVzIHRvIGRhdGEgdGhhdCBPVFJTIEFHIHJlcXVpcmVzIHRvIGFuYWx5emUgdGhlIHBlcmZvcm1hbmNlIGFuZCBmdW5jdGlvbiBvZiB0aGUgT1RSUyBzZXJ2ZXIgb3IgdG8gZXN0YWJsaXNoIGNvbnRhY3QuCgpTYWZldHkgb2YgUGVyc29uYWwgRGV0YWlscwpPVFJTIEFHIHByb3RlY3RzIHlvdXIgcGVyc29uYWwgZGF0YSBmcm9tIHVuYXV0aG9yaXplZCBhY2Nlc3MsIHVzZSBvciBwdWJsaWNhdGlvbi4gT1RSUyBBRyBlbnN1cmVzIHRoYXQgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHlvdSBzdG9yZSBvbiB0aGUgc2VydmVyIGlzIHByb3RlY3RlZCBmcm9tIHVuYXV0aG9yaXplZCBhY2Nlc3MgYW5kIHB1YmxpY2F0aW9uLgoKRGlzY2xvc3VyZSBvZiBEZXRhaWxzCk9UUlMgQUcgd2lsbCBub3QgcGFzcyBvbiB5b3VyIGRldGFpbHMgdG8gdGhpcmQgcGFydGllcyB1bmxlc3MgcmVxdWlyZWQgZm9yIGJ1c2luZXNzIHRyYW5zYWN0aW9ucy4KT1RSUyBBRyB3aWxsIG9ubHkgcGFzcyBvbiB5b3VyIGRldGFpbHMgdG8gZW50aXRsZWQgcHVibGljIGluc3RpdHV0aW9ucyBhbmQgYXV0aG9yaXRpZXMgaWYgcmVxdWlyZWQgYnkgbGF3IG9yIGNvdXJ0IG9yZGVyLgoKQW1lbmRtZW50IG9mIERhdGEgUHJvdGVjdGlvbiBQb2xpY3kKT1RSUyBBRyByZXNlcnZlcyB0aGUgcmlnaHQgdG8gYW1lbmQgdGhpcyBzZWN1cml0eSBhbmQgZGF0YSBwcm90ZWN0aW9uIHBvbGljeSBpZiByZXF1aXJlZCBieSB0ZWNobmljYWwgZGV2ZWxvcG1lbnRzLiBJbiB0aGlzIGNhc2Ugd2Ugd2lsbCBhbHNvIGFkYXB0IG91ciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgZGF0YSBwcm90ZWN0aW9uIGFjY29yZGluZ2x5LiBQbGVhc2UgcmVndWxhcmx5IHJlZmVyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBvdXIgRGF0YSBQcm90ZWN0aW9uIFBvbGljeS4KClJpZ2h0IHRvIEluZm9ybWF0aW9uCllvdSBoYXZlIHRoZSByaWdodCB0byBkZW1hbmQgaW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgZGF0YSBzYXZlZCBhYm91dCB5b3UsIGl0cyBvcmlnaW4gYW5kIHJlY2lwaWVudHMsIGFzIHdlbGwgYXMgdGhlIHB1cnBvc2Ugb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyBhdCBhbnkgdGltZS4gWW91IGNhbiByZXF1ZXN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYXZlZCBkYXRhIGJ5IHNlbmRpbmcgYW4gZS1tYWlsIHRvIGluZm9Ab3Rycy5jb20uCgpGdXJ0aGVyIEluZm9ybWF0aW9uCllvdXIgdHJ1c3QgaXMgdmVyeSBpbXBvcnRhbnQgdG8gdXMuIFdlIGFyZSB3aWxsaW5nIHRvIGluZm9ybSB5b3UgYWJvdXQgdGhlIHByb2Nlc3Npbmcgb2YgeW91ciBwZXJzb25hbCBkZXRhaWxzIGF0IGFueSB0aW1lLiBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiBhbnN3ZXJlZCBieSB0aGlzIERhdGEgUHJvdGVjdGlvbiBQb2xpY3kgb3IgaWYgeW91IHJlcXVpcmUgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHRvcGljLCBwbGVhc2UgY29udGFjdCBpbmZvQG90cnMuY29tLgoKICAgICAgICAgIDwvdGV4dGFyZWE+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbENvbnRlbnRFTiAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlbmRlckluZm9ybWF0aW9uIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFjY2VwdCBsaWNlbnNlIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMCIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiRG9uJ3QgYWNjZXB0IGxpY2Vuc2UifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWwgLS0+CgojIC0tLQojIC0gU3VwcG9ydG1vZHVsZSBzZW5kZXIgYW5kIHN5c3RlbSBpbmZvcm1hdGlvbgojIC0tLQoKPCEtLSBkdGw6YmxvY2s6U2VuZGVySW5mb3JtYXRpb24gLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPiRFbnZ7IkJveDAifSRUZXh0eyJBZG1pbiBTdXBwb3J0IEluZm8ifSRFbnZ7IkJveDEifTwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWRtaW5TdXBwb3J0JlN1YmFjdGlvbj1Db25maWRlbnRpYWwiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN1Ym1pdCI+CiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjAwcHgiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiVmVuZG9yIFN1cHBvcnQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgo8IS0tIGR0bDpibG9jazpTZW5kZXJJbmZvcm1hdGlvbkhpZGRlbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iJFFEYXRheyJWYWx1ZSJ9Ij4KPCEtLSBkdGw6YmxvY2s6U2VuZGVySW5mb3JtYXRpb25IaWRkZW4gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjYwMHB4IiBjZWxsc3BhY2luZz0iNSIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiRW1haWwifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IlNlbmRlciIgdmFsdWU9IiRRRGF0YXsiU2VuZGVyQWRyZXNzIn0iIHNpemU9IjQwIiByZWFkb25seT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJTYWx1dGF0aW9uIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJTYWx1dGF0aW9uIiB2YWx1ZT0iJFFEYXRheyJTZW5kZXJTYWx1dGF0aW9uIn0iIHNpemU9IjQwIiByZWFkb25seT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJOYW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJTZW5kZXJOYW1lIn0iIHNpemU9IjQwInJlYWRvbmx5PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNvbXBhbnkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IkNvbXBhbnkiIHZhbHVlPSIiIHNpemU9IjQwIj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJTdHJlZXQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9IlRleHQiIG5hbWU9IlN0cmVldCIgdmFsdWU9IiIgc2l6ZT0iNDAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IlppcCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iWmlwIiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiQ2l0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iQ2l0eSIgdmFsdWU9IiIgc2l6ZT0iNDAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IlBob25lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJQaG9uZSIgdmFsdWU9IiIgc2l6ZT0iNDAiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkJ1Z3ppbGxhIElEIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJCdWd6aWxsYUlEIiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIiBhbGlnbj0ianVzdGlmeSI+JFRleHR7IklmIHlvdSd2ZSBhbHJlYWR5IGFkZGVkIGEgQnVnemlsbGEgcmVwb3J0IGF0IGJ1Z3Mub3Rycy5vcmcsIHBsZWFzZSBhZGQgeW91ciBCdWd6aWxsYSBJRCBoZXJlLiJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTZXJ2aWNlIFN1YnNjcmlwdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSIgYWxpZ249Im1pZGRsZSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJTZW5kSW5mbyIgdmFsdWU9IjEiIGNoZWNrZWQ9ImNoZWNrZWQiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iMjUwIiBhbGlnbj0ianVzdGlmeSI+JFRleHR7IlBsZWFzZSByZWNvbW1lbmQgbWUgYSBTZXJ2aWNlIFN1YnNjcmlwdGlvbiB0byBvcHRpbWl6ZSBteSBPVFJTLiJ9IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJEb3dubG9hZCIgdmFsdWU9IiRUZXh0eyJEb3dubG9hZCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlNlbmQiIHZhbHVlPSIkVGV4dHsiU2VuZCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8YnI+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlNlbmRlckluZm9ybWF0aW9uIC0tPgoKIyAtLS0KIyAtIFN1cHBvcnRtb2R1bGUgYmVuY2htYXJrIHJlc3VsdAojIC0tLQoKPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4kRW52eyJCb3gwIn0kVGV4dHsiQmVuY2htYXJrIn0kRW52eyJCb3gxIn08L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlJlc3VsdCJ9OiAkVGV4dHsiJERhdGF7IkhlYWQifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJLZXkifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsdWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjQwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJLZXkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlZhbHVlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDb21tZW50In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QmVuY2htYXJrUmVzdWx0Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkJlbmNobWFya1Jlc3VsdCAtLT4KPCEtLSBlbmQgZm9ybSAtLT4K</File>
+ <File Location="Kernel/System/Support.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN1cHBvcnQucG0sdiAxLjQ0LjIuMSAyMDExLzEyLzE2IDIzOjEwOjE4IGNnIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQYWNrYWdlOwp1c2UgRGlnZXN0OjpNRDUgcXcobWQ1X2hleCk7Cgp1c2UgTUlNRTo6QmFzZTY0Owp1c2UgQXJjaGl2ZTo6VGFyOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQ0LjIuMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQgLSBnbG9iYWwgc3lzdGVtIGluZm9ybWF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCByZXF1aXJlZCBzdXBwb3J0IGluZm9ybWF0aW9uIG9mIGEgcnVubmluZyBPVFJTIHN5c3RlbS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIFN1cHBvcnQgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkU3VwcG9ydE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntEQk9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntYTUxPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntFbWFpbE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntQYWNrYWdlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpQYWNrYWdlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpnZXQgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHBvc3NpYmlsaXR5IGNoZWNrcy4KCiAgICBteSAkTGlzdCA9ICRTdXBwb3J0LT5BZG1pbkNoZWNrc0dldCgpOwoKPWN1dAoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0FkbWluQ2hlY2tzR2V0IHN0YXJ0JywKICAgICk7CgogICAgIyBnZXQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9TeXN0ZW0vU3VwcG9ydC8nOwoKICAgICMgcmVhZCBhbGwgYXZhaWxpYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYiggJERpck5hbWUgLiAnLyoucG0nICk7CgogICAgbXkgJERhdGFIYXNoOwogICAgTU9EVUxFOgogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OiRGaWxlIjsKCiAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKCiAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgbG9hZCAkR2VuZXJpY01vZHVsZSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBNT0RVTEU7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBuZXcgb2JqZWN0CiAgICAgICAgbXkgJFN1cHBvcnRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCAleyRTZWxmfSApOwoKICAgICAgICAjIHJldHVybiBpZiBpbnN0YW5jZSBjYW4gbm90IGJlIGNyZWF0ZWQKICAgICAgICBpZiAoICEkU3VwcG9ydE9iamVjdCApIHsKCiAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mICRHZW5lcmljTW9kdWxlISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IE1PRFVMRTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFkbWluIGNoZWNrIGRhdGEKICAgICAgICBteSAkQWRtaW5DaGVja1JlZiA9ICRTdXBwb3J0T2JqZWN0LT5BZG1pbkNoZWNrc0dldCgpOwoKICAgICAgICAjIGNoZWNrIGlmIHJldHVybiB2YWx1ZSBpcyBhIHZhbGlkIGFycmF5IHJlZmVyZW5jZQogICAgICAgIGlmICggISRBZG1pbkNoZWNrUmVmIHx8IHJlZiAkQWRtaW5DaGVja1JlZiBuZSAnQVJSQVknIHx8ICFAeyRBZG1pbkNoZWNrUmVmfSApIHsKCiAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgY2hlY2tzIG9mICRHZW5lcmljTW9kdWxlIHJldHVybmVkIG5vIGRhdGEhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgTU9EVUxFOwogICAgICAgIH0KCiAgICAgICAgIyBleHRyYWN0IGFsbCB2YWxpZCBlbGVtZW50cwogICAgICAgIG15IEBDbGVhbmRBZG1pbkNoZWNrUmVmID0gZ3JlcCB7IHJlZigkXykgZXEgJ0hBU0gnIH0gQHskQWRtaW5DaGVja1JlZn07CgogICAgICAgICMgYXR0YWNoIHRoZSBjbGVhbmVkIGVsZW1lbnQgYXJyYXkKICAgICAgICAkRGF0YUhhc2gtPnskRmlsZX0gPSBcQENsZWFuZEFkbWluQ2hlY2tSZWY7CiAgICB9CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0FkbWluQ2hlY2tzR2V0IGVuZCcsCiAgICApOwoKICAgIHJldHVybiAkRGF0YUhhc2g7Cn0KCnN1YiBYTUxTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhEYXRhSGFzaCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCByZWYgJFBhcmFte0RhdGFIYXNofSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdEYXRhSGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnWE1MU3RyaW5nQ3JlYXRlIHN0YXJ0JywKICAgICk7CgogICAgbXkgJFhNTEhhc2ggICAgID0gW107CiAgICBteSAkQ291bnRNb2R1bGUgPSAwOwogICAgbXkgJENvdW50SXRlbSAgID0gMDsKICAgIE1PRFVMRToKICAgIGZvciBteSAkTW9kdWxlICgga2V5cyAleyAkUGFyYW17RGF0YUhhc2h9IH0gKSB7CgogICAgICAgICRDb3VudE1vZHVsZSsrOwogICAgICAgICRYTUxIYXNoLT5bMV0tPntTdXBwb3J0SW5mb30tPlsxXS0+e01vZHVsZX0tPlskQ291bnRNb2R1bGVdLT57TmFtZX0gPSAkTW9kdWxlOwoKICAgICAgICBmb3IgbXkgJERhdGFIYXNoUm93ICggQHsgJFBhcmFte0RhdGFIYXNofS0+eyRNb2R1bGV9IH0gKSB7CgogICAgICAgICAgICAkQ291bnRJdGVtKys7CiAgICAgICAgICAgIG15ICREYXRhID0ge307CgogICAgICAgICAgICBFTEVNRU5UOgogICAgICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBrZXlzICV7JERhdGFIYXNoUm93fSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IEVMRU1FTlQgaWYgJEVsZW1lbnQgZXEgJ05hbWUnOwogICAgICAgICAgICAgICAgJERhdGEtPnskRWxlbWVudH0tPlsxXS0+e0NvbnRlbnR9ID0gJERhdGFIYXNoUm93LT57JEVsZW1lbnR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkWE1MSGFzaC0+WzFdLT57U3VwcG9ydEluZm99LT5bMV0tPntNb2R1bGV9LT5bJENvdW50TW9kdWxlXS0+e0l0ZW19LT5bJENvdW50SXRlbV0KICAgICAgICAgICAgICAgID0gJERhdGE7CgogICAgICAgICAgICAkWE1MSGFzaC0+WzFdLT57U3VwcG9ydEluZm99LT5bMV0tPntNb2R1bGV9LT5bJENvdW50TW9kdWxlXS0+e0l0ZW19LT5bJENvdW50SXRlbV0KICAgICAgICAgICAgICAgIC0+e05hbWV9ID0gJERhdGFIYXNoUm93LT57TmFtZX07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRYTUxTdHJpbmcgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2gyWE1MKCBAeyRYTUxIYXNofSApOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdYTUxTdHJpbmdDcmVhdGUgZW5kJywKICAgICk7CgogICAgcmV0dXJuIFwkWE1MU3RyaW5nOwp9CgpzdWIgTG9nTGFzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJMb2dMYXN0ICckUGFyYW17VHlwZX0nIHN0YXJ0IiwKICAgICk7CgogICAgbXkgJExvZ1N0cmluZyA9ICRTZWxmLT57TG9nT2JqZWN0fS0+R2V0TG9nKCBMaW1pdCA9PiAxMjAwICk7CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkxvZ0xhc3QgJyRQYXJhbXtUeXBlfScgZW5kIiwKICAgICk7CgogICAgcmV0dXJuICggXCRMb2dTdHJpbmcsICRQYXJhbXtUeXBlfSAuICcubG9nJyApOwp9CgpzdWIgTW9kdWxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnTW9kdWxlQ2hlY2sgc3RhcnQnLAogICAgKTsKCiAgICBteSAkSG9tZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICBteSAkVG1wU3VtU3RyaW5nOwogICAgbXkgJFRtcExvZzsKICAgIG9wZW4oICRUbXBTdW1TdHJpbmcsICJwZXJsICRIb21lL2Jpbi9vdHJzLmNoZWNrTW9kdWxlcyB8IiApOwoKICAgIHdoaWxlICg8JFRtcFN1bVN0cmluZz4pIHsKICAgICAgICAkVG1wTG9nIC49ICRfOwogICAgfQogICAgY2xvc2UoJFRtcFN1bVN0cmluZyk7CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ01vZHVsZUNoZWNrIGVuZCcsCiAgICApOwoKICAgIHJldHVybiAoIFwkVG1wTG9nLCAnTW9kdWxlQ2hlY2subG9nJyApOwp9CgpzdWIgQVJDSElWRUxvZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdBUkNISVZFTG9nQ3JlYXRlIHN0YXJ0JywKICAgICk7CgogICAgbXkgJEhvbWUgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgbXkgJEFyY2hpdmUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9BUkNISVZFJzsKCiAgICBteSAkSGFuZGxlOwogICAgaWYgKCAhb3BlbiggJEhhbmRsZSwgJzwnLCAkQXJjaGl2ZSApICkgewogICAgICAgIG15ICRBUkNISVZFRW1wdHkgPSAiQ2FuJ3Qgb3BlbiAkQXJjaGl2ZTogJCEiOwoKICAgICAgICAjIGxvZyBpbmZvCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQVJDSElWRUxvZ0NyZWF0ZSBlbmQnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAoIFwkQVJDSElWRUVtcHR5LCAnQVJDSElWRS5sb2cnICk7CiAgICB9CiAgICBiaW5tb2RlICRIYW5kbGU7CiAgICBteSAlQ29tcGFyZTsKICAgIHdoaWxlICg8JEhhbmRsZT4pIHsKICAgICAgICBteSBAUm93ID0gc3BsaXQoIC86Oi8sICRfICk7CiAgICAgICAgY2hvbXAgJFJvd1sxXTsKICAgICAgICAkQ29tcGFyZXsgJFJvd1sxXSB9ID0gJFJvd1swXTsKICAgIH0KICAgIGNsb3NlICRIYW5kbGU7CgogICAgbXkgJVJlc3VsdCA9ICRTZWxmLT5fQVJDSElWRUxvZ0xvb2t1cCgKICAgICAgICBJbiAgICAgID0+ICRIb21lLAogICAgICAgIENvbXBhcmUgPT4gXCVDb21wYXJlLAogICAgICAgIEhvbWUgICAgPT4gJEhvbWUsCiAgICApOwoKICAgIG15ICRBUkNISVZFU3RyaW5nID0gJyc7CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlUmVzdWx0ICkgewogICAgICAgICRBUkNISVZFU3RyaW5nIC49ICIkUmVzdWx0eyRLZXl9XG4iOwogICAgfQoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnbm90aWNlJywgTWVzc2FnZSA9PiAnQVJDSElWRUxvZ0NyZWF0ZSBlbmQnICk7CgogICAgcmV0dXJuICggXCRBUkNISVZFU3RyaW5nLCAnQVJDSElWRS5sb2cnICk7Cn0KCnN1YiBfQVJDSElWRUxvZ0xvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBMaXN0ID0gZ2xvYigiJFBhcmFte0lufS8qIik7CiAgICBGSUxFOgogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIGNsZWFuIHVwIGRpcmVjdG9yeSBuYW1lCiAgICAgICAgJEZpbGUgPX4gcy9cL1wvL1wvL2c7CgogICAgICAgICMgaWdub3RlIGN2cyBkaXJlY3RvcmllcwogICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvRW50cmllc3xSZXBvc2l0b3J5fFJvb3R8Q1ZTfEFSQ0hJVkUvOwoKICAgICAgICAjIGlmIGl0J3MgYSBkaXJlY3RvcnkKICAgICAgICBpZiAoIC1kICRGaWxlICkgewogICAgICAgICAgICAkU2VsZi0+X0FSQ0hJVkVMb2dMb29rdXAoCiAgICAgICAgICAgICAgICBJbiAgICAgID0+ICRGaWxlLAogICAgICAgICAgICAgICAgQ29tcGFyZSA9PiAkUGFyYW17Q29tcGFyZX0sCiAgICAgICAgICAgICAgICBIb21lICAgID0+ICRQYXJhbXtIb21lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBGSUxFOwoKICAgICAgICAgICAgIyBwcmludCAiRGlyZWN0b3J5OiAkRmlsZVxuIjsKICAgICAgICB9CgogICAgICAgICMgaWYgaXQncyBhIGZpbGUKICAgICAgICBteSAkT3JpZ0ZpbGUgPSAkRmlsZTsKICAgICAgICAkRmlsZSA9fiBzL1xRJFBhcmFte0hvbWV9XEUvLzsKICAgICAgICAkRmlsZSA9fiBzL15cLyguKikkLyQxLzsKCiAgICAgICAgIyBpZ25vcmUgdmFyIGRpcmVjdG9yaWVzCiAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC9eZG9jXC8vOwogICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvXnZhclwvdG1wLzsKICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL152YXJcL2FydGljbGUvOwoKICAgICAgICAjIG5leHQgaWYgbm90IHJlYWRhYmxlCiAgICAgICAgbXkgJENvbnRlbnQgPSAnJzsKICAgICAgICBteSAkSW47CiAgICAgICAgaWYgKCAhb3BlbiggJEluLCAnPCcsICRPcmlnRmlsZSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgcmVhZDogJE9yaWdGaWxlOiAkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRklMRTsKICAgICAgICB9CiAgICAgICAgbXkgJGN0eCA9IERpZ2VzdDo6TUQ1LT5uZXc7CiAgICAgICAgJGN0eC0+YWRkZmlsZSgqJEluKTsKICAgICAgICBteSAkRGlnZXN0ID0gJGN0eC0+aGV4ZGlnZXN0KCk7CiAgICAgICAgY2xvc2UgJEluOwogICAgICAgIGlmICggISRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSApIHsKICAgICAgICAgICAgJFBhcmFte0NvbXBhcmV9LT57JEZpbGV9ID0gIk5ldyAkRmlsZSI7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0NvbXBhcmV9LT57JEZpbGV9IG5lICREaWdlc3QgKSB7CiAgICAgICAgICAgICRQYXJhbXtDb21wYXJlfS0+eyRGaWxlfSA9ICJEaWYgJEZpbGUiOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoIGRlZmluZWQgJFBhcmFte0NvbXBhcmV9LT57JEZpbGV9ICkgewogICAgICAgICAgICBkZWxldGUgJFBhcmFte0NvbXBhcmV9LT57JEZpbGV9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJXsgJFBhcmFte0NvbXBhcmV9IH07Cn0KCnN1YiBPcG1JbmZvIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdub3RpY2UnLCBNZXNzYWdlID0+ICdPcG1JbmZvIHN0YXJ0JyApOwoKICAgIG15ICRPcG1JbmZvOwogICAgZm9yIG15ICRQYWNrYWdlICggJFNlbGYtPntQYWNrYWdlT2JqZWN0fS0+UmVwb3NpdG9yeUxpc3QoKSApIHsKICAgICAgICAkT3BtSW5mbwogICAgICAgICAgICAuPSAiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iOwogICAgICAgICRPcG1JbmZvIC49ICJ8IE5hbWU6ICAgICAgICAkUGFja2FnZS0+e05hbWV9LT57Q29udGVudH1cbiI7CiAgICAgICAgJE9wbUluZm8gLj0gInwgVmVyc2lvbjogICAgICRQYWNrYWdlLT57VmVyc2lvbn0tPntDb250ZW50fVxuIjsKICAgICAgICAkT3BtSW5mbyAuPSAifCBWZW5kb3I6ICAgICAgJFBhY2thZ2UtPntWZW5kb3J9LT57Q29udGVudH1cbiI7CiAgICAgICAgJE9wbUluZm8gLj0gInwgVVJMOiAgICAgICAgICRQYWNrYWdlLT57VVJMfS0+e0NvbnRlbnR9XG4iOwogICAgICAgICRPcG1JbmZvIC49ICJ8IExpY2Vuc2U6ICAgICAkUGFja2FnZS0+e0xpY2Vuc2V9LT57Q29udGVudH1cbiI7CiAgICB9CiAgICAkT3BtSW5mbyAuPSAiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnbm90aWNlJywgTWVzc2FnZSA9PiAnT3BtSW5mbyBlbmQnICk7CgogICAgcmV0dXJuICggXCRPcG1JbmZvLCAnSW5zdGFsbGVkUGFja2FnZXMubG9nJyApOwp9CgpzdWIgQXBwbGljYXRpb25BcmNoaXZlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdub3RpY2UnLCBNZXNzYWdlID0+ICdBcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUgc3RhcnQnICk7CgogICAgbXkgJEhvbWUgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgbXkgJEFyY2hpdmUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvdG1wL2FwcGxpY2F0aW9uLnRhcic7CgogICAgaWYgKCAtZiAkQXJjaGl2ZSApIHsKICAgICAgICB1bmxpbmsgJEFyY2hpdmUgfHwgZGllICJDYW4ndCB1bmxpbmsgJEFyY2hpdmU6ICQhIjsKICAgIH0KCiAgICBteSBATGlzdDsKICAgIGZvciBteSAkTGlzdEVsZW1lbnQgKCAkU2VsZi0+RGlyZWN0b3J5RmlsZXMoIERpcmVjdG9yeSA9PiAkSG9tZSApICkgewogICAgICAgIGlmICggLXIgJExpc3RFbGVtZW50ICkgewogICAgICAgICAgICBwdXNoIEBMaXN0LCAkTGlzdEVsZW1lbnQ7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGZpbGVzIHRvIHRoZSB0YXIgYXJjaGl2ZQogICAgbXkgJFRhck9iamVjdCA9IEFyY2hpdmU6OlRhci0+bmV3KCk7CgogICAgJFRhck9iamVjdC0+YWRkX2ZpbGVzKEBMaXN0KTsKCiAgICAjIE1hc2sgUGFzc3dvcmRzIGluIENvbmZpZy5wbQogICAgbXkgJEhvbWVXaXRob3V0U2xhc2ggPSAkSG9tZTsKICAgICRIb21lV2l0aG91dFNsYXNoID1+IHMvXlwvLy87CiAgICBteSAkQ29uZmlnID0gJFRhck9iamVjdC0+Z2V0X2NvbnRlbnQoIiRIb21lV2l0aG91dFNsYXNoL0tlcm5lbC9Db25maWcucG0iKTsKCiAgICBteSBAVHJpbUFjdGlvbiA9IHF3KAogICAgICAgIERhdGFiYXNlUHcKICAgICAgICBTZWFyY2hVc2VyUHcKICAgICAgICBVc2VyUHcKICAgICAgICBTZW5kbWFpbE1vZHVsZTo6QXV0aFBhc3N3b3JkCiAgICAgICAgQXV0aE1vZHVsZTo6UmFkaXVzOjpQYXNzd29yZAogICAgICAgIFBHUDo6S2V5OjpQYXNzd29yZAogICAgICAgIEN1c3RvbWVyOjpBdXRoTW9kdWxlOjpEQjo6Q3VzdG9tZXJQYXNzd29yZAogICAgICAgIEN1c3RvbWVyOjpBdXRoTW9kdWxlOjpSYWRpdXM6OlBhc3N3b3JkCiAgICApOwoKICAgIFNUUklORzoKICAgIGZvciBteSAkU3RyaW5nIChAVHJpbUFjdGlvbikgewogICAgICAgIG5leHQgU1RSSU5HIGlmICEkU3RyaW5nOwogICAgICAgICRDb25maWcgPX4gcy8oXlxzK1wkU2VsZi4qPyRTdHJpbmcuKj89Lio/KVwnLio/XCc7LyQxXCd4eHhcJzsvbWc7CiAgICB9CiAgICAkQ29uZmlnID1+IHMvKF5ccytQYXNzd29yZC4qPz0+Lio/KVwnLio/XCcsLyQxXCd4eHhcJywvbWc7CgogICAgJFRhck9iamVjdC0+cmVwbGFjZV9jb250ZW50KCAiJEhvbWVXaXRob3V0U2xhc2gvS2VybmVsL0NvbmZpZy5wbSIsICRDb25maWcgKTsKICAgIG15ICRXcml0ZSA9ICRUYXJPYmplY3QtPndyaXRlKCAkQXJjaGl2ZSwgMCApOwogICAgaWYgKCAhJFdyaXRlICkgewoKICAgICAgICAjIGxvZyBpbmZvCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUgY2FuJ3Qgd3JpdGUgJEFyY2hpdmU6ICQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFkZCBmaWxlcyB0byB0aGUgdGFyIGFyY2hpdmUKICAgIG15ICRUYXI7CiAgICBpZiAoICFvcGVuKCAkVGFyLCAnPCcsICRBcmNoaXZlICkgKSB7CgogICAgICAgICMgbG9nIGluZm8KICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkFwcGxpY2F0aW9uQXJjaGl2ZUNyZWF0ZSBjYW4ndCByZWFkICRBcmNoaXZlOiAkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgYmlubW9kZSAkVGFyOwogICAgbXkgJFRtcFRhciA9IGRvIHsgbG9jYWwgJC87IDwkVGFyPiB9OwogICAgY2xvc2UgJFRhcjsKCiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ0NvbXByZXNzOjpabGliJykgKSB7CiAgICAgICAgbXkgJEd6VGFyID0gQ29tcHJlc3M6OlpsaWI6Om1lbUd6aXAoJFRtcFRhcik7CgogICAgICAgICMgbG9nIGluZm8KICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdBcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUgQ29tcHJlc3M6OlpsaWIgZW5kJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gKCBcJEd6VGFyLCAnYXBwbGljYXRpb24udGFyLmd6JyApOwogICAgfQoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdBcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUgbm8gQ29tcHJlc3M6OlpsaWIgZW5kJywKICAgICk7CgogICAgcmV0dXJuICggXCRUbXBUYXIsICdhcHBsaWNhdGlvbi50YXInICk7Cn0KCnN1YiBEaXJlY3RvcnlGaWxlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KERpcmVjdG9yeSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhcnRpY2xlIGRpcmVjdG9yeQogICAgbXkgJEFydGljbGVEaXIgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQXJ0aWNsZURpcicpOwoKICAgICMgY2xlYW51cCBmaWxlIG5hbWUKICAgICRBcnRpY2xlRGlyID1+IHMvXC9cLy9cLy9nOwoKICAgICMgdGVtcCBkaXJlY3RvcnkKICAgIG15ICRUZW1wRGlyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBEaXInKTsKCiAgICAjIGNsZWFudXAgZmlsZSBuYW1lCiAgICAkVGVtcERpciA9fiBzL1wvXC8vXC8vZzsKCiAgICAjIHJlc2V0IGZpbGUgY291bnQgb24gaW5pdGlhbCBjYWxsCiAgICBpZiAoICEkUGFyYW17TG9vcH0gKSB7CiAgICAgICAgJFNlbGYtPntEaXJlY3RvcnlGaWxlc0NvdW50fSA9IDA7CiAgICB9CgogICAgIyBjaGVjayBhbGwgJFBhcmFte0RpcmVjdG9yeX0vKiBpbiBob21lIGRpcmVjdG9yeQogICAgbXkgQEZpbGVzOwogICAgbXkgQExpc3QgPSBnbG9iKCIkUGFyYW17RGlyZWN0b3J5fS8qIik7CiAgICBGSUxFOgogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIGNsZWFudXAgZmlsZSBuYW1lCiAgICAgICAgJEZpbGUgPX4gcy9cL1wvL1wvL2c7CgogICAgICAgICMgY2hlY2sgaWYgZGlyZWN0b3J5CiAgICAgICAgaWYgKCAtZCAkRmlsZSApIHsKCiAgICAgICAgICAgICMgZG8gbm90IGluY2x1ZGUgQ1ZTIGRpcmVjdG9yaWVzCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvXC9DVlMvOwoKICAgICAgICAgICAgIyBkbyBub3QgaW5jbHVkZSBhcnRpY2xlIGluIGZpbGUgc3lzdGVtCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAkRmlsZSA9fiAvXFEkQXJ0aWNsZURpclxFL2k7CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIHRtcCBpbiBmaWxlIHN5c3RlbQogICAgICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL1xRJFRlbXBEaXJcRS9pOwoKICAgICAgICAgICAgIyBhZGQgZGlyZWN0b3J5IHRvIGxpc3QKICAgICAgICAgICAgcHVzaCBARmlsZXMsICRTZWxmLT5EaXJlY3RvcnlGaWxlcyggRGlyZWN0b3J5ID0+ICRGaWxlLCBMb29wID0+IDEgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGhpZGRlbiBmaWxlcwogICAgICAgICAgICBuZXh0IEZJTEUgaWYgJEZpbGUgPX4gL15cLi87CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGZpbGVzIHdpdGggIyBpbiBmaWxlIG5hbWUKICAgICAgICAgICAgbmV4dCBGSUxFIGlmICRGaWxlID1+IC8jLzsKCiAgICAgICAgICAgICMgZG8gbm90IGluY2x1ZGUgaWYgZmlsZSBpcyBiaWdnZXIgdGhlIDAuNDUgTUIKICAgICAgICAgICAgbmV4dCBGSUxFIGlmICggLXMgJEZpbGUgPiAoIDEwMjQgKiAxMDI0ICogMC40NSApICk7CgogICAgICAgICAgICAjIGRvIG5vdCBpbmNsdWRlIGlmIGZpbGUgaXMgbm90IHJlYWRhYmxlCiAgICAgICAgICAgIG5leHQgRklMRSBpZiAhLXIgJEZpbGU7CgogICAgICAgICAgICAjIGFkZCBmaWxlIHRvIGxpc3QKICAgICAgICAgICAgcHVzaCBARmlsZXMsICRGaWxlOwoKICAgICAgICAgICAgIyBjaGVjayB0b3RhbCBjb3VudCBvZiBmaWxlcyAobWF4LiBmaWxlIGNvdW50KQogICAgICAgICAgICBteSAkRmlsZUNvdW50TWF4ID0gOF8wMDA7CiAgICAgICAgICAgICRTZWxmLT57RGlyZWN0b3J5RmlsZXNDb3VudH0rKzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RpcmVjdG9yeUZpbGVzQ291bnR9ID4gJEZpbGVDb3VudE1heCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk1heCBmaWxlIGNvdW50ICgkRmlsZUNvdW50TWF4KSBmb3IgYXBwbGljYXRpb24gYXJjaGl2ZSByZWFjaGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuIEBGaWxlczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQEZpbGVzOwp9CgpzdWIgR2V0SW5zdGFsbGVkUHJvZHVjdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdHZXRJbnN0YWxsZWRQcm9kdWN0IHN0YXJ0JywKICAgICk7CgogICAgbXkgJFByb2R1Y3Q7CiAgICBteSAlVG9vbCA9ICgKICAgICAgICBTSVJJT1MgICAgICAgICAgICAgICA9PiAwLAogICAgICAgIElUU00gICAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgV0lEQXV0aG9yaW5nICAgICAgICAgPT4gMCwKICAgICAgICBXSURQdWJsaWNhdGlvblN5c3RlbSA9PiAwLAogICAgKTsKCiAgICAkUHJvZHVjdCA9ICJQcm9kdWN0OiAiIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Byb2R1Y3QnKSAuICcgJwogICAgICAgIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1ZlcnNpb24nKTsKCiAgICBmb3IgbXkgJFBhY2thZ2UgKCAkU2VsZi0+e1BhY2thZ2VPYmplY3R9LT5SZXBvc2l0b3J5TGlzdCgpICkgewogICAgICAgIGZvciBteSAkVG9vbHMgKCBrZXlzICVUb29sICkgewogICAgICAgICAgICBpZiAoICRUb29scyA9fiAvXlxRJFBhY2thZ2UtPntOYW1lfS0+e0NvbnRlbnR9XEUkLyApIHsKICAgICAgICAgICAgICAgIGlmICggJFRvb2x7JFRvb2xzfSA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICRQcm9kdWN0IC49ICIgLyAkUGFja2FnZS0+e05hbWV9LT57Q29udGVudH0iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFRvb2x7JFRvb2xzfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgdGhlIHByb2R1Y3QgbmFtZSAod2hpY2ggY29udGFpbnMgdGhlIElUU00gdmVyc2lvbiwgaWYgSVRTTSBpcyBpbnN0YWxsZWQpCiAgICAkUHJvZHVjdCAuPSAnIC8gJyAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0TmFtZScpOwoKICAgICMgbG9nIGluZm8KICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICdHZXRJbnN0YWxsZWRQcm9kdWN0IGVuZCcsCiAgICApOwoKICAgIHJldHVybiAkUHJvZHVjdDsKfQoKc3ViIFNlbmRJbmZvIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ1NlbmRJbmZvIHN0YXJ0JywKICAgICk7CgogICAgIyBjcmVhdGUgbG9nIHBhY2thZ2UKICAgIG15ICggJExvZ1ByZUNvbnRlbnQsICRMb2dQcmVGaWxlbmFtZSApID0gJFNlbGYtPkxvZ0xhc3QoIFR5cGUgPT4gJ2xvZ19wcmUnICk7CgogICAgIyBjcmVhdGUgY2hlY2sgcGFja2FnZQogICAgbXkgJERhdGFIYXNoID0gJFNlbGYtPkFkbWluQ2hlY2tzR2V0KCk7CiAgICBteSAkWE1MQ2hlY2sgPSAkU2VsZi0+WE1MU3RyaW5nQ3JlYXRlKCBEYXRhSGFzaCA9PiAkRGF0YUhhc2ggKTsKCiAgICAjIGNyZWF0ZSBhcHBsaWNhdGlvbiBwYWNrYWdlCiAgICBteSAoICRDb250ZW50LCAkRmlsZW5hbWUgKSA9ICRTZWxmLT5BcHBsaWNhdGlvbkFyY2hpdmVDcmVhdGUoKTsKCiAgICAjIGNyZWF0ZSBBUkNISVZFIGxvZyBwYWNrYWdlCiAgICBteSAoICRBUkNISVZFQ29udGVudCwgJEFSQ0hJVkVGaWxlbmFtZSApID0gJFNlbGYtPkFSQ0hJVkVMb2dDcmVhdGUoKTsKCiAgICAjIGNyZWF0ZSBPUE0gSW5mbyBwYWNrYWdlIGxpa2UgLi9vcG0ucGwgLWEgbGlzdAogICAgbXkgKCAkT1BNSW5mb0NvbnRlbnQsICRPUE1JbmZvRmlsZW5hbWUgKSA9ICRTZWxmLT5PcG1JbmZvKCk7CgogICAgIyBjcmVhdGUgbW9kdWxlIGNoZWNrIHBhY2thZ2UKICAgIG15ICggJE1vZHVsZUNoZWNrQ29udGVudCwgJE1vZHVsZUNoZWNrRmlsZW5hbWUgKSA9ICRTZWxmLT5Nb2R1bGVDaGVjaygpOwoKICAgICMgY3JlYXRlIGxvZyBwYWNrYWdlCiAgICBteSAoICRMb2dQb3N0Q29udGVudCwgJExvZ1Bvc3RGaWxlbmFtZSApID0gJFNlbGYtPkxvZ0xhc3QoIFR5cGUgPT4gJ2xvZ19wb3N0JyApOwoKICAgICMgY3JlYXRlIG1haWwgYm9keQogICAgbXkgJEJvZHkgPSAnJzsKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtDdXN0b21lckluZm99IH0gKSB7CiAgICAgICAgbXkgJEN1c3RvbWVySW5mb1ZhbHVlID0gJFBhcmFte0N1c3RvbWVySW5mb30tPnskS2V5fSB8fCAnJzsKICAgICAgICAkQm9keSAuPSAiJEtleTokQ3VzdG9tZXJJbmZvVmFsdWVcbiI7CiAgICB9CgogICAgIyBHZXQgdGhlIEZRRE4KICAgIG15ICRGUUROID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZRRE4nKSB8fCAnJzsKICAgICRCb2R5IC49ICJGUUROOiIgLiAkRlFETiAuICJcbiI7CgogICAgIyBHZXQgdGhlIG90cnMgdmVyc2lvbiBhbmQgaWYgaW5zdGFsbGVkIGFkZCBvdGhlciBwcm9kdWN0IGluZm8gbGlrZSBTSVJJT1Mgb3IgSVRTTS4KICAgICRCb2R5IC49ICRTZWxmLT5HZXRJbnN0YWxsZWRQcm9kdWN0KCk7CgogICAgbXkgJFNlbmQgPSAkU2VsZi0+e0VtYWlsT2JqZWN0fS0+U2VuZCgKICAgICAgICBGcm9tICAgICAgID0+ICRQYXJhbXtDdXN0b21lckluZm99LT57U2VuZGVyfSwKICAgICAgICBUbyAgICAgICAgID0+ICdzdXBwb3J0QG90cnMuY29tJywKICAgICAgICBTdWJqZWN0ICAgID0+ICdTdXBwb3J0OjpSZXF1ZXN0OjpBdXRvOjpFbWFpbDo6Q0hFQ0snLAogICAgICAgIFR5cGUgICAgICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgIENoYXJzZXQgICAgPT4gJ3V0Zi04JywKICAgICAgICBCb2R5ICAgICAgID0+ICRCb2R5LAogICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkTG9nUHJlRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRMb2dQcmVDb250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2NoZWNrLnhtbCcsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRYTUxDaGVja30sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC94bWwnLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRDb250ZW50fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkQVJDSElWRUZpbGVuYW1lLAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJHskQVJDSElWRUNvbnRlbnR9LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkTW9kdWxlQ2hlY2tGaWxlbmFtZSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JE1vZHVsZUNoZWNrQ29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRPUE1JbmZvRmlsZW5hbWUsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRPUE1JbmZvQ29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRMb2dQb3N0RmlsZW5hbWUsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkeyRMb2dQb3N0Q29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ1NlbmRJbmZvIGVuZCcsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgRG93bmxvYWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvZyBpbmZvCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAnRG93bmxvYWQgc3RhcnQnLAogICAgKTsKCiAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFksICR3ZCwgJHlkLCAkZHN0ICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwogICAgbXkgJEZpbGVuYW1lID0gIlN1cHBvcnRJbmZvXyRZLSRNLSREIiAuICdfJyAuICIkaC0kbSI7CgogICAgIyBjcmVhdGUgbG9nIHBhY2thZ2UKICAgIG15ICVGaWxlOwogICAgKCAkRmlsZXtMb2dQcmVDb250ZW50fSwgJEZpbGV7TG9nUHJlRmlsZW5hbWV9ICkgPSAkU2VsZi0+TG9nTGFzdCggVHlwZSA9PiAnbG9nX3ByZScgKTsKCiAgICAjIGNyZWF0ZSBjaGVjayBwYWNrYWdlCiAgICBteSAkRGF0YUhhc2ggPSAkU2VsZi0+QWRtaW5DaGVja3NHZXQoKTsKCiAgICAkRmlsZXtDaGVja0NvbnRlbnR9ID0gJFNlbGYtPlhNTFN0cmluZ0NyZWF0ZSggRGF0YUhhc2ggPT4gJERhdGFIYXNoLCApOwogICAgJEZpbGV7Q2hlY2tGaWxlbmFtZX0gPSAnY2hlY2sueG1sJywKCiAgICAgICAgIyBjcmVhdGUgYXBwbGljYXRpb24gcGFja2FnZQogICAgICAgICggJEZpbGV7QXBwQ29udGVudH0sICRGaWxle0FwcEZpbGVuYW1lfSApID0gJFNlbGYtPkFwcGxpY2F0aW9uQXJjaGl2ZUNyZWF0ZSgpOwoKICAgICMgY3JlYXRlIEFSQ0hJVkUgbG9nIHBhY2thZ2UKICAgICggJEZpbGV7QXJjaENvbnRlbnR9LCAkRmlsZXtBcmNoRmlsZW5hbWV9ICkgPSAkU2VsZi0+QVJDSElWRUxvZ0NyZWF0ZSgpOwoKICAgICMgY3JlYXRlIE9QTSBJbmZvIHBhY2thZ2UgbGlrZSAuL29wbS5wbCAtYSBsaXN0CiAgICAoICRGaWxle09QTUluZm9Db250ZW50fSwgJEZpbGV7T1BNSW5mb0ZpbGVuYW1lfSApID0gJFNlbGYtPk9wbUluZm8oKTsKCiAgICAjIGNyZWF0ZSBtb2R1bGUgY2hlY2sgcGFja2FnZQogICAgKCAkRmlsZXtNb2R1bGVDaGVja0NvbnRlbnR9LCAkRmlsZXtNb2R1bGVDaGVja0ZpbGVuYW1lfSApID0gJFNlbGYtPk1vZHVsZUNoZWNrKCk7CgogICAgIyBjcmVhdGUgbG9nIHBhY2thZ2UKICAgICggJEZpbGV7TG9nUG9zdENvbnRlbnR9LCAkRmlsZXtMb2dQb3N0RmlsZW5hbWV9ICkgPSAkU2VsZi0+TG9nTGFzdCggVHlwZSA9PiAnbG9nX3Bvc3QnICk7CgogICAgIyBjcmVhdGUgbWFpbCBib2R5CiAgICBteSAkQm9keSA9ICcnOwogICAgZm9yIG15ICRLZXkgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkQm9keSAuPSAiJEtleTokUGFyYW17JEtleX1cbiI7CiAgICB9CiAgICAkQm9keSAuPSAiRlFETjoiIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZRRE4nKSAuICJcbiI7CiAgICAkQm9keSAuPSAkU2VsZi0+R2V0SW5zdGFsbGVkUHJvZHVjdCgpOwoKICAgICRGaWxle0JvZHlDb250ZW50fSAgPSBcJEJvZHk7CiAgICAkRmlsZXtCb2R5RmlsZW5hbWV9ID0gJ0JvZHkudHh0JzsKCiAgICAjIHNhdmUgYW5kIGNyZWF0ZSBhcmNoaXZlCiAgICBteSAkVGVtcERpciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUZW1wRGlyJykgLiAnL3N1cHBvcnRpbmZvLyc7CgogICAgaWYgKCAhLWQgJFRlbXBEaXIgKSB7CiAgICAgICAgbWtkaXIgJFRlbXBEaXI7CiAgICB9CgogICAgIyByZW1vdmUgYWxsIGZpbGVzCiAgICBteSBATGlzdE9sZCA9IGdsb2IoICRUZW1wRGlyIC4gJy8qJyApOwogICAgZm9yIG15ICRGaWxlIChATGlzdE9sZCkgewogICAgICAgIHVubGluayAkRmlsZTsKICAgIH0KCiAgICBteSBATGlzdDsKICAgIGZvciBteSAkS2V5IChxdyhCb2R5IExvZ1ByZSBDaGVjayBBcHAgQXJjaCBNb2R1bGVDaGVjayBMb2dQb3N0IE9QTUluZm8pKSB7CiAgICAgICAgaWYgKCAkRmlsZXsgJEtleSAuICdGaWxlbmFtZScgfSAmJiAkRmlsZXsgJEtleSAuICdDb250ZW50JyB9ICkgewogICAgICAgICAgICBteSAkRmlsZW5hbWUgPSAkVGVtcERpciAuICcvJyAuICRGaWxleyAkS2V5IC4gJ0ZpbGVuYW1lJyB9OwogICAgICAgICAgICBvcGVuKCBteSAkT3V0LCAnPicsICRGaWxlbmFtZSApOwogICAgICAgICAgICBiaW5tb2RlKCRPdXQpOwogICAgICAgICAgICBwcmludCAkT3V0ICR7ICRGaWxleyAkS2V5IC4gJ0NvbnRlbnQnIH0gfTsKICAgICAgICAgICAgY2xvc2UgJE91dDsKICAgICAgICAgICAgcHVzaCBATGlzdCwgJEZpbGVuYW1lOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBmaWxlcyB0byB0aGUgdGFyIGFyY2hpdmUKICAgIG15ICRBcmNoaXZlICAgPSAkVGVtcERpciAuICcvJyAuICRGaWxlbmFtZTsKICAgIG15ICRUYXJPYmplY3QgPSBBcmNoaXZlOjpUYXItPm5ldygpOwogICAgJFRhck9iamVjdC0+YWRkX2ZpbGVzKEBMaXN0KTsKICAgICRUYXJPYmplY3QtPndyaXRlKCAkQXJjaGl2ZSwgMCApIHx8IGRpZSAiQ291bGQgbm90IHdyaXRlOiAkXyEiOwoKICAgICMgYWRkIGZpbGVzIHRvIHRoZSB0YXIgYXJjaGl2ZQogICAgb3BlbiggbXkgJFRhciwgJzwnLCAkQXJjaGl2ZSApOwogICAgYmlubW9kZSAkVGFyOwogICAgbXkgJFRtcFRhciA9IGRvIHsgbG9jYWwgJC87IDwkVGFyPiB9OwogICAgY2xvc2UgJFRhcjsKCiAgICAjIHJlbW92ZSBhbGwgZmlsZXMKICAgIEBMaXN0T2xkID0gZ2xvYiggJFRlbXBEaXIgLiAnLyonICk7CiAgICBmb3IgbXkgJEZpbGUgKEBMaXN0T2xkKSB7CiAgICAgICAgdW5saW5rICRGaWxlOwogICAgfQoKICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgnQ29tcHJlc3M6OlpsaWInKSApIHsKICAgICAgICBteSAkR3pUYXIgPSBDb21wcmVzczo6WmxpYjo6bWVtR3ppcCgkVG1wVGFyKTsKCiAgICAgICAgIyBsb2cgaW5mbwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0Rvd25sb2FkIENvbXByZXNzOjpabGliIGVuZCcsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICggXCRHelRhciwgJEZpbGVuYW1lIC4gJy50YXIuZ3onICk7CiAgICB9CgogICAgIyBsb2cgaW5mbwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0Rvd25sb2FkIG5vIENvbXByZXNzOjpabGliIGVuZCcsCiAgICApOwoKICAgIHJldHVybiAoIFwkVG1wVGFyLCAkRmlsZW5hbWUgLiAnLnRhcicgKTsKfQoKc3ViIEJlbmNobWFyayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRJbnNlcnQgPSAkUGFyYW17SW5zZXJ0fTsKICAgIG15ICRVcGRhdGUgPSAkUGFyYW17VXBkYXRlfTsKICAgIG15ICRTZWxlY3QgPSAkUGFyYW17U2VsZWN0fTsKICAgIG15ICRNb2RlICAgPSAkUGFyYW17TW9kZX07CgogICAgZm9yICggMSAuLiAkTW9kZSApIHsKICAgICAgICAkU2VsZi0+eyJEQk9iamVjdCRfIn0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldyggJXskU2VsZn0gKTsKICAgIH0KCiAgICAkUGFyYW17SW5zZXJ0VGltZX0gPSAwOwogICAgJFBhcmFte1VwZGF0ZVRpbWV9ID0gMDsKICAgICRQYXJhbXtTZWxlY3RUaW1lfSA9IDA7CiAgICAkUGFyYW17RGVsZXRlVGltZX0gPSAwOwogICAgbXkgJFRpbWVTdGFydCA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKICAgICRTZWxmLT5fU1FMSW5zZXJ0KCAkSW5zZXJ0LCAkTW9kZSApOwogICAgbXkgJFRpbWUxID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgJFNlbGYtPl9TUUxVcGRhdGUoICRVcGRhdGUsICRNb2RlICk7CiAgICBteSAkVGltZTIgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAkU2VsZi0+X1NRTFNlbGVjdCggJFNlbGVjdCwgJE1vZGUgKTsKICAgIG15ICRUaW1lMyA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKICAgICRTZWxmLT5fU1FMRGVsZXRlKCAkSW5zZXJ0LCAkTW9kZSApOwogICAgbXkgJFRpbWU0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgJFBhcmFte0luc2VydFRpbWV9ID0gJFBhcmFte0luc2VydFRpbWV9ICsgJFRpbWUxIC0gJFRpbWVTdGFydDsKICAgICRQYXJhbXtVcGRhdGVUaW1lfSA9ICRQYXJhbXtVcGRhdGVUaW1lfSArICRUaW1lMiAtICRUaW1lMTsKICAgICRQYXJhbXtTZWxlY3RUaW1lfSA9ICRQYXJhbXtTZWxlY3RUaW1lfSArICRUaW1lMyAtICRUaW1lMjsKICAgICRQYXJhbXtEZWxldGVUaW1lfSA9ICRQYXJhbXtEZWxldGVUaW1lfSArICRUaW1lNCAtICRUaW1lMzsKCiAgICBteSAkSW5zZXJ0VGltZSA9ICggJFBhcmFte0luc2VydFRpbWV9IC8gJE1vZGUgKSAqICggMTAwMDAgLyAkSW5zZXJ0ICk7CiAgICBpZiAoICRJbnNlcnRUaW1lIDw9IDMgKSB7CiAgICAgICAgJFBhcmFte0luc2VydE1vb2R9ICAgID0gJzotKSc7CiAgICAgICAgJFBhcmFte0luc2VydENvbW1lbnR9ID0gJyRUZXh0eyJMb29rcyBmaW5lISJ9JywKICAgIH0KICAgIGVsc2lmICggJEluc2VydFRpbWUgPD0gNSApIHsKICAgICAgICAkUGFyYW17SW5zZXJ0TW9vZH0gICAgPSAnOi18JzsKICAgICAgICAkUGFyYW17SW5zZXJ0Q29tbWVudH0gPSAnJFRleHR7Ik9rIn0nOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0luc2VydE1vb2R9ID0gJzotKCc7CiAgICAgICAgbXkgJFNob3VsZFRha2UgPSBpbnQoICRNb2RlICogNSApOwogICAgICAgICRQYXJhbXtJbnNlcnRDb21tZW50fQogICAgICAgICAgICA9ICckVGV4dHsiU2hvdWxkIG5vdCB0YWtlIG1vcmUgdGhhbiAlcyBvbiBhbiBhdmVyYWdlIHN5c3RlbS4iLCAiJyAuICRTaG91bGRUYWtlIC4gJ3MifScsCiAgICB9CgogICAgbXkgJFVwZGF0ZVRpbWUgPSAoICRQYXJhbXtVcGRhdGVUaW1lfSAvICRNb2RlICkgKiAoIDEwMDAwIC8gJFVwZGF0ZSApOwogICAgaWYgKCAkVXBkYXRlVGltZSA8PSA1ICkgewogICAgICAgICRQYXJhbXtVcGRhdGVNb29kfSAgICA9ICc6LSknOwogICAgICAgICRQYXJhbXtVcGRhdGVDb21tZW50fSA9ICckVGV4dHsiTG9va3MgZmluZSEifScsCiAgICB9CiAgICBlbHNpZiAoICRVcGRhdGVUaW1lIDw9IDkgKSB7CiAgICAgICAgJFBhcmFte1VwZGF0ZU1vb2R9ICAgID0gJzotfCc7CiAgICAgICAgJFBhcmFte1VwZGF0ZUNvbW1lbnR9ID0gJyRUZXh0eyJPayJ9JzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtVcGRhdGVNb29kfSA9ICc6LSgnOwogICAgICAgIG15ICRTaG91bGRUYWtlID0gaW50KCAkTW9kZSAqIDkgKTsKICAgICAgICAkUGFyYW17VXBkYXRlQ29tbWVudH0KICAgICAgICAgICAgPSAnJFRleHR7IlNob3VsZCBub3QgdGFrZSBtb3JlIHRoYW4gJXMgb24gYW4gYXZlcmFnZSBzeXN0ZW0uIiwgIicgLiAkU2hvdWxkVGFrZSAuICdzIn0nLAogICAgfQoKICAgIG15ICRTZWxlY3RUaW1lID0gKCAkUGFyYW17U2VsZWN0VGltZX0gLyAkTW9kZSApICogKCAxMDAwMCAvICRTZWxlY3QgKTsKICAgIGlmICggJFNlbGVjdFRpbWUgPD0gNSApIHsKICAgICAgICAkUGFyYW17U2VsZWN0TW9vZH0gICAgPSAnOi0pJzsKICAgICAgICAkUGFyYW17U2VsZWN0Q29tbWVudH0gPSAnJFRleHR7Ikxvb2tzIGZpbmUhIn0nLAogICAgfQogICAgZWxzaWYgKCAkU2VsZWN0VGltZSA8PSA2ICkgewogICAgICAgICRQYXJhbXtTZWxlY3RNb29kfSAgICA9ICc6LXwnOwogICAgICAgICRQYXJhbXtTZWxlY3RDb21tZW50fSA9ICckVGV4dHsiT2sifSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17U2VsZWN0TW9vZH0gPSAnOi0oJzsKICAgICAgICBteSAkU2hvdWxkVGFrZSA9IGludCggJE1vZGUgKiA2ICk7CiAgICAgICAgJFBhcmFte1NlbGVjdENvbW1lbnR9CiAgICAgICAgICAgID0gJyRUZXh0eyJTaG91bGQgbm90IHRha2UgbW9yZSB0aGFuICVzIG9uIGFuIGF2ZXJhZ2Ugc3lzdGVtLiIsICInIC4gJFNob3VsZFRha2UgLiAncyJ9JywKICAgIH0KCiAgICBteSAkRGVsZXRlVGltZSA9ICggJFBhcmFte0RlbGV0ZVRpbWV9IC8gJE1vZGUgKTsKICAgIGlmICggJERlbGV0ZVRpbWUgPD0gNCApIHsKICAgICAgICAkUGFyYW17RGVsZXRlTW9vZH0gICAgPSAnOi0pJzsKICAgICAgICAkUGFyYW17RGVsZXRlQ29tbWVudH0gPSAnJFRleHR7Ikxvb2tzIGZpbmUhIn0nLAogICAgfQogICAgZWxzaWYgKCAkRGVsZXRlVGltZSA8PSA1ICkgewogICAgICAgICRQYXJhbXtEZWxldGVNb29kfSAgICA9ICc6LXwnOwogICAgICAgICRQYXJhbXtEZWxldGVDb21tZW50fSA9ICckVGV4dHsiT2sifSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17RGVsZXRlTW9vZH0gPSAnOi0oJzsKICAgICAgICBteSAkU2hvdWxkVGFrZSA9IGludCggJE1vZGUgKiA1ICk7CiAgICAgICAgJFBhcmFte0RlbGV0ZUNvbW1lbnR9CiAgICAgICAgICAgID0gJyRUZXh0eyJTaG91bGQgbm90IHRha2UgbW9yZSB0aGFuICVzIG9uIGFuIGF2ZXJhZ2Ugc3lzdGVtLiIsICInIC4gJFNob3VsZFRha2UgLiAncyJ9JywKICAgIH0KCiAgICByZXR1cm4gJVBhcmFtOwp9CgpzdWIgX1NRTEluc2VydCB7CiAgICBteSAoICRTZWxmLCAkQ291bnQsICRNb2RlICkgPSBAXzsKCiAgICBmb3IgbXkgJEMgKCAxIC4uICRDb3VudCApIHsKICAgICAgICBmb3IgbXkgJE0gKCAxIC4uICRNb2RlICkgewogICAgICAgICAgICBteSAkVmFsdWUxID0gImFhYSRDLSRNIjsKICAgICAgICAgICAgbXkgJFZhbHVlMiA9ICdiYmInOwogICAgICAgICAgICAkU2VsZi0+eyJEQk9iamVjdCRNIn0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBzdXBwb3J0X2JlbmNoX3Rlc3QgKG5hbWVfYSwgbmFtZV9iKSB2YWx1ZXMgKD8sID8pJywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFZhbHVlMSwgXCRWYWx1ZTIsIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfU1FMVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICRDb3VudCwgJE1vZGUgKSA9IEBfOwoKICAgIG15ICRWYWx1ZTEgPSAnMTExJzsKICAgIG15ICRWYWx1ZTIgPSAnMjIyJzsKICAgIGZvciBteSAkQyAoIDEgLi4gJENvdW50ICkgewogICAgICAgIGZvciBteSAkTSAoIDEgLi4gJE1vZGUgKSB7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICJhYWEkQy0kTSI7CiAgICAgICAgICAgICRTZWxmLT57IkRCT2JqZWN0JE0ifS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBzdXBwb3J0X2JlbmNoX3Rlc3QgU0VUIG5hbWVfYSA9ID8sIG5hbWVfYiA9ID8gV0hFUkUgbmFtZV9hID0gPycsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRWYWx1ZTEsIFwkVmFsdWUyLCBcJFZhbHVlIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfU1FMU2VsZWN0IHsKICAgIG15ICggJFNlbGYsICRDb3VudCwgJE1vZGUgKSA9IEBfOwoKICAgIGZvciBteSAkQyAoIDEgLi4gJENvdW50ICkgewogICAgICAgIGZvciBteSAkTSAoIDEgLi4gJE1vZGUgKSB7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgiYWFhJEMtJE0iKTsKICAgICAgICAgICAgJFNlbGYtPnsiREJPYmplY3QkTSJ9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgbmFtZV9hLCBuYW1lX2IgRlJPTSBzdXBwb3J0X2JlbmNoX3Rlc3QgV0hFUkUgbmFtZV9hID0gJyRWYWx1ZSciLAogICAgICAgICAgICApOwogICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+eyJEQk9iamVjdCRNIn0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdGhpbmcKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1NRTERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAkQ291bnQsICRNb2RlICkgPSBAXzsKCiAgICBmb3IgbXkgJEMgKCAxIC4uICRDb3VudCApIHsKICAgICAgICBmb3IgbXkgJE0gKCAxIC4uICRNb2RlICkgewogICAgICAgICAgICBteSAkVmFsdWUgPSAiMTExJEMtJE0iOwogICAgICAgICAgICAkU2VsZi0+eyJEQk9iamVjdCRNIn0tPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gc3VwcG9ydF9iZW5jaF90ZXN0IFdIRVJFIG5hbWVfYSA9ID8nLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkVmFsdWUgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNDQuMi4xICQgJERhdGU6IDIwMTEvMTIvMTYgMjM6MTA6MTggJAoKPWN1dAo=</File>
+ <File Location="Kernel/System/Support/Database.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGFiYXNlLnBtLHYgMS4xMiAyMDEwLzAyLzA5IDE5OjU0OjE3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uIHRvIGEgcnVubmluZyBPVFJTIGhvc3QuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBEYXRhYmFzZSBpbmZvIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2UtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBBZG1pbkNoZWNrcyBpbmZvcm1hdGlvbi4KCiREYXRhYmFzZUFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZGF0YWJhc2VzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiAgICAjICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwogICAgIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IGluZm9ybWF0aW9uIGFib3V0IHVzZWQgZGF0YWJhc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAjIHRyeSB0byBmaW5kIG91dCB3aGljaCB0aWNrZXQgZGF0YWJhc2UgaXMgY29uZmlndXJlZAogICAgbXkgJERhdGFiYXNlVHlwZSA9ICRTZWxmLT57REJPYmplY3R9LT57J0RCOjpUeXBlJ307CgogICAgIyB0cnkgdG8gZ2V0IGF2YWlsYWJsZSBtb2R1bGVzIGFuZCB0aGUgZGlyZWN0b3J5IG5hbWUKICAgIG15ICREaXJOYW1lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvS2VybmVsL1N5c3RlbS9TdXBwb3J0L0RhdGFiYXNlIjsKCiAgICAjIHJlYWQgYWxsIGF2YWlsYWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoICREaXJOYW1lIC4gIi8qLnBtIiApOwogICAgZm9yIG15ICRGaWxlIChATGlzdCkgewoKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgaWYgKCAkRGF0YWJhc2VUeXBlID1+IC9PREJDL2kgKSB7CiAgICAgICAgICAgICREYXRhYmFzZVR5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGF0YWJhc2U6OlR5cGUnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkRGF0YWJhc2VUeXBlID1+IC9eJEZpbGUvaSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjokRmlsZSI7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKICAgICAgICAgICAgICAgIGlmICgkU3VwcG9ydE9iamVjdCkgewogICAgICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5BZG1pbkNoZWNrc0dldCgpOwogICAgICAgICAgICAgICAgICAgIGlmICggJEFycmF5UmVmICYmIHJlZigkQXJyYXlSZWYpIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7JERhdGFBcnJheX0sIEB7JEFycmF5UmVmfSApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEyICQgJERhdGU6IDIwMTAvMDIvMDkgMTk6NTQ6MTcgJAoKPWN1dAo=</File>
+ <File Location="Kernel/System/Support/OS.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PUy5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9TLnBtLHYgMS4xNSAyMDEwLzAyLzA5IDIxOjI5OjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpPUzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5hbWVzIG9mIGF2YWlsYWJsZSBjaGVja3MgZnJvbSBzeXNjb25maWcKICAgIG15ICRDaGVja3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6T1MnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gc29ydCBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9EaXN0cmlidXRpb25DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXR1cm5IYXNoID0ge307CgogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoICReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGRhcndpbikvaSApIHsKICAgICAgICBteSAkVG1wTGluZSA9ICIiOwogICAgICAgIG15ICREaXN0cmlidXRpb247CiAgICAgICAgaWYgKCBvcGVuKCAkRGlzdHJpYnV0aW9uLCAnPCcsICIvZXRjL2lzc3VlIiApICkgewogICAgICAgICAgICB3aGlsZSAoPCREaXN0cmlidXRpb24+KSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkRGlzdHJpYnV0aW9uKTsKICAgICAgICAgICAgaWYgKCRUbXBMaW5lKSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL1xcLiovLzsKICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXG4vL2c7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRGlzdHJpYnV0aW9uJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlwiJFRtcExpbmVcIiBpcyB1c2VkLiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAiQ2FuXCd0IGZpbmQgL2V0Yy9pc3N1ZS4uLiIsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luL2kgKSB7CiAgICAgICAgcmVxdWlyZSBXaW4zMjsKICAgICAgICBteSAkV2luVmVyc2lvbiA9IFdpbjMyOjpHZXRPU05hbWUoKTsKICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJTaG93cyB0aGUgdXNlZCBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIiRXaW5WZXJzaW9uIGlzIHVzZWQuIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICB9OwogICAgfQogICAgZWxzaWYgKCAkXk8gPX4gL2ZyZWVic2QvaSApIHsKICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJTaG93cyB0aGUgdXNlZCBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIiReTyBpcyB1c2VkLiIsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9LZXJuZWxJbmZvQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCAkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxmcmVlYnNkfGRhcndpbikvaSApIHsKICAgICAgICBteSAkVG1wTGluZSA9ICIiOwogICAgICAgIG15ICRLZXJuZWxJbmZvOwogICAgICAgIGlmICggb3BlbiggJEtlcm5lbEluZm8sICJ1bmFtZSAtYSB8IiApICkgewogICAgICAgICAgICB3aGlsZSAoPCRLZXJuZWxJbmZvPikgewogICAgICAgICAgICAgICAgJFRtcExpbmUgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEtlcm5lbEluZm8pOwogICAgICAgICAgICBpZiAoJFRtcExpbmUpIHsKICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdLZXJuZWwgVmVyc2lvbicsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIlNob3dzIHRoZSB1c2VkIEtlcm5lbCB2ZXJzaW9uLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlwiJFRtcExpbmVcIiBpcyB1c2VkLiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0tlcm5lbCBWZXJzaW9uJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJTaG93cyB0aGUgdXNlZCBLZXJuZWwgdmVyc2lvbi4iLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhblwndCBleGVjdXRlIHVuYW1lIC1hLi4uIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkXk8gPX4gL3dpbi9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9QZXJsQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwoKICAgICMgY2hlY2sgdmVyaXNvbiBzdHJpbmcKICAgIG15ICRWZXJzaW9uID0gc3ByaW50ZiAiJXZkIiwgJF5WOwogICAgbXkgJE9TICAgICAgPSBzcHJpbnRmICIkXk8iLCAkXlY7CiAgICBpZiAoICRWZXJzaW9uID1+IC8oXGQrKVwuKFxkKylcLihcZCspL2kgKSB7CiAgICAgICAgaWYgKCAkMSA8PSA1ICYmICQyIDw9IDggJiYgJDMgPD0gNyApIHsKICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnUGVybENoZWNrJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBQZXJsIHZlcnNpb24uIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4KICAgICAgICAgICAgICAgICAgICAiWW91ciBQZXJsICRWZXJzaW9uICgkT1MpIGlzIHRvIG9sZCwgeW91IHNob3VsZCB1cGdyYWRlIHRvIFBlcmwgNS44Ljggb3IgaGlnaGVyLiIsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnRmFpbGVkJywKICAgICAgICAgICAgfTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQZXJsQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIFBlcmwgVmVyc2lvbi4iLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlBlcmwgJFZlcnNpb24gKCRPUykgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BlcmxDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBQZXJsIFZlcnNpb24uIiwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIlVuYWJsZSB0byBwYXJzZSB2ZXJzaW9uIHN0cmluZyAoJFZlcnNpb24gLyAkT1MpLiIsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIF9NZW1vcnlTd2FwQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CgogICAgbXkgJE1lbUluZm9GaWxlOwogICAgbXkgJE1lbVRvdGFsOwogICAgbXkgJE1lbUZyZWU7CiAgICBteSAkU3dhcFRvdGFsOwogICAgbXkgJFN3YXBGcmVlOwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCAkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxmcmVlYnNkfGRhcndpbikvaSApIHsKICAgICAgICBpZiAoIG9wZW4oICRNZW1JbmZvRmlsZSwgJzwnLCAiL3Byb2MvbWVtaW5mbyIgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkTWVtSW5mb0ZpbGU+KSB7CiAgICAgICAgICAgICAgICBteSAkVG1wTGluZSA9ICRfOwogICAgICAgICAgICAgICAgaWYgKCAkVG1wTGluZSA9fiAvTWVtVG90YWwvICkgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtVG90YWwgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkVG1wTGluZSA9fiAvTWVtRnJlZS8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRNZW1GcmVlID0gaW50KCRUbXBMaW5lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFRtcExpbmUgPX4gL1N3YXBUb3RhbC8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRTd2FwVG90YWwgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkVG1wTGluZSA9fiAvU3dhcEZyZWUvICkgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkU3dhcEZyZWUgPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRNZW1JbmZvRmlsZSk7CgogICAgICAgICAgICAjIGJ1aWxkIHJldHVybiBoYXNoCiAgICAgICAgICAgIG15ICREZXNjcmlidGlvbgogICAgICAgICAgICAgICAgPSAiVGhlIEhvc3QgU3lzdGVtIGhhczogXG4iCiAgICAgICAgICAgICAgICAuIGludCggJE1lbVRvdGFsIC8gMTAyNCApCiAgICAgICAgICAgICAgICAuICIgTUIgTWVtb3J5IHRvdGFsIFxuIgogICAgICAgICAgICAgICAgLiBpbnQoICRNZW1GcmVlIC8gMTAyNCApCiAgICAgICAgICAgICAgICAuICIgTUIgTWVtb3J5IGZyZWUgXG4iCiAgICAgICAgICAgICAgICAuIGludCggJFN3YXBUb3RhbCAvIDEwMjQgKQogICAgICAgICAgICAgICAgLiAiIE1CIFN3YXAgdG90YWwgXG4iCiAgICAgICAgICAgICAgICAuIGludCggJFN3YXBGcmVlIC8gMTAyNCApCiAgICAgICAgICAgICAgICAuICIgTUIgU3dhcCBmcmVlICI7CgogICAgICAgICAgICBpZiAoICEkU3dhcFRvdGFsICkgewogICAgICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ01lbW9yeSBTd2FwIENoZWNrJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQSBNZW1vcnkgQ2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiBvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIk5vIFN3YXAgZW5hYmxlZCEiLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgKCAoJFN3YXBGcmVlKSAvICgkU3dhcFRvdGFsKSA8IDYwICkKICAgICAgICAgICAgICAgIHx8ICggKCRTd2FwVG90YWwpIC0gKCRTd2FwRnJlZSkgPiAyMDAwMCApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdNZW1vcnkgU3dhcCBDaGVjaycsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJTd2FwRnJlZSA6IFN3YXBUb3RhbCA8IDYwICUgIgogICAgICAgICAgICAgICAgICAgICAgICAuICIgb3IgaWYgbW9yZSB0aGFuIDIwMCBNQiBTd2FwIGlzIHVzZWQuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICIkRGVzY3JpYnRpb24iLAogICAgICAgICAgICAgICAgICAgIENoZWNrICAgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTWVtb3J5IFN3YXAgQ2hlY2snLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJBIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiU3dhcEZyZWUgOiBTd2FwVG90YWwgPCA2MCAlICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAiJERlc2NyaWJ0aW9uIiwKICAgICAgICAgICAgICAgICAgICBDaGVjayAgID0+ICdGYWlsZWQnLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJF5PID1+IC93aW4vaSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgpzdWIgX0NQVUxvYWRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXR1cm5IYXNoID0ge307CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15IEBTcGxpdEFycmF5ID0ge307CgogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoICReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGZyZWVic2R8ZGFyd2luKS9pICkgewogICAgICAgIGlmICggLWUgIi9wcm9jL2xvYWRhdmciICkgewogICAgICAgICAgICBteSAkTG9hZEZpbGU7CiAgICAgICAgICAgIG9wZW4oICRMb2FkRmlsZSwgJzwnLCAiL3Byb2MvbG9hZGF2ZyIgKTsKICAgICAgICAgICAgd2hpbGUgKDwkTG9hZEZpbGU+KSB7CiAgICAgICAgICAgICAgICBAU3BsaXRBcnJheSA9IHNwbGl0KCAiICIsICRfICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJExvYWRGaWxlKTsKCiAgICAgICAgICAgICMgYnVpbGQgcmV0dXJuIGhhc2gKICAgICAgICAgICAgbXkgJERlc2NyaWJ0aW9uCiAgICAgICAgICAgICAgICA9ICJUaGUgSG9zdCBTeXN0ZW0gaGFzIGEgbG9hZDogXG4iCiAgICAgICAgICAgICAgICAuICRTcGxpdEFycmF5WzBdCiAgICAgICAgICAgICAgICAuICIgaW4gdGhlIGxhc3QgMSBtaW51dGUgXG4iCiAgICAgICAgICAgICAgICAuICRTcGxpdEFycmF5WzFdCiAgICAgICAgICAgICAgICAuICIgaW4gdGhlIGxhc3QgNSBtaW51dGVzIFxuIgogICAgICAgICAgICAgICAgLiAkU3BsaXRBcnJheVsyXQogICAgICAgICAgICAgICAgLiAiIGluIHRoZSBsYXN0IDE1IG1pbnV0ZXMiOwoKICAgICAgICAgICAgaWYgKCAkU3BsaXRBcnJheVsyXSA8ICcxLjAwJyApIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdDUFUgTG9hZCcsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgQ1BVIGxvYWQgY2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRoZSBzeXN0ZW0gbG9hZCBpbiB0aGUgbGFzdCAxNSBtaW51dGVzID4gMS4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICA9PiAnT0snLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdDUFUgTG9hZCcsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgQ1BVIGxvYWQgY2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gInRoZSBzeXN0ZW0gbG9hZCBpbiB0aGUgbGFzdCAxNSBtaW51dGVzIDwgMS4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgICA9PiAnRmFpbGVkJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICReTyA9fiAvd2luL2kgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgpzdWIgX0Rpc2tVc2FnZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgICAgPSB7fTsKICAgIG15ICRDaGVjayAgID0gJ09LJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CgogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoICReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGZyZWVic2R8ZGFyd2luKS9pICkgewogICAgICAgIG15ICRJbjsKICAgICAgICBpZiAoIG9wZW4oICRJbiwgImRmIC1seCB0bXBmcyAteCBpc285OTYwIC14IHVkZiB8IiApICkgewogICAgICAgICAgICB3aGlsZSAoPCRJbj4pIHsKICAgICAgICAgICAgICAgIGlmICggJF8gPX4gL14oLis/KVxzLipccyhcZFxkXGR8XGRcZHxcZCklLis/JC8gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkMiA+IDkwICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2hlY2sgbmUgJ0ZhaWxlZCcgJiYgJDIgPiA4NSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIsIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiQxXFskMiVcXSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgaWYgKCAkQ2hlY2sgZXEgJ0ZhaWxlZCcgKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJEaXNrIGlzIGZ1bGwgKCRNZXNzYWdlKS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiRGlzayB1c2FnZSAoJE1lc3NhZ2UpLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEaXNrIFVzYWdlJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGRpc2sgdXNhZ2UuIiwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICB9OwogICAgICAgIHJldHVybiAkRGF0YTsKICAgIH0KfQoKMTsK</File>
+ <File Location="Kernel/System/Support/OTRS.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PVFJTLnBtIC0gYWxsIHJlcXVpcmVkIG90cnMgaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9UUlMucG0sdiAxLjI3IDIwMTAvMDIvMDkgMjE6Mjk6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6Ok9UUlM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UGFja2FnZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpBdXRoOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI3ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBFbmNvZGVPYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1N1cHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57UGFja2FnZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UGFja2FnZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHcm91cE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntBdXRoT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpBdXRoLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6Ok9UUlMnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gc29ydCBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKIyBjaGVjayBpZiBlcnJvciBsb2cgZW50cmllcyBhcmUgYXZhaWxhYmxlCnN1YiBfTG9nQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgVGlja2V0OjpJbmRleE1vZHVsZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnT0snOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIG15ICRFcnJvciAgID0gJyc7CgogICAgbXkgQExpbmVzID0gc3BsaXQoIC9cbi8sICRTZWxmLT57TG9nT2JqZWN0fS0+R2V0TG9nKCkgKTsKICAgIGZvciAoQExpbmVzKSB7CiAgICAgICAgbXkgQFJvdyA9IHNwbGl0KCAvOzsvLCAkXyApOwogICAgICAgIGlmICggJFJvd1szXSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzFdID1+IC9lcnJvci9pICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICdZb3UgaGF2ZSBtb3JlIGVycm9yIGxvZyBlbnRyaWVzOiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAnVGhlcmUgaXMgb25lIGVycm9yIGxvZyBlbnRyeTogJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3IgLj0gJywgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRFcnJvciAuPSAkUm93WzNdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdMb2dDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGxvZyBmb3IgZXJyb3IgbG9nIGVudHJpZXMuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSAuICRFcnJvciwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RpY2tldEluZGV4TW9kdWxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgVGlja2V0OjpJbmRleE1vZHVsZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSAkTW9kdWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkluZGV4TW9kdWxlJyk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdTRUxFQ1QgY291bnQoKikgZnJvbSB0aWNrZXQnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA+IDgwMDAwICkgewogICAgICAgICAgICBpZiAoICRNb2R1bGUgPX4gL1J1bnRpbWVEQi8gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiJFJvd1swXSB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZC4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSb3dbMF0gPiA2MDAwMCApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlID1+IC9SdW50aW1lREIvICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiJFJvd1swXSB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZC4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3UgYXJlIHVzaW5nIFwiJE1vZHVsZVwiLCB0aGF0J3MgZmluZSBmb3IgJFJvd1swXSB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiI7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RpY2tldDo6SW5kZXhNb2R1bGUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBUaWNrZXQ6OkluZGV4TW9kdWxlIHNldHRpbmcuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RpY2tldFN0YXRpY0RCT3JwaGFuZWRSZWNvcmRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIFRpY2tldDo6SW5kZXhNb2R1bGUgY2hlY2sgZm9yIHJlY29yZHMgaW4gU3RhdGljREIgd2hlbiB1c2luZyBkaWZmZXJlbnQgYmFja2VuZAogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSAkTW9kdWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkluZGV4TW9kdWxlJyk7CgogICAgaWYgKCAkTW9kdWxlICF+IC9TdGF0aWNEQi8gKSB7CgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBjb3VudCgqKSBmcm9tIHRpY2tldF9sb2NrX2luZGV4JyApOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICIkUm93WzBdIHRpY2tldHMgaW4gU3RhdGljREIgbG9ja19pbmRleCBidXQgeW91IGFyZSB1c2luZyB0aGUgJE1vZHVsZSBpbmRleC4gUGxlYXNlIHJ1biBvdHJzL2Jpbi9vdHJzLkNsZWFuVGlja2V0SW5kZXgucGwgdG8gY2xlYW4gdGhlIFN0YXRpY0RCIGluZGV4LiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ1NFTEVDVCBjb3VudCgqKSBmcm9tIHRpY2tldF9pbmRleCcgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMF0gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiJFJvd1swXSB0aWNrZXRzIGluIFN0YXRpY0RCIGluZGV4IGJ1dCB5b3UgYXJlIHVzaW5nIHRoZSAkTW9kdWxlIGluZGV4LiBQbGVhc2UgcnVuIG90cnMvYmluL290cnMuQ2xlYW5UaWNrZXRJbmRleC5wbCB0byBjbGVhbiB0aGUgU3RhdGljREIgaW5kZXguIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRNZXNzYWdlID0gIllvdSBhcmUgdXNpbmcgJE1vZHVsZS4gU2tpcHBpbmcgdGVzdC4iOwogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgIH0KICAgIGlmICggJE1lc3NhZ2UgZXEgJycgKSB7CiAgICAgICAgJE1lc3NhZ2UgPSAnTm8gb3JwaGFuZWQgcmVjb3JkcyBmb3VuZC4nOwogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnVGlja2V0U3RhdGljREJPcnBoYW5lZFJlY29yZHMnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBvcnBoYW5lZCBTdGF0aWNEQiByZWNvcmRzLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UaWNrZXRGdWxsdGV4dEluZGV4TW9kdWxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgVGlja2V0OjpJbmRleE1vZHVsZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSAkTW9kdWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlYXJjaEluZGV4TW9kdWxlJyk7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdTRUxFQ1QgY291bnQoKikgZnJvbSBhcnRpY2xlJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPiAxMDAwMDAgKSB7CiAgICAgICAgICAgIGlmICggJE1vZHVsZSA9fiAvUnVudGltZURCLyApIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICIkUm93WzBdIGFydGljbGVzIGluIHlvdXIgc3lzdGVtLiBZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZCBmb3IgT1RSUyAyLjMgYW5kIGhpZ2hlci4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSb3dbMF0gPiA1MDAwMCApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlID1+IC9SdW50aW1lREIvICkgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiJFJvd1swXSBhcnRpY2xlcyBpbiB5b3VyIHN5c3RlbS4gWW91IHNob3VsZCB1c2UgdGhlIFN0YXRpY0RCIGJhY2tlbmQgZm9yIE9UUlMgMi4zIGFuZCBoaWdoZXIuIFNlZSBhZG1pbiBtYW51YWwgKFBlcmZvcm1hbmNlIFR1bmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICA9ICJZb3UgYXJlIHVzaW5nIFwiJE1vZHVsZVwiLCB0aGF0J3MgZmluZSBmb3IgJFJvd1swXSBhcnRpY2xlcyBpbiB5b3VyIHN5c3RlbS4iOwogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdUaWNrZXQ6OlNlYXJjaEluZGV4TW9kdWxlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgVGlja2V0OjpTZWFyY2hJbmRleE1vZHVsZSBzZXR0aW5nLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKIyBPcGVuVGlja2V0Q2hlY2sgY2hlY2sKc3ViIF9PcGVuVGlja2V0Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgIG15ICRDaGVjayAgICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlICAgPSAnJzsKICAgIG15IEBUaWNrZXRJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgU3RhdGVUeXBlICA9PiAnT3BlbicsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICAgICBMaW1pdCAgICAgID0+IDg5OTk5LAogICAgKTsKICAgIGlmICggJCNUaWNrZXRJRHMgPiA4OTk5MCApIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdZb3Ugc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhlbiA4MDAwIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IGN1cnJlbnRseSBoYXZlIG92ZXIgODk5OTkhIEluIGNhc2UgeW91IHdhbnQgdG8gaW1wcm92ZSB5b3VyIHBlcmZvcm1hbmNlLCBjbG9zZSBub3QgbmVlZGVkIG9wZW4gdGlja2V0cy4nOwoKICAgIH0KICAgIGVsc2lmICggJCNUaWNrZXRJRHMgPiAxMDAwMCApIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdZb3Ugc2hvdWxkIG5vdCBoYXZlIG92ZXIgODAwMCBvcGVuIHRpY2tldHMgaW4geW91ciBzeXN0ZW0uIFlvdSBjdXJyZW50bHkgaGF2ZSAnCiAgICAgICAgICAgIC4gJCNUaWNrZXRJRHMKICAgICAgICAgICAgLiAnLiBJbiBjYXNlIHlvdSB3YW50IHRvIGltcHJvdmUgeW91ciBwZXJmb3JtYW5jZSwgY2xvc2Ugbm90IG5lZWRlZCBvcGVuIHRpY2tldHMuJzsKCiAgICB9CiAgICBlbHNpZiAoICQjVGlja2V0SURzID4gODAwMCApIHsKICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1lvdSBzaG91bGQgbm90IGhhdmUgbW9yZSB0aGVuIDgwMDAgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3UgY3VycmVudGx5IGhhdmUgJwogICAgICAgICAgICAuICQjVGlja2V0SURzCiAgICAgICAgICAgIC4gJy4gSW4gY2FzZSB5b3Ugd2FudCB0byBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UsIGNsb3NlIG5vdCBuZWVkZWQgb3BlbiB0aWNrZXRzLic7CgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICRNZXNzYWdlID0gJ1lvdSBoYXZlICcgLiAkI1RpY2tldElEcyAuICcgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLic7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnT3BlblRpY2tldENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKIyBDaGVjayBpZiB0aGUgY29uZmlndXJlZCBGUUROIGlzIHZhbGlkLgpzdWIgX0ZRRE5Db25maWdDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0ZRRE5Db25maWdDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIHRoZSBjb25maWd1cmVkIEZRRE4gaXMgdmFsaWQuJywKICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICBDb21tZW50ICAgICA9PiAnJywKICAgIH07CgogICAgIyBHZXQgdGhlIGNvbmZpZ3VyZWQgRlFETgogICAgbXkgJEZRRE4gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpOwoKICAgICMgRG8gd2UgaGF2ZSBzZXQgb3VyIEZRRE4/CiAgICBpZiAoICRGUUROIGVxICd5b3VyaG9zdC5leGFtcGxlLmNvbScgKSB7CiAgICAgICAgJERhdGEtPntDaGVja30gPSAnRmFpbGVkJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9CiAgICAgICAgICAgID0gIlBsZWFzZSBjb25maWd1cmUgeW91ciBGUUROIGluc2lkZSB0aGUgU3lzQ29uZmlnIG1vZHVsZS4gKGN1cnJlbnRseSB0aGUgZGVmYXVsdCBzZXR0aW5nICckRlFETicgaXMgZW5hYmxlZCkuIjsKICAgIH0KCiAgICAjIEZRRE4gc3ludGF4IGNoZWNrLgogICAgZWxzaWYgKCAkRlFETiA9fiAvXC5cLnxcc3xbXmEtekEtWjAtOS0uXS9nICkgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnRmFpbGVkJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIkludmFsaWQgRlFETiAnJEZRRE4nLiI7CiAgICB9CgogICAgIyBOb3RoaW5nIHRvIGNvbXBsYWluLiA6LSgKICAgIGVsc2UgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnT0snOwogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiRlFETiAnJEZRRE4nIGxvb2tzIGdvb2QuIjsKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKIyBDaGVjayBpZiB0aGUgU3lzdGVtSUQgY29udGFpbnMgb25seSBkaWdpdHMuCnN1YiBfU3lzdGVtSURDb25maWdDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdTeXN0ZW1JRENvbmZpZ0NoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgdGhlIGNvbmZpZ3VyZWQgU3lzdGVtSUQgY29udGFpbnMgb25seSBkaWdpdHMuJywKICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICBDb21tZW50ICAgICA9PiAnJywKICAgIH07CgogICAgIyBHZXQgdGhlIGNvbmZpZ3VyZWQgU3lzdGVtSUQKICAgIG15ICRTeXN0ZW1JRCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTeXN0ZW1JRCcpOwoKICAgICMgRG9lcyB0aGUgU3lzdGVtSUQgY29udGFpbiBub24tZGlnaXRzPwogICAgaWYgKCAkU3lzdGVtSUQgPX4gL15cZCskLyApIHsKICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ09LJzsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIiBZb3VyIFN5c3RlbUlEIHNldHRpbmcgaXMgJFN5c3RlbUlELiIKICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiVGhlIFN5c3RlbUlEICckU3lzdGVtSUQnIG11c3QgY29uc2lzdCBvZiBkaWdpdHMgZXhjbHVzaXZlbHkuIjsKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKIyBDaGVjayBpZiBUaWNrZXQ6OkZyb250ZW5kOjpSZXNwb25zZUZvcm1hdCBpcyB2YWxpZApzdWIgX0NvbmZpZ0NoZWNrVGlja2V0RnJvbnRlbmRSZXNwb25zZUZvcm1hdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdSZXNwb25zZUZvcm1hdENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQgY29udGFpbnMgbm8gJERhdGF7IiJ9LicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0ZhaWxlZCcsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJycsCiAgICB9OwoKICAgICMgR2V0IHRoZSBjb25maWcKICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQnKTsKCiAgICAjIERvZXMgdGhlIFN5c3RlbUlEIGNvbnRhaW4gbm9uLWRpZ2l0cz8KICAgIGlmICggJENvbmZpZyAhfiAvXCREYXRheyIvICkgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnT0snOwogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiIE5vIFwkRGF0YXtcIlwifSBmb3VuZC4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9CiAgICAgICAgICAgID0gIkNvbmZpZyBvcHRpb24gVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VGb3JtYXQgY29pbnRhaW5zIFwkRGF0YXtcIlwifSwgdXNlIFwkUURhdGF7XCJcIn0gaW5zdGFuZCAoc2VlZCBkZWZhdWx0IHNldHRpbmcpLiI7CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfRmlsZVN5c3RlbUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIG15ICREYXRhICAgID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdGaWxlU3lzdGVtQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBpZiBmaWxlIHN5c3RlbSBpcyB3cml0YWJsZS4nLAogICAgICAgIENoZWNrICAgICAgID0+ICdGYWlsZWQnLAogICAgICAgIENvbW1lbnQgICAgID0+ICdUaGUgZmlsZSBzeXN0ZW0gaXMgd3JpdGFibGUuJywKICAgIH07CgogICAgbXkgJEhvbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwoKICAgICMgY2hlY2sgSG9tZQogICAgaWYgKCAhLWUgJEhvbWUgKSB7CiAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdGYWlsZWQnOwogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiTm8gc3VjaCBob21lIGRpcmVjdG9yeTogJEhvbWUhIiwKICAgICAgICAgICAgcmV0dXJuICREYXRhOwogICAgfQogICAgZm9yICgKICAgICAgICBxdygvYmluLyAvS2VybmVsLyAvS2VybmVsL1N5c3RlbS8gL0tlcm5lbC9PdXRwdXQvIC9LZXJuZWwvT3V0cHV0L0hUTUwvIC9LZXJuZWwvTW9kdWxlcy8pCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRGaWxlID0gIiRIb21lLyRfL2NoZWNrX3Blcm1pc3NvbnMuJCQiOwogICAgICAgIGlmICggb3BlbiggbXkgJEZJTEUsICc+JywgIiRGaWxlIiApICkgewogICAgICAgICAgICBwcmludCAkRklMRSAidGVzdCI7CiAgICAgICAgICAgIGNsb3NlKCRGSUxFKTsKICAgICAgICAgICAgdW5saW5rICRGaWxlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRGaWxlKCQhKTsiOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIkNhbid0IHdyaXRlIGZpbGU6ICRNZXNzYWdlIiwKICAgICAgICAgICAgcmV0dXJuICREYXRhOwogICAgfQoKICAgICREYXRhLT57Q2hlY2t9ID0gJ09LJzsKCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfUGFja2FnZURlcGxveUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BhY2thZ2VEZXBsb3lDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRlcGxveW1lbnQgb2YgYWxsIHBhY2thZ2VzLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgICAgICBDb21tZW50ICAgICA9PiAnQWxsIHBhY2thZ2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkLicsCiAgICB9OwoKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBmb3IgbXkgJFBhY2thZ2UgKCAkU2VsZi0+e1BhY2thZ2VPYmplY3R9LT5SZXBvc2l0b3J5TGlzdCgpICkgewogICAgICAgIG15ICREZXBsb3lDaGVjayA9ICRTZWxmLT57UGFja2FnZU9iamVjdH0tPkRlcGxveUNoZWNrKAogICAgICAgICAgICBOYW1lICAgID0+ICRQYWNrYWdlLT57TmFtZX0tPntDb250ZW50fSwKICAgICAgICAgICAgVmVyc2lvbiA9PiAkUGFja2FnZS0+e1ZlcnNpb259LT57Q29udGVudH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkRGVwbG95Q2hlY2sgKSB7CiAgICAgICAgICAgICRNZXNzYWdlIC49ICRQYWNrYWdlLT57TmFtZX0tPntDb250ZW50fSAuICcgJyAuICRQYWNrYWdlLT57VmVyc2lvbn0tPntDb250ZW50fSAuICc7ICc7CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICREYXRhLT57Q2hlY2t9ICAgPSAnQ3JpdGljYWwnOwogICAgICAgICREYXRhLT57Q29tbWVudH0gPSAiUGFja2FnZXMgbm90IGNvcnJlY3RseSBpbnN0YWxsZWQ6ICRNZXNzYWdlLiIsCiAgICB9CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0ludmFsaWRVc2VyTG9ja2VkVGlja2V0U2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgdGhlIGRlZmF1bHQgbWVzc2FnZQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0ludmFsaWRVc2VyTG9ja2VkVGlja2V0U2VhcmNoJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBpbnZhbGlkIHVzZXIgd2l0aCBsb2NrZWQgdGlja2V0cy4nLAogICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJ1RoZXJlIGFyZSBubyBpbnZhbGlkIHVzZXJzIHdpdGggbG9ja2VkIHRpY2tldHMuJywKICAgIH07CgogICAgIyBnZXQgYWxsIHVzZXJzIChiZWNhdXNlIHRoZXJlIGlzIG5vIGZ1bmN0aW9uIHRvIGdldCBhbGwgaW52YWxpZCB1c2VycykKICAgIG15ICVVc2VyTGlzdCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAwCiAgICApOwoKICAgICMgY3JlYXRlIHRoZSBsaXN0IG9mIGludmFsaWQgdXNlcnMKICAgIG15IEBJbnZhbGlkVXNlciA9ICgpOwogICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVVzZXJMaXN0ICkgewogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFVzZXJ7VmFsaWRJRH0gPT0gMiApIHsKICAgICAgICAgICAgcHVzaCBASW52YWxpZFVzZXIsICRVc2VySUQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRGF0YSBpZiAhQEludmFsaWRVc2VyOwoKICAgIG15IEBUaWNrZXRJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICBSZXN1bHQgICA9PiAnQVJSQVknLAogICAgICAgIExvY2tJRHMgID0+IFsyXSwKICAgICAgICBPd25lcklEcyA9PiBcQEludmFsaWRVc2VyLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkRGF0YSBpZiAhQFRpY2tldElEczsKCiAgICBteSAlTG9ja2VkVGlja2V0VXNlciA9ICgpOwogICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJExvY2tlZFRpY2tldFVzZXJ7ICRUaWNrZXR7T3duZXJJRH0gfSA9ICRVc2VyTGlzdHsgJFRpY2tldHtPd25lcklEfSB9OwogICAgfQoKICAgIG15ICRVc2VyU3RyaW5nID0gam9pbiAnLCAnLCB2YWx1ZXMgJUxvY2tlZFRpY2tldFVzZXI7CiAgICAkRGF0YS0+e0NvbW1lbnR9ICAgPSAiVGhlc2UgaW52YWxpZCB1c2VycyBoYXZlIGxvY2tlZCB0aWNrZXRzOiAkVXNlclN0cmluZyIsCiAgICAgICAgJERhdGEtPntDaGVja30gPSAnQ3JpdGljYWwnOwoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9EZWZhdWx0VXNlckNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgdGhlIGRlZmF1bHQgbWVzc2FnZQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RlZmF1bHRVc2VyQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBpZiByb290QGxvY2FsaG9zdCBhY2NvdW50IGhhcyB0aGUgZGVmYXVsdCBwYXNzd29yZC4nLAogICAgICAgIENoZWNrICAgICAgID0+ICdPSycsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJ1RoZXJlIGlzIG5vIGFjdGl2ZSByb290QGxvY2FsaG9zdCB3aXRoIGRlZmF1bHQgcGFzc3dvcmQuJywKICAgIH07CgogICAgIyBnZXQgdXNlcklEIGZvciByb290QGxvY2FsaG9zdCAod2lsbCBwcm9iYWJseSBiZSAxKQogICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMb29rdXAoCiAgICAgICAgVXNlckxvZ2luID0+ICdyb290QGxvY2FsaG9zdCcsCiAgICApOwogICAgcmV0dXJuICREYXRhIGlmICEkVXNlcklEOwoKICAgICMgc2VlIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCBwYXNzd29yZCBhdHRhY2hlZAogICAgbXkgJERlZmF1bHRQYXNzID0gJFNlbGYtPntBdXRoT2JqZWN0fS0+QXV0aCgKICAgICAgICBVc2VyID0+ICdyb290QGxvY2FsaG9zdCcsCiAgICAgICAgUHcgICA9PiAncm9vdCcsCiAgICApOwogICAgcmV0dXJuICREYXRhIGlmICEkRGVmYXVsdFBhc3M7CgogICAgIyBzZWUgaWYgdGhlIGFjY291bnQgaXMgdmFsaWQKICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEICA9PiAkVXNlcklELAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICREYXRhIGlmICElVXNlcjsKCiAgICAkRGF0YS0+e0NvbW1lbnR9ID0gIkNoYW5nZSB0aGUgcGFzc3dvcmQgb3IgaW52YWxpZGF0ZSB0aGUgYWNjb3VudCAncm9vdFxAbG9jYWxob3N0Jy4iOwogICAgJERhdGEtPntDaGVja30gICA9ICdDcml0aWNhbCc7CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RlZmF1bHRTT0FQVXNlckNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1NPQVBDaGVjaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRlZmF1bHQgU09BUCBjcmVkZW50aWFscy4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICdZb3UgaGF2ZSBub3QgZW5hYmxlZCBTT0FQIG9yIGhhdmUgc2V0IHlvdXIgb3duIHBhc3N3b3JkLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ09LJywKICAgIH07CgogICAgbXkgJFNPQVBVc2VyICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTT0FQOjpVc2VyJykgICAgIHx8ICcnOwogICAgbXkgJFNPQVBQYXNzd29yZCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTT0FQOjpQYXNzd29yZCcpIHx8ICcnOwoKICAgIGlmICggJFNPQVBVc2VyIGVxICdzb21lX3VzZXInICkgewogICAgICAgIGlmICggJFNPQVBQYXNzd29yZCBlcSAnc29tZV9wYXNzJyB8fCAkU09BUFBhc3N3b3JkIGVxICcnICkgewogICAgICAgICAgICAkRGF0YS0+e0NoZWNrfSAgID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICdQbGVhc2Ugc2V0IGEgc3Ryb25nIHBhc3N3b3JkIGZvciBTT0FQOjpQYXNzd29yZCBpbiBTeXNDb25maWcuJzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cg==</File>
+ <File Location="Kernel/System/Support/Webserver/IIS.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvSUlTLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSUlTLnBtLHYgMS45IDIwMTAvMDIvMDkgMjE6Mjk6MTYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6SUlTOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OldlYnNlcnZlcjo6SUlTJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjaGVja3Mgc2hvdWxkIGFyZSBlbmFibGVkIGluIHN5c2NvbmZpZwogICAgbXkgQEVuYWJsZWRDaGVja0Z1bmN0aW9uczsKICAgIGlmICggJENoZWNrcyAmJiByZWYgJENoZWNrcyBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGFsbCBlbmFibGVkIGNoZWNrIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgQEVuYWJsZWRDaGVja0Z1bmN0aW9ucyA9IHNvcnQgZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfUGVybEV4Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgY2hlY2sgaWYgQXBhY2hlOjpEQkkgaXMgbG9hZGVkCiAgICBteSAkQ2hlY2sgICA9ICcnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIGlmICggJEVOVnsnR0FURVdBWV9JTlRFUkZBQ0UnfSAmJiAkRU5WeydHQVRFV0FZX0lOVEVSRkFDRSd9ID1+IC9eQ0dJLVBlcmxFeC9pICkgewogICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAkTWVzc2FnZSA9ICJQZXJsRXggaXMgaW4gdXNlICgkRU5WeydHQVRFV0FZX0lOVEVSRkFDRSd9KS4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZSA9ICdZb3Ugc2hvdWxkIHVzZSBQZXJsRXggdG8gaW5jcmVhc2UgeW91ciBwZXJmb3JtYW5jZS4nOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BlcmxFeCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIFBlcmxFeCBpcyB1c2VkLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK</File>
+ <File Location="Kernel/System/Support/Webserver/Apache.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvQXBhY2hlLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQXBhY2hlLnBtLHYgMS4xNCAyMDEwLzAyLzA5IDIxOjI5OjE2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXI6OkFwYWNoZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5hbWVzIG9mIGF2YWlsYWJsZSBjaGVja3MgZnJvbSBzeXNjb25maWcKICAgIG15ICRDaGVja3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6V2Vic2VydmVyOjpBcGFjaGUnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gc29ydCBncmVwIHsgJENoZWNrcy0+eyRffSB9IGtleXMgJXskQ2hlY2tzfTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSByZXN1bHQKICAgIG15IEBEYXRhQXJyYXk7CgogICAgRlVOQ1RJT05OQU1FOgogICAgZm9yIG15ICRGdW5jdGlvbk5hbWUgKEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMpIHsKCiAgICAgICAgIyBwcmVwZW5kIGFuIHVuZGVyc2NvcmUKICAgICAgICAkRnVuY3Rpb25OYW1lID0gJ18nIC4gJEZ1bmN0aW9uTmFtZTsKCiAgICAgICAgIyBydW4gZnVuY3Rpb24gYW5kIGdldCBjaGVjayBkYXRhCiAgICAgICAgbXkgJENoZWNrID0gJFNlbGYtPiRGdW5jdGlvbk5hbWUoKTsKCiAgICAgICAgbmV4dCBGVU5DVElPTk5BTUUgaWYgISRDaGVjazsKCiAgICAgICAgIyBhdHRhY2ggY2hlY2sgZGF0YSBpZiB2YWxpZAogICAgICAgIHB1c2ggQERhdGFBcnJheSwgJENoZWNrOwogICAgfQoKICAgIHJldHVybiBcQERhdGFBcnJheTsKfQoKc3ViIF9BcGFjaGVWZXJzaW9uQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSAgICA9IHt9OwogICAgbXkgJENoZWNrICAgPSAnJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBpZiAoICRFTlZ7U0VSVkVSX1NPRlRXQVJFfSApIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAiWW91IGFyZSBydW5uaW5nICRFTlZ7U0VSVkVSX1NPRlRXQVJFfS4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZSA9ICdDb3VsZCBub3QgZGV0ZXJtaW5lIEFwYWNoZSB2ZXJzaW9uLic7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQXBhY2hlIFZlcnNpb24nLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdEaXNwbGF5IHdlYiBzZXJ2ZXIgdmVyc2lvbi4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQXBhY2hlREJJQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgY2hlY2sgaWYgQXBhY2hlOjpEQkkgaXMgbG9hZGVkCiAgICBteSAkQXBhY2hlREJJID0gMDsKICAgIG15ICRDaGVjayAgICAgPSAnJzsKICAgIG15ICRNZXNzYWdlICAgPSAnJzsKICAgIGlmICggJEVOVntNT0RfUEVSTH0gKSB7CiAgICAgICAgZm9yIG15ICRNb2R1bGUgKCBrZXlzICVJTkMgKSB7CiAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLy86Oi9nOwogICAgICAgICAgICAkTW9kdWxlID1+IHMvXC5wbSQvL2c7CiAgICAgICAgICAgIGlmICggJE1vZHVsZSBlcSAnQXBhY2hlOjpEQkknIHx8ICRNb2R1bGUgZXEgJ0FwYWNoZTI6OkRCSScgKSB7CiAgICAgICAgICAgICAgICAkQXBhY2hlREJJID0gJE1vZHVsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICEkQXBhY2hlREJJICkgewogICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAnQXBhY2hlOjpEQkkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGEgYmV0dGVyIHBlcmZvcm1hbmNlIChwcmUtZXN0YWJsaXNoIGRhdGFiYXNlIGNvbm5lY3Rpb25zKS4nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAkTWVzc2FnZSA9ICRBcGFjaGVEQkk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgSnVzdCBza2lwIHRoaXMgdGVzdCBpZiB3ZScgcmUgbm90IHJ1bm5pbmcgbW9kX3BlcmwuCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FwYWNoZTo6REJJJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgdGhlIHN5c3RlbSB1c2VzIEFwYWNoZTo6REJJLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9BcGFjaGVSZWxvYWRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgIyByZWxvYWQgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgaWYgKCAkRU5We01PRF9QRVJMfSApIHsKICAgICAgICBldmFsICJyZXF1aXJlIG1vZF9wZXJsIjsKICAgICAgICBpZiAoIGRlZmluZWQgJG1vZF9wZXJsOjpWRVJTSU9OICkgewogICAgICAgICAgICBpZiAoICRtb2RfcGVybDo6VkVSU0lPTiA+PSAxLjk5ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgQXBhY2hlOjpSZWxvYWQgaXMgbG9hZGVkCiAgICAgICAgICAgICAgICBteSAkQXBhY2hlUmVsb2FkID0gMDsKICAgICAgICAgICAgICAgIGZvciBteSAkTW9kdWxlICgga2V5cyAlSU5DICkgewogICAgICAgICAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLy86Oi9nOwogICAgICAgICAgICAgICAgICAgICRNb2R1bGUgPX4gcy9cLnBtJC8vZzsKICAgICAgICAgICAgICAgICAgICBpZiAoICRNb2R1bGUgZXEgJ0FwYWNoZTo6UmVsb2FkJyB8fCAkTW9kdWxlIGVxICdBcGFjaGUyOjpSZWxvYWQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQXBhY2hlUmVsb2FkID0gJE1vZHVsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkQXBhY2hlUmVsb2FkICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayA9ICdJbmZvJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICA9ICdBcGFjaGU6OlJlbG9hZCBvciBBcGFjaGUyOjpSZWxvYWQgc2hvdWxkIGJlIHVzZWQgYXMgUGVybE1vZHVsZSBhbmQgUGVybEluaXRIYW5kbGVyIHRvIHByZXZlbnQgd2ViIHNlcnZlciByZXN0YXJ0cyB3aGVuIGluc3RhbGxpbmcgYW5kIHVwZ3JhZGluZyBtb2R1bGVzLic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAkQXBhY2hlUmVsb2FkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgSnVzdCBza2lwIHRoaXMgdGVzdCBpZiB3ZScgcmUgbm90IHJ1bm5pbmcgbW9kX3BlcmwuCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FwYWNoZTo6UmVsb2FkJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgaWYgdGhlIHN5c3RlbSB1c2VzIEFwYWNoZTo6UmVsb2FkL0FwYWNoZTI6OlJlbG9hZC4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfQ0dJQWNjZWxlcmF0b3JDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhID0ge307CgogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBpZiAoICRFTlZ7TU9EX1BFUkx9ICkgewoKICAgICAgICAjIGNoZWNrIG1vZF9wZXJsIHZlcnNpb24KICAgICAgICBpZiAoICRFTlZ7TU9EX1BFUkx9ID1+IC9cLzEuOTkvICkgewogICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiWW91IHVzZSBhIGJldGEgdmVyc2lvbiBvZiBtb2RfcGVybCAoJEVOVntNT0RfUEVSTH0pLCB5b3Ugc2hvdWxkIHVwZ3JhZGUgdG8gYSBzdGFibGUgdmVyc2lvbi4iOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRFTlZ7TU9EX1BFUkx9ID1+IC9cLzEvICkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIllvdSBzaG91bGQgdXBkYXRlIG1vZF9wZXJsIHRvIDIueCAoJEVOVntNT0RfUEVSTH0pLiI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gJEVOVntNT0RfUEVSTH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkRU5We1NFUlZFUl9TT0ZUV0FSRX0gPX4gL2Zhc3RjZ2kvaSApIHsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgJE1lc3NhZ2UgPSAnWW91IGFyZSB1c2luZyBGYXN0Q0dJLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgJE1lc3NhZ2UgPSAnWW91IHNob3VsZCB1c2UgRmFzdENHSSBvciBtb2RfcGVybCB0byBpbmNyZWFzZSB5b3VyIHBlcmZvcm1hbmNlLic7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQ0dJIEFjY2VsZXJhdG9yJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZm9yIENHSSBBY2NlbGVyYXRvci4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cg==</File>
+ <File Location="Kernel/System/Support/Database/oracle.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9vcmFjbGUucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBvcmFjbGUucG0sdiAxLjIyIDIwMTAvMDUvMjggMDc6MjM6MjggbWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjpvcmFjbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIyICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6T3JhY2xlJyk7CgogICAgIyBmaW5kIG91dCB3aGljaCBjaGVja3Mgc2hvdWxkIGFyZSBlbmFibGVkIGluIHN5c2NvbmZpZwogICAgbXkgQEVuYWJsZWRDaGVja0Z1bmN0aW9uczsKICAgIGlmICggJENoZWNrcyAmJiByZWYgJENoZWNrcyBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGFsbCBlbmFibGVkIGNoZWNrIGZ1bmN0aW9uIG5hbWVzCiAgICAgICAgQEVuYWJsZWRDaGVja0Z1bmN0aW9ucyA9IHNvcnQgZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfT3JhY2xlSG9tZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIGNoZWNrIE9SQUNMRV9IT01FCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gT1JBQ0xFX0hPTUUgc2V0dGluZyBmb3VuZC4nOwogICAgaWYgKCAkRU5We09SQUNMRV9IT01FfSApIHsKICAgICAgICBpZiAoICEtZSAkRU5We09SQUNMRV9IT01FfSApIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiT1JBQ0xFX0hPTUUgZG9uJ3QgZXhpc3RzICgkRU5We09SQUNMRV9IT01FfSkuIjsKICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gIllvdXIgT1JBQ0xFX0hvbWUgY29uZmlndXJhdGlvbiBpcyAkRU5We09SQUNMRV9IT01FfS4iOwogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ09SQUNMRV9IT01FJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgT1JBQ0xFX0hPTUUgY29uZmlndXJhdGlvbi4iLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfTkxTTGFuZ0NoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBOTFNfTEFORwogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIE5MU19MQU5HIGNvbmZpZ3VyYXRpb24gZm91bmQuJzsKICAgIGlmICggJEVOVntOTFNfTEFOR30gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgICAgICBpZiAoICRFTlZ7TkxTX0xBTkd9ICF+IC91dGYoXC04fDgpLyApIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TkxTX0xBTkd9LCBuZWVkIC51dGY4IGluIE5MU19MQU5HIChlLiBnLiBnZXJtYW5fZ2VybWFueS51dGY4KS4iOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIllvdXIgTkxTX0xBTkcgY29uZmlndXJhdGlvbiBpcyAkRU5We05MU19MQU5HfS4iOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3VyIE5MU19MQU5HIGNvbmZpZ3VyYXRpb24gaXMgJEVOVntOTFNfTEFOR30iOwogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05MU19MQU5HJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgTkxTX0xBTkcuIiwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX05MU0RhdGVGb3JtYXRDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgTkxTX0RBVEVfRk9STUFUCiAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gTkxTX0RBVEVfRk9STUFUIHNldHRpbmcgZm91bmQuJzsKICAgIGlmICggJEVOVntOTFNfREFURV9GT1JNQVR9ICkgewogICAgICAgIGlmICggJEVOVntOTFNfREFURV9GT1JNQVR9IG5lICJZWVlZLU1NLUREIEhIMjQ6TUk6U1MiICkgewogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiTmVlZCBmb3JtYXQgJ1lZWVktTU0tREQgSEgyNDpNSTpTUycgZm9yIE5MU19EQVRFX0ZPUk1BVCAobm90ICRFTlZ7TkxTX0RBVEVfRk9STUFUfSkuIjsKICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3VyIE5MU19EQVRFX0ZPUk1BVCBzZXR0aW5nIGlzICRFTlZ7TkxTX0RBVEVfRk9STUFUfS4iOwogICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05MU19EQVRFX0ZPUk1BVCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIE5MU19EQVRFX0ZPUk1BVC4iLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfTkxTRGF0ZUZvcm1hdFNlbGVjdENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBOTFNfREFURV9GT1JNQVQKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdOTFNfREFURV9GT1JNQVQgc2VlbXMgdG8gYmUgd3JvbmcnOwogICAgbXkgJENyZWF0ZVRpbWU7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGNyZWF0ZV90aW1lIEZST00gdmFsaWQiLCBMaW1pdCA9PiAxICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDcmVhdGVUaW1lID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoJENyZWF0ZVRpbWUpIHsKICAgICAgICBpZiAoICRDcmVhdGVUaW1lICF+IC9eXGRcZFxkXGQtKFxkfFxkXGQpLShcZHxcZFxkKVxzKFxkfFxkXGQpOihcZHxcZFxkKTooXGR8XGRcZCkvICkgewogICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgPSAiJENyZWF0ZVRpbWUgaXMgbm90IHRoZSByaWdodCBmb3JtYXQgJ3l5eXktbW0tZGQgaGg6bW06OnNzJyAocGxlYXNlIGNoZWNrIFwkRU5We05MU19EQVRFX0ZPUk1BVH0pLiI7CiAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiTkxTX0RBVEVfRm9ybWF0IGhhcyB0aGUgcmlnaHQgZm9ybWF0ICgkQ3JlYXRlVGltZSkuIjsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgIH0KICAgIH0KICAgIG15ICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdOTFNfREFURV9TRUxFQ1RfRk9STUFUJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgTkxTX0RBVEVfRk9STUFUIGJ5IHVzaW5nIFNFTEVDVCBzdGF0ZW1lbnQuIiwKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwiOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICIkRmlsZSIgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkSW4+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkSW4pOwogICAgICAgICAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MUGFyc2UyWE1MSGFzaCggU3RyaW5nID0+ICRDb250ZW50ICk7CiAgICAgICAgICAgIGZvciBteSAkVGFibGUgKCBAeyAkWE1MSGFzaFsxXS0+e2RhdGFiYXNlfS0+WzFdLT57VGFibGV9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoJFRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCAgID0+ICJzZWxlY3QgKiBmcm9tICRUYWJsZS0+e05hbWV9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbWl0ID0+IDEKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiJFRhYmxlLT57TmFtZX0sICI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiVGFibGUgZG9uJ3QgZXhpc3RzOiAkTWVzc2FnZS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENvdW50IHRhYmxlcyBjaGVja2VkLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBvcGVuIGZpbGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLiIsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBmaW5kIGZpbGUgJEZpbGUhIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0N1cnJlbnRUaW1lc3RhbXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgICA9IHt9OwogICAgbXkgJERiVGltZSA9ICcnOwoKICAgICMgQ3VycmVudCBUaW1lc3RhbXAgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgJFNlbGYtPntEQk9iamVjdH0KICAgICAgICAtPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIHRvX2NoYXIoY3VycmVudF90aW1lc3RhbXAsJ1lZWVktTU0tREQgSEgyNDpNSTpTUycpIEZST00gRFVBTCIgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERiVGltZSA9ICRSb3dbMF07CiAgICB9CiAgICBteSAkVGltZUFwcGxpY2F0aW9uU2VydmVyID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgbXkgJFRpbWVEYXRhYmFzZVNlcnZlciAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkRGJUaW1lLAogICAgKTsKCiAgICBteSAkVGltZURpZmZlcmVuY2UgPSAwOwogICAgbXkgJFJhbmdlICAgICAgICAgID0gMTA7CiAgICAkVGltZURpZmZlcmVuY2UgPSAkVGltZUFwcGxpY2F0aW9uU2VydmVyIC0gJFRpbWVEYXRhYmFzZVNlcnZlcjsKICAgIGlmICggKCAkVGltZURpZmZlcmVuY2UgPj0gKCAkUmFuZ2UgKiAtMSApICkgJiYgKCAkVGltZURpZmZlcmVuY2UgPD0gJFJhbmdlICkgKSB7CiAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyIHRpbWUgYW5kIGRhdGFiYXNlIHNlcnZlciB0aW1lLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBhIG1hdGVyaWFsIGRpZmZlcmVuY2UgKCcKICAgICAgICAgICAgLiAkVGltZURpZmZlcmVuY2UKICAgICAgICAgICAgLiAiIHNlY29uZHMpIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyICgkVGltZUFwcGxpY2F0aW9uU2VydmVyKSBhbmQgZGF0YWJhc2Ugc2VydmVyICgkVGltZURhdGFiYXNlU2VydmVyKSB0aW1lLiI7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0N1cnJlbnQgVGltZXN0YW1wIENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgIlN5c3RlbSBUaW1lIiB2cyAiQ3VycmVudCBUaW1lc3RhbXAiLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK</File>
+ <File Location="Kernel/System/Support/Database/mssql.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9tc3NxbC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG1zc3FsLnBtLHYgMS4xOCAyMDEwLzA1LzI4IDA3OjI3OjU1IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6bXNzcWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE4ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6TVNTUUwnKTsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNoZWNrcyBzaG91bGQgYXJlIGVuYWJsZWQgaW4gc3lzY29uZmlnCiAgICBteSBARW5hYmxlZENoZWNrRnVuY3Rpb25zOwogICAgaWYgKCAkQ2hlY2tzICYmIHJlZiAkQ2hlY2tzIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIGVuYWJsZWQgY2hlY2sgZnVuY3Rpb24gbmFtZXMKICAgICAgICBARW5hYmxlZENoZWNrRnVuY3Rpb25zID0gZ3JlcCB7ICRDaGVja3MtPnskX30gfSBrZXlzICV7JENoZWNrc307CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgcmVzdWx0CiAgICBteSBARGF0YUFycmF5OwoKICAgIEZVTkNUSU9OTkFNRToKICAgIGZvciBteSAkRnVuY3Rpb25OYW1lIChARW5hYmxlZENoZWNrRnVuY3Rpb25zKSB7CgogICAgICAgICMgcHJlcGVuZCBhbiB1bmRlcnNjb3JlCiAgICAgICAgJEZ1bmN0aW9uTmFtZSA9ICdfJyAuICRGdW5jdGlvbk5hbWU7CgogICAgICAgICMgcnVuIGZ1bmN0aW9uIGFuZCBnZXQgY2hlY2sgZGF0YQogICAgICAgIG15ICRDaGVjayA9ICRTZWxmLT4kRnVuY3Rpb25OYW1lKCk7CgogICAgICAgIG5leHQgRlVOQ1RJT05OQU1FIGlmICEkQ2hlY2s7CgogICAgICAgICMgYXR0YWNoIGNoZWNrIGRhdGEgaWYgdmFsaWQKICAgICAgICBwdXNoIEBEYXRhQXJyYXksICRDaGVjazsKICAgIH0KCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCnN1YiBfVmVyc2lvbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHZlcnNpb24gY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdDb3VsZCBub3QgZGV0ZXJtaW5lIE1pY3Jvc29mdCBTUUwgU2VydmVyIHZlcnNpb24uJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgQEB2ZXJzaW9uJywKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRNZXNzYWdlID0gJFJvd1swXTsKICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ZlcnNpb24nLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBkYXRhYmFzZSB2ZXJzaW9uLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9UYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHRhYmxlIGNoZWNrCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3NjcmlwdHMvZGF0YWJhc2Uvb3Rycy1zY2hlbWEueG1sJzsKICAgIGlmICggLWYgJEZpbGUgKSB7CiAgICAgICAgbXkgJENvdW50ICAgPSAwOwogICAgICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICAgICBteSAkQ29udGVudCA9ICcnOwogICAgICAgIG15ICRJbjsKICAgICAgICBpZiAoIG9wZW4oICRJbiwgJzwnLCAkRmlsZSApICkgewogICAgICAgICAgICB3aGlsZSAoPCRJbj4pIHsKICAgICAgICAgICAgICAgICRDb250ZW50IC49ICRfOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRJbik7CiAgICAgICAgICAgIG15IEBYTUxIYXNoID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxQYXJzZTJYTUxIYXNoKCBTdHJpbmcgPT4gJENvbnRlbnQgKTsKICAgICAgICAgICAgZm9yIG15ICRUYWJsZSAoIEB7ICRYTUxIYXNoWzFdLT57ZGF0YWJhc2V9LT5bMV0tPntUYWJsZX0gfSApIHsKICAgICAgICAgICAgICAgIGlmICgkVGFibGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRUYWJsZS0+e05hbWV9IGVxICdzeXN0ZW1fdXNlcicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYWJsZS0+e05hbWV9ID0gJ3N5c3RlbV91c2VyMic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgICA9PiAic2VsZWN0ICogZnJvbSAkVGFibGUtPntOYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW1pdCA9PiAxCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRUYWJsZS0+e05hbWV9LCAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlRhYmxlIGRvZXNuJ3QgZXhpc3Q6ICRNZXNzYWdlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRDb3VudCB0YWJsZXMuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IG9wZW4gZmlsZSAkRmlsZTogJCEiLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RhYmxlIENoZWNrJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IGZpbmQgZmlsZSAkRmlsZSEiLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0N1cnJlbnRUaW1lc3RhbXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgICA9IHt9OwogICAgbXkgJERiVGltZSA9ICcnOwoKICAgICMgQ3VycmVudCBUaW1lc3RhbXAgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGN1cnJlbnRfdGltZXN0YW1wIiApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGJUaW1lID0gJFJvd1swXTsKICAgIH0KICAgIG15ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICBteSAkVGltZURhdGFiYXNlU2VydmVyICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICREYlRpbWUsCiAgICApOwoKICAgIG15ICRUaW1lRGlmZmVyZW5jZSA9IDA7CiAgICBteSAkUmFuZ2UgICAgICAgICAgPSAxMDsKICAgICRUaW1lRGlmZmVyZW5jZSA9ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgLSAkVGltZURhdGFiYXNlU2VydmVyOwogICAgaWYgKCAoICRUaW1lRGlmZmVyZW5jZSA+PSAoICRSYW5nZSAqIC0xICkgKSAmJiAoICRUaW1lRGlmZmVyZW5jZSA8PSAkUmFuZ2UgKSApIHsKICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1RoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGltZSBhbmQgZGF0YWJhc2Ugc2VydmVyIHRpbWUuJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1RoZXJlIGlzIGEgbWF0ZXJpYWwgZGlmZmVyZW5jZSAoJwogICAgICAgICAgICAuICRUaW1lRGlmZmVyZW5jZQogICAgICAgICAgICAuICIgc2Vjb25kcykgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgKCRUaW1lQXBwbGljYXRpb25TZXJ2ZXIpIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgKCRUaW1lRGF0YWJhc2VTZXJ2ZXIpIHRpbWUuIjsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQ3VycmVudCBUaW1lc3RhbXAgQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayAiU3lzdGVtIFRpbWUiIHZzICJDdXJyZW50IFRpbWVzdGFtcCIuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CjE7Cg==</File>
+ <File Location="Kernel/System/Support/Database/postgresql.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9wb3N0Z3Jlc3FsLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogcG9zdGdyZXNxbC5wbSx2IDEuMTkgMjAxMC8wNS8yOCAwNzoyNzo1NSBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U6OnBvc3RncmVzcWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE5ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmFtZXMgb2YgYXZhaWxhYmxlIGNoZWNrcyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJENoZWNrcyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpEYXRhYmFzZTo6UG9zdGdyZVNRTCcpOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY2hlY2tzIHNob3VsZCBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBzb3J0IGdyZXAgeyAkQ2hlY2tzLT57JF99IH0ga2V5cyAleyRDaGVja3N9OwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIHJlc3VsdAogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQEVuYWJsZWRDaGVja0Z1bmN0aW9ucykgewoKICAgICAgICAjIHByZXBlbmQgYW4gdW5kZXJzY29yZQogICAgICAgICRGdW5jdGlvbk5hbWUgPSAnXycgLiAkRnVuY3Rpb25OYW1lOwoKICAgICAgICAjIHJ1biBmdW5jdGlvbiBhbmQgZ2V0IGNoZWNrIGRhdGEKICAgICAgICBteSAkQ2hlY2sgPSAkU2VsZi0+JEZ1bmN0aW9uTmFtZSgpOwoKICAgICAgICBuZXh0IEZVTkNUSU9OTkFNRSBpZiAhJENoZWNrOwoKICAgICAgICAjIGF0dGFjaCBjaGVjayBkYXRhIGlmIHZhbGlkCiAgICAgICAgcHVzaCBARGF0YUFycmF5LCAkQ2hlY2s7CiAgICB9CgogICAgcmV0dXJuIFxARGF0YUFycmF5Owp9CgpzdWIgX1RhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvc2NyaXB0cy9kYXRhYmFzZS9vdHJzLXNjaGVtYS54bWwnOwogICAgaWYgKCAtZiAkRmlsZSApIHsKICAgICAgICBteSAkQ291bnQgICA9IDA7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmICggb3BlbiggJEluLCAnPCcsICRGaWxlICkgKSB7CiAgICAgICAgICAgIHdoaWxlICg8JEluPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEluKTsKICAgICAgICAgICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goIFN0cmluZyA9PiAkQ29udGVudCApOwogICAgICAgICAgICBmb3IgbXkgJFRhYmxlICggQHsgJFhNTEhhc2hbMV0tPntkYXRhYmFzZX0tPlsxXS0+e1RhYmxlfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkgewogICAgICAgICAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgICA9PiAic2VsZWN0ICogZnJvbSAkVGFibGUtPntOYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW1pdCA9PiAxCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRUYWJsZS0+e05hbWV9LCAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIm5vbmV4aXN0aW5nIHRhYmxlKHMpOiAkTWVzc2FnZS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJENvdW50IHRhYmxlcyBjaGVja2VkLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVGFibGUgQ2hlY2snLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBvcGVuIGZpbGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgIENoZWNrICAgICAgID0+ICdDcml0aWNhbCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLicsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJDYW4ndCBmaW5kIGZpbGUgJEZpbGUhIiwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0RhdGVTdHlsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIERhdGVzdHlsZSBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIERhdGVTdHlsZSBmb3VuZC4nOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyBhbGwnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXkRhdGVTdHlsZS9pICkgewogICAgICAgICAgICBpZiAoICRSb3dbMV0gPX4gL15JU08vaSApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRSb3dbMV0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlVua25vd24gRGF0ZVN0eWxlICgkUm93WzFdKSBuZWVkIElTTy4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RhdGVTdHlsZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIERhdGVTdHlsZS4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICB9LAogICAgICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9VVEY4U2VydmVyQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdXRmLTggc2VydmVyIGNoZWNrCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Q2hhcnNldCcpID1+IC91dGYoXC04fDgpL2kgKSB7CiAgICAgICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICdObyBzZXJ2ZXJfZW5jb2RpbmcgZm91bmQuJzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IGFsbCcgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15zZXJ2ZXJfZW5jb2RpbmcvaSApIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiU2V0dGluZyBzZXJ2ZXJfZW5jb2RpbmcgZm91bmQsIGJ1dCBpdCdzIHNldCB0byAnJFJvd1sxXScgKG5lZWQgdG8gYmUgVU5JQ09ERSBvciBVVEY4KS4iOwogICAgICAgICAgICAgICAgaWYgKCAkUm93WzFdID1+IC8oVU5JQ09ERXx1dGYoOHxcLTgpKS9pICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1NlcnZlciBDb25uZWN0aW9uICh1dGY4KScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayB0aGUgdXRmOCBzZXJ2ZXIgY29ubmVjdGlvbi4nLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVVRGOENsaWVudENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHV0Zi04IGNsaWVudCBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnTm8gY2xpZW50X2VuY29kaW5nIGZvdW5kLic7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyBhbGwnICk7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdID1+IC9eY2xpZW50X2VuY29kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gIlNldHRpbmcgY2xpZW50X2VuY29kaW5nIGZvdW5kLCBidXQgaXQncyBzZXQgdG8gJyRSb3dbMV0nIChuZWVkIHRvIGJlIFVOSUNPREUgb3IgVVRGOCkiOwogICAgICAgICAgICAgICAgaWYgKCAkUm93WzFdID1+IC8oVU5JQ09ERXx1dGYoOHxcLTgpKS9pICkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0NsaWVudCBDb25uZWN0aW9uICh1dGY4KScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayB0aGUgdXRmOCBjbGllbnQgY29ubmVjdGlvbi4nLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfVmVyc2lvbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHZlcnNpb24gY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyBkYXRhYmFzZSB2ZXJzaW9uIGZvdW5kLic7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHNlcnZlcl92ZXJzaW9uJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL14oXGR7MSwzfSkuKiQvICkgewogICAgICAgICAgICBpZiAoICQxID4gNyApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRSb3dbMF0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIllvdSB1c2UgZGF0YWJhc2UgdmVyc2lvbiAkUm93WzBdLCB5b3Ugc2hvdWxkIHVzZSA4Lnggb3IgaGlnbmVyLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIlVua25vd24gdmVyc2lvbiAkUm93WzBdLiI7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ZlcnNpb24nLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBkYXRhYmFzZSB2ZXJzaW9uLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9DdXJyZW50VGltZXN0YW1wQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhICAgPSB7fTsKICAgIG15ICREYlRpbWUgPSAnJzsKCiAgICAjIEN1cnJlbnQgVGltZXN0YW1wIGNoZWNrCiAgICBteSAkQ2hlY2sgICA9ICcnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gIlNFTEVDVCBjdXJyZW50X3RpbWVzdGFtcCIgKTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERiVGltZSA9ICRSb3dbMF07CiAgICB9CiAgICBteSAkVGltZUFwcGxpY2F0aW9uU2VydmVyID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgbXkgJFRpbWVEYXRhYmFzZVNlcnZlciAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkRGJUaW1lLAogICAgKTsKCiAgICBteSAkVGltZURpZmZlcmVuY2UgPSAwOwogICAgbXkgJFJhbmdlICAgICAgICAgID0gMTA7CiAgICAkVGltZURpZmZlcmVuY2UgPSAkVGltZUFwcGxpY2F0aW9uU2VydmVyIC0gJFRpbWVEYXRhYmFzZVNlcnZlcjsKICAgIGlmICggKCAkVGltZURpZmZlcmVuY2UgPj0gKCAkUmFuZ2UgKiAtMSApICkgJiYgKCAkVGltZURpZmZlcmVuY2UgPD0gJFJhbmdlICkgKSB7CiAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyIHRpbWUgYW5kIGRhdGFiYXNlIHNlcnZlciB0aW1lLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICA9ICdUaGVyZSBpcyBhIG1hdGVyaWFsIGRpZmZlcmVuY2UgKCcKICAgICAgICAgICAgLiAkVGltZURpZmZlcmVuY2UKICAgICAgICAgICAgLiAiIHNlY29uZHMpIGJldHdlZW4gYXBwbGljYXRpb24gc2VydmVyICgkVGltZUFwcGxpY2F0aW9uU2VydmVyKSBhbmQgZGF0YWJhc2Ugc2VydmVyICgkVGltZURhdGFiYXNlU2VydmVyKSB0aW1lLiI7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0N1cnJlbnQgVGltZXN0YW1wIENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgIlN5c3RlbSBUaW1lIiB2cyAiQ3VycmVudCBUaW1lc3RhbXAiLicsCiAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJENoZWNrLAogICAgfTsKICAgIHJldHVybiAkRGF0YTsKfQoxOwo=</File>
+ <File Location="Kernel/System/Support/Database/mysql.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9teXNxbC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG15c3FsLnBtLHYgMS4yNyAyMDEwLzA1LzI4IDA3OjI3OjU1IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6bXlzcWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI3ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntYTUxPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCAleyRTZWxmfSApOwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuYW1lcyBvZiBhdmFpbGFibGUgY2hlY2tzIGZyb20gc3lzY29uZmlnCiAgICBteSAkQ2hlY2tzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cHBvcnQ6OkRhdGFiYXNlOjpNeVNRTCcpOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY2hlY2tzIHNob3VsZCBhcmUgZW5hYmxlZCBpbiBzeXNjb25maWcKICAgIG15IEBFbmFibGVkQ2hlY2tGdW5jdGlvbnM7CiAgICBpZiAoICRDaGVja3MgJiYgcmVmICRDaGVja3MgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGdldCBhbGwgZW5hYmxlZCBjaGVjayBmdW5jdGlvbiBuYW1lcwogICAgICAgIEBFbmFibGVkQ2hlY2tGdW5jdGlvbnMgPSBzb3J0IGdyZXAgeyAkQ2hlY2tzLT57JF99IH0ga2V5cyAleyRDaGVja3N9OwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIHJlc3VsdAogICAgbXkgQERhdGFBcnJheTsKCiAgICBGVU5DVElPTk5BTUU6CiAgICBmb3IgbXkgJEZ1bmN0aW9uTmFtZSAoQEVuYWJsZWRDaGVja0Z1bmN0aW9ucykgewoKICAgICAgICAjIHByZXBlbmQgYW4gdW5kZXJzY29yZQogICAgICAgICRGdW5jdGlvbk5hbWUgPSAnXycgLiAkRnVuY3Rpb25OYW1lOwoKICAgICAgICAjIHJ1biBmdW5jdGlvbiBhbmQgZ2V0IGNoZWNrIGRhdGEKICAgICAgICBteSAkQ2hlY2sgPSAkU2VsZi0+JEZ1bmN0aW9uTmFtZSgpOwoKICAgICAgICBuZXh0IEZVTkNUSU9OTkFNRSBpZiAhJENoZWNrOwoKICAgICAgICAjIGF0dGFjaCBjaGVjayBkYXRhIGlmIHZhbGlkCiAgICAgICAgcHVzaCBARGF0YUFycmF5LCAkQ2hlY2s7CiAgICB9CgogICAgcmV0dXJuIFxARGF0YUFycmF5Owp9CgpzdWIgX1ZlcnNpb25DaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdmVyc2lvbiBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIGRhdGFiYXNlIHZlcnNpb24gZm91bmQuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBpZiByb3cgbm90IHZlcnNpb24gcm93LCBuZXh0LgogICAgICAgIGlmICggJFJvd1swXSAhfiAvXnZlcnNpb24kL2kgKSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRSb3dbMV0gPX4gL14oXGR7MSwzfSlcLihcZHsxLDN9KS4qJC8gKSB7CiAgICAgICAgICAgIGlmICggJDEgPj0gNCApIHsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIk15U1FMICRSb3dbMV0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlZlcnNpb24gJFJvd1sxXSwgeW91IHNob3VsZCB1c2UgNC4xIG9yIGhpZ2hlci4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIlVua25vd24gZGF0YWJhc2UgdmVyc2lvbiAkUm93WzFdIjsKICAgICAgICB9CiAgICB9CiAgICBteSAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnRGF0YWJhc2UgVmVyc2lvbicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRhdGFiYXNlIHZlcnNpb24uJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhTdXBwb3J0Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHV0Zi04IHN1cHBvcnQgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgIX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RhdGFiYXNlICh1dGY4KScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGRhdGFiYXNlIHV0Zjggc3VwcG9ydC4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICdObyBkYXRhYmFzZSB2ZXJzaW9uIGZvdW5kLicsCiAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgIH07CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHZhcmlhYmxlcycgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgbmV4dCByb3cgaWYgbm90IHZlcnNpb24KICAgICAgICBuZXh0IGlmICRSb3dbMF0gIX4gL152ZXJzaW9uJC9pOwoKICAgICAgICAjIGZpbmQgdGhlIHZlcnNpb24gbnVtYmVyCiAgICAgICAgaWYgKCAkUm93WzFdID1+IC9eKDRcLigxfDJ8M3w0fDUpfDVcLnw2XC58N1wuKS8gKSB7CiAgICAgICAgICAgICREYXRhLT57Q29tbWVudH0gPSAnWW91ciBkYXRhYmFzZSB2ZXJzaW9uIHN1cHBvcnRzIHV0ZjguJzsKICAgICAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdPSyc7CgogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgJERhdGEtPntDb21tZW50fSA9ICJ1dGY4IGlzIG5vdCBzdXBwb3J0ZWQgKE15U1FMICRSb3dbMV0pLiI7CiAgICAgICAgJERhdGEtPntDaGVja30gICA9ICdGYWlsZWQnOwogICAgfQoKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIF9VVEY4Q2xpZW50Q2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhID0ge307CgogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vIGNoYXJhY3Rlcl9zZXRfY2xpZW50IHNldHRpbmcgZm91bmQuJzsKCiAgICAjIHV0Zi04IGNsaWVudCBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSAhfiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgI25leHQgaWYgcm93IG5vdCBjaGFyYWN0ZXJfc2V0X2NsaWVudAogICAgICAgIG5leHQgaWYgJFJvd1swXSAhfiAvXmNoYXJhY3Rlcl9zZXRfY2xpZW50L2k7CgogICAgICAgIGlmICggJFJvd1sxXSA9fiAvdXRmOC8gKSB7CiAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91ciBjbGllbnQgY29ubmVjdGlvbiBpcyAkUm93WzFdLiI7CgogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KICAgICAgICAkTWVzc2FnZSA9ICJGb3VuZCBjaGFyYWN0ZXJfc2V0X2NsaWVudCwgYnV0IGl0J3Mgc2V0IHRvICRSb3dbMV0gKG5lZWRzIHRvIGJlIHV0ZjgpLiI7CiAgICB9CgogICAgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0NsaWVudCBDb25uZWN0aW9uICh1dGY4KScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGlmIHRoZSBjbGllbnQgdXNlcyB1dGY4IGZvciB0aGUgY29ubmVjdGlvbi4nLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgIH07CgogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhEYXRhYmFzZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1dGYtOCBkYXRhYmFzZSBjaGVjawogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSAhfiAvdXRmKFwtOHw4KS9pICkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyBjaGFyYWN0ZXJfc2V0X2RhdGFiYXNlIHNldHRpbmcgZm91bmQuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15jaGFyYWN0ZXJfc2V0X2RhdGFiYXNlL2kgKSB7CiAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICA9ICJDaGFyYWN0ZXJfc2V0X2RhdGFiYXNlIHNldHRpbmcgZm91bmQsIGJ1dCBpdCdzIHNldCB0byAkUm93WzFdIChuZWVkcyB0byBiZSB1dGY4KS4iOwogICAgICAgICAgICBpZiAoICRSb3dbMV0gPX4gL3V0ZjgvICkgewogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91ciBkYXRhYmFzZSBjaGFyYWN0ZXIgc2V0dGluZyBpcyAkUm93WzFdLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJERhdGEgPSB7CiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RhdGFiYXNlIENoYXJhY3RlciAodXRmOCknLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayBpZiB0aGUgZGF0YWJhc2UgdXNlcyB1dGY4IGFzIGNoYXJzZXQuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1VURjhUYWJsZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdXRmLTggdGFibGUgY2hlY2sKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgPX4gL3V0ZihcLTh8OCkvaSApIHsKICAgICAgICBteSAkQ2hlY2sgICAgPSAnRmFpbGVkJzsKICAgICAgICBteSAkTWVzc2FnZSAgPSAnJzsKICAgICAgICBteSAkTWVzc2FnZTIgPSAnJzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICdzaG93IHRhYmxlIHN0YXR1cycgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMTRdICF+IC9edXRmOC9pICkgewogICAgICAgICAgICAgICAgaWYgKCRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gJywgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRNZXNzYWdlIC49ICIkUm93WzBdXFskUm93WzE0XVxdIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlMiA9ICRSb3dbMTRdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgICAgICAkTWVzc2FnZSA9ICJJbnZhbGlkIGNoYXJzZXQgY29sbGF0aW9uIGZvcjogJE1lc3NhZ2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJENoZWNrICAgPSAnT0snOwogICAgICAgICAgICAkTWVzc2FnZSA9ICRNZXNzYWdlMjsKICAgICAgICB9CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDb2xsYXRpb24gKHV0ZjgpJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIHRoZSB1dGY4IHRhYmxlIGNoYXJzZXQgY29sbGF0aW9uLicsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICJZb3VyIGNoYXJzZXQgY29sbGF0aW9uIGlzIHNldCB0byAkTWVzc2FnZS4iLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gJERhdGE7CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBfTWF4QWxsb3dlZFBhY2thZ2VDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIG1heF9hbGxvd2VkX3BhY2tldCBjaGVjawogICAgbXkgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJ05vICJtYXhfYWxsb3dlZF9wYWNrZXQiIGNvbmZpZ3VyYXRpb24gZm91bmQuJzsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJ3Nob3cgdmFyaWFibGVzJyApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL15tYXhfYWxsb3dlZF9wYWNrZXQvaSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzFdIDwgMTAyNCAqIDEwMjQgKiA3ICkgewogICAgICAgICAgICAgICAgJFJvd1sxXSAgPSBpbnQoICRSb3dbMV0gLyAxMDI0IC8gMTAyNCApOwogICAgICAgICAgICAgICAgJENoZWNrICAgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlwibWF4X2FsbG93ZWRfcGFja2V0XCIgc2hvdWxkIGJlIGhpZ2hlciB0aGVuIDcgTUIgKGl0J3MgJFJvd1sxXSBNQikuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSb3dbMV0gID0gaW50KCAkUm93WzFdIC8gMTAyNCAvIDEwMjQgKTsKICAgICAgICAgICAgICAgICRDaGVjayAgID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIllvdXIgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzICRSb3dbMV0gTUIuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdNYXggUGFja2FnZSBTaXplJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgIm1heF9hbGxvd2VkX3BhY2tldCIgc2V0dGluZy4nLAogICAgICAgIENvbW1lbnQgICAgID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrICAgICAgID0+ICRDaGVjaywKICAgIH07CiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBfUXVlcnlDYWNoZVNpemVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHF1ZXJ5X2NhY2hlX3NpemUgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICdObyAicXVlcnlfY2FjaGVfc2l6ZSIgc2V0dGluZyBmb3VuZC4nOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnc2hvdyB2YXJpYWJsZXMnICk7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFJvd1swXSA9fiAvXnF1ZXJ5X2NhY2hlX3NpemUvaSApIHsKICAgICAgICAgICAgaWYgKCAhJFJvd1sxXSApIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gJ1RoZSBzZXR0aW5nICJxdWVyeV9jYWNoZV9zaXplIiBzaG91bGQgYmUgdXNlZCwgeW91IHdpbGwgZ2V0IGltcHJvdmVtZW50cyB1cCB0byAzMCAlIG9mIHNwZWVkLic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUm93WzFdIDwgMTAyNCAqIDEwMjQgKiAxMCApIHsKICAgICAgICAgICAgICAgICRSb3dbMV0gPSBpbnQoICRSb3dbMV0gLyAxMDI0IC8gMTAyNCApOwogICAgICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiVGhlIHNldHRpbmcgXCJxdWVyeV9jYWNoZV9zaXplXCIgc2hvdWxkIGJlIGhpZ2hlciB0aGFuIDEwIE1CIChpdCdzICRSb3dbMV0gTUIpLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUm93WzFdICA9IGludCggJFJvd1sxXSAvIDEwMjQgLyAxMDI0ICk7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkUm93WzFdIE1CIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIE5hbWUgICAgICAgID0+ICdRdWVyeSBDYWNoZSBTaXplJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgInF1ZXJ5X2NhY2hlX3NpemUiIHNldHRpbmcuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX0N1cnJlbnRUaW1lc3RhbXBDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJERhdGEgICA9IHt9OwogICAgbXkgJERiVGltZSA9ICcnOwoKICAgICMgQ3VycmVudCBUaW1lc3RhbXAgY2hlY2sKICAgIG15ICRDaGVjayAgID0gJyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAiU0VMRUNUIGN1cnJlbnRfdGltZXN0YW1wIiApOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGJUaW1lID0gJFJvd1swXTsKICAgIH0KICAgIG15ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICBteSAkVGltZURhdGFiYXNlU2VydmVyICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICREYlRpbWUsCiAgICApOwoKICAgIG15ICRUaW1lRGlmZmVyZW5jZSA9IDA7CiAgICBteSAkUmFuZ2UgICAgICAgICAgPSAxMDsKICAgICRUaW1lRGlmZmVyZW5jZSA9ICRUaW1lQXBwbGljYXRpb25TZXJ2ZXIgLSAkVGltZURhdGFiYXNlU2VydmVyOwogICAgaWYgKCAoICRUaW1lRGlmZmVyZW5jZSA+PSAoICRSYW5nZSAqIC0xICkgKSAmJiAoICRUaW1lRGlmZmVyZW5jZSA8PSAkUmFuZ2UgKSApIHsKICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1RoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGltZSBhbmQgZGF0YWJhc2Ugc2VydmVyIHRpbWUuJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICRNZXNzYWdlCiAgICAgICAgICAgID0gJ1RoZXJlIGlzIGEgbWF0ZXJpYWwgZGlmZmVyZW5jZSAoJwogICAgICAgICAgICAuICRUaW1lRGlmZmVyZW5jZQogICAgICAgICAgICAuICIgc2Vjb25kcykgYmV0d2VlbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgKCRUaW1lQXBwbGljYXRpb25TZXJ2ZXIpIGFuZCBkYXRhYmFzZSBzZXJ2ZXIgKCRUaW1lRGF0YWJhc2VTZXJ2ZXIpIHRpbWUuIjsKICAgIH0KCiAgICAkRGF0YSA9IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnQ3VycmVudCBUaW1lc3RhbXAgQ2hlY2snLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGVjayAiU3lzdGVtIFRpbWUiIHZzICJDdXJyZW50IFRpbWVzdGFtcCIuJywKICAgICAgICBDb21tZW50ICAgICA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICB9OwogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgX1RhYmxlQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICREYXRhID0ge307CgogICAgIyB0YWJsZSBjaGVjawogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9zY3JpcHRzL2RhdGFiYXNlL290cnMtc2NoZW1hLnhtbCc7CiAgICBpZiAoIC1mICRGaWxlICkgewogICAgICAgIG15ICRDb3VudCAgID0gMDsKICAgICAgICBteSAkQ2hlY2sgICA9ICdGYWlsZWQnOwogICAgICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICAgICAgbXkgJENvbnRlbnQgPSAnJzsKICAgICAgICBteSAkSW47CiAgICAgICAgaWYgKCBvcGVuKCAkSW4sICc8JywgJEZpbGUgKSApIHsKICAgICAgICAgICAgd2hpbGUgKDwkSW4+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkSW4pOwogICAgICAgICAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MUGFyc2UyWE1MSGFzaCggU3RyaW5nID0+ICRDb250ZW50ICk7CgogICAgICAgICAgICBteSBAUHJvYmxlbXM7CiAgICAgICAgICAgIGZvciBteSAkVGFibGUgKCBAeyAkWE1MSGFzaFsxXS0+e2RhdGFiYXNlfS0+WzFdLT57VGFibGV9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoJFRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgJENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgICMgdXNlICdDSEVDSyBUQUJMRSctc3RhdGVtZW50IHRvIGRldGVybWluZSBzdGF0ZSBvZiBlYWNoIHRhYmxlCiAgICAgICAgICAgICAgICAgICAgIyAod2hpY2ggbWF5IHlpZWxkIHNldmVyYWwgbGluZXMgcGVyIHRhYmxlLCB0aGUgbGFzdCBvZiB3aGljaCB3aWxsCiAgICAgICAgICAgICAgICAgICAgIyBjb250YWluIHRoZSBvdmVyYWxsIHN0YXRlIG9mIHRoYXQgdGFibGUpCiAgICAgICAgICAgICAgICAgICAgIyBEbyBxdWljayBjaGVja3Mgb24gdGFibGVzLCBvdGhlciB3YXkgaXQgdGFrZXMgb3ZlciA0MjAgc2VjCiAgICAgICAgICAgICAgICAgICAgIyBvciBsb25nZXIgdG8gY2hlY2sgaXQuCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSggU1FMID0+ICJDSEVDSyBUQUJMRSAkVGFibGUtPntOYW1lfSBGQVNUIFFVSUNLIiApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RhdHVzID0gJFJvd1szXTsgICAgIyBsb29rIGF0IGZpZWxkICdNc2dfdGV4dCcKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlmICRTdGF0dXMgPX4gL14oT0t8VGFibGVcc2lzXHNhbHJlYWR5XHN1cFxzdG9cc2RhdGUpL2k7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFByb2JsZW1zLCAiJFRhYmxlLT57TmFtZX1cWyRTdGF0dXNcXSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBQcm9ibGVtcywgIiRUYWJsZS0+e05hbWV9XFt1bmFibGUgdG8gY2hlY2sgdGFibGVcXSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChAUHJvYmxlbXMpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gam9pbiAiXG4iLCBAUHJvYmxlbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2hlY2sgICA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkQ291bnQgdGFibGVzIGNoZWNrZWQuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDaGVjayAgICAgICA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdUYWJsZSBDaGVjaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4nLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IG9wZW4gZmlsZSAkRmlsZTogJCEiLAogICAgICAgICAgICAgICAgQ2hlY2sgICAgICAgPT4gJ0NyaXRpY2FsJywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RhYmxlIENoZWNrJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuJywKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gIkNhbid0IGZpbmQgZmlsZSAkRmlsZSEiLAogICAgICAgICAgICBDaGVjayAgICAgICA9PiAnQ3JpdGljYWwnLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJERhdGE7Cn0KCjE7Cg==</File>
+ <File Location="Kernel/System/Support/Webserver.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBXZWJzZXJ2ZXIucG0sdiAxLjEwIDIwMTAvMDIvMDkgMTk6NTQ6MTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlciAtIGdsb2JhbCBzeXN0ZW0gaW5mb3JtYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbiB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgV2Vic2VydmVyIGluZm8gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6V2Vic2VydmVyOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJFdlYnNlcnZlckFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgV2Vic2VydmVycwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwogICAgIyAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+Q2hlY2soKTsKICAgICMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCB1c2VkIFdlYnNlcnZlcgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgdHJ5IHRvIGZpbmQgb3V0IHdoaWNoIFdlYnNlcnZlciBpcyBjb25maWd1cmVkCiAgICBteSAkV2Vic2VydmVyVHlwZSA9ICcnOwogICAgaWYgKCAkRU5We1NFUlZFUl9TT0ZUV0FSRX0gPX4gL2FwYWNoZS9pICkgewogICAgICAgICRXZWJzZXJ2ZXJUeXBlID0gJ0FwYWNoZSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkV2Vic2VydmVyVHlwZSA9ICdJSVMnOwogICAgfQoKICAgICMgdHJ5IHRvIGdldCBhdmFpbGFibGUgbW9kdWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXInOwoKICAgICMgcmVhZCBhbGwgYXZhaWxhYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYiggJERpck5hbWUgLiAnLyoucG0nICk7CiAgICBmb3IgbXkgJEZpbGUgKEBMaXN0KSB7CgogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBpZiAoICRXZWJzZXJ2ZXJUeXBlID1+IC9eJEZpbGUvaSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlcjo6JEZpbGUiOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBuZXcgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAgICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBcnJheVJlZiAmJiByZWYoJEFycmF5UmVmKSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCBAeyREYXRhQXJyYXl9LCBAeyRBcnJheVJlZn0gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMCAkICREYXRlOiAyMDEwLzAyLzA5IDE5OjU0OjE3ICQKCj1jdXQK</File>
+ <File Location="Kernel/cpan-lib/Archive/Tar/Constant.pm" Permission="644" Encode="Base64">cGFja2FnZSBBcmNoaXZlOjpUYXI6OkNvbnN0YW50OwoKQkVHSU4gewogICAgcmVxdWlyZSBFeHBvcnRlcjsKICAgICRWRVJTSU9OPSAnMC4wMic7CiAgICBASVNBICAgID0gcXdbRXhwb3J0ZXJdOwogICAgQEVYUE9SVCA9IHF3WwogICAgICAgICAgICAgICAgRklMRSBIQVJETElOSyBTWU1MSU5LIENIQVJERVYgQkxPQ0tERVYgRElSIEZJRk8gU09DS0VUIFVOS05PV04KICAgICAgICAgICAgICAgIEJVRkZFUiBIRUFEIFJFQURfT05MWSBXUklURV9PTkxZIFVOUEFDSyBQQUNLIFRJTUVfT0ZGU0VUIFpMSUIKICAgICAgICAgICAgICAgIEJMT0NLX1NJWkUgVEFSX1BBRCBUQVJfRU5EIE9OX1VOSVggQkxPQ0sgQ0FOX1JFQURMSU5LIE1BR0lDIAogICAgICAgICAgICAgICAgVEFSX1ZFUlNJT04gVU5BTUUgR05BTUUgQ0FOX0NIT1dOIE1PREUgQ0hFQ0tfU1VNIFVJRCBHSUQgCiAgICAgICAgICAgICAgICBHWklQX01BR0lDX05VTSBNT0RFX1JFQUQgTE9OR0xJTksgTE9OR0xJTktfTkFNRSBQUkVGSVhfTEVOR1RICiAgICAgICAgICAgICAgICBMQUJFTCBOQU1FX0xFTkdUSCBTVFJJUF9NT0RFCiAgICAgICAgICAgIF07CgogICAgcmVxdWlyZSBUaW1lOjpMb2NhbCBpZiAkXk8gZXEgIk1hY09TIjsKfQoKdXNlIGNvbnN0YW50IEZJTEUgICAgICAgICAgID0+IDA7CnVzZSBjb25zdGFudCBIQVJETElOSyAgICAgICA9PiAxOwp1c2UgY29uc3RhbnQgU1lNTElOSyAgICAgICAgPT4gMjsKdXNlIGNvbnN0YW50IENIQVJERVYgICAgICAgID0+IDM7CnVzZSBjb25zdGFudCBCTE9DS0RFViAgICAgICA9PiA0Owp1c2UgY29uc3RhbnQgRElSICAgICAgICAgICAgPT4gNTsKdXNlIGNvbnN0YW50IEZJRk8gICAgICAgICAgID0+IDY7CnVzZSBjb25zdGFudCBTT0NLRVQgICAgICAgICA9PiA4Owp1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgPT4gOTsKdXNlIGNvbnN0YW50IExPTkdMSU5LICAgICAgID0+ICdMJzsKdXNlIGNvbnN0YW50IExBQkVMICAgICAgICAgID0+ICdWJzsKCnVzZSBjb25zdGFudCBCVUZGRVIgICAgICAgICA9PiA0MDk2Owp1c2UgY29uc3RhbnQgSEVBRCAgICAgICAgICAgPT4gNTEyOwp1c2UgY29uc3RhbnQgQkxPQ0sgICAgICAgICAgPT4gNTEyOwoKdXNlIGNvbnN0YW50IEJMT0NLX1NJWkUgICAgID0+IHN1YiB7IG15ICRuID0gaW50KCRfWzBdL0JMT0NLKTsgJG4rKyBpZiAkX1swXSAlIEJMT0NLOyAkbiAqIEJMT0NLIH07CnVzZSBjb25zdGFudCBUQVJfUEFEICAgICAgICA9PiBzdWIgeyBteSAkeCA9IHNoaWZ0IHx8IHJldHVybjsgcmV0dXJuICJcMCIgeCAoQkxPQ0sgLSAoJHggJSBCTE9DSykgKSB9Owp1c2UgY29uc3RhbnQgVEFSX0VORCAgICAgICAgPT4gIlwwIiB4IEJMT0NLOwoKdXNlIGNvbnN0YW50IFJFQURfT05MWSAgICAgID0+IHN1YiB7IHNoaWZ0KCkgPyAncmInIDogJ3InIH07CnVzZSBjb25zdGFudCBXUklURV9PTkxZICAgICA9PiBzdWIgeyAkX1swXSA/ICd3YicgLiBzaGlmdCA6ICd3JyB9Owp1c2UgY29uc3RhbnQgTU9ERV9SRUFEICAgICAgPT4gc3ViIHsgJF9bMF0gPX4gL15yLyA/IDEgOiAwIH07CgojIFBvaW50bGVzcyBhc3NpZ25tZW50IHRvIG1ha2UgLXcgc2h1dCB1cApteSAkZ2V0cHd1aWQ7ICRnZXRwd3VpZCA9ICd1bmtub3duJyB1bmxlc3MgZXZhbCB7IG15ICRmID0gZ2V0cHd1aWQgKDApOyB9OwpteSAkZ2V0Z3JnaWQ7ICRnZXRncmdpZCA9ICd1bmtub3duJyB1bmxlc3MgZXZhbCB7IG15ICRmID0gZ2V0Z3JnaWQgKDApOyB9Owp1c2UgY29uc3RhbnQgVU5BTUUgICAgICAgICAgPT4gc3ViIHsgJGdldHB3dWlkIHx8IHNjYWxhciBnZXRwd3VpZCggc2hpZnQoKSApIHx8ICcnIH07CnVzZSBjb25zdGFudCBHTkFNRSAgICAgICAgICA9PiBzdWIgeyAkZ2V0Z3JnaWQgfHwgc2NhbGFyIGdldGdyZ2lkKCBzaGlmdCgpICkgfHwgJycgfTsKdXNlIGNvbnN0YW50IFVJRCAgICAgICAgICAgID0+ICQ+Owp1c2UgY29uc3RhbnQgR0lEICAgICAgICAgICAgPT4gKHNwbGl0ICcgJywgJCkgKVswXTsKCnVzZSBjb25zdGFudCBNT0RFICAgICAgICAgICA9PiBkbyB7IDA2NjYgJiAoMDc3NyAmIH51bWFzaykgfTsKdXNlIGNvbnN0YW50IFNUUklQX01PREUgICAgID0+IHN1YiB7IHNoaWZ0KCkgJiAwNzc3IH07CnVzZSBjb25zdGFudCBDSEVDS19TVU0gICAgICA9PiAiICAgICAgIjsKCnVzZSBjb25zdGFudCBVTlBBQ0sgICAgICAgICA9PiAnQTEwMCBBOCBBOCBBOCBBMTIgQTEyIEE4IEExIEExMDAgQTYgQTIgQTMyIEEzMiBBOCBBOCBBMTU1IHgxMic7CnVzZSBjb25zdGFudCBQQUNLICAgICAgICAgICA9PiAnYTEwMCBhOCBhOCBhOCBhMTIgYTEyIEE4IGExIGExMDAgYTYgYTIgYTMyIGEzMiBhOCBhOCBhMTU1IHgxMic7CnVzZSBjb25zdGFudCBOQU1FX0xFTkdUSCAgICA9PiAxMDA7CnVzZSBjb25zdGFudCBQUkVGSVhfTEVOR1RIICA9PiAxNTU7Cgp1c2UgY29uc3RhbnQgVElNRV9PRkZTRVQgICAgPT4gKCReTyBlcSAiTWFjT1MiKSA/IFRpbWU6OkxvY2FsOjp0aW1lbG9jYWwoMCwwLDAsMSwwLDcwKSA6IDA7ICAgIAp1c2UgY29uc3RhbnQgTUFHSUMgICAgICAgICAgPT4gInVzdGFyIjsKdXNlIGNvbnN0YW50IFRBUl9WRVJTSU9OICAgID0+ICIwMCI7CnVzZSBjb25zdGFudCBMT05HTElOS19OQU1FICA9PiAnLi8uL0BMb25nTGluayc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIGFsbG93IFpMSUIgdG8gYmUgdHVybmVkIG9mZiB1c2luZyBFTlYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBERUJVRyBvbmx5CnVzZSBjb25zdGFudCBaTElCICAgICAgICAgICA9PiBkbyB7ICEkRU5WeydQRVJMNV9BVF9OT19aTElCJ30gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsIHsgcmVxdWlyZSBJTzo6WmxpYiB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRU5WeydQRVJMNV9BVF9OT19aTElCJ30gfHwgJEAgPyAwIDogMSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKdXNlIGNvbnN0YW50IEdaSVBfTUFHSUNfTlVNID0+IHFyL14oPzpcMDM3XDIxM3xcMDM3XDIzNSkvOwoKdXNlIGNvbnN0YW50IENBTl9DSE9XTiAgICAgID0+IGRvIHsgKCQ+ID09IDAgYW5kICReTyBuZSAiTWFjT1MiIGFuZCAkXk8gbmUgIk1TV2luMzIiKSB9Owp1c2UgY29uc3RhbnQgQ0FOX1JFQURMSU5LICAgPT4gKCReTyBuZSAnTVNXaW4zMicgYW5kICReTyAhfiAvUklTQyg/OlsgX10pP09TL2kgYW5kICReTyBuZSAnVk1TJyk7CnVzZSBjb25zdGFudCBPTl9VTklYICAgICAgICA9PiAoJF5PIG5lICdNU1dpbjMyJyBhbmQgJF5PIG5lICdNYWNPUycgYW5kICReTyBuZSAnVk1TJyk7CgoxOwo=</File>
+ <File Location="Kernel/cpan-lib/Archive/Tar/File.pm" Permission="644" Encode="Base64">cGFja2FnZSBBcmNoaXZlOjpUYXI6OkZpbGU7CnVzZSBzdHJpY3Q7Cgp1c2UgSU86OkZpbGU7CnVzZSBGaWxlOjpTcGVjOjpVbml4ICAgICgpOwp1c2UgRmlsZTo6U3BlYyAgICAgICAgICAoKTsKdXNlIEZpbGU6OkJhc2VuYW1lICAgICAgKCk7Cgp1c2UgQXJjaGl2ZTo6VGFyOjpDb25zdGFudDsKCnVzZSB2YXJzIHF3W0BJU0EgJFZFUlNJT05dOwpASVNBICAgICAgICA9IHF3W0FyY2hpdmU6OlRhcl07CiRWRVJTSU9OICAgID0gJzAuMDInOwoKIyMjIHNldCB2YWx1ZSB0byAxIHRvIG9jdCgpIGl0IGR1cmluZyB0aGUgdW5wYWNrICMjIwpteSAkdG1wbCA9IFsKICAgICAgICBuYW1lICAgICAgICA9PiAwLCAgICMgc3RyaW5nCiAgICAgICAgbW9kZSAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgdWlkICAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgZ2lkICAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgc2l6ZSAgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgbXRpbWUgICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgY2hrc3VtICAgICAgPT4gMSwgICAjIG9jdGFsCiAgICAgICAgdHlwZSAgICAgICAgPT4gMCwgICAjIGNoYXJhY3RlcgogICAgICAgIGxpbmtuYW1lICAgID0+IDAsICAgIyBzdHJpbmcKICAgICAgICBtYWdpYyAgICAgICA9PiAwLCAgICMgc3RyaW5nCiAgICAgICAgdmVyc2lvbiAgICAgPT4gMCwgICAjIDIgYnl0ZXMKICAgICAgICB1bmFtZSAgICAgICA9PiAwLCAgICMgc3RyaW5nCiAgICAgICAgZ25hbWUgICAgICAgPT4gMCwgICAjIHN0cmluZwogICAgICAgIGRldm1ham9yICAgID0+IDEsICAgIyBvY3RhbAogICAgICAgIGRldm1pbm9yICAgID0+IDEsICAgIyBvY3RhbAogICAgICAgIHByZWZpeCAgICAgID0+IDAsCgojIyMgZW5kIFVOUEFDSyBpdGVtcyAjIyMKICAgICAgICByYXcgICAgICAgICA9PiAwLCAgICMgdGhlIHJhdyBkYXRhIGNodW5rCiAgICAgICAgZGF0YSAgICAgICAgPT4gMCwgICAjIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSAtLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzICBtaWdodCBiZSB2ZXJ5IG1lbW9yeSBpbnRlbnNpdmUKXTsKCiMjIyBpbnN0YWxsIGdldC9zZXQgYWNjZXNzb3JzIGZvciB0aGlzIG9iamVjdC4KZm9yICggbXkgJGk9MDsgJGk8c2NhbGFyIEAkdG1wbCA7ICRpKz0yICkgewogICAgbXkgJGtleSA9ICR0bXBsLT5bJGldOwogICAgbm8gc3RyaWN0ICdyZWZzJzsKICAgICp7X19QQUNLQUdFX18uIjo6JGtleSJ9ID0gc3ViIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgICRzZWxmLT57JGtleX0gPSAkX1swXSBpZiBAXzsKCiAgICAgICAgIyMjIGp1c3QgaW4gY2FzZSB0aGUga2V5IGlzIG5vdCB0aGVyZSBvciB1bmRlZiBvciBzb21ldGhpbmcgIyMjCiAgICAgICAgeyAgIGxvY2FsICReVyA9IDA7CiAgICAgICAgICAgIHJldHVybiAkc2VsZi0+eyRrZXl9OwogICAgICAgIH0KICAgIH0KfQoKPWhlYWQxIE5BTUUKCkFyY2hpdmU6OlRhcjo6RmlsZSAtIGEgc3ViY2xhc3MgZm9yIGluLW1lbW9yeSBleHRyYWN0ZWQgZmlsZSBmcm9tIEFyY2hpdmU6OlRhcgoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgQGl0ZW1zID0gJHRhci0+Z2V0X2ZpbGVzOwoKICAgIHByaW50ICRfLT5uYW1lLCAnICcsICRfLT5zaXplLCAiXG4iIGZvciBAaXRlbXM7CgogICAgcHJpbnQgJG9iamVjdC0+Z2V0X2NvbnRlbnQ7CiAgICAkb2JqZWN0LT5yZXBsYWNlX2NvbnRlbnQoJ25ldyBjb250ZW50Jyk7CgogICAgJG9iamVjdC0+cmVuYW1lKCAnbmV3L2Z1bGwvcGF0aC90by9maWxlLmMnICk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkFyY2hpdmU6OlRhcjo6RmlsZXMgcHJvdmlkZXMgYSBuZWF0IGxpdHRsZSBvYmplY3QgbGF5ZXIgZm9yIGluLW1lbW9yeQpleHRyYWN0ZWQgZmlsZXMuIEl0J3MgbW9zdGx5IHVzZWQgaW50ZXJuYWxseSBpbiBBcmNoaXZlOjpUYXIgdG8gdGlkeQp1cCB0aGUgY29kZSwgYnV0IHRoZXJlJ3Mgbm8gcmVhc29uIHVzZXJzIHNob3VsZG4ndCB1c2UgdGhpcyBBUEkgYXMKd2VsbC4KCj1oZWFkMiBBY2Nlc3NvcnMKCkEgbG90IG9mIHRoZSBtZXRob2RzIGluIHRoaXMgcGFja2FnZSBhcmUgYWNjZXNzb3JzIHRvIHRoZSB2YXJpb3VzCmZpZWxkcyBpbiB0aGUgdGFyIGhlYWRlcjoKCj1vdmVyIDQKCj1pdGVtIG5hbWUKClRoZSBmaWxlJ3MgbmFtZQoKPWl0ZW0gbW9kZQoKVGhlIGZpbGUncyBtb2RlCgo9aXRlbSB1aWQKClRoZSB1c2VyIGlkIG93bmluZyB0aGUgZmlsZQoKPWl0ZW0gZ2lkCgpUaGUgZ3JvdXAgaWQgb3duaW5nIHRoZSBmaWxlCgo9aXRlbSBzaXplCgpGaWxlIHNpemUgaW4gYnl0ZXMKCj1pdGVtIG10aW1lCgpNb2RpZmljYXRpb24gdGltZS4gQWRqdXN0ZWQgdG8gbWFjLXRpbWUgb24gTWFjT1MgaWYgcmVxdWlyZWQKCj1pdGVtIGNoa3N1bQoKQ2hlY2tzdW0gZmllbGQgZm9yIHRoZSB0YXIgaGVhZGVyCgo9aXRlbSB0eXBlCgpGaWxlIHR5cGUgLS0gbnVtZXJpYywgYnV0IGNvbXBhcmFibGUgdG8gZXhwb3J0ZWQgY29uc3RhbnRzIC0tIHNlZQpBcmNoaXZlOjpUYXIncyBkb2N1bWVudGF0aW9uCgo9aXRlbSBsaW5rbmFtZQoKSWYgdGhlIGZpbGUgaXMgYSBzeW1saW5rLCB0aGUgZmlsZSBpdCdzIHBvaW50aW5nIHRvCgo9aXRlbSBtYWdpYwoKVGFyIG1hZ2ljIHN0cmluZyAtLSBub3QgdXNlZnVsIGZvciBtb3N0IHVzZXJzCgo9aXRlbSB2ZXJzaW9uCgpUYXIgdmVyc2lvbiBzdHJpbmcgLS0gbm90IHVzZWZ1bCBmb3IgbW9zdCB1c2VycwoKPWl0ZW0gdW5hbWUKClRoZSB1c2VyIG5hbWUgdGhhdCBvd25zIHRoZSBmaWxlCgo9aXRlbSBnbmFtZQoKVGhlIGdyb3VwIG5hbWUgdGhhdCBvd25zIHRoZSBmaWxlCgo9aXRlbSBkZXZtYWpvcgoKRGV2aWNlIG1ham9yIG51bWJlciBpbiBjYXNlIG9mIGEgc3BlY2lhbCBmaWxlCgo9aXRlbSBkZXZtaW5vcgoKRGV2aWNlIG1pbm9yIG51bWJlciBpbiBjYXNlIG9mIGEgc3BlY2lhbCBmaWxlCgo9aXRlbSBwcmVmaXgKCkFueSBkaXJlY3RvcnkgdG8gcHJlZml4IHRvIHRoZSBleHRyYWN0aW9uIHBhdGgsIGlmIGFueQoKPWl0ZW0gcmF3CgpSYXcgdGFyIGhlYWRlciAtLSBub3QgdXNlZnVsIGZvciBtb3N0IHVzZXJzCgo9YmFjawoKPWhlYWQxIE1ldGhvZHMKCj1oZWFkMiBuZXcoIGZpbGUgPT4gJHBhdGggKQoKUmV0dXJucyBhIG5ldyBBcmNoaXZlOjpUYXI6OkZpbGUgb2JqZWN0IGZyb20gYW4gZXhpc3RpbmcgZmlsZS4KClJldHVybnMgdW5kZWYgb24gZmFpbHVyZS4KCj1oZWFkMiBuZXcoIGRhdGEgPT4gJHBhdGgsICRkYXRhLCAkb3B0ICkKClJldHVybnMgYSBuZXcgQXJjaGl2ZTo6VGFyOjpGaWxlIG9iamVjdCBmcm9tIGRhdGEuCgpDPCRwYXRoPiBkZWZpbmVzIHRoZSBmaWxlIG5hbWUgKHdoaWNoIG5lZWQgbm90IGV4aXN0KSwgQzwkZGF0YT4gdGhlCmZpbGUgY29udGVudHMsIGFuZCBDPCRvcHQ+IGlzIGEgcmVmZXJlbmNlIHRvIGEgaGFzaCBvZiBhdHRyaWJ1dGVzCndoaWNoIG1heSBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgKGZpZWxkcyBpbiB0aGUKdGFyIGhlYWRlciksIHdoaWNoIGFyZSBkZXNjcmliZWQgYWJvdmUgaW4gdGhlIEFjY2Vzc29ycyBzZWN0aW9uLgoKUmV0dXJucyB1bmRlZiBvbiBmYWlsdXJlLgoKPWhlYWQyIG5ldyggY2h1bmsgPT4gJGNodW5rICkKClJldHVybnMgYSBuZXcgQXJjaGl2ZTo6VGFyOjpGaWxlIG9iamVjdCBmcm9tIGEgcmF3IDUxMi1ieXRlIHRhcgphcmNoaXZlIGNodW5rLgoKUmV0dXJucyB1bmRlZiBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgICA9IHNoaWZ0OwogICAgbXkgJHdoYXQgICAgPSBzaGlmdDsKCiAgICBteSAkb2JqID0gICAoJHdoYXQgZXEgJ2NodW5rJykgPyBfX1BBQ0tBR0VfXy0+X25ld19mcm9tX2NodW5rKCBAXyApIDoKICAgICAgICAgICAgICAgICgkd2hhdCBlcSAnZmlsZScgKSA/IF9fUEFDS0FHRV9fLT5fbmV3X2Zyb21fZmlsZSggQF8gKSA6CiAgICAgICAgICAgICAgICAoJHdoYXQgZXEgJ2RhdGEnICkgPyBfX1BBQ0tBR0VfXy0+X25ld19mcm9tX2RhdGEoIEBfICkgOgogICAgICAgICAgICAgICAgdW5kZWY7CgogICAgcmV0dXJuICRvYmo7Cn0KCiMjIyBjb3BpZXMgdGhlIGRhdGEsIGNyZWF0ZXMgYSBjbG9uZSAjIyMKc3ViIGNsb25lIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gYmxlc3MgeyAlJHNlbGYgfSwgcmVmICRzZWxmOwp9CgpzdWIgX25ld19mcm9tX2NodW5rIHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgJGNodW5rID0gc2hpZnQgb3IgcmV0dXJuOyAgICAjIDUxMiBieXRlcyBvZiB0YXIgaGVhZGVyCiAgICBteSAlaGFzaCAgPSBAXzsKCiAgICAjIyMgZmlsdGVyIGFueSBhcmd1bWVudHMgb24gZGVmaW5lZC1uZXNzIG9mIHZhbHVlcy4KICAgICMjIyB0aGlzIGFsbG93cyBvdmVycmlkaW5nIGZyb20gd2hhdCB0aGUgdGFyLWhlYWRlciBpcyBzYXlpbmcKICAgICMjIyBhYm91dCB0aGlzIHRhci1lbnRyeS4gUGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgQExvbmdMaW5rIGZpbGVzCiAgICBteSAlYXJncyAgPSBtYXAgeyAkXyA9PiAkaGFzaHskX30gfSBncmVwIHsgZGVmaW5lZCAkaGFzaHskX30gfSBrZXlzICVoYXNoOwoKICAgICMjIyBtYWtlcyBpdCBzdGFydCBhdCAwIGFjdHVhbGx5Li4uIDopICMjIwogICAgbXkgJGkgPSAtMTsKICAgIG15ICVlbnRyeSA9IG1hcCB7CiAgICAgICAgJHRtcGwtPlsrKyRpXSA9PiAkdG1wbC0+WysrJGldID8gb2N0ICRfIDogJF8KICAgIH0gbWFwIHsgL14oW15cMF0qKS8gfSB1bnBhY2soIFVOUEFDSywgJGNodW5rICk7CgogICAgbXkgJG9iaiA9IGJsZXNzIHsgJWVudHJ5LCAlYXJncyB9LCAkY2xhc3M7CgoJIyMjIG1hZ2ljIGlzIGEgZmlsZXR5cGUgc3RyaW5nLi4gaXQgc2hvdWxkIGhhdmUgc29tZXRoaW5nIGxpa2UgJ3VzdGFyJyBvcgoJIyMjIHNvbWV0aGluZyBzaW1pbGFyLi4uIGlmIHRoZSBjaHVuayBpcyBnYXJiYWdlLCBza2lwIGl0CglyZXR1cm4gdW5sZXNzICRvYmotPm1hZ2ljICF+IC9cVy87CgogICAgIyMjIHN0b3JlIHRoZSBvcmlnaW5hbCBjaHVuayAjIyMKICAgICRvYmotPnJhdyggJGNodW5rICk7CgogICAgJG9iai0+dHlwZShGSUxFKSBpZiAoICghbGVuZ3RoICRvYmotPnR5cGUpIG9yICgkb2JqLT50eXBlID1+IC9cVy8pICk7CiAgICAkb2JqLT50eXBlKERJUikgIGlmICggKCRvYmotPmlzX2ZpbGUpICYmICgkb2JqLT5uYW1lID1+IG18LyR8KSApOwoKCiAgICByZXR1cm4gJG9iajsKCn0KCnN1YiBfbmV3X2Zyb21fZmlsZSB7CiAgICBteSAkY2xhc3MgICAgICAgPSBzaGlmdDsKICAgIG15ICRwYXRoICAgICAgICA9IHNoaWZ0OyAgICAgICAgCiAgICAKICAgICMjIyBwYXRoIGhhcyB0byBhdCBsZWFzdCBleGlzdAogICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRwYXRoOwogICAgCiAgICBteSAkdHlwZSAgICAgICAgPSBfX1BBQ0tBR0VfXy0+X2ZpbGV0eXBlKCRwYXRoKTsKICAgIG15ICRkYXRhICAgICAgICA9ICcnOwoKICAgIFJFQUQ6IHsgCiAgICAgICAgdW5sZXNzICgkdHlwZSA9PSBESVIgKSB7CiAgICAgICAgICAgIG15ICRmaCA9IElPOjpGaWxlLT5uZXc7CiAgICAgICAgCiAgICAgICAgICAgIHVubGVzcyggJGZoLT5vcGVuKCRwYXRoKSApIHsKICAgICAgICAgICAgICAgICMjIyBkYW5nbGluZyBzeW1saW5rcyBhcmUgZmluZSwgc3RvcCByZWFkaW5nIGJ1dCBjb250aW51ZQogICAgICAgICAgICAgICAgIyMjIGNyZWF0aW5nIHRoZSBvYmplY3QKICAgICAgICAgICAgICAgIGxhc3QgUkVBRCBpZiAkdHlwZSA9PSBTWU1MSU5LOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAjIyMgb3RoZXJ3aXNlLCByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIC0tCiAgICAgICAgICAgICAgICAjIyMgYW55dGhpbmcgdGhhdCdzICpub3QqIGEgc3ltbGluayBzaG91bGQgYmUKICAgICAgICAgICAgICAgICMjIyByZXNvbHZhYmxlCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyBiaW5tb2RlIG5lZWRlZCB0byByZWFkIGZpbGVzIHByb3Blcmx5IG9uIHdpbjMyICMjIwogICAgICAgICAgICBiaW5tb2RlICRmaDsKICAgICAgICAgICAgJGRhdGEgPSBkbyB7IGxvY2FsICQvOyA8JGZoPiB9OwogICAgICAgICAgICBjbG9zZSAkZmg7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBpdGVtcyAgICAgICA9IHF3W21vZGUgdWlkIGdpZCBzaXplIG10aW1lXTsKICAgIG15ICVoYXNoICAgICAgICA9IG1hcCB7IHNoaWZ0KEBpdGVtcyksICRfIH0gKGxzdGF0ICRwYXRoKVsyLDQsNSw3LDldOwoKICAgICMjIyB5b3UgKm11c3QqIHNldCBzaXplID09IDAgb24gc3ltbGlua3MsIG9yIHRoZSBuZXh0IGVudHJ5IHdpbGwgYmUKICAgICMjIyB0aG91Z2ggb2YgYXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1saW5rLCB3aGljaCBpcyB3cm9uZy4KICAgICMjIyB0aGlzIGZpeGVzIGJ1ZyAjNzkzNwogICAgJGhhc2h7c2l6ZX0gICAgID0gMCBpZiAoJHR5cGUgPT0gRElSIG9yICR0eXBlID09IFNZTUxJTkspOwogICAgJGhhc2h7bXRpbWV9ICAgIC09IFRJTUVfT0ZGU0VUOwoKICAgICMjIyBzdHJpcCB0aGUgaGlnaCBiaXRzIG9mZiB0aGUgbW9kZSwgd2hpY2ggd2UgZG9uJ3QgbmVlZCB0byBzdG9yZQogICAgJGhhc2h7bW9kZX0gICAgID0gU1RSSVBfTU9ERS0+KCAkaGFzaHttb2RlfSApOwoKCiAgICAjIyMgcHJvYmFibHkgcmVxdWlyZXMgc29tZSBmaWxlIHBhdGggbXVuZ2luZyBoZXJlIC4uLiAjIyMKICAgICMjIyBuYW1lIGFuZCBwcmVmaXggYXJlIHNldCBsYXRlcgogICAgbXkgJG9iaiA9IHsKICAgICAgICAlaGFzaCwKICAgICAgICBuYW1lICAgICAgICA9PiAnJywKICAgICAgICBjaGtzdW0gICAgICA9PiBDSEVDS19TVU0sCiAgICAgICAgdHlwZSAgICAgICAgPT4gJHR5cGUsCiAgICAgICAgbGlua25hbWUgICAgPT4gKCR0eXBlID09IFNZTUxJTksgYW5kIENBTl9SRUFETElOSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVhZGxpbmsgJHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJycsCiAgICAgICAgbWFnaWMgICAgICAgPT4gTUFHSUMsCiAgICAgICAgdmVyc2lvbiAgICAgPT4gVEFSX1ZFUlNJT04sCiAgICAgICAgdW5hbWUgICAgICAgPT4gVU5BTUUtPiggJGhhc2h7dWlkfSApLAogICAgICAgIGduYW1lICAgICAgID0+IEdOQU1FLT4oICRoYXNoe2dpZH0gKSwKICAgICAgICBkZXZtYWpvciAgICA9PiAwLCAgICMgbm90IGhhbmRsZWQKICAgICAgICBkZXZtaW5vciAgICA9PiAwLCAgICMgbm90IGhhbmRsZWQKICAgICAgICBwcmVmaXggICAgICA9PiAnJywKICAgICAgICBkYXRhICAgICAgICA9PiAkZGF0YSwKICAgIH07CgogICAgYmxlc3MgJG9iaiwgJGNsYXNzOwoKICAgICMjIyBmaXggdXAgdGhlIHByZWZpeCBhbmQgZmlsZSBmcm9tIHRoZSBwYXRoCiAgICBteSgkcHJlZml4LCRmaWxlKSA9ICRvYmotPl9wcmVmaXhfYW5kX2ZpbGUoICRwYXRoICk7CiAgICAkb2JqLT5wcmVmaXgoICRwcmVmaXggKTsKICAgICRvYmotPm5hbWUoICRmaWxlICk7CgogICAgcmV0dXJuICRvYmo7Cn0KCnN1YiBfbmV3X2Zyb21fZGF0YSB7CiAgICBteSAkY2xhc3MgICA9IHNoaWZ0OwogICAgbXkgJHBhdGggICAgPSBzaGlmdDsgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRwYXRoOwogICAgbXkgJGRhdGEgICAgPSBzaGlmdDsgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRkYXRhOwogICAgbXkgJG9wdCAgICAgPSBzaGlmdDsKCiAgICBteSAkb2JqID0gewogICAgICAgIGRhdGEgICAgICAgID0+ICRkYXRhLAogICAgICAgIG5hbWUgICAgICAgID0+ICcnLAogICAgICAgIG1vZGUgICAgICAgID0+IE1PREUsCiAgICAgICAgdWlkICAgICAgICAgPT4gVUlELAogICAgICAgIGdpZCAgICAgICAgID0+IEdJRCwKICAgICAgICBzaXplICAgICAgICA9PiBsZW5ndGggJGRhdGEsCiAgICAgICAgbXRpbWUgICAgICAgPT4gdGltZSAtIFRJTUVfT0ZGU0VULAogICAgICAgIGNoa3N1bSAgICAgID0+IENIRUNLX1NVTSwKICAgICAgICB0eXBlICAgICAgICA9PiBGSUxFLAogICAgICAgIGxpbmtuYW1lICAgID0+ICcnLAogICAgICAgIG1hZ2ljICAgICAgID0+IE1BR0lDLAogICAgICAgIHZlcnNpb24gICAgID0+IFRBUl9WRVJTSU9OLAogICAgICAgIHVuYW1lICAgICAgID0+IFVOQU1FLT4oIFVJRCApLAogICAgICAgIGduYW1lICAgICAgID0+IEdOQU1FLT4oIEdJRCApLAogICAgICAgIGRldm1pbm9yICAgID0+IDAsCiAgICAgICAgZGV2bWFqb3IgICAgPT4gMCwKICAgICAgICBwcmVmaXggICAgICA9PiAnJywKICAgIH07CgogICAgIyMjIG92ZXJ3cml0ZSB3aXRoIHVzZXIgb3B0aW9ucywgaWYgcHJvdmlkZWQgIyMjCiAgICBpZiggJG9wdCBhbmQgcmVmICRvcHQgZXEgJ0hBU0gnICkgewogICAgICAgIGZvciBteSAka2V5ICgga2V5cyAlJG9wdCApIHsKCiAgICAgICAgICAgICMjIyBkb24ndCB3cml0ZSBib2d1cyBvcHRpb25zICMjIwogICAgICAgICAgICBuZXh0IHVubGVzcyBleGlzdHMgJG9iai0+eyRrZXl9OwogICAgICAgICAgICAkb2JqLT57JGtleX0gPSAkb3B0LT57JGtleX07CiAgICAgICAgfQogICAgfQoKICAgIGJsZXNzICRvYmosICRjbGFzczsKCiAgICAjIyMgZml4IHVwIHRoZSBwcmVmaXggYW5kIGZpbGUgZnJvbSB0aGUgcGF0aAogICAgbXkoJHByZWZpeCwkZmlsZSkgPSAkb2JqLT5fcHJlZml4X2FuZF9maWxlKCAkcGF0aCApOwogICAgJG9iai0+cHJlZml4KCAkcHJlZml4ICk7CiAgICAkb2JqLT5uYW1lKCAkZmlsZSApOwoKICAgIHJldHVybiAkb2JqOwp9CgpzdWIgX3ByZWZpeF9hbmRfZmlsZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHBhdGggPSBzaGlmdDsKCiAgICBteSAoJHZvbCwgJGRpcnMsICRmaWxlKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGgsICRzZWxmLT5pc19kaXIgKTsKICAgIG15IEBkaXJzID0gRmlsZTo6U3BlYy0+c3BsaXRkaXIoICRkaXJzICk7CgogICAgIyMjIHNvIHNvbWV0aW1lcyB0aGUgbGFzdCBlbGVtZW50IGlzICcnIC0tIHByb2JhYmx5IHdoZW4gdHJhaWxpbmcKICAgICMjIyBkaXIgc2xhc2hlcyBhcmUgZW5jb3VudGVyZWQuLi4gdGhpcyBpcyBpcyBvZiBjb3Vyc2UgcG9pbnRsZXNzLAogICAgIyMjIHNvIHJlbW92ZSBpdAogICAgcG9wIEBkaXJzIHdoaWxlIEBkaXJzIGFuZCBub3QgbGVuZ3RoICRkaXJzWy0xXTsKCiAgICAjIyMgaWYgaXQncyBhIGRpcmVjdG9yeSwgdGhlbiAkZmlsZSBtaWdodCBiZSBlbXB0eQogICAgJGZpbGUgPSBwb3AgQGRpcnMgaWYgJHNlbGYtPmlzX2RpciBhbmQgbm90IGxlbmd0aCAkZmlsZTsKCiAgICBteSAkcHJlZml4ID0gRmlsZTo6U3BlYzo6VW5peC0+Y2F0ZGlyKAogICAgICAgICAgICAgICAgICAgICAgICBncmVwIHsgbGVuZ3RoIH0gJHZvbCwgQGRpcnMKICAgICAgICAgICAgICAgICAgICApOwogICAgcmV0dXJuKCAkcHJlZml4LCAkZmlsZSApOwp9CgpzdWIgX2ZpbGV0eXBlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkZmlsZSA9IHNoaWZ0OwogICAgCiAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CgogICAgcmV0dXJuIFNZTUxJTksgIGlmICgtbCAkZmlsZSk7CSMgU3ltbGluawoKICAgIHJldHVybiBGSUxFICAgICBpZiAoLWYgXyk7CQkjIFBsYWluIGZpbGUKCiAgICByZXR1cm4gRElSICAgICAgaWYgKC1kIF8pOwkJIyBEaXJlY3RvcnkKCiAgICByZXR1cm4gRklGTyAgICAgaWYgKC1wIF8pOwkJIyBOYW1lZCBwaXBlCgogICAgcmV0dXJuIFNPQ0tFVCAgIGlmICgtUyBfKTsJCSMgU29ja2V0CgogICAgcmV0dXJuIEJMT0NLREVWIGlmICgtYiBfKTsJCSMgQmxvY2sgc3BlY2lhbAoKICAgIHJldHVybiBDSEFSREVWICBpZiAoLWMgXyk7CQkjIENoYXJhY3RlciBzcGVjaWFsCgogICAgIyMjIHNob3VsZG4ndCBoYXBwZW4sIHRoaXMgaXMgd2hlbiBtYWtpbmcgYXJjaGl2ZXMsIG5vdCByZWFkaW5nICMjIwogICAgcmV0dXJuIExPTkdMSU5LIGlmICggJGZpbGUgZXEgTE9OR0xJTktfTkFNRSApOwoKICAgIHJldHVybiBVTktOT1dOOwkJICAgICAgICAgICAgIyBTb21ldGhpbmcgZWxzZSAobGlrZSB3aGF0PykKCn0KCiMjIyB0aGlzIG1ldGhvZCAnZG93bmdyYWRlcycgYSBmaWxlIHRvIHBsYWluIGZpbGUgLS0gdGhpcyBpcyB1c2VkIGZvcgojIyMgc3ltbGlua3Mgd2hlbiBGT0xMT1dfU1lNTElOS1MgaXMgdHJ1ZS4Kc3ViIF9kb3duZ3JhZGVfdG9fcGxhaW5maWxlIHsKICAgIG15ICRlbnRyeSA9IHNoaWZ0OwogICAgJGVudHJ5LT50eXBlKCBGSUxFICk7CiAgICAkZW50cnktPm1vZGUoIE1PREUgKTsKICAgICRlbnRyeS0+bGlua25hbWUoJycpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgZnVsbF9wYXRoCgpSZXR1cm5zIHRoZSBmdWxsIHBhdGggZnJvbSB0aGUgdGFyIGhlYWRlcjsgdGhpcyBpcyBiYXNpY2FsbHkgYQpjb25jYXRlbmF0aW9uIG9mIHRoZSBDPHByZWZpeD4gYW5kIEM8bmFtZT4gZmllbGRzLgoKPWN1dAoKc3ViIGZ1bGxfcGF0aCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgICMjIyBpZiBwcmVmaXggZmllbGQgaXMgZW10cHkKICAgIHJldHVybiAkc2VsZi0+bmFtZSB1bmxlc3MgZGVmaW5lZCAkc2VsZi0+cHJlZml4IGFuZCBsZW5ndGggJHNlbGYtPnByZWZpeDsKCiAgICAjIyMgb3Igb3RoZXJ3aXNlLCBjYXRmaWxlJ2QKICAgIHJldHVybiBGaWxlOjpTcGVjOjpVbml4LT5jYXRmaWxlKCAkc2VsZi0+cHJlZml4LCAkc2VsZi0+bmFtZSApOwp9CgoKPWhlYWQyIHZhbGlkYXRlCgpEb25lIGJ5IEFyY2hpdmU6OlRhciBpbnRlcm5hbGx5IHdoZW4gcmVhZGluZyB0aGUgdGFyIGZpbGU6CnZhbGlkYXRlIHRoZSBoZWFkZXIgYWdhaW5zdCB0aGUgY2hlY2tzdW0gdG8gZW5zdXJlIGludGVnZXIgdGFyIGZpbGUuCgpSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQoKPWN1dAoKc3ViIHZhbGlkYXRlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgbXkgJHJhdyA9ICRzZWxmLT5yYXc7CgogICAgIyMjIGRvbid0IGtub3cgd2h5IHRoaXMgb25lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2UgL3dyaXRlLyAjIyMKICAgIHN1YnN0ciAoJHJhdywgMTQ4LCA4KSA9ICIgICAgICAgICI7CglyZXR1cm4gdW5wYWNrICgiJTE2QyoiLCAkcmF3KSA9PSAkc2VsZi0+Y2hrc3VtID8gMSA6IDA7Cn0KCj1oZWFkMiBoYXNfY29udGVudAoKUmV0dXJucyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgY3VycmVudCBvYmplY3QgaGFzIGNvbnRlbnQuClNvbWUgc3BlY2lhbCBmaWxlcyBsaWtlIGRpcmVjdG9yaWVzIGFuZCBzbyBvbiBuZXZlciB3aWxsIGhhdmUgYW55CmNvbnRlbnQuIFRoaXMgbWV0aG9kIGlzIG1haW5seSB0byBtYWtlIHN1cmUgeW91IGRvbid0IGdldCB3YXJuaW5ncwpmb3IgdXNpbmcgdW5pbml0aWFsaXplZCB2YWx1ZXMgd2hlbiBsb29raW5nIGF0IGFuIG9iamVjdCdzIGNvbnRlbnQuCgo9Y3V0CgpzdWIgaGFzX2NvbnRlbnQgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiBkZWZpbmVkICRzZWxmLT5kYXRhKCkgJiYgbGVuZ3RoICRzZWxmLT5kYXRhKCkgPyAxIDogMDsKfQoKPWhlYWQyIGdldF9jb250ZW50CgpSZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRlbnQgZm9yIHRoZSBpbi1tZW1vcnkgZmlsZQoKPWN1dAoKc3ViIGdldF9jb250ZW50IHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAkc2VsZi0+ZGF0YSggKTsKfQoKPWhlYWQyIGdldF9jb250ZW50X2J5X3JlZgoKUmV0dXJucyB0aGUgY3VycmVudCBjb250ZW50IGZvciB0aGUgaW4tbWVtb3J5IGZpbGUgYXMgYSBzY2FsYXIKcmVmZXJlbmNlLiBOb3JtYWwgdXNlcnMgd29uJ3QgbmVlZCB0aGlzLCBidXQgaXQgd2lsbCBzYXZlIG1lbW9yeSBpZgp5b3UgYXJlIGRlYWxpbmcgd2l0aCB2ZXJ5IGxhcmdlIGRhdGEgZmlsZXMgaW4geW91ciB0YXIgYXJjaGl2ZSwgc2luY2UKaXQgd2lsbCBwYXNzIHRoZSBjb250ZW50cyBieSByZWZlcmVuY2UsIHJhdGhlciB0aGFuIG1ha2UgYSBjb3B5IG9mIGl0CmZpcnN0LgoKPWN1dAoKc3ViIGdldF9jb250ZW50X2J5X3JlZiB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiBcJHNlbGYtPntkYXRhfTsKfQoKPWhlYWQyIHJlcGxhY2VfY29udGVudCggJGNvbnRlbnQgKQoKUmVwbGFjZSB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBmaWxlIHdpdGggdGhlIG5ldyBjb250ZW50LiBUaGlzCm9ubHkgYWZmZWN0cyB0aGUgaW4tbWVtb3J5IGFyY2hpdmUsIG5vdCB0aGUgb24tZGlzayB2ZXJzaW9uIHVudGlsCnlvdSB3cml0ZSBpdC4KClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIHJlcGxhY2VfY29udGVudCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGRhdGEgPSBzaGlmdCB8fCAnJzsKCiAgICAkc2VsZi0+ZGF0YSggJGRhdGEgKTsKICAgICRzZWxmLT5zaXplKCBsZW5ndGggJGRhdGEgKTsKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgcmVuYW1lKCAkbmV3X25hbWUgKQoKUmVuYW1lIHRoZSBjdXJyZW50IGZpbGUgdG8gJG5ld19uYW1lLgoKTm90ZSB0aGF0IHlvdSBtdXN0IHNwZWNpZnkgYSBVbml4IHBhdGggZm9yICRuZXdfbmFtZSwgc2luY2UgcGVyIHRhcgpzdGFuZGFyZCwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlIG11c3QgYmUgVW5peCBwYXRocy4KClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIHJlbmFtZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHBhdGggPSBzaGlmdDsKICAgIAogICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRwYXRoOwoKICAgIG15ICgkcHJlZml4LCRmaWxlKSA9ICRzZWxmLT5fcHJlZml4X2FuZF9maWxlKCAkcGF0aCApOwoKICAgICRzZWxmLT5uYW1lKCAkZmlsZSApOwogICAgJHNlbGYtPnByZWZpeCggJHByZWZpeCApOwoKCXJldHVybiAxOwp9Cgo9aGVhZDEgQ29udmVuaWVuY2UgbWV0aG9kcwoKVG8gcXVpY2tseSBjaGVjayB0aGUgdHlwZSBvZiBhIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3QsIHlvdSBjYW4KdXNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKCj1vdmVyIDQKCj1pdGVtIGlzX2ZpbGUKClJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBvZiB0eXBlIEM8ZmlsZT4KCj1pdGVtIGlzX2RpcgoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxkaXI+Cgo9aXRlbSBpc19oYXJkbGluawoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxoYXJkbGluaz4KCj1pdGVtIGlzX3N5bWxpbmsKClJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBvZiB0eXBlIEM8c3ltbGluaz4KCj1pdGVtIGlzX2NoYXJkZXYKClJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBvZiB0eXBlIEM8Y2hhcmRldj4KCj1pdGVtIGlzX2Jsb2NrZGV2CgpSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgb2YgdHlwZSBDPGJsb2NrZGV2PgoKPWl0ZW0gaXNfZmlmbwoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxmaWZvPgoKPWl0ZW0gaXNfc29ja2V0CgpSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgb2YgdHlwZSBDPHNvY2tldD4KCj1pdGVtIGlzX2xvbmdsaW5rCgpSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgb2YgdHlwZSBDPExvbmdMaW5rPi4KU2hvdWxkIG5vdCBoYXBwZW4gYWZ0ZXIgYSBzdWNjZXNzZnVsIEM8cmVhZD4uCgo9aXRlbSBpc19sYWJlbAoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIG9mIHR5cGUgQzxMYWJlbD4uClNob3VsZCBub3QgaGFwcGVuIGFmdGVyIGEgc3VjY2Vzc2Z1bCBDPHJlYWQ+LgoKPWl0ZW0gaXNfdW5rbm93bgoKUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIHR5cGUgaXMgQzx1bmtub3duPgoKPWJhY2sKCj1jdXQKCiNzdHVwaWQgcGVybDUuNS4zIG5lZWRzIHRvIHdhcm4gaWYgaXQncyBub3QgbnVtZXJpYwpzdWIgaXNfZmlsZSAgICAgeyBsb2NhbCAkXlc7ICAgIEZJTEUgICAgICA9PSAkX1swXS0+dHlwZSB9CnN1YiBpc19kaXIgICAgICB7IGxvY2FsICReVzsgICAgRElSICAgICAgID09ICRfWzBdLT50eXBlIH0Kc3ViIGlzX2hhcmRsaW5rIHsgbG9jYWwgJF5XOyAgICBIQVJETElOSyAgPT0gJF9bMF0tPnR5cGUgfQpzdWIgaXNfc3ltbGluayAgeyBsb2NhbCAkXlc7ICAgIFNZTUxJTksgICA9PSAkX1swXS0+dHlwZSB9CnN1YiBpc19jaGFyZGV2ICB7IGxvY2FsICReVzsgICAgQ0hBUkRFViAgID09ICRfWzBdLT50eXBlIH0Kc3ViIGlzX2Jsb2NrZGV2IHsgbG9jYWwgJF5XOyAgICBCTE9DS0RFViAgPT0gJF9bMF0tPnR5cGUgfQpzdWIgaXNfZmlmbyAgICAgeyBsb2NhbCAkXlc7ICAgIEZJRk8gICAgICA9PSAkX1swXS0+dHlwZSB9CnN1YiBpc19zb2NrZXQgICB7IGxvY2FsICReVzsgICAgU09DS0VUICAgID09ICRfWzBdLT50eXBlIH0Kc3ViIGlzX3Vua25vd24gIHsgbG9jYWwgJF5XOyAgICBVTktOT1dOICAgPT0gJF9bMF0tPnR5cGUgfQpzdWIgaXNfbG9uZ2xpbmsgeyBsb2NhbCAkXlc7ICAgIExPTkdMSU5LICBlcSAkX1swXS0+dHlwZSB9CnN1YiBpc19sYWJlbCAgICB7IGxvY2FsICReVzsgICAgTEFCRUwgICAgIGVxICRfWzBdLT50eXBlIH0KCjE7Cg==</File>
+ <File Location="Kernel/cpan-lib/Archive/Tar.pm" Permission="644" Encode="Base64">IyMjIHRoZSBnbnUgdGFyIHNwZWNpZmljYXRpb246CiMjIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGFyL21hbnVhbC90YXIuaHRtbAojIyMKIyMjIGFuZCB0aGUgcGF4IGZvcm1hdCBzcGVjLCB3aGljaCB0YXIgZGVyaXZlcyBmcm9tOgojIyMgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9wYXguaHRtbAoKcGFja2FnZSBBcmNoaXZlOjpUYXI7CnJlcXVpcmUgNS4wMDVfMDM7Cgp1c2Ugc3RyaWN0Owp1c2UgdmFycyBxd1skREVCVUcgJGVycm9yICRWRVJTSU9OICRXQVJOICRGT0xMT1dfU1lNTElOSyAkQ0hPV04gJENITU9ECiAgICAgICAgICAgICRET19OT1RfVVNFX1BSRUZJWCAkSEFTX1BFUkxJTyAkSEFTX0lPX1NUUklOR107CgokREVCVUcgICAgICAgICAgICAgID0gMDsKJFdBUk4gICAgICAgICAgICAgICA9IDE7CiRGT0xMT1dfU1lNTElOSyAgICAgPSAwOwokVkVSU0lPTiAgICAgICAgICAgID0gIjEuMzQiOwokQ0hPV04gICAgICAgICAgICAgID0gMTsKJENITU9EICAgICAgICAgICAgICA9IDE7CiRET19OT1RfVVNFX1BSRUZJWCAgPSAwOwoKQkVHSU4gewogICAgdXNlIENvbmZpZzsKICAgICRIQVNfUEVSTElPID0gJENvbmZpZzo6Q29uZmlne3VzZXBlcmxpb307CgogICAgIyMjIHRyeSBhbmQgbG9hZCBJTzo6U3RyaW5nIGFueXdheSwgc28geW91IGNhbiBkeW5hbWljYWxseQogICAgIyMjIHN3aXRjaCBiZXR3ZWVuIHBlcmxpbyBhbmQgSU86OlN0cmluZwogICAgZXZhbCB7CiAgICAgICAgcmVxdWlyZSBJTzo6U3RyaW5nOwogICAgICAgIGltcG9ydCBJTzo6U3RyaW5nOwogICAgfTsKICAgICRIQVNfSU9fU1RSSU5HID0gJEAgPyAwIDogMTsKCn0KCnVzZSBDd2Q7CnVzZSBJTzo6RmlsZTsKdXNlIENhcnAgICAgICAgICAgICAgICAgcXcoY2FycCBjcm9hayk7CnVzZSBGaWxlOjpTcGVjICAgICAgICAgICgpOwp1c2UgRmlsZTo6U3BlYzo6VW5peCAgICAoKTsKdXNlIEZpbGU6OlBhdGggICAgICAgICAgKCk7Cgp1c2UgQXJjaGl2ZTo6VGFyOjpGaWxlOwp1c2UgQXJjaGl2ZTo6VGFyOjpDb25zdGFudDsKCj1oZWFkMSBOQU1FCgpBcmNoaXZlOjpUYXIgLSBtb2R1bGUgZm9yIG1hbmlwdWxhdGlvbnMgb2YgdGFyIGFyY2hpdmVzCgo9aGVhZDEgU1lOT1BTSVMKCiAgICB1c2UgQXJjaGl2ZTo6VGFyOwogICAgbXkgJHRhciA9IEFyY2hpdmU6OlRhci0+bmV3OwoKICAgICR0YXItPnJlYWQoJ29yaWdpbi50Z3onLDEpOwogICAgJHRhci0+ZXh0cmFjdCgpOwoKICAgICR0YXItPmFkZF9maWxlcygnZmlsZS9mb28ucGwnLCAnZG9jcy9SRUFETUUnKTsKICAgICR0YXItPmFkZF9kYXRhKCdmaWxlL2Jhei50eHQnLCAnVGhpcyBpcyB0aGUgY29udGVudHMgbm93Jyk7CgogICAgJHRhci0+cmVuYW1lKCdvbGRuYW1lJywgJ25ldy9maWxlL25hbWUnKTsKCiAgICAkdGFyLT53cml0ZSgnZmlsZXMudGFyJyk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkFyY2hpdmU6OlRhciBwcm92aWRlcyBhbiBvYmplY3Qgb3JpZW50ZWQgbWVjaGFuaXNtIGZvciBoYW5kbGluZyB0YXIKZmlsZXMuICBJdCBwcm92aWRlcyBjbGFzcyBtZXRob2RzIGZvciBxdWljayBhbmQgZWFzeSBmaWxlcyBoYW5kbGluZwp3aGlsZSBhbHNvIGFsbG93aW5nIGZvciB0aGUgY3JlYXRpb24gb2YgdGFyIGZpbGUgb2JqZWN0cyBmb3IgY3VzdG9tCm1hbmlwdWxhdGlvbi4gIElmIHlvdSBoYXZlIHRoZSBJTzo6WmxpYiBtb2R1bGUgaW5zdGFsbGVkLApBcmNoaXZlOjpUYXIgd2lsbCBhbHNvIHN1cHBvcnQgY29tcHJlc3NlZCBvciBnemlwcGVkIHRhciBmaWxlcy4KCkFuIG9iamVjdCBvZiBjbGFzcyBBcmNoaXZlOjpUYXIgcmVwcmVzZW50cyBhIC50YXIoLmd6KSBhcmNoaXZlIGZ1bGwKb2YgZmlsZXMgYW5kIHRoaW5ncy4KCj1oZWFkMSBPYmplY3QgTWV0aG9kcwoKPWhlYWQyIEFyY2hpdmU6OlRhci0+bmV3KCBbJGZpbGUsICRjb21wcmVzc2VkXSApCgpSZXR1cm5zIGEgbmV3IFRhciBvYmplY3QuIElmIGdpdmVuIGFueSBhcmd1bWVudHMsIEM8bmV3KCk+IGNhbGxzIHRoZQpDPHJlYWQoKT4gbWV0aG9kIGF1dG9tYXRpY2FsbHksIHBhc3Npbmcgb24gdGhlIGFyZ3VtZW50cyBwcm92aWRlZCB0bwp0aGUgQzxyZWFkKCk+IG1ldGhvZC4KCklmIEM8bmV3KCk+IGlzIGludm9rZWQgd2l0aCBhcmd1bWVudHMgYW5kIHRoZSBDPHJlYWQoKT4gbWV0aG9kIGZhaWxzCmZvciBhbnkgcmVhc29uLCBDPG5ldygpPiByZXR1cm5zIHVuZGVmLgoKPWN1dAoKbXkgJHRtcGwgPSB7CiAgICBfZGF0YSAgID0+IFsgXSwKICAgIF9maWxlICAgPT4gJ1Vua25vd24nLAp9OwoKIyMjIGluc3RhbGwgZ2V0L3NldCBhY2Nlc3NvcnMgZm9yIHRoaXMgb2JqZWN0Lgpmb3IgbXkgJGtleSAoIGtleXMgJSR0bXBsICkgewogICAgbm8gc3RyaWN0ICdyZWZzJzsKICAgICp7X19QQUNLQUdFX18uIjo6JGtleSJ9ID0gc3ViIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgICRzZWxmLT57JGtleX0gPSAkX1swXSBpZiBAXzsKICAgICAgICByZXR1cm4gJHNlbGYtPnska2V5fTsKICAgIH0KfQoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgICRjbGFzcyA9IHJlZiAkY2xhc3MgaWYgcmVmICRjbGFzczsKCiAgICAjIyMgY29weWluZyAkdG1wbCBoZXJlIHNpbmNlIGEgc2hhbGxvdyBjb3B5IG1ha2VzIGl0IHVzZSB0aGUKICAgICMjIyBzYW1lIGFyZWYsIGNhdXNpbmcgZm9yIGZpbGVzIHRvIHJlbWFpbiBpbiBtZW1vcnkgYWx3YXlzLgogICAgbXkgJG9iaiA9IGJsZXNzIHsgX2RhdGEgPT4gWyBdLCBfZmlsZSA9PiAnVW5rbm93bicgfSwgJGNsYXNzOwoKICAgIGlmIChAXykgewogICAgICAgIHVubGVzcyAoICRvYmotPnJlYWQoIEBfICkgKSB7CiAgICAgICAgICAgICRvYmotPl9lcnJvcihxcVtObyBkYXRhIGNvdWxkIGJlIHJlYWQgZnJvbSBmaWxlXSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRvYmo7Cn0KCj1oZWFkMiAkdGFyLT5yZWFkICggJGZpbGVuYW1lfCRoYW5kbGUsICRjb21wcmVzc2VkLCB7b3B0ID0+ICd2YWwnfSApCgpSZWFkIHRoZSBnaXZlbiB0YXIgZmlsZSBpbnRvIG1lbW9yeS4KVGhlIGZpcnN0IGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgdGhlIG5hbWUgb2YgYSBmaWxlIG9yIGEgcmVmZXJlbmNlIHRvCmFuIGFscmVhZHkgb3BlbiBmaWxlaGFuZGxlIChvciBhbiBJTzo6WmxpYiBvYmplY3QgaWYgaXQncyBjb21wcmVzc2VkKQpUaGUgc2Vjb25kIGFyZ3VtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlIHJlZmVyZW5jZWQgYnkgdGhlIGZpcnN0CmFyZ3VtZW50IGlzIGNvbXByZXNzZWQuCgpUaGUgQzxyZWFkPiB3aWxsIEk8cmVwbGFjZT4gYW55IHByZXZpb3VzIGNvbnRlbnQgaW4gQzwkdGFyPiEKClRoZSBzZWNvbmQgYXJndW1lbnQgbWF5IGJlIGNvbnNpZGVyZWQgb3B0aW9uYWwgaWYgSU86OlpsaWIgaXMKaW5zdGFsbGVkLCBzaW5jZSBpdCB3aWxsIHRyYW5zcGFyZW50bHkgRG8gVGhlIFJpZ2h0IFRoaW5nLgpBcmNoaXZlOjpUYXIgd2lsbCB3YXJuIGlmIHlvdSB0cnkgdG8gcGFzcyBhIGNvbXByZXNzZWQgZmlsZSBpZgpJTzo6WmxpYiBpcyBub3QgYXZhaWxhYmxlIGFuZCBzaW1wbHkgcmV0dXJuLgoKTm90ZSB0aGF0IHlvdSBjYW4gY3VycmVudGx5IEI8bm90PiBwYXNzIGEgQzxnemlwPiBjb21wcmVzc2VkCmZpbGVoYW5kbGUsIHdoaWNoIGlzIG5vdCBvcGVuZWQgd2l0aCBDPElPOjpabGliPiwgbm9yIGEgc3RyaW5nCmNvbnRhaW5pbmcgdGhlIGZ1bGwgYXJjaGl2ZSBpbmZvcm1hdGlvbiAoZWl0aGVyIGNvbXByZXNzZWQgb3IKdW5jb21wcmVzc2VkKS4gVGhlc2UgYXJlIHdvcnRoIHdoaWxlIGZlYXR1cmVzLCBidXQgbm90IGN1cnJlbnRseQppbXBsZW1lbnRlZC4gU2VlIHRoZSBDPFRPRE8+IHNlY3Rpb24uCgpUaGUgdGhpcmQgYXJndW1lbnQgY2FuIGJlIGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBvcHRpb25zLiBOb3RlIHRoYXQKYWxsIG9wdGlvbnMgYXJlIGNhc2Utc2Vuc2l0aXZlLgoKPW92ZXIgNAoKPWl0ZW0gbGltaXQKCkRvIG5vdCByZWFkIG1vcmUgdGhhbiBDPGxpbWl0PiBmaWxlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUKdmVyeSBiaWcgYXJjaGl2ZXMsIGFuZCBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaXJzdCBmZXcgZmlsZXMuCgo9aXRlbSBleHRyYWN0CgpJZiBzZXQgdG8gdHJ1ZSwgaW1tZWRpYXRlbHkgZXh0cmFjdCBlbnRyaWVzIHdoZW4gcmVhZGluZyB0aGVtLiBUaGlzCmdpdmVzIHlvdSB0aGUgc2FtZSBtZW1vcnkgYnJlYWsgYXMgdGhlIEM8ZXh0cmFjdF9hcmNoaXZlPiBmdW5jdGlvbi4KTm90ZSBob3dldmVyIHRoYXQgZW50cmllcyB3aWxsIG5vdCBiZSByZWFkIGludG8gbWVtb3J5LCBidXQgd3JpdHRlbgpzdHJhaWdodCB0byBkaXNrLgoKPWJhY2sKCkFsbCBmaWxlcyBhcmUgc3RvcmVkIGludGVybmFsbHkgYXMgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IG9iamVjdHMuClBsZWFzZSBjb25zdWx0IHRoZSBMPEFyY2hpdmU6OlRhcjo6RmlsZT4gZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KClJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlcyByZWFkIGluIHNjYWxhciBjb250ZXh0LCBhbmQgYSBsaXN0IG9mCkM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3RzIGluIGxpc3QgY29udGV4dC4KCj1jdXQKCnN1YiByZWFkIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkZmlsZSA9IHNoaWZ0OwogICAgbXkgJGd6aXAgPSBzaGlmdCB8fCAwOwogICAgbXkgJG9wdHMgPSBzaGlmdCB8fCB7fTsKCiAgICB1bmxlc3MoIGRlZmluZWQgJGZpbGUgKSB7CiAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbTm8gZmlsZSB0byByZWFkIGZyb20hXSApOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgJHNlbGYtPl9maWxlKCAkZmlsZSApOwogICAgfQoKICAgIG15ICRoYW5kbGUgPSAkc2VsZi0+X2dldF9oYW5kbGUoJGZpbGUsICRnemlwLCBSRUFEX09OTFktPiggWkxJQiApICkKICAgICAgICAgICAgICAgICAgICBvciByZXR1cm47CgogICAgbXkgJGRhdGEgPSAkc2VsZi0+X3JlYWRfdGFyKCAkaGFuZGxlLCAkb3B0cyApIG9yIHJldHVybjsKCiAgICAkc2VsZi0+X2RhdGEoICRkYXRhICk7CgogICAgcmV0dXJuIHdhbnRhcnJheSA/IEAkZGF0YSA6IHNjYWxhciBAJGRhdGE7Cn0KCnN1YiBfZ2V0X2hhbmRsZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZSBpZiByZWYgJGZpbGU7CgogICAgbXkgJGd6aXAgPSBzaGlmdCB8fCAwOwogICAgbXkgJG1vZGUgPSBzaGlmdCB8fCBSRUFEX09OTFktPiggWkxJQiApOyAjIGRlZmF1bHQgdG8gcmVhZCBvbmx5CgogICAgbXkgJGZoOyBteSAkYmluOwoKICAgICMjIyBvbmx5IGRlZmF1bHQgdG8gWkxJQiBpZiB3ZSdyZSBub3QgdHJ5aW5nIHRvIC93cml0ZS8gdG8gYSBoYW5kbGUgIyMjCiAgICBpZiggWkxJQiBhbmQgJGd6aXAgfHwgTU9ERV9SRUFELT4oICRtb2RlICkgKSB7CgogICAgICAgICMjIyBJTzo6WmxpYiB3aWxsIERvIFRoZSBSaWdodCBUaGluZywgZXZlbiB3aGVuIHBhc3NlZAogICAgICAgICMjIyBhIHBsYWluIGZpbGUgIyMjCiAgICAgICAgJGZoID0gbmV3IElPOjpabGliOwoKICAgIH0gZWxzZSB7CiAgICAgICAgaWYoICRnemlwICkgewogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKHFxW0NvbXByZXNzaW9uIG5vdCBhdmFpbGFibGUgLSBJbnN0YWxsIElPOjpabGliIV0pOwogICAgICAgICAgICByZXR1cm47CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRmaCA9IG5ldyBJTzo6RmlsZTsKICAgICAgICAgICAgJGJpbisrOwogICAgICAgIH0KICAgIH0KCiAgICB1bmxlc3MoICRmaC0+b3BlbiggJGZpbGUsICRtb2RlICkgKSB7CiAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IGNyZWF0ZSBmaWxlaGFuZGxlIGZvciAnJGZpbGUnOiAkISFdICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGJpbm1vZGUgJGZoIGlmICRiaW47CgogICAgcmV0dXJuICRmaDsKfQoKc3ViIF9yZWFkX3RhciB7CiAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgbXkgJGhhbmRsZSAgPSBzaGlmdCBvciByZXR1cm47CiAgICBteSAkb3B0cyAgICA9IHNoaWZ0IHx8IHt9OwoKICAgIG15ICRjb3VudCAgID0gJG9wdHMtPntsaW1pdH0gICAgfHwgMDsKICAgIG15ICRleHRyYWN0ID0gJG9wdHMtPntleHRyYWN0fSAgfHwgMDsKCiAgICAjIyMgc2V0IGEgY2FwIG9uIHRoZSBhbW91bnQgb2YgZmlsZXMgdG8gZXh0cmFjdCAjIyMKICAgIG15ICRsaW1pdCAgID0gMDsKICAgICRsaW1pdCA9IDEgaWYgJGNvdW50ID4gMDsKCiAgICBteSAkdGFyZmlsZSA9IFsgXTsKICAgIG15ICRjaHVuazsKICAgIG15ICRyZWFkID0gMDsKICAgIG15ICRyZWFsX25hbWU7ICAjIHRvIHNldCB0aGUgbmFtZSBvZiBhIGZpbGUgd2hlbgogICAgICAgICAgICAgICAgICAgICMgd2UncmUgZW5jb3VudGVyaW5nIEBsb25nbGluawogICAgbXkgJGRhdGE7CgogICAgTE9PUDoKICAgIHdoaWxlKCAkaGFuZGxlLT5yZWFkKCAkY2h1bmssIEhFQUQgKSApIHsKICAgICAgICAjIyMgSU86OlpsaWIgZG9lc24ndCBzdXBwb3J0IHRoaXMgeWV0CiAgICAgICAgbXkgJG9mZnNldCA9IGV2YWwgeyB0ZWxsICRoYW5kbGUgfSB8fCAndW5rbm93bic7CgogICAgICAgIHVubGVzcyggJHJlYWQrKyApIHsKICAgICAgICAgICAgbXkgJGd6aXAgPSBHWklQX01BR0lDX05VTTsKICAgICAgICAgICAgaWYoICRjaHVuayA9fiAvJGd6aXAvICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ2Fubm90IHJlYWQgY29tcHJlc3NlZCBmb3JtYXQgaW4gdGFyLW1vZGVdICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMjIyBpZiB3ZSBjYW4ndCByZWFkIGluIGFsbCBieXRlcy4uLiAjIyMKICAgICAgICBsYXN0IGlmIGxlbmd0aCAkY2h1bmsgIT0gSEVBRDsKCiAgICAgICAgIyMjIEFwcGFyZW50bHkgdGhpcyBzaG91bGQgcmVhbGx5IGJlIHR3byBibG9ja3Mgb2YgNTEyIHplcm9lcywKICAgICAgICAjIyMgYnV0IEdOVSB0YXIgc29tZXRpbWVzIGdldHMgaXQgd3JvbmcuIFNlZSBjb21tZW50IGluIHRoZQogICAgICAgICMjIyBzb3VyY2UgY29kZSAodGFyLmMpIHRvIEdOVSBjcGlvLgogICAgICAgIG5leHQgaWYgJGNodW5rIGVxIFRBUl9FTkQ7CgogICAgICAgICMjIyBhY2NvcmRpbmcgdG8gdGhlIHBvc2l4IHNwZWMsIHRoZSBsYXN0IDEyIGJ5dGVzIG9mIHRoZSBoZWFkZXIgYXJlCiAgICAgICAgIyMjIG51bGwgYnl0ZXMsIHRvIHBhZCBpdCB0byBhIDUxMiBieXRlIGJsb2NrLiBUaGF0IG1lYW5zIGlmIHRoZXNlCiAgICAgICAgIyMjIGJ5dGVzIGFyZSBOT1QgbnVsbCBieXRlcywgaXQncyBhIGNvcnJydXB0IGhlYWRlci4gU2VlOgogICAgICAgICMjIyB3d3cua29kZXJzLmNvbS9jL2ZpZENFNDczQUQzRDlGODM1RDY5MDI1OUQ2MEFENTY1NDU5MUQ5MUQ1QkEuYXNweAogICAgICAgICMjIyBsaW5lIDExMQogICAgICAgIHsgICBteSAkbnVsbHMgPSBqb2luICcnLCAiXDAiIHggMTI7CiAgICAgICAgICAgIHVubGVzcyggJG51bGxzIGVxIHN1YnN0ciggJGNodW5rLCA1MDAsIDEyICkgKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtJbnZhbGlkIGhlYWRlciBibG9jayBhdCBvZmZzZXQgJG9mZnNldF0gKTsKICAgICAgICAgICAgICAgIG5leHQgTE9PUDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyMjIHBhc3MgdGhlIHJlYWxuYW1lLCBzbyB3ZSBjYW4gc2V0IGl0ICdwcm9wZXInIHJpZ2h0IGF3YXkKICAgICAgICAjIyMgc29tZSBvZiB0aGUgaGV1cmlzdGljcyBhcmUgZG9uZSBvbiB0aGUgbmFtZSwgc28gaW1wb3J0YW50CiAgICAgICAgIyMjIHRvIHNldCBpdCBBU0FQCiAgICAgICAgbXkgJGVudHJ5OwogICAgICAgIHsgICBteSAlZXh0cmFfYXJncyA9ICgpOwogICAgICAgICAgICAkZXh0cmFfYXJnc3snbmFtZSd9ID0gJCRyZWFsX25hbWUgaWYgZGVmaW5lZCAkcmVhbF9uYW1lOwogICAgICAgICAgICAKICAgICAgICAgICAgdW5sZXNzKCAkZW50cnkgPSBBcmNoaXZlOjpUYXI6OkZpbGUtPm5ldyggICBjaHVuayA9PiAkY2h1bmssIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVleHRyYV9hcmdzICkgCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGRuJ3QgcmVhZCBjaHVuayBhdCBvZmZzZXQgJG9mZnNldF0gKTsKICAgICAgICAgICAgICAgIG5leHQgTE9PUDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyMjIGlnbm9yZSBsYWJlbHM6CiAgICAgICAgIyMjIGh0dHA6Ly93d3cuZ251Lm9yZy9tYW51YWwvdGFyL2h0bWxfbm9kZS90YXJfMTM5Lmh0bWwKICAgICAgICBuZXh0IGlmICRlbnRyeS0+aXNfbGFiZWw7CgogICAgICAgIGlmKCBsZW5ndGggJGVudHJ5LT50eXBlIGFuZCAoJGVudHJ5LT5pc19maWxlIHx8ICRlbnRyeS0+aXNfbG9uZ2xpbmspICkgewoKICAgICAgICAgICAgaWYgKCAkZW50cnktPmlzX2ZpbGUgJiYgISRlbnRyeS0+dmFsaWRhdGUgKSB7CiAgICAgICAgICAgICAgICAjIyMgc29tZXRpbWVzIHRoZSBjaHVuayBpcyByYXRoZXIgZnV4MHIzZCBhbmQgYSB3aG9sZSA1MTIKICAgICAgICAgICAgICAgICMjIyBieXRlcyBlbmRzIHVwIGluIHRoZSAtPm5hbWUgYXJlYS4KICAgICAgICAgICAgICAgICMjIyBjbGVhbiBpdCB1cCwgaWYgbmVlZCBiZQogICAgICAgICAgICAgICAgbXkgJG5hbWUgPSAkZW50cnktPm5hbWU7CiAgICAgICAgICAgICAgICAkbmFtZSA9IHN1YnN0cigkbmFtZSwgMCwgMTAwKSBpZiBsZW5ndGggJG5hbWUgPiAxMDA7CiAgICAgICAgICAgICAgICAkbmFtZSA9fiBzL1xuLyAvZzsKCiAgICAgICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCAkbmFtZSAuIHFxWzogY2hlY2tzdW0gZXJyb3JdICk7CiAgICAgICAgICAgICAgICBuZXh0IExPT1A7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRibG9jayA9IEJMT0NLX1NJWkUtPiggJGVudHJ5LT5zaXplICk7CgogICAgICAgICAgICAkZGF0YSA9ICRlbnRyeS0+Z2V0X2NvbnRlbnRfYnlfcmVmOwoKICAgICAgICAgICAgIyMjIGp1c3QgcmVhZCBldmVyeXRoaW5nIGludG8gbWVtb3J5CiAgICAgICAgICAgICMjIyBjYW4ndCBkbyBsYXp5IGxvYWRpbmcgc2luY2UgSU86OlpsaWIgZG9lc24ndCBzdXBwb3J0ICdzZWVrJwogICAgICAgICAgICAjIyMgdGhpcyBpcyBiZWNhdXNlIENvbXByZXNzOjpabGliIGRvZXNuJ3Qgc3VwcG9ydCBpdCA9LwogICAgICAgICAgICAjIyMgdGhpcyByZWFkcyBpbiB0aGUgd2hvbGUgZGF0YSBpbiBvbmUgcmVhZCgpIGNhbGwuCiAgICAgICAgICAgIGlmKCAkaGFuZGxlLT5yZWFkKCAkJGRhdGEsICRibG9jayApIDwgJGJsb2NrICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbUmVhZCBlcnJvciBvbiB0YXJmaWxlIChtaXNzaW5nIGRhdGEpICddLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW50cnktPmZ1bGxfcGF0aCAuIicgYXQgb2Zmc2V0ICRvZmZzZXQiICk7CiAgICAgICAgICAgICAgICBuZXh0IExPT1A7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMjIyB0aHJvdyBhd2F5IHRyYWlsaW5nIGdhcmJhZ2UgIyMjCiAgICAgICAgICAgIHN1YnN0ciAoJCRkYXRhLCAkZW50cnktPnNpemUpID0gIiIgaWYgZGVmaW5lZCAkJGRhdGE7CgogICAgICAgICAgICAjIyMgcGFydCBJSSBvZiB0aGUgQExvbmdMaW5rIG11bmdpbmcgLS0gbmVlZCB0byBkbyAvYWZ0ZXIvCiAgICAgICAgICAgICMjIyB0aGUgY2hlY2tzdW0gY2hlY2suCiAgICAgICAgICAgIGlmKCAkZW50cnktPmlzX2xvbmdsaW5rICkgewogICAgICAgICAgICAgICAgIyMjIHdlaXJkIHRoaW5nIGluIHRhcmZpbGVzIC0tIGlmIHRoZSBmaWxlIGlzIGFjdHVhbGx5IGEKICAgICAgICAgICAgICAgICMjIyBATG9uZ0xpbmssIHRoZSBkYXRhIHBhcnQgc2VlbXMgdG8gaGF2ZSBhIHRyYWlsaW5nIF5ACiAgICAgICAgICAgICAgICAjIyMgKHVucHJpbnRhYmxlKSBjaGFyLiB0byBkaXNwbGF5LCBwaXBlIG91dHB1dCB0aHJvdWdoIGxlc3MuCiAgICAgICAgICAgICAgICAjIyMgYnV0IHRoYXQgZG9lc24ndCAqYWx3YXlzKiBoYXBwZW4uLiBzbyBjaGVjayBpZiB0aGUgbGFzdAogICAgICAgICAgICAgICAgIyMjIGNoYXJhY3RlciBpcyBhIGNvbnRyb2wgY2hhcmFjdGVyLCBhbmQgaWYgc28gcmVtb3ZlIGl0CiAgICAgICAgICAgICAgICAjIyMgYXQgYW55IHJhdGUsIHdlIGJldHRlciByZW1vdmUgdGhhdCBjaGFyYWN0ZXIgaGVyZSwgb3IgdGVzdHMKICAgICAgICAgICAgICAgICMjIyBsaWtlICdlcScgYW5kIGhhc2hsb29rIHVwcyBiYXNlZCBvbiBuYW1lcyB3aWxsIFNPIG5vdCB3b3JrCiAgICAgICAgICAgICAgICAjIyMgcmVtb3ZlIGl0IGJ5IGNhbGN1bGF0aW5nIHRoZSBwcm9wZXIgc2l6ZSwgYW5kIHRoZW4KICAgICAgICAgICAgICAgICMjIyB0b3NzaW5nIG91dCBldmVyeXRoaW5nIHRoYXQncyBsb25nZXIgdGhhbiB0aGF0IHNpemUuCgogICAgICAgICAgICAgICAgIyMjIGNvdW50IG51bWJlciBvZiBudWxscwogICAgICAgICAgICAgICAgbXkgJG51bGxzID0gJCRkYXRhID1+IHRyL1wwL1wwLzsKCiAgICAgICAgICAgICAgICAjIyMgY3V0IGRhdGEgKyBzaXplIGJ5IHRoYXQgbWFueSBieXRlcwogICAgICAgICAgICAgICAgJGVudHJ5LT5zaXplKCAkZW50cnktPnNpemUgLSAkbnVsbHMgKTsKICAgICAgICAgICAgICAgIHN1YnN0ciAoJCRkYXRhLCAkZW50cnktPnNpemUpID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMjIyBjbGVhbiB1cCBvZiB0aGUgZW50cmllcy4uIHBvc2l4IHRhciAvYXBwYXJlbnRseS8gaGFzIHNvbWUKICAgICAgICAjIyMgd2VpcmQgJ2ZlYXR1cmUnIHRoYXQgYWxsb3dzIGZvciBmaWxlbmFtZXMgPiAyNTUgY2hhcmFjdGVycwogICAgICAgICMjIyB0aGV5J2xsIHB1dCBhIGhlYWRlciBpbiB3aXRoIGFzIG5hbWUgJy4vLi9ATG9uZ0xpbmsnIGFuZCB0aGUKICAgICAgICAjIyMgY29udGVudHMgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgL25leHQvIGZpbGUgaW4gdGhlIGFyY2hpdmUKICAgICAgICAjIyMgcHJldHR5IGNyYXBweSBhbmQga2x1ZGd5IGlmIHlvdSBhc2sgbWUKCiAgICAgICAgIyMjIHNldCB0aGUgbmFtZSBmb3IgdGhlIG5leHQgZW50cnkgaWYgdGhpcyBpcyBhIEBMb25nTGluazsKICAgICAgICAjIyMgdGhpcyBpcyBvbmUgdWdseSBoYWNrID0vIGJ1dCBuZWVkZWQgZm9yIGRpcmVjdCBleHRyYWN0aW9uCiAgICAgICAgaWYoICRlbnRyeS0+aXNfbG9uZ2xpbmsgKSB7CiAgICAgICAgICAgICRyZWFsX25hbWUgPSAkZGF0YTsKICAgICAgICAgICAgbmV4dCBMT09QOwogICAgICAgIH0gZWxzaWYgKCBkZWZpbmVkICRyZWFsX25hbWUgKSB7CiAgICAgICAgICAgICRlbnRyeS0+bmFtZSggJCRyZWFsX25hbWUgKTsKICAgICAgICAgICAgJGVudHJ5LT5wcmVmaXgoJycpOwogICAgICAgICAgICB1bmRlZiAkcmVhbF9uYW1lOwogICAgICAgIH0KCiAgICAgICAgJHNlbGYtPl9leHRyYWN0X2ZpbGUoICRlbnRyeSApIGlmICRleHRyYWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRlbnRyeS0+aXNfbG9uZ2xpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhJGVudHJ5LT5pc191bmtub3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRlbnRyeS0+aXNfbGFiZWw7CgogICAgICAgICMjIyBHdWFyZCBhZ2FpbnN0IHRhcmZpbGVzIHdpdGggZ2FyYmFnZSBhdCB0aGUgZW5kCgkgICAgbGFzdCBMT09QIGlmICRlbnRyeS0+bmFtZSBlcSAnJzsKCiAgICAgICAgIyMjIHB1c2ggb25seSB0aGUgbmFtZSBvbiB0aGUgcnYgaWYgd2UncmUgZXh0cmFjdGluZwogICAgICAgICMjIyAtLSBmb3IgZXh0cmFjdF9hcmNoaXZlCiAgICAgICAgcHVzaCBAJHRhcmZpbGUsICgkZXh0cmFjdCA/ICRlbnRyeS0+bmFtZSA6ICRlbnRyeSk7CgogICAgICAgIGlmKCAkbGltaXQgKSB7CiAgICAgICAgICAgICRjb3VudC0tIHVubGVzcyAkZW50cnktPmlzX2xvbmdsaW5rIHx8ICRlbnRyeS0+aXNfZGlyOwogICAgICAgICAgICBsYXN0IExPT1AgdW5sZXNzICRjb3VudDsKICAgICAgICB9CiAgICB9IGNvbnRpbnVlIHsKICAgICAgICB1bmRlZiAkZGF0YTsKICAgIH0KCiAgICByZXR1cm4gJHRhcmZpbGU7Cn0KCj1oZWFkMiAkdGFyLT5jb250YWluc19maWxlKCAkZmlsZW5hbWUgKQoKQ2hlY2sgaWYgdGhlIGFyY2hpdmUgY29udGFpbnMgYSBjZXJ0YWluIGZpbGUuCkl0IHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgaXMgaW4gdGhlIGFyY2hpdmUsIGZhbHNlIG90aGVyd2lzZS4KCk5vdGUgaG93ZXZlciwgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgYW4gZXhhY3QgbWF0Y2ggdXNpbmcgQzxlcT4Kb24gdGhlIGZ1bGwgcGF0aC4gU28gaXQgY2Fubm90IGNvbXBlbnNhdGUgZm9yIGNhc2UtaW5zZW5zaXRpdmUgZmlsZS0Kc3lzdGVtcyBvciBjb21wYXJlIDIgcGF0aHMgdG8gc2VlIGlmIHRoZXkgd291bGQgcG9pbnQgdG8gdGhlIHNhbWUKdW5kZXJseWluZyBmaWxlLgoKPWN1dAoKc3ViIGNvbnRhaW5zX2ZpbGUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRmdWxsID0gc2hpZnQ7CiAgICAKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZnVsbDsKCiAgICAjIyMgZG9uJ3Qgd2FybiBpZiB0aGUgZW50cnkgaXNuJ3QgdGhlcmUuLiB0aGF0J3Mgd2hhdCB0aGlzIGZ1bmN0aW9uCiAgICAjIyMgaXMgZm9yIGFmdGVyIGFsbC4KICAgIGxvY2FsICRXQVJOID0gMDsKICAgIHJldHVybiAxIGlmICRzZWxmLT5fZmluZF9lbnRyeSgkZnVsbCk7CiAgICByZXR1cm47Cn0KCj1oZWFkMiAkdGFyLT5leHRyYWN0KCBbQGZpbGVuYW1lc10gKQoKV3JpdGUgZmlsZXMgd2hvc2UgbmFtZXMgYXJlIGVxdWl2YWxlbnQgdG8gYW55IG9mIHRoZSBuYW1lcyBpbgpDPEBmaWxlbmFtZXM+IHRvIGRpc2ssIGNyZWF0aW5nIHN1YmRpcmVjdG9yaWVzIGFzIG5lY2Vzc2FyeS4gVGhpcwptaWdodCBub3Qgd29yayB0b28gd2VsbCB1bmRlciBWTVMuClVuZGVyIE1hY1BlcmwsIHRoZSBmaWxlJ3MgbW9kaWZpY2F0aW9uIHRpbWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlCk1hY09TIHplcm8gb2YgdGltZSwgYW5kIGFwcHJvcHJpYXRlIGNvbnZlcnNpb25zIHdpbGwgYmUgZG9uZSB0byB0aGUKcGF0aC4gIEhvd2V2ZXIsIHRoZSBsZW5ndGggb2YgZWFjaCBlbGVtZW50IG9mIHRoZSBwYXRoIGlzIG5vdAppbnNwZWN0ZWQgdG8gc2VlIHdoZXRoZXIgaXQncyBsb25nZXIgdGhhbiBNYWNPUyBjdXJyZW50bHkgYWxsb3dzICgzMgpjaGFyYWN0ZXJzKS4KCklmIEM8ZXh0cmFjdD4gaXMgY2FsbGVkIHdpdGhvdXQgYSBsaXN0IG9mIGZpbGUgbmFtZXMsIHRoZSBlbnRpcmUKY29udGVudHMgb2YgdGhlIGFyY2hpdmUgYXJlIGV4dHJhY3RlZC4KClJldHVybnMgYSBsaXN0IG9mIGZpbGVuYW1lcyBleHRyYWN0ZWQuCgo9Y3V0CgpzdWIgZXh0cmFjdCB7CiAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgbXkgQGFyZ3MgICAgPSBAXzsKICAgIG15IEBmaWxlczsKCiAgICAjIHVzZSB0aGUgc3BlZWQgb3B0aW1pemF0aW9uIGZvciBhbGwgZXh0cmFjdGVkIGZpbGVzCiAgICBsb2NhbCgkc2VsZi0+e2N3ZH0pID0gY3dkKCkgdW5sZXNzICRzZWxmLT57Y3dkfTsKCiAgICAjIyMgeW91IHJlcXVlc3RlZCB0aGUgZXh0cmFjdGlvbiBvZiBvbmx5IGNlcnRpYW4gZmlsZXMKICAgIGlmKCBAYXJncyApIHsKICAgICAgICBmb3IgbXkgJGZpbGUgKCBAYXJncyApIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICMjIyBpdCdzIGFscmVhZHkgYW4gb2JqZWN0PwogICAgICAgICAgICBpZiggVU5JVkVSU0FMOjppc2EoICRmaWxlLCAnQXJjaGl2ZTo6VGFyOjpGaWxlJyApICkgewogICAgICAgICAgICAgICAgcHVzaCBAZmlsZXMsICRmaWxlOwogICAgICAgICAgICAgICAgbmV4dDsKCiAgICAgICAgICAgICMjIyBnbyBmaW5kIGl0IHRoZW4KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBteSAkZm91bmQ7CiAgICAgICAgICAgICAgICBmb3IgbXkgJGVudHJ5ICggQHskc2VsZi0+X2RhdGF9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgdW5sZXNzICRmaWxlIGVxICRlbnRyeS0+ZnVsbF9wYXRoOwogICAgCiAgICAgICAgICAgICAgICAgICAgIyMjIHdlIGZvdW5kIHRoZSBmaWxlIHlvdSdyZSBsb29raW5nIGZvcgogICAgICAgICAgICAgICAgICAgIHB1c2ggQGZpbGVzLCAkZW50cnk7CiAgICAgICAgICAgICAgICAgICAgJGZvdW5kKys7CiAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgIHVubGVzcyggJGZvdW5kICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkc2VsZi0+X2Vycm9yKCAKICAgICAgICAgICAgICAgICAgICAgICAgcXFbQ291bGQgbm90IGZpbmQgJyRmaWxlJyBpbiBhcmNoaXZlXSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICMjIyBqdXN0IGdyYWIgYWxsIHRoZSBmaWxlIGl0ZW1zCiAgICB9IGVsc2UgewogICAgICAgIEBmaWxlcyA9ICRzZWxmLT5nZXRfZmlsZXM7CiAgICB9CgogICAgIyMjIG5vdGhpbmcgZm91bmQ/IHRoYXQncyBhbiBlcnJvcgogICAgdW5sZXNzKCBzY2FsYXIgQGZpbGVzICkgewogICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW05vIGZpbGVzIGZvdW5kIGZvciBdIC4gJHNlbGYtPl9maWxlICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMjIyBub3cgZXh0cmFjdCB0aGVtCiAgICBmb3IgbXkgJGVudHJ5ICggQGZpbGVzICkgewogICAgICAgIHVubGVzcyggJHNlbGYtPl9leHRyYWN0X2ZpbGUoICRlbnRyeSApICkgewogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKHFbQ291bGQgbm90IGV4dHJhY3QgJ10uICRlbnRyeS0+ZnVsbF9wYXRoIC5xWyddICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBmaWxlczsKfQoKPWhlYWQyICR0YXItPmV4dHJhY3RfZmlsZSggJGZpbGUsIFskZXh0cmFjdF9wYXRoXSApCgpXcml0ZSBhbiBlbnRyeSwgd2hvc2UgbmFtZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBmaWxlIG5hbWUgcHJvdmlkZWQgdG8KZGlzay4gT3B0aW9uYWxseSB0YWtlcyBhIHNlY29uZCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBmdWxsICh1bml4KQpwYXRoIChpbmNsdWRpbmcgZmlsZW5hbWUpIHRoZSBlbnRyeSB3aWxsIGJlIHdyaXR0ZW4gdG8uCgpGb3IgZXhhbXBsZToKCiAgICAkdGFyLT5leHRyYWN0X2ZpbGUoICduYW1lL2luL2FyY2hpdmUnLCAnbmFtZS9pL3dhbnQvdG8vZ2l2ZS9pdCcgKTsKCiAgICAkdGFyLT5leHRyYWN0X2ZpbGUoICRhdF9maWxlX29iamVjdCwgICAnbmFtZS9pL3dhbnQvdG8vZ2l2ZS9pdCcgKTsKClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIGV4dHJhY3RfZmlsZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkYWx0ICA9IHNoaWZ0OwoKICAgIG15ICRlbnRyeSA9ICRzZWxmLT5fZmluZF9lbnRyeSggJGZpbGUgKQogICAgICAgIG9yICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCBmaW5kIGFuIGVudHJ5IGZvciAnJGZpbGUnXSApLCByZXR1cm47CgogICAgcmV0dXJuICRzZWxmLT5fZXh0cmFjdF9maWxlKCAkZW50cnksICRhbHQgKTsKfQoKc3ViIF9leHRyYWN0X2ZpbGUgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICRlbnRyeSAgID0gc2hpZnQgb3IgcmV0dXJuOwogICAgbXkgJGFsdCAgICAgPSBzaGlmdDsKCiAgICAjIyMgeW91IHdhbnRlZCBhbiBhbHRlcm5hdGUgZXh0cmFjdGlvbiBsb2NhdGlvbiAjIyMKICAgIG15ICRuYW1lID0gZGVmaW5lZCAkYWx0ID8gJGFsdCA6ICRlbnRyeS0+ZnVsbF9wYXRoOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBzcGxpdHBhdGggdGFrZXMgYSBib29sIGF0IHRoZSBlbmQgdG8gaW5kaWNhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyB0aGF0IGl0J3Mgc3BsaXR0aW5nIGEgZGlyCiAgICBteSAoJHZvbCwkZGlycywkZmlsZSk7CiAgICBpZiAoIGRlZmluZWQgJGFsdCApIHsgIyBJdCdzIGEgbG9jYWwtT1MgcGF0aAogICAgICAgICgkdm9sLCRkaXJzLCRmaWxlKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggICAgICAgJGFsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbnRyeS0+aXNfZGlyICk7CiAgICB9IGVsc2UgewogICAgICAgICgkdm9sLCRkaXJzLCRmaWxlKSA9IEZpbGU6OlNwZWM6OlVuaXgtPnNwbGl0cGF0aCggJG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW50cnktPmlzX2RpciApOwogICAgfQoKICAgIG15ICRkaXI7CiAgICAjIyMgaXMgJG5hbWUgYW4gYWJzb2x1dGUgcGF0aD8gIyMjCiAgICBpZiggRmlsZTo6U3BlYy0+ZmlsZV9uYW1lX2lzX2Fic29sdXRlKCAkZGlycyApICkgewogICAgICAgICRkaXIgPSAkZGlyczsKCiAgICAjIyMgaXQncyBhIHJlbGF0aXZlIHBhdGggIyMjCiAgICB9IGVsc2UgewogICAgICAgIG15ICRjd2QgICAgID0gKGRlZmluZWQgJHNlbGYtPntjd2R9ID8gJHNlbGYtPntjd2R9IDogY3dkKCkpOwogICAgICAgIG15IEBkaXJzICAgID0gRmlsZTo6U3BlYzo6VW5peC0+c3BsaXRkaXIoICRkaXJzICk7CiAgICAgICAgbXkgQGN3ZCAgICAgPSBGaWxlOjpTcGVjLT5zcGxpdGRpciggJGN3ZCApOwogICAgICAgICRkaXIgICAgICAgID0gRmlsZTo6U3BlYy0+Y2F0ZGlyKCBAY3dkLCBAZGlycyApOwoKICAgICAgICAjIGNhdGRpcigpIHJldHVybnMgdW5kZWYgaWYgdGhlIHBhdGggaXMgbG9uZ2VyIHRoYW4gMjU1IGNoYXJzIG9uIFZNUwogICAgICAgIHVubGVzcyAoIGRlZmluZWQgJGRpciApIHsKICAgICAgICAgICAgJF5XICYmICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCBjb21wb3NlIGEgcGF0aCBmb3IgJyRkaXJzJ1xuXSApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgIH0KCiAgICBpZiggLWUgJGRpciAmJiAhLWQgXyApIHsKICAgICAgICAkXlcgJiYgJHNlbGYtPl9lcnJvciggcXFbJyRkaXInIGV4aXN0cywgYnV0IGl0J3Mgbm90IGEgZGlyZWN0b3J5IVxuXSApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB1bmxlc3MgKCAtZCBfICkgewogICAgICAgIGV2YWwgeyBGaWxlOjpQYXRoOjpta3BhdGgoICRkaXIsIDAsIDA3NzcgKSB9OwogICAgICAgIGlmKCAkQCApIHsKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgJyRkaXInOiAkQF0gKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAjIyMgWFhYIGNob3duIGhlcmU/IHRoYXQgbWlnaHQgbm90IGJlIHRoZSBzYW1lIGFzIGluIHRoZSBhcmNoaXZlCiAgICAgICAgIyMjIGFzIHdlJ3JlIG9ubHkgY2hvd24naW5nIHRvIHRoZSBvd25lciBvZiB0aGUgZmlsZSB3ZSdyZSBleHRyYWN0aW5nCiAgICAgICAgIyMjIG5vdCB0byB0aGUgb3duZXIgb2YgdGhlIGRpcmVjdG9yeSBpdHNlbGYsIHdoaWNoIG1heSBvciBtYXkgbm90CiAgICAgICAgIyMjIGJlIGFub3RoZXIgZW50cnkgaW4gdGhlIGFyY2hpdmUKICAgICAgICAjIyMgQW5zd2VyOiBubywgZ251IHRhciBkb2Vzbid0IGRvIGl0IGVpdGhlciwgaXQnZCBiZSB0aGUgd3JvbmcKICAgICAgICAjIyMgd2F5IHRvIGdvLgogICAgICAgICNpZiggJENIT1dOICYmIENBTl9DSE9XTiApIHsKICAgICAgICAjICAgIGNob3duICRlbnRyeS0+dWlkLCAkZW50cnktPmdpZCwgJGRpciBvcgogICAgICAgICMgICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCBzZXQgdWlkL2dpZCBvbiAnJGRpciddICk7CiAgICAgICAgI30KICAgIH0KCiAgICAjIyMgd2UncmUgZG9uZSBpZiB3ZSBqdXN0IG5lZWRlZCB0byBjcmVhdGUgYSBkaXIgIyMjCiAgICByZXR1cm4gMSBpZiAkZW50cnktPmlzX2RpcjsKCiAgICBteSAkZnVsbCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoICRkaXIsICRmaWxlICk7CgogICAgaWYoICRlbnRyeS0+aXNfdW5rbm93biApIHsKICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtVbmtub3duIGZpbGUgdHlwZSBmb3IgZmlsZSAnJGZ1bGwnXSApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiggbGVuZ3RoICRlbnRyeS0+dHlwZSAmJiAkZW50cnktPmlzX2ZpbGUgKSB7CiAgICAgICAgbXkgJGZoID0gSU86OkZpbGUtPm5ldzsKICAgICAgICAkZmgtPm9wZW4oICc+JyAuICRmdWxsICkgb3IgKAogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtDb3VsZCBub3Qgb3BlbiBmaWxlICckZnVsbCc6ICQhXSApLAogICAgICAgICAgICByZXR1cm4KICAgICAgICApOwoKICAgICAgICBpZiggJGVudHJ5LT5zaXplICkgewogICAgICAgICAgICBiaW5tb2RlICRmaDsKICAgICAgICAgICAgc3lzd3JpdGUgJGZoLCAkZW50cnktPmRhdGEgb3IgKAogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IHdyaXRlIGRhdGEgdG8gJyRmdWxsJ10gKSwKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgY2xvc2UgJGZoIG9yICgKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IGNsb3NlIGZpbGUgJyRmdWxsJ10gKSwKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgKTsKCiAgICB9IGVsc2UgewogICAgICAgICRzZWxmLT5fbWFrZV9zcGVjaWFsX2ZpbGUoICRlbnRyeSwgJGZ1bGwgKSBvciByZXR1cm47CiAgICB9CgogICAgdXRpbWUgdGltZSwgJGVudHJ5LT5tdGltZSAtIFRJTUVfT0ZGU0VULCAkZnVsbCBvcgogICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW0NvdWxkIG5vdCB1cGRhdGUgdGltZXN0YW1wXSApOwoKICAgIGlmKCAkQ0hPV04gJiYgQ0FOX0NIT1dOICkgewogICAgICAgIGNob3duICRlbnRyeS0+dWlkLCAkZW50cnktPmdpZCwgJGZ1bGwgb3IKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IHNldCB1aWQvZ2lkIG9uICckZnVsbCddICk7CiAgICB9CgogICAgIyMjIG9ubHkgY2htb2QgaWYgd2UncmUgYWxsb3dlZCB0bywgYnV0IG5ldmVyIGNobW9kIHN5bWxpbmtzLCBzaW5jZSB0aGV5J2xsCiAgICAjIyMgY2hhbmdlIHRoZSBwZXJtcyBvbiB0aGUgZmlsZSB0aGV5J3JlIGxpbmtpbmcgdG9vLi4uCiAgICBpZiggJENITU9EIGFuZCBub3QgLWwgJGZ1bGwgKSB7CiAgICAgICAgY2htb2QgJGVudHJ5LT5tb2RlLCAkZnVsbCBvcgogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtDb3VsZCBub3QgY2hvd24gJyRmdWxsJyB0byBdIC4gJGVudHJ5LT5tb2RlICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfbWFrZV9zcGVjaWFsX2ZpbGUgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICRlbnRyeSAgID0gc2hpZnQgICAgIG9yIHJldHVybjsKICAgIG15ICRmaWxlICAgID0gc2hpZnQ7ICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZmlsZTsKCiAgICBteSAkZXJyOwoKICAgIGlmKCAkZW50cnktPmlzX3N5bWxpbmsgKSB7CiAgICAgICAgbXkgJGZhaWw7CiAgICAgICAgaWYoIE9OX1VOSVggKSB7CiAgICAgICAgICAgIHN5bWxpbmsoICRlbnRyeS0+bGlua25hbWUsICRmaWxlICkgb3IgJGZhaWwrKzsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPl9leHRyYWN0X3NwZWNpYWxfZmlsZV9hc19wbGFpbl9maWxlKCAkZW50cnksICRmaWxlICkKICAgICAgICAgICAgICAgIG9yICRmYWlsKys7CiAgICAgICAgfQoKICAgICAgICAkZXJyID0gIHFxW01ha2luZyBzeW1ib2xpbmsgbGluayBmcm9tICddIC4gJGVudHJ5LT5saW5rbmFtZSAuCiAgICAgICAgICAgICAgICBxcVsnIHRvICckZmlsZScgZmFpbGVkXSBpZiAkZmFpbDsKCiAgICB9IGVsc2lmICggJGVudHJ5LT5pc19oYXJkbGluayApIHsKICAgICAgICBteSAkZmFpbDsKICAgICAgICBpZiggT05fVU5JWCApIHsKICAgICAgICAgICAgbGluayggJGVudHJ5LT5saW5rbmFtZSwgJGZpbGUgKSBvciAkZmFpbCsrOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc2VsZi0+X2V4dHJhY3Rfc3BlY2lhbF9maWxlX2FzX3BsYWluX2ZpbGUoICRlbnRyeSwgJGZpbGUgKQogICAgICAgICAgICAgICAgb3IgJGZhaWwrKzsKICAgICAgICB9CgogICAgICAgICRlcnIgPSAgcXFbTWFraW5nIGhhcmQgbGluayBmcm9tICddIC4gJGVudHJ5LT5saW5rbmFtZSAuCiAgICAgICAgICAgICAgICBxcVsnIHRvICckZmlsZScgZmFpbGVkXSBpZiAkZmFpbDsKCiAgICB9IGVsc2lmICggJGVudHJ5LT5pc19maWZvICkgewogICAgICAgIE9OX1VOSVggJiYgIXN5c3RlbSgnbWtub2QnLCAkZmlsZSwgJ3AnKSBvcgogICAgICAgICAgICAkZXJyID0gcXFbTWFraW5nIGZpZm8gJ10uICRlbnRyeS0+bmFtZSAucXFbJyBmYWlsZWRdOwoKICAgIH0gZWxzaWYgKCAkZW50cnktPmlzX2Jsb2NrZGV2IG9yICRlbnRyeS0+aXNfY2hhcmRldiApIHsKICAgICAgICBteSAkbW9kZSA9ICRlbnRyeS0+aXNfYmxvY2tkZXYgPyAnYicgOiAnYyc7CgogICAgICAgIE9OX1VOSVggJiYgIXN5c3RlbSgnbWtub2QnLCAkZmlsZSwgJG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW50cnktPmRldm1ham9yLCAkZW50cnktPmRldm1pbm9yKSBvcgogICAgICAgICAgICAkZXJyID0gIHFxW01ha2luZyBibG9jayBkZXZpY2UgJ10uICRlbnRyeS0+bmFtZSAucXFbJyAobWFqPV0gLgogICAgICAgICAgICAgICAgICAgICRlbnRyeS0+ZGV2bWFqb3IgLiBxcVsgbWluPV0gLiAkZW50cnktPmRldm1pbm9yIC4KICAgICAgICAgICAgICAgICAgICBxcVspIGZhaWxlZC5dOwoKICAgIH0gZWxzaWYgKCAkZW50cnktPmlzX3NvY2tldCApIHsKICAgICAgICAjIyMgdGhlIG9yaWdpbmFsIGRvZXNuJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3Igc29ja2V0cy4uLi4gIyMjCiAgICAgICAgMTsKICAgIH0KCiAgICByZXR1cm4gJGVyciA/ICRzZWxmLT5fZXJyb3IoICRlcnIgKSA6IDE7Cn0KCiMjIyBkb24ndCBrbm93IGhvdyB0byBtYWtlIHN5bWxpbmtzLCBsZXQncyBqdXN0IGV4dHJhY3QgdGhlIGZpbGUgYXMKIyMjIGEgcGxhaW4gZmlsZQpzdWIgX2V4dHJhY3Rfc3BlY2lhbF9maWxlX2FzX3BsYWluX2ZpbGUgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICRlbnRyeSAgID0gc2hpZnQgICAgIG9yIHJldHVybjsKICAgIG15ICRmaWxlICAgID0gc2hpZnQ7ICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZmlsZTsKCiAgICBteSAkZXJyOwogICAgVFJZOiB7CiAgICAgICAgbXkgJG9yaWcgPSAkc2VsZi0+X2ZpbmRfZW50cnkoICRlbnRyeS0+bGlua25hbWUgKTsKCiAgICAgICAgdW5sZXNzKCAkb3JpZyApIHsKICAgICAgICAgICAgJGVyciA9ICBxcVtDb3VsZCBub3QgZmluZCBmaWxlICddIC4gJGVudHJ5LT5saW5rbmFtZSAuCiAgICAgICAgICAgICAgICAgICAgcXFbJyBpbiBtZW1vcnkuXTsKICAgICAgICAgICAgbGFzdCBUUlk7CiAgICAgICAgfQoKICAgICAgICAjIyMgY2xvbmUgdGhlIGVudHJ5LCBtYWtlIGl0IGFwcGVhciBhcyBhIG5vcm1hbCBmaWxlICMjIwogICAgICAgIG15ICRjbG9uZSA9ICRlbnRyeS0+Y2xvbmU7CiAgICAgICAgJGNsb25lLT5fZG93bmdyYWRlX3RvX3BsYWluZmlsZTsKICAgICAgICAkc2VsZi0+X2V4dHJhY3RfZmlsZSggJGNsb25lLCAkZmlsZSApIG9yIGxhc3QgVFJZOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigkZXJyKTsKfQoKPWhlYWQyICR0YXItPmxpc3RfZmlsZXMoIFtcQHByb3BlcnRpZXNdICkKClJldHVybnMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlLgoKSWYgQzxsaXN0X2ZpbGVzKCk+IGlzIHBhc3NlZCBhbiBhcnJheSByZWZlcmVuY2UgYXMgaXRzIGZpcnN0IGFyZ3VtZW50Cml0IHJldHVybnMgYSBsaXN0IG9mIGhhc2ggcmVmZXJlbmNlcyBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQKcHJvcGVydGllcyBvZiBlYWNoIGZpbGUuICBUaGUgZm9sbG93aW5nIGxpc3Qgb2YgcHJvcGVydGllcyBpcwpzdXBwb3J0ZWQ6IG5hbWUsIHNpemUsIG10aW1lIChsYXN0IG1vZGlmaWVkIGRhdGUpLCBtb2RlLCB1aWQsIGdpZCwKbGlua25hbWUsIHVuYW1lLCBnbmFtZSwgZGV2bWFqb3IsIGRldm1pbm9yLCBwcmVmaXguCgpQYXNzaW5nIGFuIGFycmF5IHJlZmVyZW5jZSBjb250YWluaW5nIG9ubHkgb25lIGVsZW1lbnQsICduYW1lJywgaXMKc3BlY2lhbCBjYXNlZCB0byByZXR1cm4gYSBsaXN0IG9mIG5hbWVzIHJhdGhlciB0aGFuIGEgbGlzdCBvZiBoYXNoCnJlZmVyZW5jZXMsIG1ha2luZyBpdCBlcXVpdmFsZW50IHRvIGNhbGxpbmcgQzxsaXN0X2ZpbGVzPiB3aXRob3V0CmFyZ3VtZW50cy4KCj1jdXQKCnN1YiBsaXN0X2ZpbGVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkYXJlZiA9IHNoaWZ0IHx8IFsgXTsKCiAgICB1bmxlc3MoICRzZWxmLT5fZGF0YSApIHsKICAgICAgICAkc2VsZi0+cmVhZCgpIG9yIHJldHVybjsKICAgIH0KCiAgICBpZiggQCRhcmVmID09IDAgb3IgKCBAJGFyZWYgPT0gMSBhbmQgJGFyZWYtPlswXSBlcSAnbmFtZScgKSApIHsKICAgICAgICByZXR1cm4gbWFwIHsgJF8tPmZ1bGxfcGF0aCB9IEB7JHNlbGYtPl9kYXRhfTsKICAgIH0gZWxzZSB7CgogICAgICAgICNteSBAcnY7CiAgICAgICAgI2ZvciBteSAkb2JqICggQHskc2VsZi0+X2RhdGF9ICkgewogICAgICAgICMgICAgcHVzaCBAcnYsIHsgbWFwIHsgJF8gPT4gJG9iai0+JF8oKSB9IEAkYXJlZiB9OwogICAgICAgICN9CiAgICAgICAgI3JldHVybiBAcnY7CgogICAgICAgICMjIyB0aGlzIGRvZXMgdGhlIHNhbWUgYXMgdGhlIGFib3ZlLi4ganVzdCBuZWVkcyBhICt7IH0KICAgICAgICAjIyMgdG8gbWFrZSBzdXJlIHBlcmwgZG9lc24ndCBjb25mdXNlIGl0IGZvciBhIGJsb2NrCiAgICAgICAgcmV0dXJuIG1hcCB7ICAgIG15ICRvPSRfOwogICAgICAgICAgICAgICAgICAgICAgICAreyBtYXAgeyAkXyA9PiAkby0+JF8oKSB9IEAkYXJlZiB9CiAgICAgICAgICAgICAgICAgICAgfSBAeyRzZWxmLT5fZGF0YX07CiAgICB9Cn0KCnN1YiBfZmluZF9lbnRyeSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsKCiAgICB1bmxlc3MoIGRlZmluZWQgJGZpbGUgKSB7CiAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbTm8gZmlsZSBzcGVjaWZpZWRdICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMjIyBpdCdzIGFuIG9iamVjdCBhbHJlYWR5CiAgICByZXR1cm4gJGZpbGUgaWYgVU5JVkVSU0FMOjppc2EoICRmaWxlLCAnQXJjaGl2ZTo6VGFyOjpGaWxlJyApOwoKICAgIGZvciBteSAkZW50cnkgKCBAeyRzZWxmLT5fZGF0YX0gKSB7CiAgICAgICAgbXkgJHBhdGggPSAkZW50cnktPmZ1bGxfcGF0aDsKICAgICAgICByZXR1cm4gJGVudHJ5IGlmICRwYXRoIGVxICRmaWxlOwogICAgfQoKICAgICRzZWxmLT5fZXJyb3IoIHFxW05vIHN1Y2ggZmlsZSBpbiBhcmNoaXZlOiAnJGZpbGUnXSApOwogICAgcmV0dXJuOwp9Cgo9aGVhZDIgJHRhci0+Z2V0X2ZpbGVzKCBbQGZpbGVuYW1lc10gKQoKUmV0dXJucyB0aGUgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IG9iamVjdHMgbWF0Y2hpbmcgdGhlIGZpbGVuYW1lcwpwcm92aWRlZC4gSWYgbm8gZmlsZW5hbWUgbGlzdCB3YXMgcGFzc2VkLCBhbGwgQzxBcmNoaXZlOjpUYXI6OkZpbGU+Cm9iamVjdHMgaW4gdGhlIGN1cnJlbnQgVGFyIG9iamVjdCBhcmUgcmV0dXJuZWQuCgpQbGVhc2UgcmVmZXIgdG8gdGhlIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBkb2N1bWVudGF0aW9uIG9uIGhvdyB0bwpoYW5kbGUgdGhlc2Ugb2JqZWN0cy4KCj1jdXQKCnN1YiBnZXRfZmlsZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gQHsgJHNlbGYtPl9kYXRhIH0gdW5sZXNzIEBfOwoKICAgIG15IEBsaXN0OwogICAgZm9yIG15ICRmaWxlICggQF8gKSB7CiAgICAgICAgcHVzaCBAbGlzdCwgZ3JlcCB7IGRlZmluZWQgfSAkc2VsZi0+X2ZpbmRfZW50cnkoICRmaWxlICk7CiAgICB9CgogICAgcmV0dXJuIEBsaXN0Owp9Cgo9aGVhZDIgJHRhci0+Z2V0X2NvbnRlbnQoICRmaWxlICkKClJldHVybiB0aGUgY29udGVudCBvZiB0aGUgbmFtZWQgZmlsZS4KCj1jdXQKCnN1YiBnZXRfY29udGVudCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGVudHJ5ID0gJHNlbGYtPl9maW5kX2VudHJ5KCBzaGlmdCApIG9yIHJldHVybjsKCiAgICByZXR1cm4gJGVudHJ5LT5kYXRhOwp9Cgo9aGVhZDIgJHRhci0+cmVwbGFjZV9jb250ZW50KCAkZmlsZSwgJGNvbnRlbnQgKQoKTWFrZSB0aGUgc3RyaW5nICRjb250ZW50IGJlIHRoZSBjb250ZW50IGZvciB0aGUgZmlsZSBuYW1lZCAkZmlsZS4KCj1jdXQKCnN1YiByZXBsYWNlX2NvbnRlbnQgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRlbnRyeSA9ICRzZWxmLT5fZmluZF9lbnRyeSggc2hpZnQgKSBvciByZXR1cm47CgogICAgcmV0dXJuICRlbnRyeS0+cmVwbGFjZV9jb250ZW50KCBzaGlmdCApOwp9Cgo9aGVhZDIgJHRhci0+cmVuYW1lKCAkZmlsZSwgJG5ld19uYW1lICkKClJlbmFtZSB0aGUgZmlsZSBvZiB0aGUgaW4tbWVtb3J5IGFyY2hpdmUgdG8gJG5ld19uYW1lLgoKTm90ZSB0aGF0IHlvdSBtdXN0IHNwZWNpZnkgYSBVbml4IHBhdGggZm9yICRuZXdfbmFtZSwgc2luY2UgcGVyIHRhcgpzdGFuZGFyZCwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlIG11c3QgYmUgVW5peCBwYXRocy4KClJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIHJlbmFtZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZpbGUgPSBzaGlmdDsgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRmaWxlOwogICAgbXkgJG5ldyAgPSBzaGlmdDsgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRuZXc7CgogICAgbXkgJGVudHJ5ID0gJHNlbGYtPl9maW5kX2VudHJ5KCAkZmlsZSApIG9yIHJldHVybjsKCiAgICByZXR1cm4gJGVudHJ5LT5yZW5hbWUoICRuZXcgKTsKfQoKPWhlYWQyICR0YXItPnJlbW92ZSAoQGZpbGVuYW1lbGlzdCkKClJlbW92ZXMgYW55IGVudHJpZXMgd2l0aCBuYW1lcyBtYXRjaGluZyBhbnkgb2YgdGhlIGdpdmVuIGZpbGVuYW1lcwpmcm9tIHRoZSBpbi1tZW1vcnkgYXJjaGl2ZS4gUmV0dXJucyBhIGxpc3Qgb2YgQzxBcmNoaXZlOjpUYXI6OkZpbGU+Cm9iamVjdHMgdGhhdCByZW1haW4uCgo9Y3V0CgpzdWIgcmVtb3ZlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAbGlzdCA9IEBfOwoKICAgIG15ICVzZWVuID0gbWFwIHsgJF8tPmZ1bGxfcGF0aCA9PiAkXyB9IEB7JHNlbGYtPl9kYXRhfTsKICAgIGRlbGV0ZSAkc2VlbnsgJF8gfSBmb3IgQGxpc3Q7CgogICAgJHNlbGYtPl9kYXRhKCBbdmFsdWVzICVzZWVuXSApOwoKICAgIHJldHVybiB2YWx1ZXMgJXNlZW47Cn0KCj1oZWFkMiAkdGFyLT5jbGVhcgoKQzxjbGVhcj4gY2xlYXJzIHRoZSBjdXJyZW50IGluLW1lbW9yeSBhcmNoaXZlLiBUaGlzIGVmZmVjdGl2ZWx5IGdpdmVzCnlvdSBhICdibGFuaycgb2JqZWN0LCByZWFkeSB0byBiZSBmaWxsZWQgYWdhaW4uIE5vdGUgdGhhdCBDPGNsZWFyPgpvbmx5IGhhcyBlZmZlY3Qgb24gdGhlIG9iamVjdCwgbm90IHRoZSB1bmRlcmx5aW5nIHRhcmZpbGUuCgo9Y3V0CgpzdWIgY2xlYXIgewogICAgbXkgJHNlbGYgPSBzaGlmdCBvciByZXR1cm47CgogICAgJHNlbGYtPl9kYXRhKCBbXSApOwogICAgJHNlbGYtPl9maWxlKCAnJyApOwoKICAgIHJldHVybiAxOwp9CgoKPWhlYWQyICR0YXItPndyaXRlICggWyRmaWxlLCAkY29tcHJlc3NlZCwgJHByZWZpeF0gKQoKV3JpdGUgdGhlIGluLW1lbW9yeSBhcmNoaXZlIHRvIGRpc2suICBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGVpdGhlcgpiZSB0aGUgbmFtZSBvZiBhIGZpbGUgb3IgYSByZWZlcmVuY2UgdG8gYW4gYWxyZWFkeSBvcGVuIGZpbGVoYW5kbGUgKGEKR0xPQiByZWZlcmVuY2UpLiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRydWUsIHRoZSBtb2R1bGUgd2lsbCB1c2UKSU86OlpsaWIgdG8gd3JpdGUgdGhlIGZpbGUgaW4gYSBjb21wcmVzc2VkIGZvcm1hdC4gIElmIElPOjpabGliIGlzCm5vdCBhdmFpbGFibGUsIHRoZSBDPHdyaXRlPiBtZXRob2Qgd2lsbCBmYWlsIGFuZCByZXR1cm4uCgpOb3RlIHRoYXQgd2hlbiB5b3UgcGFzcyBpbiBhIGZpbGVoYW5kbGUsIHRoZSBjb21wcmVzc2lvbiBhcmd1bWVudAppcyBpZ25vcmVkLCBhcyBhbGwgZmlsZXMgYXJlIHByaW50ZWQgdmVyYmF0aW0gdG8geW91ciBmaWxlaGFuZGxlLgpJZiB5b3Ugd2lzaCB0byBlbmFibGUgY29tcHJlc3Npb24gd2l0aCBmaWxlaGFuZGxlcywgdXNlIGFuCkM8SU86OlpsaWI+IGZpbGVoYW5kbGUgaW5zdGVhZC4KClNwZWNpZmljIGxldmVscyBvZiBjb21wcmVzc2lvbiBjYW4gYmUgY2hvc2VuIGJ5IHBhc3NpbmcgdGhlIHZhbHVlcyAyCnRocm91Z2ggOSBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KClRoZSB0aGlyZCBhcmd1bWVudCBpcyBhbiBvcHRpb25hbCBwcmVmaXguIEFsbCBmaWxlcyB3aWxsIGJlIHR1Y2tlZAphd2F5IGluIHRoZSBkaXJlY3RvcnkgeW91IHNwZWNpZnkgYXMgcHJlZml4LiBTbyBpZiB5b3UgaGF2ZSBmaWxlcwonYScgYW5kICdiJyBpbiB5b3VyIGFyY2hpdmUsIGFuZCB5b3Ugc3BlY2lmeSAnZm9vJyBhcyBwcmVmaXgsIHRoZXkKd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBhcmNoaXZlIGFzICdmb28vYScgYW5kICdmb28vYicuCgpJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBDPHdyaXRlPiByZXR1cm5zIHRoZSBlbnRpcmUgZm9ybWF0dGVkCmFyY2hpdmUgYXMgYSBzdHJpbmcsIHdoaWNoIGNvdWxkIGJlIHVzZWZ1bCBpZiB5b3UnZCBsaWtlIHRvIHN0dWZmIHRoZQphcmNoaXZlIGludG8gYSBzb2NrZXQgb3IgYSBwaXBlIHRvIGd6aXAgb3Igc29tZXRoaW5nLgoKPWN1dAoKc3ViIHdyaXRlIHsKICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OwogICAgbXkgJGZpbGUgICAgICAgID0gc2hpZnQ7ICRmaWxlID0gJycgdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkZ3ppcCAgICAgICAgPSBzaGlmdCB8fCAwOwogICAgbXkgJGV4dF9wcmVmaXggID0gc2hpZnQ7ICRleHRfcHJlZml4ID0gJycgdW5sZXNzIGRlZmluZWQgJGV4dF9wcmVmaXg7CiAgICBteSAkZHVtbXkgICAgICAgPSAnJzsKICAgIAogICAgIyMjIG9ubHkgbmVlZCBhIGhhbmRsZSBpZiB3ZSBoYXZlIGEgZmlsZSB0byBwcmludCB0byAjIyMKICAgIG15ICRoYW5kbGUgPSBsZW5ndGgoJGZpbGUpCiAgICAgICAgICAgICAgICAgICAgPyAoICRzZWxmLT5fZ2V0X2hhbmRsZSgkZmlsZSwgJGd6aXAsIFdSSVRFX09OTFktPigkZ3ppcCkgKQogICAgICAgICAgICAgICAgICAgICAgICBvciByZXR1cm4gKQogICAgICAgICAgICAgICAgICAgIDogJEhBU19QRVJMSU8gICAgPyBkbyB7IG9wZW4gbXkgJGgsICc+JywgXCRkdW1teTsgJGggfQogICAgICAgICAgICAgICAgICAgIDogJEhBU19JT19TVFJJTkcgPyBJTzo6U3RyaW5nLT5uZXcgCiAgICAgICAgICAgICAgICAgICAgOiBfX1BBQ0tBR0VfXy0+bm9fc3RyaW5nX3N1cHBvcnQoKTsKCgoKICAgIGZvciBteSAkZW50cnkgKCBAeyRzZWxmLT5fZGF0YX0gKSB7CiAgICAgICAgIyMjIGVudHJpZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgdGFyZmlsZSAjIyMKICAgICAgICBteSBAd3JpdGVfbWU7CgogICAgICAgICMjIyBvbmx5IG5vdyB3aWxsIHdlIGNoYW5nZSB0aGUgb2JqZWN0IHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdGUKICAgICAgICAjIyMgb2YgdGhlIG5hbWUgYW5kIHByZWZpeCBmaWVsZHMgLS0gdGhpcyBuZWVkcyB0byBiZSBsaW1pdGVkIHRvCiAgICAgICAgIyMjIHdyaXRlKCkgb25seSEKICAgICAgICBteSAkY2xvbmUgPSAkZW50cnktPmNsb25lOwoKCiAgICAgICAgIyMjIHNvLCBpZiB5b3UgZG9uJ3Qgd2FudCB1c2UgdG8gdXNlIHRoZSBwcmVmaXgsIHdlJ2xsIHN0dWZmIAogICAgICAgICMjIyBldmVyeXRoaW5nIGluIHRoZSBuYW1lIGZpZWxkIGluc3RlYWQKICAgICAgICBpZiggJERPX05PVF9VU0VfUFJFRklYICkgewoKICAgICAgICAgICAgIyMjIHlvdSBtaWdodCBoYXZlIGFuIGV4dGVuZGVkIHByZWZpeCwgaWYgc28sIHNldCBpdCBpbiB0aGUgY2xvbmUKICAgICAgICAgICAgIyMjIFhYWCBpcyA6OlVuaXggcmlnaHQ/CiAgICAgICAgICAgICRjbG9uZS0+bmFtZSggbGVuZ3RoICRleHRfcHJlZml4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZpbGU6OlNwZWM6OlVuaXgtPmNhdGRpciggJGV4dF9wcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsb25lLT5mdWxsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICRjbG9uZS0+ZnVsbF9wYXRoICk7CiAgICAgICAgICAgICRjbG9uZS0+cHJlZml4KCAnJyApOwoKICAgICAgICAjIyMgb3RoZXJ3aXNlLCB3ZSdsbCBoYXZlIHRvIHNldCBpdCBwcm9wZXJseSAtLSBwcmVmaXggcGFydCBpbiB0aGUKICAgICAgICAjIyMgcHJlZml4IGFuZCBuYW1lIHBhcnQgaW4gdGhlIG5hbWUgZmllbGQuCiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICMjIyBzcGxpdCB0aGVtIGhlcmUsIG5vdCBiZWZvcmUhCiAgICAgICAgICAgIG15ICgkcHJlZml4LCRuYW1lKSA9ICRjbG9uZS0+X3ByZWZpeF9hbmRfZmlsZSggJGNsb25lLT5mdWxsX3BhdGggKTsKCiAgICAgICAgICAgICMjIyB5b3UgbWlnaHQgaGF2ZSBhbiBleHRlbmRlZCBwcmVmaXgsIGlmIHNvLCBzZXQgaXQgaW4gdGhlIGNsb25lCiAgICAgICAgICAgICMjIyBYWFggaXMgOjpVbml4IHJpZ2h0PwogICAgICAgICAgICAkcHJlZml4ID0gRmlsZTo6U3BlYzo6VW5peC0+Y2F0ZGlyKCAkZXh0X3ByZWZpeCwgJHByZWZpeCApCiAgICAgICAgICAgICAgICBpZiBsZW5ndGggJGV4dF9wcmVmaXg7CgogICAgICAgICAgICAkY2xvbmUtPnByZWZpeCggJHByZWZpeCApOwogICAgICAgICAgICAkY2xvbmUtPm5hbWUoICRuYW1lICk7CiAgICAgICAgfQoKICAgICAgICAjIyMgbmFtZXMgYXJlIHRvbyBsb25nLCBhbmQgd2lsbCBnZXQgdHJ1bmNhdGVkIGlmIHdlIGRvbid0IGFkZCBhCiAgICAgICAgIyMjICdATG9uZ0xpbmsnIGZpbGUuLi4KICAgICAgICBteSAkbWFrZV9sb25nbGluayA9ICggICBsZW5ndGgoJGNsb25lLT5uYW1lKSAgICA+IE5BTUVfTEVOR1RIIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKCRjbG9uZS0+cHJlZml4KSAgPiBQUkVGSVhfTEVOR1RICiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHx8IDA7CgogICAgICAgICMjIyBwZXJoYXBzIHdlIG5lZWQgdG8gbWFrZSBhIGxvbmdsaW5rIGZpbGU/CiAgICAgICAgaWYoICRtYWtlX2xvbmdsaW5rICkgewogICAgICAgICAgICBteSAkbG9uZ2xpbmsgPSBBcmNoaXZlOjpUYXI6OkZpbGUtPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPT4gTE9OR0xJTktfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbG9uZS0+ZnVsbF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlID0+IExPTkdMSU5LIH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHVubGVzcyggJGxvbmdsaW5rICkgewogICAgICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggIHFxW0NvdWxkIG5vdCBjcmVhdGUgJ0xvbmdMaW5rJyBlbnRyeSBmb3IgXSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFbb3ZlcnNpemUgZmlsZSAnXSAuICRjbG9uZS0+ZnVsbF9wYXRoIC4iJyIgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHB1c2ggQHdyaXRlX21lLCAkbG9uZ2xpbms7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB3cml0ZV9tZSwgJGNsb25lOwoKICAgICAgICAjIyMgd3JpdGUgdGhlIG9uZSwgb3B0aW9uYWxseSAyIGE6OnQ6OmZpbGUgb2JqZWN0cyB0byB0aGUgaGFuZGxlCiAgICAgICAgZm9yIG15ICRjbG9uZSAoQHdyaXRlX21lKSB7CgogICAgICAgICAgICAjIyMgaWYgdGhlIGZpbGUgaXMgYSBzeW1saW5rLCB0aGVyZSBhcmUgMiBvcHRpb25zOgogICAgICAgICAgICAjIyMgZWl0aGVyIHdlIGxlYXZlIHRoZSBzeW1saW5rIGludGFjdCwgYnV0IHRoZW4gd2UgZG9uJ3Qgd3JpdGUgYW55CiAgICAgICAgICAgICMjIyBkYXRhIE9SIHdlIGZvbGxvdyB0aGUgc3ltbGluaywgd2hpY2ggbWVhbnMgd2UgYWN0dWFsbHkgbWFrZSBhCiAgICAgICAgICAgICMjIyBjb3B5LiBpZiB3ZSBkbyB0aGUgbGF0dGVyLCB3ZSBoYXZlIHRvIGNoYW5nZSB0aGUgVFlQRSBvZiB0aGUKICAgICAgICAgICAgIyMjIGNsb25lIHRvICdGSUxFJwogICAgICAgICAgICBteSAkbGlua19vayA9ICAkY2xvbmUtPmlzX3N5bWxpbmsgJiYgJEFyY2hpdmU6OlRhcjo6Rk9MTE9XX1NZTUxJTks7CiAgICAgICAgICAgIG15ICRkYXRhX29rID0gISRjbG9uZS0+aXNfc3ltbGluayAmJiAkY2xvbmUtPmhhc19jb250ZW50OwoKICAgICAgICAgICAgIyMjIGRvd25ncmFkZSB0byBhICdub3JtYWwnIGZpbGUgaWYgaXQncyBhIHN5bWxpbmsgd2UncmUgZ29pbmcgdG8KICAgICAgICAgICAgIyMjIHRyZWF0IGFzIGEgcmVndWxhciBmaWxlCiAgICAgICAgICAgICRjbG9uZS0+X2Rvd25ncmFkZV90b19wbGFpbmZpbGUgaWYgJGxpbmtfb2s7CgogICAgICAgICAgICAjIyMgZ2V0IHRoZSBoZWFkZXIgZm9yIHRoaXMgYmxvY2sKICAgICAgICAgICAgbXkgJGhlYWRlciA9ICRzZWxmLT5fZm9ybWF0X3Rhcl9lbnRyeSggJGNsb25lICk7CiAgICAgICAgICAgIHVubGVzcyggJGhlYWRlciApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fZXJyb3IocVtDb3VsZCBub3QgZm9ybWF0IGhlYWRlciBmb3I6IF0gLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2xvbmUtPmZ1bGxfcGF0aCApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1bmxlc3MoIHByaW50ICRoYW5kbGUgJGhlYWRlciApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fZXJyb3IocVtDb3VsZCBub3Qgd3JpdGUgaGVhZGVyIGZvcjogXSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbG9uZS0+ZnVsbF9wYXRoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoICRsaW5rX29rIG9yICRkYXRhX29rICkgewogICAgICAgICAgICAgICAgdW5sZXNzKCBwcmludCAkaGFuZGxlICRjbG9uZS0+ZGF0YSApIHsKICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X2Vycm9yKHFbQ291bGQgbm90IHdyaXRlIGRhdGEgZm9yOiBdIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsb25lLT5mdWxsX3BhdGgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIyMgcGFkIHRoZSBlbmQgb2YgdGhlIGNsb25lIGlmIHJlcXVpcmVkICMjIwogICAgICAgICAgICAgICAgcHJpbnQgJGhhbmRsZSBUQVJfUEFELT4oICRjbG9uZS0+c2l6ZSApIGlmICRjbG9uZS0+c2l6ZSAlIEJMT0NLCiAgICAgICAgICAgIH0KCiAgICAgICAgfSAjIyMgZG9uZSB3cml0aW5nIHRoZXNlIGVudHJpZXMKICAgIH0KCiAgICAjIyMgd3JpdGUgdGhlIGVuZCBtYXJrZXJzICMjIwogICAgcHJpbnQgJGhhbmRsZSBUQVJfRU5EIHggMiBvcgogICAgICAgICAgICByZXR1cm4gJHNlbGYtPl9lcnJvciggcXFbQ291bGQgbm90IHdyaXRlIHRhciBlbmQgbWFya2Vyc10gKTsKCiAgICAjIyMgZGlkIHlvdSB3YW50IGl0IHdyaXR0ZW4gdG8gYSBmaWxlLCBvciByZXR1cm5lZCBhcyBhIHN0cmluZz8gIyMjCiAgICBteSAkcnYgPSAgbGVuZ3RoKCRmaWxlKSA/IDEKICAgICAgICAgICAgICAgICAgICAgICAgOiAkSEFTX1BFUkxJTyA/ICRkdW1teQogICAgICAgICAgICAgICAgICAgICAgICA6IGRvIHsgc2VlayAkaGFuZGxlLCAwLCAwOyBsb2NhbCAkLzsgPCRoYW5kbGU+IH07CgogICAgIyMjIG1ha2Ugc3VyZSB0byBjbG9zZSB0aGUgaGFuZGxlOwogICAgY2xvc2UgJGhhbmRsZTsKICAgIAogICAgcmV0dXJuICRydjsKfQoKc3ViIF9mb3JtYXRfdGFyX2VudHJ5IHsKICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OwogICAgbXkgJGVudHJ5ICAgICAgID0gc2hpZnQgb3IgcmV0dXJuOwogICAgbXkgJGV4dF9wcmVmaXggID0gc2hpZnQ7ICRleHRfcHJlZml4ID0gJycgdW5sZXNzIGRlZmluZWQgJGV4dF9wcmVmaXg7CiAgICBteSAkbm9fcHJlZml4ICAgPSBzaGlmdCB8fCAwOwoKICAgIG15ICRmaWxlICAgID0gJGVudHJ5LT5uYW1lOwogICAgbXkgJHByZWZpeCAgPSAkZW50cnktPnByZWZpeDsgJHByZWZpeCA9ICcnIHVubGVzcyBkZWZpbmVkICRwcmVmaXg7CgogICAgIyMjIHJlbW92ZSB0aGUgcHJlZml4IGZyb20gdGhlIGZpbGUgbmFtZQogICAgIyMjIG5vdCBzdXJlIGlmIHRoaXMgaXMgc3RpbGwgbmVlZWRlZCAtLWthbmUKICAgICMjIyBubyBpdCdzIG5vdCAtLSBBcmNoaXZlOjpUYXI6OkZpbGUtPl9uZXdfZnJvbV9maWxlIHdpbGwgdGFrZSBjYXJlIG9mCiAgICAjIyMgdGhpcyBmb3IgdXMuIEV2ZW4gd29yc2UsIHRoaXMgd291bGQgYnJlYWsgaWYgd2UgdHJpZWQgdG8gYWRkIGEgZmlsZQogICAgIyMjIGxpa2UgeC94LgogICAgI2lmKCBsZW5ndGggJHByZWZpeCApIHsKICAgICMgICAgJGZpbGUgPX4gcy9eJG1hdGNoLy87CiAgICAjfQoKICAgICRwcmVmaXggPSBGaWxlOjpTcGVjOjpVbml4LT5jYXRkaXIoJGV4dF9wcmVmaXgsICRwcmVmaXgpCiAgICAgICAgICAgICAgICBpZiBsZW5ndGggJGV4dF9wcmVmaXg7CgogICAgIyMjIG5vdCBzdXJlIHdoeSB0aGlzIGlzLi4uICMjIwogICAgbXkgJGwgPSBQUkVGSVhfTEVOR1RIOyAjIGlzIGFtYmlndW91cyBvdGhlcndpc2UuLi4KICAgIHN1YnN0ciAoJHByZWZpeCwgMCwgLSRsKSA9ICIiIGlmIGxlbmd0aCAkcHJlZml4ID49IFBSRUZJWF9MRU5HVEg7CgogICAgbXkgJGYxID0gIiUwNm8iOyBteSAkZjIgID0gIiUxMW8iOwoKICAgICMjIyB0aGlzIG1pZ2h0IGJlIG9wdGltaXphYmxlIHdpdGggYSAnY2hhbmdlZCcgZmxhZyBpbiB0aGUgZmlsZSBvYmplY3RzICMjIwogICAgbXkgJHRhciA9IHBhY2sgKAogICAgICAgICAgICAgICAgUEFDSywKICAgICAgICAgICAgICAgICRmaWxlLAoKICAgICAgICAgICAgICAgIChtYXAgeyBzcHJpbnRmKCAkZjEsICRlbnRyeS0+JF8oKSApIH0gcXdbbW9kZSB1aWQgZ2lkXSksCiAgICAgICAgICAgICAgICAobWFwIHsgc3ByaW50ZiggJGYyLCAkZW50cnktPiRfKCkgKSB9IHF3W3NpemUgbXRpbWVdKSwKCiAgICAgICAgICAgICAgICAiIiwgICMgY2hlY2tzdW0gZmllbGQgLSBzcGFjZSBwYWRkZWQgYSBiaXQgZG93bgoKICAgICAgICAgICAgICAgIChtYXAgeyAkZW50cnktPiRfKCkgfSAgICAgICAgICAgICAgICAgcXdbdHlwZSBsaW5rbmFtZSBtYWdpY10pLAoKICAgICAgICAgICAgICAgICRlbnRyeS0+dmVyc2lvbiB8fCBUQVJfVkVSU0lPTiwKCiAgICAgICAgICAgICAgICAobWFwIHsgJGVudHJ5LT4kXygpIH0gICAgICAgICAgICAgICAgIHF3W3VuYW1lIGduYW1lXSksCiAgICAgICAgICAgICAgICAobWFwIHsgc3ByaW50ZiggJGYxLCAkZW50cnktPiRfKCkgKSB9IHF3W2Rldm1ham9yIGRldm1pbm9yXSksCgogICAgICAgICAgICAgICAgKCRub19wcmVmaXggPyAnJyA6ICRwcmVmaXgpCiAgICApOwoKICAgICMjIyBhZGQgdGhlIGNoZWNrc3VtICMjIwogICAgc3Vic3RyKCR0YXIsMTQ4LDcpID0gc3ByaW50ZigiJTZvXDAiLCB1bnBhY2soIiUxNkMqIiwkdGFyKSk7CgogICAgcmV0dXJuICR0YXI7Cn0KCj1oZWFkMiAkdGFyLT5hZGRfZmlsZXMoIEBmaWxlbmFtZWxpc3QgKQoKVGFrZXMgYSBsaXN0IG9mIGZpbGVuYW1lcyBhbmQgYWRkcyB0aGVtIHRvIHRoZSBpbi1tZW1vcnkgYXJjaGl2ZS4KClRoZSBwYXRoIHRvIHRoZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGEgVW5peCBsaWtlCmVxdWl2YWxlbnQgZm9yIHVzZSBpbiB0aGUgYXJjaGl2ZSwgYW5kLCBpZiBvbiBNYWNPUywgdGhlIGZpbGUncwptb2RpZmljYXRpb24gdGltZSBpcyBjb252ZXJ0ZWQgZnJvbSB0aGUgTWFjT1MgZXBvY2ggdG8gdGhlIFVuaXggZXBvY2guClNvIHRhciBhcmNoaXZlcyBjcmVhdGVkIG9uIE1hY09TIHdpdGggQjxBcmNoaXZlOjpUYXI+IGNhbiBiZSByZWFkCmJvdGggd2l0aCBJPHRhcj4gb24gVW5peCBhbmQgYXBwbGljYXRpb25zIGxpa2UgSTxzdW50YXI+IG9yCkk8U3R1ZmZpdCBFeHBhbmRlcj4gb24gTWFjT1MuCgpCZSBhd2FyZSB0aGF0IHRoZSBmaWxlJ3MgdHlwZS9jcmVhdG9yIGFuZCByZXNvdXJjZSBmb3JrIHdpbGwgYmUgbG9zdCwKd2hpY2ggaXMgdXN1YWxseSB3aGF0IHlvdSB3YW50IGluIGNyb3NzLXBsYXRmb3JtIGFyY2hpdmVzLgoKUmV0dXJucyBhIGxpc3Qgb2YgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IG9iamVjdHMgdGhhdCB3ZXJlIGp1c3QgYWRkZWQuCgo9Y3V0CgpzdWIgYWRkX2ZpbGVzIHsKICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CiAgICBteSBAZmlsZXMgICA9IEBfIG9yIHJldHVybjsKCiAgICBteSBAcnY7CiAgICBmb3IgbXkgJGZpbGUgKCBAZmlsZXMgKSB7CiAgICAgICAgdW5sZXNzKCAtZSAkZmlsZSB8fCAtbCAkZmlsZSApIHsKICAgICAgICAgICAgJHNlbGYtPl9lcnJvciggcXFbTm8gc3VjaCBmaWxlOiAnJGZpbGUnXSApOwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgbXkgJG9iaiA9IEFyY2hpdmU6OlRhcjo6RmlsZS0+bmV3KCBmaWxlID0+ICRmaWxlICk7CiAgICAgICAgdW5sZXNzKCAkb2JqICkgewogICAgICAgICAgICAkc2VsZi0+X2Vycm9yKCBxcVtVbmFibGUgdG8gYWRkIGZpbGU6ICckZmlsZSddICk7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBydiwgJG9iajsKICAgIH0KCiAgICBwdXNoIEB7JHNlbGYtPntfZGF0YX19LCBAcnY7CgogICAgcmV0dXJuIEBydjsKfQoKPWhlYWQyICR0YXItPmFkZF9kYXRhICggJGZpbGVuYW1lLCAkZGF0YSwgWyRvcHRoYXNocmVmXSApCgpUYWtlcyBhIGZpbGVuYW1lLCBhIHNjYWxhciBmdWxsIG9mIGRhdGEgYW5kIG9wdGlvbmFsbHkgYSByZWZlcmVuY2UgdG8KYSBoYXNoIHdpdGggc3BlY2lmaWMgb3B0aW9ucy4KCldpbGwgYWRkIGEgZmlsZSB0byB0aGUgaW4tbWVtb3J5IGFyY2hpdmUsIHdpdGggbmFtZSBDPCRmaWxlbmFtZT4gYW5kCmNvbnRlbnQgQzwkZGF0YT4uIFNwZWNpZmljIHByb3BlcnRpZXMgY2FuIGJlIHNldCB1c2luZyBDPCRvcHRoYXNocmVmPi4KVGhlIGZvbGxvd2luZyBsaXN0IG9mIHByb3BlcnRpZXMgaXMgc3VwcG9ydGVkOiBuYW1lLCBzaXplLCBtdGltZQoobGFzdCBtb2RpZmllZCBkYXRlKSwgbW9kZSwgdWlkLCBnaWQsIGxpbmtuYW1lLCB1bmFtZSwgZ25hbWUsCmRldm1ham9yLCBkZXZtaW5vciwgcHJlZml4LCB0eXBlLiAgKE9uIE1hY09TLCB0aGUgZmlsZSdzIHBhdGggYW5kCm1vZGlmaWNhdGlvbiB0aW1lcyBhcmUgY29udmVydGVkIHRvIFVuaXggZXF1aXZhbGVudHMuKQoKVmFsaWQgdmFsdWVzIGZvciB0aGUgZmlsZSB0eXBlIGFyZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBkZWZpbmVkIGluCkFyY2hpdmU6OlRhcjo6Q29uc3RhbnRzOgoKPW92ZXIgNAoKPWl0ZW0gRklMRQoKUmVndWxhciBmaWxlLgoKPWl0ZW0gSEFSRExJTksKCj1pdGVtIFNZTUxJTksKCkhhcmQgYW5kIHN5bWJvbGljICgic29mdCIpIGxpbmtzOyBsaW5rbmFtZSBzaG91bGQgc3BlY2lmeSB0YXJnZXQuCgo9aXRlbSBDSEFSREVWCgo9aXRlbSBCTE9DS0RFVgoKQ2hhcmFjdGVyIGFuZCBibG9jayBkZXZpY2VzLiBkZXZtYWpvciBhbmQgZGV2bWlub3Igc2hvdWxkIHNwZWNpZnkgdGhlIG1ham9yCmFuZCBtaW5vciBkZXZpY2UgbnVtYmVycy4KCj1pdGVtIERJUgoKRGlyZWN0b3J5LgoKPWl0ZW0gRklGTwoKRklGTyAobmFtZWQgcGlwZSkuCgo9aXRlbSBTT0NLRVQKClNvY2tldC4KCj1iYWNrCgpSZXR1cm5zIHRoZSBDPEFyY2hpdmU6OlRhcjo6RmlsZT4gb2JqZWN0IHRoYXQgd2FzIGp1c3QgYWRkZWQsIG9yCkM8dW5kZWY+IG9uIGZhaWx1cmUuCgo9Y3V0CgpzdWIgYWRkX2RhdGEgewogICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgIG15ICgkZmlsZSwgJGRhdGEsICRvcHQpID0gQF87CgogICAgbXkgJG9iaiA9IEFyY2hpdmU6OlRhcjo6RmlsZS0+bmV3KCBkYXRhID0+ICRmaWxlLCAkZGF0YSwgJG9wdCApOwogICAgdW5sZXNzKCAkb2JqICkgewogICAgICAgICRzZWxmLT5fZXJyb3IoIHFxW1VuYWJsZSB0byBhZGQgZmlsZTogJyRmaWxlJ10gKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcHVzaCBAeyRzZWxmLT57X2RhdGF9fSwgJG9iajsKCiAgICByZXR1cm4gJG9iajsKfQoKPWhlYWQyICR0YXItPmVycm9yKCBbJEJPT0xdICkKClJldHVybnMgdGhlIGN1cnJlbnQgZXJyb3JzdHJpbmcgKHVzdWFsbHksIHRoZSBsYXN0IGVycm9yIHJlcG9ydGVkKS4KSWYgYSB0cnVlIHZhbHVlIHdhcyBzcGVjaWZpZWQsIGl0IHdpbGwgZ2l2ZSB0aGUgQzxDYXJwOjpsb25nbWVzcz4KZXF1aXZhbGVudCBvZiB0aGUgZXJyb3IsIGluIGVmZmVjdCBnaXZpbmcgeW91IGEgc3RhY2t0cmFjZS4KCkZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhpcyBlcnJvciBpcyBhbHNvIGF2YWlsYWJsZSBhcwpDPCRBcmNoaXZlOjpUYXI6OmVycm9yPiBhbHRob3VnaCBpdCBpcyBtdWNoIHJlY29tbWVuZGVkIHlvdSB1c2UgdGhlCm1ldGhvZCBjYWxsIGluc3RlYWQuCgo9Y3V0Cgp7CiAgICAkZXJyb3IgPSAnJzsKICAgIG15ICRsb25nbWVzczsKCiAgICBzdWIgX2Vycm9yIHsKICAgICAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgICAgIG15ICRtc2cgICAgID0gJGVycm9yID0gc2hpZnQ7CiAgICAgICAgJGxvbmdtZXNzICAgPSBDYXJwOjpsb25nbWVzcygkZXJyb3IpOwoKICAgICAgICAjIyMgc2V0IEFyY2hpdmU6OlRhcjo6V0FSTiB0byAwIHRvIGRpc2FibGUgcHJpbnRpbmcKICAgICAgICAjIyMgb2YgZXJyb3JzCiAgICAgICAgaWYoICRXQVJOICkgewogICAgICAgICAgICBjYXJwICRERUJVRyA/ICRsb25nbWVzcyA6ICRtc2c7CiAgICAgICAgfQoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgc3ViIGVycm9yIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgIHJldHVybiBzaGlmdCgpID8gJGxvbmdtZXNzIDogJGVycm9yOwogICAgfQp9Cgo9aGVhZDIgJHRhci0+c2V0Y3dkKCAkY3dkICk7CgpDPEFyY2hpdmU6OlRhcj4gbmVlZHMgdG8ga25vdyB0aGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCBpdCB3aWxsIHJ1bgpDPEN3ZDo6Y3dkKCk+IEk8ZXZlcnk+IHRpbWUgaXQgZXh0cmFjdHMgYSBJPHJlbGF0aXZlPiBlbnRyeSBmcm9tIHRoZSAKdGFyZmlsZSBhbmQgc2F2ZXMgaXQgaW4gdGhlIGZpbGUgc3lzdGVtLiAoQXMgb2YgdmVyc2lvbiAxLjMwLCBob3dldmVyLApDPEFyY2hpdmU6OlRhcj4gd2lsbCB1c2UgdGhlIHNwZWVkIG9wdGltaXphdGlvbiBkZXNjcmliZWQgYmVsb3cgCmF1dG9tYXRpY2FsbHksIHNvIGl0J3Mgb25seSByZWxldmFudCBpZiB5b3UncmUgdXNpbmcgQzxleHRyYWN0X2ZpbGUoKT4pLgoKU2luY2UgQzxBcmNoaXZlOjpUYXI+IGRvZXNuJ3QgY2hhbmdlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbnRlcm5hbGx5CndoaWxlIGl0IGlzIGV4dHJhY3RpbmcgdGhlIGl0ZW1zIGluIGEgdGFyYmFsbCwgYWxsIGNhbGxzIHRvIEM8Q3dkOjpjd2QoKT4KY2FuIGJlIGF2b2lkZWQgaWYgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBkb2Vzbid0CmdldCBjaGFuZ2VkIGV4dGVybmFsbHkuCgpUbyB1c2UgdGhpcyBwZXJmb3JtYW5jZSBib29zdCwgc2V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSB2aWEKCiAgICB1c2UgQ3dkOwogICAgJHRhci0+c2V0Y3dkKCBjd2QoKSApOwoKb25jZSBiZWZvcmUgY2FsbGluZyBhIGZ1bmN0aW9uIGxpa2UgQzxleHRyYWN0X2ZpbGU+IGFuZApDPEFyY2hpdmU6OlRhcj4gd2lsbCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNldHRpbmcgZnJvbSB0aGVuIG9uCmFuZCB3b24ndCBjYWxsIEM8Q3dkOjpjd2QoKT4gaW50ZXJuYWxseS4gCgpUbyBzd2l0Y2ggYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvdXIsIHVzZQoKICAgICR0YXItPnNldGN3ZCggdW5kZWYgKTsKCmFuZCBDPEFyY2hpdmU6OlRhcj4gd2lsbCBjYWxsIEM8Q3dkOjpjd2QoKT4gaW50ZXJuYWxseSBhZ2Fpbi4KCklmIHlvdSdyZSB1c2luZyBDPEFyY2hpdmU6OlRhcj4ncyBDPGV4cmFjdCgpPiBtZXRob2QsIEM8c2V0Y3dkKCk+IHdpbGwKYmUgY2FsbGVkIGZvciB5b3UuCgo9Y3V0IAoKc3ViIHNldGN3ZCB7CiAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKICAgIG15ICRjd2QgICAgICA9IHNoaWZ0OwoKICAgICRzZWxmLT57Y3dkfSA9ICRjd2Q7Cn0KCj1oZWFkMiAkYm9vbCA9ICR0YXItPmhhc19pb19zdHJpbmcKClJldHVybnMgdHJ1ZSBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBDPElPOjpTdHJpbmc+IHN1cHBvcnQgbG9hZGVkLgoKRWl0aGVyIEM8SU86OlN0cmluZz4gb3IgQzxwZXJsaW8+IHN1cHBvcnQgaXMgbmVlZGVkIHRvIHN1cHBvcnQgd3JpdGluZyAKc3RyaW5naWZpZWQgYXJjaGl2ZXMuIEN1cnJlbnRseSwgQzxwZXJsaW8+IGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kLCBpZgphdmFpbGFibGUuCgpTZWUgdGhlIEM8R0xPQkFMIFZBUklBQkxFUz4gc2VjdGlvbiB0byBzZWUgaG93IHRvIGNoYW5nZSB0aGlzIHByZWZlcmVuY2UuCgo9Y3V0CgpzdWIgaGFzX2lvX3N0cmluZyB7IHJldHVybiAkSEFTX0lPX1NUUklORzsgfQoKPWhlYWQyICRib29sID0gJHRhci0+aGFzX3BlcmxpbwoKUmV0dXJucyB0cnVlIGlmIHdlIGN1cnJlbnRseSBoYXZlIEM8cGVybGlvPiBzdXBwb3J0IGxvYWRlZC4KClRoaXMgcmVxdWlyZXMgQzxwZXJsLTUuOD4gb3IgaGlnaGVyLCBjb21waWxlZCB3aXRoIEM8cGVybGlvPiAKCkVpdGhlciBDPElPOjpTdHJpbmc+IG9yIEM8cGVybGlvPiBzdXBwb3J0IGlzIG5lZWRlZCB0byBzdXBwb3J0IHdyaXRpbmcgCnN0cmluZ2lmaWVkIGFyY2hpdmVzLiBDdXJyZW50bHksIEM8cGVybGlvPiBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCwgaWYKYXZhaWxhYmxlLgoKU2VlIHRoZSBDPEdMT0JBTCBWQVJJQUJMRVM+IHNlY3Rpb24gdG8gc2VlIGhvdyB0byBjaGFuZ2UgdGhpcyBwcmVmZXJlbmNlLgoKPWN1dAoKc3ViIGhhc19wZXJsaW8geyByZXR1cm4gJEhBU19QRVJMSU87IH0KCgo9aGVhZDEgQ2xhc3MgTWV0aG9kcwoKPWhlYWQyIEFyY2hpdmU6OlRhci0+Y3JlYXRlX2FyY2hpdmUoJGZpbGUsICRjb21wcmVzc2lvbiwgQGZpbGVsaXN0KQoKQ3JlYXRlcyBhIHRhciBmaWxlIGZyb20gdGhlIGxpc3Qgb2YgZmlsZXMgcHJvdmlkZWQuICBUaGUgZmlyc3QKYXJndW1lbnQgY2FuIGVpdGhlciBiZSB0aGUgbmFtZSBvZiB0aGUgdGFyIGZpbGUgdG8gY3JlYXRlIG9yIGEKcmVmZXJlbmNlIHRvIGFuIG9wZW4gZmlsZSBoYW5kbGUgKGUuZy4gYSBHTE9CIHJlZmVyZW5jZSkuCgpUaGUgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgY29tcHJlc3Npb24gdG8gYmUgdXNlZCwgaWYKYW55LiAgQ29tcHJlc3Npb24gb2YgdGFyIGZpbGVzIHJlcXVpcmVzIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlCklPOjpabGliIG1vZHVsZS4gIFNwZWNpZmljIGxldmVscyBvZiBjb21wcmVzc2lvbiBtYXkgYmUKcmVxdWVzdGVkIGJ5IHBhc3NpbmcgYSB2YWx1ZSBiZXR3ZWVuIDIgYW5kIDkgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4KQW55IG90aGVyIHZhbHVlIGV2YWx1YXRpbmcgYXMgdHJ1ZSB3aWxsIHJlc3VsdCBpbiB0aGUgZGVmYXVsdApjb21wcmVzc2lvbiBsZXZlbCBiZWluZyB1c2VkLgoKTm90ZSB0aGF0IHdoZW4geW91IHBhc3MgaW4gYSBmaWxlaGFuZGxlLCB0aGUgY29tcHJlc3Npb24gYXJndW1lbnQKaXMgaWdub3JlZCwgYXMgYWxsIGZpbGVzIGFyZSBwcmludGVkIHZlcmJhdGltIHRvIHlvdXIgZmlsZWhhbmRsZS4KSWYgeW91IHdpc2ggdG8gZW5hYmxlIGNvbXByZXNzaW9uIHdpdGggZmlsZWhhbmRsZXMsIHVzZSBhbgpDPElPOjpabGliPiBmaWxlaGFuZGxlIGluc3RlYWQuCgpUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBsaXN0IHRoZSBmaWxlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgdGFyIGZpbGUuClRoZXNlIGZpbGVzIG11c3QgYWxsIGV4aXN0LiBBbnkgZmlsZXMgd2hpY2ggZG9uJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUKcmVhZCBhcmUgc2lsZW50bHkgaWdub3JlZC4KCklmIHRoZSBhcmNoaXZlIGNyZWF0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLCBDPGNyZWF0ZV9hcmNoaXZlPiB3aWxsCnJldHVybiBmYWxzZS4gUGxlYXNlIHVzZSB0aGUgQzxlcnJvcj4gbWV0aG9kIHRvIGZpbmQgdGhlIGNhdXNlIG9mIHRoZQpmYWlsdXJlLgoKTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHdyaXRlIEM8b24gdGhlIGZseT4gYXMgaXQgd2VyZTsgaXQKc3RpbGwgcmVhZHMgYWxsIHRoZSBmaWxlcyBpbnRvIG1lbW9yeSBiZWZvcmUgd3JpdGluZyBvdXQgdGhlIGFyY2hpdmUuCkNvbnN1bHQgdGhlIEZBUSBiZWxvdyBpZiB0aGlzIGlzIGEgcHJvYmxlbS4KCj1jdXQKCnN1YiBjcmVhdGVfYXJjaGl2ZSB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKCiAgICBteSAkZmlsZSAgICA9IHNoaWZ0OyByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkZ3ppcCAgICA9IHNoaWZ0IHx8IDA7CiAgICBteSBAZmlsZXMgICA9IEBfOwoKICAgIHVubGVzcyggQGZpbGVzICkgewogICAgICAgIHJldHVybiAkY2xhc3MtPl9lcnJvciggcXFbQ293YXJkbHkgcmVmdXNpbmcgdG8gY3JlYXRlIGVtcHR5IGFyY2hpdmUhXSApOwogICAgfQoKICAgIG15ICR0YXIgPSAkY2xhc3MtPm5ldzsKICAgICR0YXItPmFkZF9maWxlcyggQGZpbGVzICk7CiAgICByZXR1cm4gJHRhci0+d3JpdGUoICRmaWxlLCAkZ3ppcCApOwp9Cgo9aGVhZDIgQXJjaGl2ZTo6VGFyLT5saXN0X2FyY2hpdmUgKCRmaWxlLCAkY29tcHJlc3NlZCwgW1xAcHJvcGVydGllc10pCgpSZXR1cm5zIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZS4gIFRoZQpmaXJzdCBhcmd1bWVudCBjYW4gZWl0aGVyIGJlIHRoZSBuYW1lIG9mIHRoZSB0YXIgZmlsZSB0byBsaXN0IG9yIGEKcmVmZXJlbmNlIHRvIGFuIG9wZW4gZmlsZSBoYW5kbGUgKGUuZy4gYSBHTE9CIHJlZmVyZW5jZSkuCgpJZiBDPGxpc3RfYXJjaGl2ZSgpPiBpcyBwYXNzZWQgYW4gYXJyYXkgcmVmZXJlbmNlIGFzIGl0cyB0aGlyZAphcmd1bWVudCBpdCByZXR1cm5zIGEgbGlzdCBvZiBoYXNoIHJlZmVyZW5jZXMgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkCnByb3BlcnRpZXMgb2YgZWFjaCBmaWxlLiAgVGhlIGZvbGxvd2luZyBsaXN0IG9mIHByb3BlcnRpZXMgaXMKc3VwcG9ydGVkOiBmdWxsX3BhdGgsIG5hbWUsIHNpemUsIG10aW1lIChsYXN0IG1vZGlmaWVkIGRhdGUpLCBtb2RlLCAKdWlkLCBnaWQsIGxpbmtuYW1lLCB1bmFtZSwgZ25hbWUsIGRldm1ham9yLCBkZXZtaW5vciwgcHJlZml4LgoKU2VlIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBmb3IgZGV0YWlscyBhYm91dCBzdXBwb3J0ZWQgcHJvcGVydGllcy4KClBhc3NpbmcgYW4gYXJyYXkgcmVmZXJlbmNlIGNvbnRhaW5pbmcgb25seSBvbmUgZWxlbWVudCwgJ25hbWUnLCBpcwpzcGVjaWFsIGNhc2VkIHRvIHJldHVybiBhIGxpc3Qgb2YgbmFtZXMgcmF0aGVyIHRoYW4gYSBsaXN0IG9mIGhhc2gKcmVmZXJlbmNlcy4KCj1jdXQKCnN1YiBsaXN0X2FyY2hpdmUgewogICAgbXkgJGNsYXNzICAgPSBzaGlmdDsKICAgIG15ICRmaWxlICAgID0gc2hpZnQ7IHJldHVybiB1bmxlc3MgZGVmaW5lZCAkZmlsZTsKICAgIG15ICRnemlwICAgID0gc2hpZnQgfHwgMDsKCiAgICBteSAkdGFyID0gJGNsYXNzLT5uZXcoJGZpbGUsICRnemlwKTsKICAgIHJldHVybiB1bmxlc3MgJHRhcjsKCiAgICByZXR1cm4gJHRhci0+bGlzdF9maWxlcyggQF8gKTsKfQoKPWhlYWQyIEFyY2hpdmU6OlRhci0+ZXh0cmFjdF9hcmNoaXZlICgkZmlsZSwgJGd6aXApCgpFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgdGhlIHRhciBmaWxlLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGNhbiBlaXRoZXIKYmUgdGhlIG5hbWUgb2YgdGhlIHRhciBmaWxlIHRvIGNyZWF0ZSBvciBhIHJlZmVyZW5jZSB0byBhbiBvcGVuIGZpbGUKaGFuZGxlIChlLmcuIGEgR0xPQiByZWZlcmVuY2UpLiAgQWxsIHJlbGF0aXZlIHBhdGhzIGluIHRoZSB0YXIgZmlsZSB3aWxsCmJlIGNyZWF0ZWQgdW5kZXJuZWF0aCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KCkM8ZXh0cmFjdF9hcmNoaXZlPiB3aWxsIHJldHVybiBhIGxpc3Qgb2YgZmlsZXMgaXQgZXh0cmFjdGVkLgpJZiB0aGUgYXJjaGl2ZSBleHRyYWN0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLCBDPGV4dHJhY3RfYXJjaGl2ZT4Kd2lsbCByZXR1cm4gZmFsc2UuICBQbGVhc2UgdXNlIHRoZSBDPGVycm9yPiBtZXRob2QgdG8gZmluZCB0aGUgY2F1c2UKb2YgdGhlIGZhaWx1cmUuCgo9Y3V0CgpzdWIgZXh0cmFjdF9hcmNoaXZlIHsKICAgIG15ICRjbGFzcyAgID0gc2hpZnQ7CiAgICBteSAkZmlsZSAgICA9IHNoaWZ0OyByZXR1cm4gdW5sZXNzIGRlZmluZWQgJGZpbGU7CiAgICBteSAkZ3ppcCAgICA9IHNoaWZ0IHx8IDA7CgogICAgbXkgJHRhciA9ICRjbGFzcy0+bmV3KCApIG9yIHJldHVybjsKCiAgICByZXR1cm4gJHRhci0+cmVhZCggJGZpbGUsICRnemlwLCB7IGV4dHJhY3QgPT4gMSB9ICk7Cn0KCj1oZWFkMiBBcmNoaXZlOjpUYXItPmNhbl9oYW5kbGVfY29tcHJlc3NlZF9maWxlcwoKQSBzaW1wbGUgY2hlY2tpbmcgcm91dGluZSwgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBpZiBDPEFyY2hpdmU6OlRhcj4KaXMgYWJsZSB0byB1bmNvbXByZXNzIGNvbXByZXNzZWQgYXJjaGl2ZXMgb24gdGhlIGZseSB3aXRoIEM8SU86OlpsaWI+LApvciBmYWxzZSBpZiBDPElPOjpabGliPiBpcyBub3QgaW5zdGFsbGVkLgoKWW91IGNhbiB1c2UgdGhpcyBhcyBhIHNob3J0Y3V0IHRvIGRldGVybWluZSB3aGV0aGVyIEM8QXJjaGl2ZTo6VGFyPgp3aWxsIGRvIHdoYXQgeW91IHRoaW5rIGJlZm9yZSBwYXNzaW5nIGNvbXByZXNzZWQgYXJjaGl2ZXMgdG8gaXRzCkM8cmVhZD4gbWV0aG9kLgoKPWN1dAoKc3ViIGNhbl9oYW5kbGVfY29tcHJlc3NlZF9maWxlcyB7IHJldHVybiBaTElCID8gMSA6IDAgfQoKc3ViIG5vX3N0cmluZ19zdXBwb3J0IHsKICAgIGNyb2FrKCJZb3UgaGF2ZSB0byBpbnN0YWxsIElPOjpTdHJpbmcgdG8gc3VwcG9ydCB3cml0aW5nIGFyY2hpdmVzIHRvIHN0cmluZ3MiKTsKfQoKMTsKCl9fRU5EX18KCj1oZWFkMSBHTE9CQUwgVkFSSUFCTEVTCgo9aGVhZDIgJEFyY2hpdmU6OlRhcjo6Rk9MTE9XX1NZTUxJTksKClNldCB0aGlzIHZhcmlhYmxlIHRvIEM8MT4gdG8gbWFrZSBDPEFyY2hpdmU6OlRhcj4gZWZmZWN0aXZlbHkgbWFrZSBhCmNvcHkgb2YgdGhlIGZpbGUgd2hlbiBleHRyYWN0aW5nLiBEZWZhdWx0IGlzIEM8MD4sIHdoaWNoCm1lYW5zIHRoZSBzeW1saW5rIHN0YXlzIGludGFjdC4gT2YgY291cnNlLCB5b3Ugd2lsbCBoYXZlIHRvIHBhY2sgdGhlCmZpbGUgbGlua2VkIHRvIGFzIHdlbGwuCgpUaGlzIG9wdGlvbiBpcyBjaGVja2VkIHdoZW4geW91IHdyaXRlIG91dCB0aGUgdGFyZmlsZSB1c2luZyBDPHdyaXRlPgpvciBDPGNyZWF0ZV9hcmNoaXZlPi4KClRoaXMgd29ya3MganVzdCBsaWtlIEM8L2Jpbi90YXI+J3MgQzwtaD4gb3B0aW9uLgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkNIT1dOCgpCeSBkZWZhdWx0LCBDPEFyY2hpdmU6OlRhcj4gd2lsbCB0cnkgdG8gQzxjaG93bj4geW91ciBmaWxlcyBpZiBpdCBpcwphYmxlIHRvLiBJbiBzb21lIGNhc2VzLCB0aGlzIG1heSBub3QgYmUgZGVzaXJlZC4gSW4gdGhhdCBjYXNlLCBzZXQKdGhpcyB2YXJpYWJsZSB0byBDPDA+IHRvIGRpc2FibGUgQzxjaG93bj4taW5nLCBldmVuIGlmIGl0IHdlcmUKcG9zc2libGUuCgpUaGUgZGVmYXVsdCBpcyBDPDE+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkNITU9ECgpCeSBkZWZhdWx0LCBDPEFyY2hpdmU6OlRhcj4gd2lsbCB0cnkgdG8gQzxjaG1vZD4geW91ciBmaWxlcyB0bwp3aGF0ZXZlciBtb2RlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIGZpbGUgaW4gdGhlIGFyY2hpdmUuCkluIHNvbWUgY2FzZXMsIHRoaXMgbWF5IG5vdCBiZSBkZXNpcmVkLiBJbiB0aGF0IGNhc2UsIHNldCB0aGlzCnZhcmlhYmxlIHRvIEM8MD4gdG8gZGlzYWJsZSBDPGNobW9kPi1pbmcuCgpUaGUgZGVmYXVsdCBpcyBDPDE+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkRPX05PVF9VU0VfUFJFRklYCgpCeSBkZWZhdWx0LCBDPEFyY2hpdmU6OlRhcj4gd2lsbCB0cnkgdG8gcHV0IHBhdGhzIHRoYXQgYXJlIG92ZXIgCjEwMCBjaGFyYWN0ZXJzIGluIHRoZSBDPHByZWZpeD4gZmllbGQgb2YgeW91ciB0YXIgaGVhZGVyLCBhcwpkZWZpbmVkIHBlciBQT1NJWC1zdGFuZGFyZC4gSG93ZXZlciwgc29tZSAob2xkZXIpIHRhciBwcm9ncmFtcyAKZG8gbm90IGltcGxlbWVudCB0aGlzIHNwZWMuIFRvIHJldGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlc2Ugb2xkZXIgCm9yIG5vbi1QT1NJWCBjb21wbGlhbnQgdmVyc2lvbnMsIHlvdSBjYW4gc2V0IHRoZSBDPCRET19OT1RfVVNFX1BSRUZJWD4gCnZhcmlhYmxlIHRvIGEgdHJ1ZSB2YWx1ZSwgYW5kIEM8QXJjaGl2ZTo6VGFyPiB3aWxsIHVzZSBhbiBhbHRlcm5hdGUgCndheSBvZiBkZWFsaW5nIHdpdGggcGF0aHMgb3ZlciAxMDAgY2hhcmFjdGVycyBieSB1c2luZyB0aGUgCkM8R05VIEV4dGVuZGVkIEhlYWRlcj4gZmVhdHVyZS4KCk5vdGUgdGhhdCBjbGllbnRzIHdobyBkbyBub3Qgc3VwcG9ydCB0aGUgQzxHTlUgRXh0ZW5kZWQgSGVhZGVyPgpmZWF0dXJlIHdpbGwgbm90IGJlIGFibGUgdG8gcmVhZCB0aGVzZSBhcmNoaXZlcy4gU3VjaCBjbGllbnRzIGluY2x1ZGUKdGFycyBvbiBDPFNvbGFyaXM+LCBDPElyaXg+IGFuZCBDPEFJWD4uCgpUaGUgZGVmYXVsdCBpcyBDPDA+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OkRFQlVHCgpTZXQgdGhpcyB2YXJpYWJsZSB0byBDPDE+IHRvIGFsd2F5cyBnZXQgdGhlIEM8Q2FycDo6bG9uZ21lc3M+IG91dHB1dApvZiB0aGUgd2FybmluZ3MsIGluc3RlYWQgb2YgdGhlIHJlZ3VsYXIgQzxjYXJwPi4gVGhpcyBpcyB0aGUgc2FtZQptZXNzYWdlIHlvdSB3b3VsZCBnZXQgYnkgZG9pbmc6CgogICAgJHRhci0+ZXJyb3IoMSk7CgpEZWZhdWx0cyB0byBDPDA+LgoKPWhlYWQyICRBcmNoaXZlOjpUYXI6OldBUk4KClNldCB0aGlzIHZhcmlhYmxlIHRvIEM8MD4gaWYgeW91IGRvIG5vdCB3YW50IGFueSB3YXJuaW5ncyBwcmludGVkLgpQZXJzb25hbGx5IEkgcmVjb21tZW5kIGFnYWluc3QgZG9pbmcgdGhpcywgYnV0IHBlb3BsZSBhc2tlZCBmb3IgdGhlCm9wdGlvbi4gQWxzbywgYmUgYWR2aXNlZCB0aGF0IHRoaXMgaXMgb2YgY291cnNlIG5vdCB0aHJlYWRzYWZlLgoKRGVmYXVsdHMgdG8gQzwxPi4KCj1oZWFkMiAkQXJjaGl2ZTo6VGFyOjplcnJvcgoKSG9sZHMgdGhlIGxhc3QgcmVwb3J0ZWQgZXJyb3IuIEtlcHQgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgYnV0IGl0cwp1c2UgaXMgdmVyeSBtdWNoIGRpc2NvdXJhZ2VkLiBVc2UgdGhlIEM8ZXJyb3IoKT4gbWV0aG9kIGluc3RlYWQ6CgogICAgd2FybiAkdGFyLT5lcnJvciB1bmxlc3MgJHRhci0+ZXh0cmFjdDsKCj1oZWFkMiAkQXJjaGl2ZTo6VGFyOjpIQVNfUEVSTElPCgpUaGlzIHZhcmlhYmxlIGhvbGRzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHdlIGN1cnJlbnRseSBoYXZlIApDPHBlcmxpbz4gc3VwcG9ydCBsb2FkZWQuIFRoaXMgd2lsbCBiZSBlbmFibGVkIGZvciBhbnkgcGVybApncmVhdGVyIHRoYW4gQzw1Ljg+IGNvbXBpbGVkIHdpdGggQzxwZXJsaW8+LiAKCklmIHlvdSBmZWVsIHN0cm9uZ2x5IGFib3V0IGRpc2FibGluZyBpdCwgc2V0IHRoaXMgdmFyaWFibGUgdG8KQzxmYWxzZT4uIE5vdGUgdGhhdCB5b3Ugd2lsbCB0aGVuIG5lZWQgQzxJTzo6U3RyaW5nPiBpbnN0YWxsZWQKdG8gc3VwcG9ydCB3cml0aW5nIHN0cmluZ2lmaWVkIGFyY2hpdmVzLgoKRG9uJ3QgY2hhbmdlIHRoaXMgdmFyaWFibGUgdW5sZXNzIHlvdSBCPHJlYWxseT4ga25vdyB3aGF0IHlvdSdyZQpkb2luZy4KCj1oZWFkMiAkQXJjaGl2ZTo6VGFyOjpIQVNfSU9fU1RSSU5HCgpUaGlzIHZhcmlhYmxlIGhvbGRzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHdlIGN1cnJlbnRseSBoYXZlIApDPElPOjpTdHJpbmc+IHN1cHBvcnQgbG9hZGVkLiBUaGlzIHdpbGwgYmUgZW5hYmxlZCBmb3IgYW55IHBlcmwKdGhhdCBoYXMgYSBsb2FkYWJsZSBDPElPOjpTdHJpbmc+IG1vZHVsZS4KCklmIHlvdSBmZWVsIHN0cm9uZ2x5IGFib3V0IGRpc2FibGluZyBpdCwgc2V0IHRoaXMgdmFyaWFibGUgdG8KQzxmYWxzZT4uIE5vdGUgdGhhdCB5b3Ugd2lsbCB0aGVuIG5lZWQgQzxwZXJsaW8+IHN1cHBvcnQgZnJvbQp5b3VyIHBlcmwgdG8gYmUgYWJsZSB0byAgd3JpdGUgc3RyaW5naWZpZWQgYXJjaGl2ZXMuCgpEb24ndCBjaGFuZ2UgdGhpcyB2YXJpYWJsZSB1bmxlc3MgeW91IEI8cmVhbGx5PiBrbm93IHdoYXQgeW91J3JlCmRvaW5nLgoKPWhlYWQxIEZBUQoKPW92ZXIgNAoKPWl0ZW0gV2hhdCdzIHRoZSBtaW5pbXVtIHBlcmwgdmVyc2lvbiByZXF1aXJlZCB0byBydW4gQXJjaGl2ZTo6VGFyPwoKWW91IHdpbGwgbmVlZCBwZXJsIHZlcnNpb24gNS4wMDVfMDMgb3IgbmV3ZXIuCgo9aXRlbSBJc24ndCBBcmNoaXZlOjpUYXIgc2xvdz8KClllcyBpdCBpcy4gSXQncyBwdXJlIHBlcmwsIHNvIGl0J3MgYSBsb3Qgc2xvd2VyIHRoZW4geW91ciBDPC9iaW4vdGFyPgpIb3dldmVyLCBpdCdzIHZlcnkgcG9ydGFibGUuIElmIHNwZWVkIGlzIGFuIGlzc3VlLCBjb25zaWRlciB1c2luZwpDPC9iaW4vdGFyPiBpbnN0ZWFkLgoKPWl0ZW0gSXNuJ3QgQXJjaGl2ZTo6VGFyIGhlYXZpZXIgb24gbWVtb3J5IHRoYW4gL2Jpbi90YXI/CgpZZXMgaXQgaXMsIHNlZSBwcmV2aW91cyBhbnN3ZXIuIFNpbmNlIEM8Q29tcHJlc3M6OlpsaWI+IGFuZCB0aGVyZWZvcmUKQzxJTzo6WmxpYj4gZG9lc24ndCBzdXBwb3J0IEM8c2Vlaz4gb24gdGhlaXIgZmlsZWhhbmRsZXMsIHRoZXJlIGlzIGxpdHRsZQpjaG9pY2UgYnV0IHRvIHJlYWQgdGhlIGFyY2hpdmUgaW50byBtZW1vcnkuClRoaXMgaXMgb2sgaWYgeW91IHdhbnQgdG8gZG8gaW4tbWVtb3J5IG1hbmlwdWxhdGlvbiBvZiB0aGUgYXJjaGl2ZS4KSWYgeW91IGp1c3Qgd2FudCB0byBleHRyYWN0LCB1c2UgdGhlIEM8ZXh0cmFjdF9hcmNoaXZlPiBjbGFzcyBtZXRob2QKaW5zdGVhZC4gSXQgd2lsbCBvcHRpbWl6ZSBhbmQgd3JpdGUgdG8gZGlzayBpbW1lZGlhdGVseS4KCj1pdGVtIENhbid0IHlvdSBsYXp5LWxvYWQgZGF0YSBpbnN0ZWFkPwoKTm8sIG5vdCBlYXNpbHkuIFNlZSBwcmV2aW91cyBxdWVzdGlvbi4KCj1pdGVtIEhvdyBtdWNoIG1lbW9yeSB3aWxsIGFuIFgga2IgdGFyIGZpbGUgbmVlZD8KClByb2JhYmx5IG1vcmUgdGhhbiBYIGtiLCBzaW5jZSBpdCB3aWxsIGFsbCBiZSByZWFkIGludG8gbWVtb3J5LiBJZgp0aGlzIGlzIGEgcHJvYmxlbSwgYW5kIHlvdSBkb24ndCBuZWVkIHRvIGRvIGluIG1lbW9yeSBtYW5pcHVsYXRpb24Kb2YgdGhlIGFyY2hpdmUsIGNvbnNpZGVyIHVzaW5nIEM8L2Jpbi90YXI+IGluc3RlYWQuCgo9aXRlbSBXaGF0IGRvIHlvdSBkbyB3aXRoIHVuc3VwcG9ydGVkIGZpbGV0eXBlcyBpbiBhbiBhcmNoaXZlPwoKQzxVbml4PiBoYXMgYSBmZXcgZmlsZXR5cGVzIHRoYXQgYXJlbid0IHN1cHBvcnRlZCBvbiBvdGhlciBwbGF0Zm9ybXMsCmxpa2UgQzxXaW4zMj4uIElmIHdlIGVuY291bnRlciBhIEM8aGFyZGxpbms+IG9yIEM8c3ltbGluaz4gd2UnbGwganVzdAp0cnkgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGZpbGUsIHJhdGhlciB0aGFuIHRocm93aW5nIGFuIGVycm9yLgoKVGhpcyBkb2VzIHJlcXVpcmUgeW91IHRvIHJlYWQgdGhlIGVudGlyZSBhcmNoaXZlIGluIHRvIG1lbW9yeSBmaXJzdCwKc2luY2Ugb3RoZXJ3aXNlIHdlIHdvdWxkbid0IGtub3cgd2hhdCBkYXRhIHRvIGZpbGwgdGhlIGNvcHkgd2l0aC4KKFRoaXMgbWVhbnMgdGhhdCB5b3UgY2Fubm90IHVzZSB0aGUgY2xhc3MgbWV0aG9kcyBvbiBhcmNoaXZlcyB0aGF0CmhhdmUgaW5jb21wYXRpYmxlIGZpbGV0eXBlcyBhbmQgc3RpbGwgZXhwZWN0IHRoaW5ncyB0byB3b3JrKS4KCkZvciBvdGhlciBmaWxldHlwZXMsIGxpa2UgQzxjaGFyZGV2cz4gYW5kIEM8YmxvY2tkZXZzPiB3ZSdsbCB3YXJuIHRoYXQKdGhlIGV4dHJhY3Rpb24gb2YgdGhpcyBwYXJ0aWN1bGFyIGl0ZW0gZGlkbid0IHdvcmsuCgo9aXRlbSBJJ20gdXNpbmcgV2luWmlwLCBvciBzb21lIG90aGVyIG5vbi1QT1NJWCBjbGllbnQsIGFuZCBmaWxlcyBhcmUgbm90IGJlaW5nIGV4dHJhY3RlZCBwcm9wZXJseSEKCkJ5IGRlZmF1bHQsIEM8QXJjaGl2ZTo6VGFyPiBpcyBpbiBhIGNvbXBsZXRlbHkgUE9TSVgtY29tcGF0aWJsZQptb2RlLCB3aGljaCB1c2VzIHRoZSBQT1NJWC1zcGVjaWZpY2F0aW9uIG9mIEM8dGFyPiB0byBzdG9yZSBmaWxlcy4KRm9yIHBhdGhzIGdyZWF0aGVyIHRoYW4gMTAwIGNoYXJhY3RlcnMsIHRoaXMgaXMgZG9uZSB1c2luZyB0aGUKQzxQT1NJWCBoZWFkZXIgcHJlZml4Pi4gTm9uLVBPU0lYLWNvbXBhdGlibGUgY2xpZW50cyBtYXkgbm90IHN1cHBvcnQKdGhpcyBwYXJ0IG9mIHRoZSBzcGVjaWZpY2F0aW9uLCBhbmQgbWF5IG9ubHkgc3VwcG9ydCB0aGUgQzxHTlUgRXh0ZW5kZWQKSGVhZGVyPiBmdW5jdGlvbmFsaXR5LiBUbyBmYWNpbGl0YXRlIHRob3NlIGNsaWVudHMsIHlvdSBjYW4gc2V0IHRoZQpDPCRBcmNoaXZlOjpUYXI6OkRPX05PVF9VU0VfUFJFRklYPiB2YXJpYWJsZSB0byBDPHRydWU+LiBTZWUgdGhlIApDPEdMT0JBTCBWQVJJQUJMRVM+IHNlY3Rpb24gZm9yIGRldGFpbHMgb24gdGhpcyB2YXJpYWJsZS4KCk5vdGUgdGhhdCBHTlUgdGFyIGVhcmxpZXIgdGhhbiB2ZXJzaW9uIDEuMTQgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGgKdGhlIEM8UE9TSVggaGVhZGVyIHByZWZpeD4uIElmIHlvdSB1c2Ugc3VjaCBhIHZlcnNpb24sIGNvbnNpZGVyIHNldHRpbmcKdGhlIEM8JEFyY2hpdmU6OlRhcjo6RE9fTk9UX1VTRV9QUkVGSVg+IHZhcmlhYmxlIHRvIEM8dHJ1ZT4uCgo9aXRlbSBIb3cgZG8gSSBleHRyYWN0IG9ubHkgZmlsZXMgdGhhdCBoYXZlIHByb3BlcnR5IFggZnJvbSBhbiBhcmNoaXZlPwoKU29tZXRpbWVzLCB5b3UgbWlnaHQgbm90IHdpc2ggdG8gZXh0cmFjdCBhIGNvbXBsZXRlIGFyY2hpdmUsIGp1c3QKdGhlIGZpbGVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHlvdSwgYmFzZWQgb24gc29tZSBjcml0ZXJpYS4KCllvdSBjYW4gZG8gdGhpcyBieSBmaWx0ZXJpbmcgYSBsaXN0IG9mIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3RzCmJhc2VkIG9uIHlvdXIgY3JpdGVyaWEuIEZvciBleGFtcGxlLCB0byBleHRyYWN0IG9ubHkgZmlsZXMgdGhhdCBoYXZlCnRoZSBzdHJpbmcgQzxmb28+IGluIHRoZWlyIHRpdGxlLCB5b3Ugd291bGQgdXNlOgoKICAgICR0YXItPmV4dHJhY3QoIAogICAgICAgIGdyZXAgeyAkXy0+ZnVsbF9wYXRoID1+IC9mb28vIH0gJHRhci0+Z2V0X2ZpbGVzCiAgICApOyAKClRoaXMgd2F5LCB5b3UgY2FuIGZpbHRlciBvbiBhbnkgYXR0cmlidXRlIG9mIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZS4KQ29uc3VsdCB0aGUgQzxBcmNoaXZlOjpUYXI6OkZpbGU+IGRvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGVzZQpvYmplY3RzLgoKPWl0ZW0gSG93IGRvIEkgYWNjZXNzIC50YXIuWiBmaWxlcz8KClRoZSBDPEFyY2hpdmU6OlRhcj4gbW9kdWxlIGNhbiBvcHRpb25hbGx5IHVzZSBDPENvbXByZXNzOjpabGliPiAodmlhCnRoZSBDPElPOjpabGliPiBtb2R1bGUpIHRvIGFjY2VzcyB0YXIgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZAp3aXRoIEM8Z3ppcD4uIFVuZm9ydHVuYXRlbHkgdGFyIGZpbGVzIGNvbXByZXNzZWQgd2l0aCB0aGUgVW5peCBDPGNvbXByZXNzPgp1dGlsaXR5IGNhbm5vdCBiZSByZWFkIGJ5IEM8Q29tcHJlc3M6OlpsaWI+IGFuZCBzbyBjYW5ub3QgYmUgZGlyZWN0bHkKYWNjZXNzZXMgYnkgQzxBcmNoaXZlOjpUYXI+LgoKSWYgdGhlIEM8dW5jb21wcmVzcz4gb3IgQzxndW56aXA+IHByb2dyYW1zIGFyZSBhdmFpbGFibGUsIHlvdSBjYW4gdXNlCm9uZSBvZiB0aGVzZSB3b3JrYXJvdW5kcyB0byByZWFkIEM8LnRhci5aPiBmaWxlcyBmcm9tIEM8QXJjaGl2ZTo6VGFyPgoKRmlyc3RseSB3aXRoIEM8dW5jb21wcmVzcz4KCiAgICB1c2UgQXJjaGl2ZTo6VGFyOwoKICAgIG9wZW4gRiwgInVuY29tcHJlc3MgLWMgJGZpbGVuYW1lIHwiOwogICAgbXkgJHRhciA9IEFyY2hpdmU6OlRhci0+bmV3KCpGKTsKICAgIC4uLgoKYW5kIHRoaXMgd2l0aCBDPGd1bnppcD4KCiAgICB1c2UgQXJjaGl2ZTo6VGFyOwoKICAgIG9wZW4gRiwgImd1bnppcCAtYyAkZmlsZW5hbWUgfCI7CiAgICBteSAkdGFyID0gQXJjaGl2ZTo6VGFyLT5uZXcoKkYpOwogICAgLi4uCgpTaW1pbGFybHksIGlmIHRoZSBDPGNvbXByZXNzPiBwcm9ncmFtIGlzIGF2YWlsYWJsZSwgeW91IGNhbiB1c2UgdGhpcyB0bwp3cml0ZSBhIEM8LnRhci5aPiBmaWxlCgogICAgdXNlIEFyY2hpdmU6OlRhcjsKICAgIHVzZSBJTzo6RmlsZTsKCiAgICBteSAkZmggPSBuZXcgSU86OkZpbGUgInwgY29tcHJlc3MgLWMgPiRmaWxlbmFtZSI7CiAgICBteSAkdGFyID0gQXJjaGl2ZTo6VGFyLT5uZXcoKTsKICAgIC4uLgogICAgJHRhci0+d3JpdGUoJGZoKTsKICAgICRmaC0+Y2xvc2UgOwoKPWl0ZW0gSG93IGRvIEkgaGFuZGxlIFVuaWNvZGUgc3RyaW5ncz8KCkM8QXJjaGl2ZTo6VGFyPiB1c2VzIGJ5dGUgc2VtYW50aWNzIGZvciBhbnkgZmlsZXMgaXQgcmVhZHMgZnJvbSBvciB3cml0ZXMKdG8gZGlzay4gVGhpcyBpcyBub3QgYSBwcm9ibGVtIGlmIHlvdSBvbmx5IGRlYWwgd2l0aCBmaWxlcyBhbmQgbmV2ZXIKbG9vayBhdCB0aGVpciBjb250ZW50IG9yIHdvcmsgc29sZWx5IHdpdGggYnl0ZSBzdHJpbmdzLiBCdXQgaWYgeW91IHVzZQpVbmljb2RlIHN0cmluZ3Mgd2l0aCBjaGFyYWN0ZXIgc2VtYW50aWNzLCBzb21lIGFkZGl0aW9uYWwgc3RlcHMgbmVlZAp0byBiZSB0YWtlbi4KCkZvciBleGFtcGxlLCBpZiB5b3UgYWRkIGEgVW5pY29kZSBzdHJpbmcgbGlrZQoKICAgICMgUHJvYmxlbQogICAgJHRhci0+YWRkX2RhdGEoJ2ZpbGUudHh0JywgIkV1cm86IFx4ezIwQUN9Iik7Cgp0aGVuIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIGxhdGVyIHdoZW4gdGhlIHRhcmZpbGUgZ2V0cyB3cml0dGVuIG91dAp0byBkaXNrIHZpYSBDPCR0YXItPndyaXRlKCk+OgoKICAgIFdpZGUgY2hhcmFjdGVyIGluIHByaW50IGF0IC4uLi9BcmNoaXZlL1Rhci5wbSBsaW5lIDEwMTQuCgpUaGUgZGF0YSB3YXMgYWRkZWQgYXMgYSBVbmljb2RlIHN0cmluZyBhbmQgd2hlbiB3cml0aW5nIGl0IG91dCB0byBkaXNrLAp0aGUgQzw6dXRmOD4gbGluZSBkaXNjaXBsaW5lIHdhc24ndCBzZXQgYnkgQzxBcmNoaXZlOjpUYXI+LCBzbyBQZXJsCnRyaWVkIHRvIGNvbnZlcnQgdGhlIHN0cmluZyB0byBJU08tODg1OSBhbmQgZmFpbGVkLiBUaGUgd3JpdHRlbiBmaWxlCm5vdyBjb250YWlucyBnYXJiYWdlLgoKRm9yIHRoaXMgcmVhc29uLCBVbmljb2RlIHN0cmluZ3MgbmVlZCB0byBiZSBjb252ZXJ0ZWQgdG8gVVRGLTgtZW5jb2RlZApieXRlc3RyaW5ncyBiZWZvcmUgdGhleSBhcmUgaGFuZGVkIG9mZiB0byBDPGFkZF9kYXRhKCk+OgoKICAgIHVzZSBFbmNvZGU7CiAgICBteSAkZGF0YSA9ICJBY2NlbnRlZCBjaGFyYWN0ZXI6IFx4ezIwQUN9IjsKICAgICRkYXRhID0gZW5jb2RlKCd1dGY4JywgJGRhdGEpOwoKICAgICR0YXItPmFkZF9kYXRhKCdmaWxlLnR4dCcsICRkYXRhKTsKCkEgb3Bwb3NpdGUgcHJvYmxlbSBvY2N1cnMgaWYgeW91IGV4dHJhY3QgYSBVVEY4LWVuY29kZWQgZmlsZSBmcm9tIGEgCnRhcmJhbGwuIFVzaW5nIEM8Z2V0X2NvbnRlbnQoKT4gb24gdGhlIEM8QXJjaGl2ZTo6VGFyOjpGaWxlPiBvYmplY3QKd2lsbCByZXR1cm4gaXRzIGNvbnRlbnQgYXMgYSBieXRlc3RyaW5nLCBub3QgYXMgYSBVbmljb2RlIHN0cmluZy4KCklmIHlvdSB3YW50IGl0IHRvIGJlIGEgVW5pY29kZSBzdHJpbmcgKGJlY2F1c2UgeW91IHdhbnQgY2hhcmFjdGVyCnNlbWFudGljcyB3aXRoIG9wZXJhdGlvbnMgbGlrZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcpLCB5b3UgbmVlZAp0byBkZWNvZGUgdGhlIFVURjgtZW5jb2RlZCBjb250ZW50IGFuZCBoYXZlIFBlcmwgY29udmVydCBpdCBpbnRvIAphIFVuaWNvZGUgc3RyaW5nOgoKICAgIHVzZSBFbmNvZGU7CiAgICBteSAkZGF0YSA9ICR0YXItPmdldF9jb250ZW50KCk7CiAgICAKICAgICMgTWFrZSBpdCBhIFVuaWNvZGUgc3RyaW5nCiAgICAkZGF0YSA9IGRlY29kZSgndXRmOCcsICRkYXRhKTsKClRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IGluIEM8QXJjaGl2ZTo6VGFyPiwgCmJlY2F1c2UgYSB0YXJiYWxsIGNhbiBjb250YWluIG1hbnkgZmlsZXMsIGFuZCBlYWNoIG9mIHdoaWNoIGNvdWxkIGJlCmVuY29kZWQgaW4gYSBkaWZmZXJlbnQgd2F5LgoKPWJhY2sKCj1oZWFkMSBUT0RPCgo9b3ZlciA0Cgo9aXRlbSBDaGVjayBpZiBwYXNzZWQgaW4gaGFuZGxlcyBhcmUgb3BlbiBmb3IgcmVhZC93cml0ZQoKQ3VycmVudGx5IEkgZG9uJ3Qga25vdyBvZiBhbnkgcG9ydGFibGUgcHVyZSBwZXJsIHdheSB0byBkbyB0aGlzLgpTdWdnZXN0aW9ucyB3ZWxjb21lLgoKPWl0ZW0gQWxsb3cgYXJjaGl2ZXMgdG8gYmUgcGFzc2VkIGluIGFzIHN0cmluZwoKQ3VycmVudGx5LCB3ZSBvbmx5IGFsbG93IG9wZW5lZCBmaWxlaGFuZGxlcyBvciBmaWxlbmFtZXMsIGJ1dApub3Qgc3RyaW5ncy4gVGhlIGludGVybmFscyB3b3VsZCBuZWVkIHNvbWUgcmV3b3JraW5nIHRvIGZhY2lsaXRhdGUKc3RyaW5naWZpZWQgYXJjaGl2ZXMuCgo9aXRlbSBGYWNpbGl0YXRlIHByb2Nlc3NpbmcgYW4gb3BlbmVkIGZpbGVoYW5kbGUgb2YgYSBjb21wcmVzc2VkIGFyY2hpdmUKCkN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IHRoaXMgaWYgdGhlIGZpbGVoYW5kbGUgaXMgYW4gSU86OlpsaWIgb2JqZWN0LgpFbnZpcm9ubWVudHMsIGxpa2UgYXBhY2hlLCB3aWxsIHByZXNlbnQgeW91IHdpdGggYW4gb3BlbmVkIGZpbGVoYW5kbGUKdG8gYW4gdXBsb2FkZWQgZmlsZSwgd2hpY2ggbWlnaHQgYmUgYSBjb21wcmVzc2VkIGFyY2hpdmUuCgo9YmFjawoKPWhlYWQxIFNFRSBBTFNPCgo9b3ZlciA0Cgo9aXRlbSBUaGUgR05VIHRhciBzcGVjaWZpY2F0aW9uCgpDPGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90YXIvbWFudWFsL3Rhci5odG1sPgoKPWl0ZW0gVGhlIFBBWCBmb3JtYXQgc3BlY2ljYXRpb24KClRoZSBzcGVjaWZjYXRpb24gd2hpY2ggdGFyIGRlcml2ZXMgZnJvbTsgQzwgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9wYXguaHRtbD4KCj1pdGVtIEEgY29tcGFyaXNvbiBvZiBHTlUgYW5kIFBPU0lYIHRhciBzdGFuZGFyZHM7IEM8aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy90YXIvdGFyXzExNC5odG1sPgoKPWl0ZW0gR05VIHRhciBpbnRlbmRzIHRvIHN3aXRjaCB0byBQT1NJWCBjb21wYXRpYmlsaXR5CgpHTlUgVGFyIGF1dGhvcnMgaGF2ZSBleHByZXNzZWQgdGhlaXIgaW50ZW50aW9uIHRvIGJlY29tZSBjb21wbGV0ZWx5ClBPU0lYLWNvbXBhdGlibGU7IEM8aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3Rhci9tYW51YWwvaHRtbF9ub2RlL0Zvcm1hdHMuaHRtbD4KCj1pdGVtIEEgQ29tcGFyaXNvbiBiZXR3ZWVuIHZhcmlvdXMgdGFyIGltcGxlbWVudGF0aW9ucwoKTGlzdHMga25vd24gaXNzdWVzIGFuZCBpbmNvbXBhdGliaWxpdGllczsgQzxodHRwOi8vZ2QudHV3aWVuLmFjLmF0L3V0aWxzL2FyY2hpdmVycy9zdGFyL1JFQURNRS5vdGhlcmJ1Z3M+Cgo9YmFjawoKPWhlYWQxIEFVVEhPUgoKVGhpcyBtb2R1bGUgYnkgSm9zIEJvdW1hbnMgRTxsdD5rYW5lQGNwYW4ub3JnRTxndD4uCgpQbGVhc2UgcmVwb3J0cyBidWdzIHRvIEU8bHQ+YnVnLWFyY2hpdmUtdGFyQHJ0LmNwYW4ub3JnRTxndD4uCgo9aGVhZDEgQUNLTk9XTEVER0VNRU5UUwoKVGhhbmtzIHRvIFNlYW4gQnVya2UsIENocmlzIE5hbmRvciwgQ2hpcCBTYWx6ZW5iZXJnLCBUaW0gSGVhbmV5IGFuZAplc3BlY2lhbGx5IEFuZHJldyBTYXZpZ2UgZm9yIHRoZWlyIGhlbHAgYW5kIHN1Z2dlc3Rpb25zLgoKPWhlYWQxIENPUFlSSUdIVAoKVGhpcyBtb2R1bGUgaXMgY29weXJpZ2h0IChjKSAyMDAyIC0gMjAwNyBKb3MgQm91bWFucyAKRTxsdD5rYW5lQGNwYW4ub3JnRTxndD4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSAKaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9Y3V0Cg==</File>
+ <File Location="Kernel/Modules/AdminSupport.pm" Permission="644" Encode="Base64">IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU3VwcG9ydC5wbSAtIHNob3cgc3VwcG9ydCBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TdXBwb3J0LnBtLHYgMS4yOS4yLjEgMjAxMS8xMi8xNiAyMzoxMDoxOSBjZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluU3VwcG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjkuMi4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgT2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCBUaW1lT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1N1cHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXIgZGF0YQogICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBzZW5kZXIgZW1haWwgYWRyZXNzCiAgICBteSAkU2VuZGVyQWRyZXNzID0gJyc7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXBwb3J0OjpTZW5kZXJFbWFpbCcpICkgewogICAgICAgICRTZW5kZXJBZHJlc3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VwcG9ydDo6U2VuZGVyRW1haWwnKTsKICAgIH0KICAgIGVsc2lmICggJFVzZXJ7VXNlckVtYWlsfSAmJiAkVXNlcntVc2VyRW1haWx9ICF+IC9yb290XEBsb2NhbGhvc3QvICkgewogICAgICAgICRTZW5kZXJBZHJlc3MgPSAkVXNlcntVc2VyRW1haWx9OwogICAgfQogICAgZWxzaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZG1pbkVtYWlsJykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQWRtaW5FbWFpbCcpICF+IC9yb290XEBsb2NhbGhvc3QvCiAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FkbWluRW1haWwnKSAhfiAvYWRtaW5cQGV4YW1wbGUuY29tLwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VuZGVyQWRyZXNzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FkbWluRW1haWwnKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIENvbmZpZGVudGlhbAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDb25maWRlbnRpYWwnICkgewoKICAgICAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDb25maWRlbnRpYWwnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFVzZXJ7VXNlckxhbmd1YWdlfSAmJiAkVXNlcntVc2VyTGFuZ3VhZ2V9ID1+IC9kZS8gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDb25maWRlbnRpYWxDb250ZW50REUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDb25maWRlbnRpYWxDb250ZW50RU4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TdXBwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHt9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgU2VuZGVyIEluZm9ybWF0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlbmRlckluZm9ybWF0aW9uJyApIHsKCiAgICAgICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VuZGVySW5mb3JtYXRpb24nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNlbmRlckFkcmVzcyAgICAgPT4gJFNlbmRlckFkcmVzcywKICAgICAgICAgICAgICAgIFNlbmRlclNhbHV0YXRpb24gPT4gJFVzZXJ7VXNlclNhbHV0YXRpb259LAogICAgICAgICAgICAgICAgU2VuZGVyTmFtZSAgICAgICA9PiAkVXNlcntVc2VyRmlyc3RuYW1lfSAuICcgJyAuICRVc2Vye1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBVcGxvYWRTdXBwb3J0SW5mbwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdWJtaXQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlQ3VzdG9tZXJJbmZvOwogICAgICAgIGZvciBteSAkS2V5IChxdyhTZW5kZXIgQ29tcGFueSBTYWx1dGF0aW9uIE5hbWUgU3RyZWV0IFppcCBDaXR5IFBob25lIFNlbmRJbmZvIEJ1Z3ppbGxhSUQpKSB7CiAgICAgICAgICAgICRDdXN0b21lckluZm97JEtleX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlIGJ1dHRvbiBzZW5kIGJlY29tZXMgdGhlIHN1Ym1pdAogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VuZCcgKSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZW5kZXJJbmZvcm1hdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTZW5kZXJBZHJlc3MgICAgID0+ICRTZW5kZXJBZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyU2FsdXRhdGlvbiA9PiAkVXNlcntVc2VyU2FsdXRhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyTmFtZSAgICAgICA9PiAkVXNlcntVc2VyRmlyc3RuYW1lfSAuICcgJyAuICRVc2Vye1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFNlbmRNZXNzYWdlID0gJFNlbGYtPntTdXBwb3J0T2JqZWN0fS0+U2VuZEluZm8oCiAgICAgICAgICAgICAgICBDdXN0b21lckluZm8gPT4gXCVDdXN0b21lckluZm8sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VuZE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+ICJTZW50IHRvICgob3RycykpISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnd2FybmluZycsCiAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJ0NhbiBub3Qgc2VuZCBlbWFpbCB0byB0aGUgKChvdHJzKSkgc3VwcG9ydCB0ZWFtIScgLiAiXG5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiWW91IHdpbGwgZmluZCB0aGUgb3RycyBzeXN0ZW0gaW5mb3JtYXRpb24gcGFja2FnZSBhdFxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICJJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgT1RSUyBzdXBwb3J0IHNlcnZpY2VzIHBsZWFzZSBzZW5kIHRoZSBwYWNrYWdlIHRvIHN1cHBvcnRcQG90cnMuY29tIG9yIGNhbGxcbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAib3VyIHN1cHBvcnQgdGVhbSBieSBwaG9uZSB0byByZXZpZXcgdGhlIG5leHQgc3RlcC5cblxuIgogICAgICAgICAgICAgICAgICAgICAgICAuICJZb3UgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBPVFJTIHN1cHBvcnQgb3IgZmFjZS10by1mYWNlIGNvbnRhY3QgaW5mb3JtYXRpb24gYXRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAnaHR0cDovL3d3dy5vdHJzLmNvbS8nIC4gIlxuXG4iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TdXBwb3J0JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlIGJ1dHRvbiBkb3dubG9hZCBiZWNvbWVzIHRoZSBzdWJtaXQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgKCAkQ29udGVudCwgJEZpbGVuYW1lICkgPSAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5Eb3dubG9hZCgKICAgICAgICAgICAgICAgICVDdXN0b21lckluZm8sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJldHVybiBmaWxlCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICR7JENvbnRlbnR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaGVkJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBTUUwgYmVuY2gKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQmVuY2htYXJrU1FMJyApIHsKCiAgICAgICAgbXkgJEluc2VydCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0luc2VydCcgKSB8fCAxMDAwMDsKICAgICAgICBteSAkVXBkYXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVXBkYXRlJyApIHx8IDEwMDAwOwogICAgICAgIG15ICRTZWxlY3QgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3QnICkgfHwgMTAwMDA7CiAgICAgICAgbXkgJE1vZGUgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ01vZGUnICk7CgogICAgICAgIG15ICVCZW5jaFRlc3QgPSAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5CZW5jaG1hcmsoCgogICAgICAgICAgICBJbnNlcnQgPT4gJEluc2VydCwKICAgICAgICAgICAgVXBkYXRlID0+ICRVcGRhdGUsCiAgICAgICAgICAgIFNlbGVjdCA9PiAkU2VsZWN0LAogICAgICAgICAgICBNb2RlICAgPT4gJE1vZGUsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlQmVuY2hUZXN0LAogICAgICAgICAgICAgICAgSGVhZCA9PiAnU1FMJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgICA9PiAnSW5zZXJ0IFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSAgICA9PiAiJEJlbmNoVGVzdHtJbnNlcnRUaW1lfSBzICRCZW5jaFRlc3R7SW5zZXJ0TW9vZH0iLAogICAgICAgICAgICAgICAgVmFsdWUgICA9PiAoICRJbnNlcnQgKiAkTW9kZSApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkQmVuY2hUZXN0e0luc2VydENvbW1lbnR9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgICA9PiAnVXBkYXRlIFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSAgICA9PiAiJEJlbmNoVGVzdHtVcGRhdGVUaW1lfSBzICRCZW5jaFRlc3R7VXBkYXRlTW9vZH0iLAogICAgICAgICAgICAgICAgVmFsdWUgICA9PiAoICRVcGRhdGUgKiAkTW9kZSApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkQmVuY2hUZXN0e1VwZGF0ZUNvbW1lbnR9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgICA9PiAnU2VsZWN0IFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSAgICA9PiAiJEJlbmNoVGVzdHtTZWxlY3RUaW1lfSBzICRCZW5jaFRlc3R7U2VsZWN0TW9vZH0iLAogICAgICAgICAgICAgICAgVmFsdWUgICA9PiAoICRTZWxlY3QgKiAkTW9kZSApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkQmVuY2hUZXN0e1NlbGVjdENvbW1lbnR9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JlbmNobWFya1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgICA9PiAnRGVsZXRlIFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSAgICA9PiAiJEJlbmNoVGVzdHtEZWxldGVUaW1lfSBzICRCZW5jaFRlc3R7RGVsZXRlTW9vZH0iLAogICAgICAgICAgICAgICAgVmFsdWUgICA9PiAoICRJbnNlcnQgKiAkTW9kZSApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkQmVuY2hUZXN0e0RlbGV0ZUNvbW1lbnR9IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmVuY2htYXJrUmVzdWx0Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnTXVsdGlwbGllcicsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAiKiAkTW9kZSIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TdXBwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlQmVuY2hUZXN0LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgcmVzdWx0IG9mIGFsbCBhZG1pbiBjaGVja3MKICAgICAgICBteSAkRGF0YUhhc2ggPSAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5BZG1pbkNoZWNrc0dldCgpOwoKICAgICAgICAjIHNlbGVjdGlvbiBkYXRhIGZvciBiZW5jaG1hcmsgZHJvcGRvd24gbGlzdAogICAgICAgIG15ICVTZWxlY3Rpb25EYXRhID0gKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgKiBOb3JtYWwgKGNhLiAyNSBzZWMpJywKICAgICAgICAgICAgICAgIDMgPT4gJzMgKiBIaWdoICAgKGNhLiA3NSBzZWMpJywKICAgICAgICAgICAgICAgIDUgPT4gJzUgKiBIZWF2eSAgKGNhLiAxMjUgc2VjKScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5hbWUgPT4gJ01vZGUnLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgTGF5b3V0IG9iamVjdCBrbm93cyB0aGUgZnVuY3Rpb24gQnVpbGRTZWxlY3Rpb24KICAgICAgICAjIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2xkZXIgb3RycyB2ZXJzaW9ucyB1c2UgT3B0aW9uU3RyZ0hhc2hSZWYgaW5zdGVhZAogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT5jYW4oJ0J1aWxkU2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBmb3IgYmVuY2htYXJrIHRlc3QKICAgICAgICAgICAgJFBhcmFte01vZGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oJVNlbGVjdGlvbkRhdGEpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIGZvciBiZW5jaG1hcmsgdGVzdAogICAgICAgICAgICAkUGFyYW17TW9kZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZiglU2VsZWN0aW9uRGF0YSk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JERhdGFIYXNofSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TW9kdWxlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBNb2R1bGUgPT4gJE1vZHVsZSwgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgY3NzIHJvdGF0b3J5CiAgICAgICAgICAgIG15ICRDc3NDbGFzczsKICAgICAgICAgICAgZm9yIG15ICRSb3dIYXNoICggQHsgJERhdGFIYXNoLT57JE1vZHVsZX0gfSApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgICAgIGlmICggJENzc0NsYXNzICYmICRDc3NDbGFzcyBlcSAnc2VhcmNoYWN0aXZlJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3NzQ2xhc3MgPSAnc2VhcmNocGFzc2l2ZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQ3NzQ2xhc3MgPSAnc2VhcmNoYWN0aXZlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRGb250Q29sb3IgPSAncmVkJzsKICAgICAgICAgICAgICAgIGlmICggJFJvd0hhc2gtPntDaGVja30gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUm93SGFzaC0+e0NoZWNrfSBlcSAnT0snICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRm9udENvbG9yID0gJ2dyZWVuJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkUm93SGFzaC0+e0NoZWNrfSBlcSAnSW5mbycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGb250Q29sb3IgPSAnZGFya2JsdWUnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRSb3dIYXNoLT57Q2hlY2t9IGVxICdDcml0aWNhbCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGb250Q29sb3IgPSAnb3JhbmdlJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGJsb2NrIHdpdGggcm90YXRvcnkgY3NzCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TW9kdWxlUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXskUm93SGFzaH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzICA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRDb2xvciA9PiAkRm9udENvbG9yLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TdXBwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHt9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=</File>
+ <File Location="Kernel/Config/Files/Support.xml" Permission="644" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q1ZTPiRJZDogU3VwcG9ydC54bWwsdiAxLjcgMjAxMC8wNS8xMyAxNTo1MzozNyBjZyBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluU3VwcG9ydCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pblN5c3RlbVN0YXR1cyBvYmplY3QgaW4gdGhlIGFkbWluIGFyZWEuPC9EZXNjcmlwdGlvbj5EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZG1pblN5c3RlbVN0YXR1cy1PYmpla3RzIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj5EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPFRpdGxlPlN1cHBvcnQgSW5mbzwvVGl0bGU+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluLVN1cHBvcnQgT3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U3VwcG9ydCBBc3Nlc3NtZW50PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazQ8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpTZW5kZXJFbWFpbCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSB1c2VkIHNlbmRlciBtYWlsIGFkZHJlc3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSB2ZXJ3ZW5kZXRlIEFic2VuZGVyYWRyZXNzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6RGF0YWJhc2U6OkRCMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIGNoZWNrcyBmb3IgdGhlIERCMiBkYXRhYmFzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgRGF0ZW5iYW5rLUNoZWNrcyBm/HIgZGllIERCMiBEYXRlbmJhbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFibGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6RGF0YWJhc2U6Ok1TU1FMIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgY2hlY2tzIGZvciB0aGUgTVNTUUwgZGF0YWJhc2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIERhdGVuYmFuay1DaGVja3MgZvxyIGRpZSBNU1NRTCBEYXRlbmJhbmsuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFibGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJWZXJzaW9uQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpEYXRhYmFzZTo6TXlTUUwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbml0aW9uIG9mIHRoZSBkYXRhYmFzZSBjaGVja3MgZm9yIHRoZSBNeVNRTCBkYXRhYmFzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgRGF0ZW5iYW5rLUNoZWNrcyBm/HIgZGllIE15U1FMIERhdGVuYmFuay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYWJsZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXhBbGxvd2VkUGFja2FnZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJRdWVyeUNhY2hlU2l6ZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4U3VwcG9ydENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4Q2xpZW50Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVURjhEYXRhYmFzZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4VGFibGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJWZXJzaW9uQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpEYXRhYmFzZTo6T3JhY2xlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgY2hlY2tzIGZvciB0aGUgT3JhY2xlIGRhdGFiYXNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBEYXRlbmJhbmstQ2hlY2tzIGb8ciBkaWUgT3JhY2xlIERhdGVuYmFuay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYWJsZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOTFNEYXRlRm9ybWF0Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9yYWNsZUhvbWVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTkxTTGFuZ0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOTFNEYXRlRm9ybWF0U2VsZWN0Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1cnJlbnRUaW1lc3RhbXBDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cHBvcnQ6OkRhdGFiYXNlOjpQb3N0Z3JlU1FMIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgY2hlY2tzIGZvciB0aGUgUG9zdGdyZVNRTCBkYXRhYmFzZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgRGF0ZW5iYW5rLUNoZWNrcyBm/HIgZGllIFBvc3RncmVTUUwgRGF0ZW5iYW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhYmxlQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGVTdHlsZUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVVEY4U2VydmVyQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVURjhDbGllbnRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3VycmVudFRpbWVzdGFtcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJWZXJzaW9uQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpPUyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIE9wZXJhdGluZyBTeXN0ZW0gY2hlY2tzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBCZXRyaWVic3N5c3RlbS1DaGVja3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1BVTG9hZENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaXNrVXNhZ2VDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWVtb3J5U3dhcENoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEaXN0cmlidXRpb25DaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2VybmVsSW5mb0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQZXJsQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpPVFJTIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiB0aGUgT1RSUyBjaGVja3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIE9UUlMtQ2hlY2tzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdXBwb3J0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9wZW5UaWNrZXRDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGlja2V0SW5kZXhNb2R1bGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGlja2V0U3RhdGljREJPcnBoYW5lZFJlY29yZHMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpY2tldEZ1bGx0ZXh0SW5kZXhNb2R1bGVDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRlFETkNvbmZpZ0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTeXN0ZW1JRENvbmZpZ0NoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMb2dDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRmlsZVN5c3RlbUNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQYWNrYWdlRGVwbG95Q2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkludmFsaWRVc2VyTG9ja2VkVGlja2V0U2VhcmNoIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb25maWdDaGVja1RpY2tldEZyb250ZW5kUmVzcG9uc2VGb3JtYXQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRVc2VyQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRTT0FQVXNlckNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VwcG9ydDo6V2Vic2VydmVyOjpBcGFjaGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbml0aW9uIG9mIHRoZSB3ZWJzZXJ2ZXIgY2hlY2tzIGZvciB0aGUgQXBhY2hlIHdlYnNlcnZlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgV2Vic2VydmVyLUNoZWNrcyBm/HIgZGVuIEFwYWNoZSBXZWJzZXJ2ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXBhY2hlVmVyc2lvbkNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDR0lBY2NlbGVyYXRvckNoZWNrIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBcGFjaGVEQklDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXBhY2hlUmVsb2FkQ2hlY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXBwb3J0OjpXZWJzZXJ2ZXI6OklJUyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgdGhlIHdlYnNlcnZlciBjaGVja3MgZm9yIHRoZSBJSVMgd2Vic2VydmVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBXZWJzZXJ2ZXItQ2hlY2tzIGb8ciBkZW4gSUlTIFdlYnNlcnZlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXBwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3VwcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQZXJsRXhDaGVjayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cHBvcnQ6OkNyb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbml0aW9uIG9mIHRoZSBDcm9uIGNoZWNrcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgQ3Jvbi1DaGVja3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VwcG9ydDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN1cHBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=</File>
+ </Filelist>
+ <DatabaseInstall>
+ <TableCreate Type="post" Name="support_bench_test">
+ <Column Name="name_a" Required="true" Size="60" Type="VARCHAR"></Column>
+ <Column Name="name_b" Required="true" Size="60" Type="VARCHAR"></Column>
+ <Index Name="support_index_bench_test_name_a">
+ <IndexColumn Name="name_a">
+ </IndexColumn>
+ </Index>
+ </TableCreate>
+ </DatabaseInstall>
+ <DatabaseUpgrade>
+ <TableCreate Type="post" Name="support_bench_test" Version="1.0.8">
+ <Column Name="name_a" Required="true" Size="60" Type="VARCHAR"></Column>
+ <Column Name="name_b" Required="true" Size="60" Type="VARCHAR"></Column>
+ <Index Name="support_index_bench_test_name_a">
+ <IndexColumn Name="name_a">
+ </IndexColumn>
+ </Index>
+ </TableCreate>
+ </DatabaseUpgrade>
+ <DatabaseUninstall>
+ <TableDrop Type="post" Name="support_bench_test">
+ </TableDrop>
+ </DatabaseUninstall>
+</otrs_package>
\ No newline at end of file
|