Wednesday, February 8, 2017

Log JPA Queries

Log JPA Queries in WildFly (10.1)

Do the following changes in server configuration file (like standalone.xml); restart the server after wise.

Change the console handler to look like:

            <console-handler name="CONSOLE">
                <level name="TRACE"/>
                <formatter>
                    <named-formatter name="COLOR-PATTERN"/>
                </formatter>
            </console-handler>

Add a logger for org.eclipse.persistence.sql:

            <logger category="org.eclipse.persistence.sql">
                <level name="DEBUG"/>
            </logger>
PGgxIGlkPSJsb2dqcGFxdWVyaWVzaW53aWxkZmx5MTAuMSI+TG9nIEpQQSBRdWVyaWVzIGlu IFdpbGRGbHkgKDEwLjEpPC9oMT4NCg0KPHA+RG8gdGhlIGZvbGxvd2luZyBjaGFuZ2VzIGlu IHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUgKGxpa2Ugc3RhbmRhbG9uZS54bWwpOyByZXN0 YXJ0IHRoZSBzZXJ2ZXIgYWZ0ZXIgd2lzZS48L3A+DQoNCjxwPkNoYW5nZSB0aGUgY29uc29s ZSBoYW5kbGVyIHRvIGxvb2sgbGlrZTo8L3A+DQoNCjxwcmU+PGNvZGUgY2xhc3M9InhtbCI+ ICAgICAgICAgICAgJmx0O2NvbnNvbGUtaGFuZGxlciBuYW1lPSZxdW90O0NPTlNPTEUmcXVv dDsmZ3Q7DQogICAgICAgICAgICAgICAgJmx0O2xldmVsIG5hbWU9JnF1b3Q7VFJBQ0UmcXVv dDsvJmd0Ow0KICAgICAgICAgICAgICAgICZsdDtmb3JtYXR0ZXImZ3Q7DQogICAgICAgICAg ICAgICAgICAgICZsdDtuYW1lZC1mb3JtYXR0ZXIgbmFtZT0mcXVvdDtDT0xPUi1QQVRURVJO JnF1b3Q7LyZndDsNCiAgICAgICAgICAgICAgICAmbHQ7L2Zvcm1hdHRlciZndDsNCiAgICAg ICAgICAgICZsdDsvY29uc29sZS1oYW5kbGVyJmd0Ow0KDQo8L2NvZGU+PC9wcmU+DQoNCjxw PkFkZCBhIGxvZ2dlciBmb3IgPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uuc3FsPC9j b2RlPjo8L3A+DQoNCjxwcmU+PGNvZGUgY2xhc3M9InhtbCI+ICAgICAgICAgICAgJmx0O2xv Z2dlciBjYXRlZ29yeT0mcXVvdDtvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5zcWwmcXVvdDsm Z3Q7DQogICAgICAgICAgICAgICAgJmx0O2xldmVsIG5hbWU9JnF1b3Q7REVCVUcmcXVvdDsv Jmd0Ow0KICAgICAgICAgICAgJmx0Oy9sb2dnZXImZ3Q7DQo8L2NvZGU+PC9wcmU+DQo=

Run WildFly 10.1 as a Service on Windows

  • Copy docs\contrib\scripts\service directory to bin
  • Run cmd as an adminsitrator and go to bin\scripts
  • Run service.bat install /startup
  • Start the service

Before running the service.bat replace its contents with the following (or download the latest version from gitHub https://github.com/wildfly/wildfly-core/blob/master/core-feature-pack/src/main/resources/content/docs/contrib/scripts/service/service.bat). The problem with 10.1 release is that instead of

set DESCRIPTION=WildFly Application Server

we have

set DESCRIPTION="WildFly Application Server" which leads to double quoting in prunsrv parameters

@echo off
REM -------------------------------------------------------------------------
REM  WildFly Service Script for Windows
REM    It has to reside in %JBOSS_HOME%\bin
REM    It is expecting that prunsrv.exe reside in:
REM      %JBOSS_HOME%\bin\service\
REM Easiest way to make it work is to copy whole "service" directory to %JBOSS_HOME%\bin
REM
REM  v9 2016-02-16 customize for WildFly, fix working on paths with spaces (Tomaz Cerar)
REM  v8 2016-01-20 customize for EAP 7 (Petr Sakar)
REM  v7 2014-07-09 added /logpath /startup /config /hostconfig /base /debug
REM                      simplified/corrected use of quotes
REM
REM  v6 was shipped with EAP 6.2.0 and supports all previous versions of 6.x as well.
REM  v6 2013-08-21 added /name /desc
REM                added /serviceuser /servicepass
REM                extended directory checking for versions and locations
REM                extended checking on option usage
REM  v5 2013-06-10 adapted for EAP 6.1.0
REM  v4 2012-10-03 Small changes to properly handles spaces in LogPath, StartPath,
REM                and StopPath (George Rypysc)
REM  v3 2012-09-14 fixed service log path
REM                cmd line options for controller,domain host, loglevel,
REM        username,password
REM  v2 2012-09-05 NOPAUSE support
REM  v1 2012-08-20 initial edit
REM
REM Author: Tom Fonteyne (unless noted above)
REM ========================================================
setlocal EnableExtensions EnableDelayedExpansion

set DEBUG=0
if "%DEBUG%" == "1" (
    echo "Debug info enabled"
    echo on
)

set "DIRNAME=%~dp0%"
if "%DEBUG%" == "1" (
    echo DIRNAME "%DIRNAME%x"
)

if exist "%DIRNAME%..\jboss-modules.jar" (
  REM we are in JBOSS_HOME/bin
  set "WE=%DIRNAME%..\"
  goto :WE_FOUND
) else if exist "%DIRNAME%..\..\jboss-modules.jar" (
  REM we are in bin\service in a WildFly installation
  set "WE=%DIRNAME%..\..\"
  goto :WE_FOUND
) else if exist "%DIRNAME%..\..\..\jboss-modules.jar" (
  REM we are in sbin in a 6.0.x installation
  set "WE=%DIRNAME%..\..\..\"
  goto :WE_FOUND
) else (
  REM we should be in sbin in 6.1 and up
  set "WE=%DIRNAME%..\..\..\..\..\..\"
)

if "%DEBUG%" == "1" (
    echo WE was not found, using "%WE%"
)

:WE_FOUND
if "%DEBUG%" == "1" (
    echo WE "%WE%"
)
pushd "%WE%"
set "RESOLVED_JBOSS_HOME=%CD%"
popd
set WE=
set DIRNAME=
if "x%JBOSS_HOME%" == "x" (
  set "JBOSS_HOME=%RESOLVED_JBOSS_HOME%"
)

pushd "%JBOSS_HOME%"
set "SANITIZED_JBOSS_HOME=%CD%"
popd

if "%DEBUG%" == "1" (
    echo SANITIZED_JBOSS_HOME="%SANITIZED_JBOSS_HOME%"
    echo RESOLVED_JBOSS_HOME="%RESOLVED_JBOSS_HOME%"
    echo JBOSS_HOME="%JBOSS_HOME%"
)

if not "%RESOLVED_JBOSS_HOME%x" == "%SANITIZED_JBOSS_HOME%x" (
    echo WARNING JBOSS_HOME may be pointing to a different installation - unpredictable results may occur.
    goto cmdEnd
)

rem Find jboss-modules.jar to check JBOSS_HOME
if not exist "%JBOSS_HOME%\jboss-modules.jar" (
  echo Could not locate "%JBOSS_HOME%\jboss-modules.jar"
  goto cmdEnd
)

set PRUNSRV=
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
  echo Using the X86-64bit version of prunsrv
  set PRUNSRV="%JBOSS_HOME%\bin\service\amd64\wildfly-service"
) else (
  echo Using the X86-32bit version of prunsrv
  set PRUNSRV="%JBOSS_HOME%\bin\service\wildfly-service"
)

if "%DEBUG%" == "1" (
    echo PRUNSRV %PRUNSRV%
)

echo(

rem defaults
set SHORTNAME=Wildfly
set DISPLAYNAME=WildFly
rem NO quotes around the description here !
set DESCRIPTION=WildFly Application Server
set CONTROLLER=localhost:9990
set DC_HOST=master
set IS_DOMAIN=false
set LOGLEVEL=INFO
set LOGPATH=
set JBOSSUSER=
set JBOSSPASS=
set SERVICE_USER=
set SERVICE_PASS=
set STARTUP_MODE=manual
set ISDEBUG=
set CONFIG=
set HOSTCONFIG=host.xml
set BASE=

set COMMAND=%1
shift
if /I "%COMMAND%" == "install"   goto cmdInstall
if /I "%COMMAND%" == "uninstall" goto cmdUninstall
if /I "%COMMAND%" == "start"     goto cmdStart
if /I "%COMMAND%" == "stop"      goto cmdStop
if /I "%COMMAND%" == "restart"   goto cmdRestart

echo ERROR: invalid command

:cmdUsage
echo WildFly Service Script for Windows
echo Usage:
echo(
echo   service install ^<options^>  , where the options are:
echo(
echo     /startup                  : Set the service to auto start
echo                                 Not specifying sets the service to manual
echo(
echo     /jbossuser ^<username^>     : JBoss username to use for the shutdown command.
echo     /jbosspass ^<password^>     : Password for /jbossuser
echo(
echo     /controller ^<host:port^>   : The host:port of the management interface.
echo                                 default: %CONTROLLER%
echo(
echo     /host [^<domainhost^>]      : Indicates that domain mode is to be used with an
echo                                 optional domain controller name.
echo                                 default: %DC_HOST%
echo                                 Not specifying /host will install JBoss in
echo                                 standalone mode.
echo(
echo Options to use when multiple services or different accounts are needed:
echo(
echo     /name ^<servicename^>       : The name of the service
echo(
echo                                 default: %SHORTNAME%
echo     /desc ^<description^>       : The description of the service, use double
echo                                 quotes to allow spaces.
echo                                 Maximum 1024 characters.
echo                                 default: %DESCRIPTION%
echo(
echo     /serviceuser ^<username^>   : Specifies the name of the account under which
echo                                 the service should run.
echo                                 Use an account name in the form of
echo                                 DomainName\UserName
echo                                 default: not used, the service runs as
echo                                 Local System Account.
echo     /servicepass ^<password^>   : password for /serviceuser
echo(
echo Advanced options:
echo(
echo     /config ^<xmlfile^>         : The server-config to use
echo                                 default: standalone.xml / domain.xml
echo     /hostconfig ^<xmlfile^>     : domain mode only, the host config to use
echo                                 default: host.xml
echo(
echo     /base ^<directory^>         : The base directory for server/domain content
echo                                 Must be specified as a fully qualified path
echo                                 default: %JBOSS_HOME%\standalone or
echo                                          %JBOSS_HOME%\domain
echo(
echo     /loglevel ^<level^>         : The log level for the service:  Error, Info,
echo                                 Warn or Debug ^(Case insensitive^)
echo                                 default: %LOGLEVEL%
echo     /logpath ^<path^>           : Path of the log
echo                                 default depends on domain or standalone mode
echo                                 /base applies when /logpath is not set.
echo                                   %JBOSS_HOME%\domain\log
echo                                   %JBOSS_HOME%\standalone\log
echo(
echo     /debug                    : run the service install in debug mode
echo(
echo Other commands:
echo(
echo   service uninstall [/name ^<servicename^>]
echo   service start [/name ^<servicename^>]
echo   service stop [/name ^<servicename^>]
echo   service restart [/name ^<servicename^>]
echo(
echo     /name  ^<servicename^>      : Name of the service: should not contain spaces
echo                                 default: %SHORTNAME%
echo(
goto endBatch

:cmdInstall

:LoopArgs
if "%~1" == "" goto doInstall

if /I "%~1"== "/debug" (
  set ISDEBUG=true
  shift
  goto LoopArgs
)
if /I "%~1"== "/startup" (
  set STARTUP_MODE=auto
  shift
  goto LoopArgs
)
if /I "%~1"== "/config" (
  set CONFIG=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set CONFIG=%~2
    )
  )
  if "!CONFIG!" == "" (
    echo ERROR: You need to specify a config name
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
if /I "%~1"== "/hostconfig" (
  set HOSTCONFIG=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set HOSTCONFIG=%~2
    )
  )
  if "!HOSTCONFIG!" == "" (
    echo ERROR: You need to specify a host-config name
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
if /I "%~1"== "/base" (
  set BASE=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set BASE=%~2
    )
  )
  if "!BASE!" == "" (
    echo ERROR: You need to specify a base directory name
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
if /I "%~1"== "/controller" (
  set CONTROLLER=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set CONTROLLER=%~2
    )
  )
  if "!CONTROLLER!" == "" (
    echo ERROR: The management interface should be specified in the format host:port, example:  127.0.0.1:9999
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
if /I "%~1"== "/name" (
  set SHORTNAME=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set SHORTNAME=%~2
      set DISPLAYNAME=%~2
    )
  )
  if "!SHORTNAME!" == "" (
    echo ERROR: You need to specify a service name
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
if /I "%~1"== "/desc" (
  set DESCRIPTION=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set DESCRIPTION=%~2
    )
  )
  if "!DESCRIPTION!" == "" (
    echo ERROR: You need to specify a description, maximum of 1024 characters
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
if /I "%~1"== "/jbossuser" (
  set JBOSSUSER=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set JBOSSUSER=%~2
    )
  )
  if "!JBOSSUSER!" == "" (
    echo ERROR: You need to specify a username
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
if /I "%~1"== "/jbosspass" (
  set JBOSSPASS=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set JBOSSPASS=%~2
    )
  )
  if "!JBOSSPASS!" == "" (
    echo ERROR: You need to specify a password for /jbosspass
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
if /I "%~1"== "/serviceuser" (
  set SERVICE_USER=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set SERVICE_USER=%~2
    )
  )
  if "!SERVICE_USER!" == "" (
    echo ERROR: You need to specify a username in the format DOMAIN\USER, or .\USER for the local domain
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
if /I "%~1"== "/servicepass" (
  set SERVICE_PASS=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set SERVICE_PASS=%~2
    )
  )
  if "!SERVICE_PASS!" == "" (
    echo ERROR: You need to specify a password for /servicepass
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
rem the hostname is optional
if /I "%~1"== "/host" (
  set IS_DOMAIN=true
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set DC_HOST=%~2
      shift
    )
  )
  shift
  goto LoopArgs
)
if /I "%~1"== "/loglevel" (
  if /I not "%~2"=="Error" if /I not "%~2"=="Info" if /I not "%~2"=="Warn" if /I not "%~2"=="Debug" (
    echo ERROR: /loglevel must be set to Error, Info, Warn or Debug ^(Case insensitive^)
    goto endBatch
  )
  set LOGLEVEL=%~2
  shift
  shift
  goto LoopArgs
)
if /I "%~1"== "/logpath" (
  set LOGPATH=
  if not "%~2"=="" (
    set T=%~2
    if not "!T:~0,1!"=="/" (
      set LOGPATH=%~2
    )
  )
  if "!LOGPATH!" == "" (
    echo ERROR: You need to specify a path for the service log
    goto endBatch
  )
  shift
  shift
  goto LoopArgs
)
echo ERROR: Unrecognised option: %1
echo(
goto cmdUsage

:doInstall
set CREDENTIALS=
if not "%JBOSSUSER%" == "" (
  if "%JBOSSPASS%" == "" (
    echo When specifying a user, you need to specify the password
    goto endBatch
  )
  set CREDENTIALS=--user=%JBOSSUSER% --password=%JBOSSPASS%
)

set RUNAS=
if not "%SERVICE_USER%" == "" (
  if "%SERVICE_PASS%" == "" (
    echo When specifying a user, you need to specify the password
    goto endBatch
  )
  set RUNAS=--ServiceUser=%SERVICE_USER% --ServicePassword=%SERVICE_PASS%
)

if "%STDOUT%"=="" set STDOUT=auto
if "%STDERR%"=="" set STDERR=auto

if "%START_PATH%"=="" set START_PATH="%JBOSS_HOME%\bin"
if "%STOP_PATH%"=="" set STOP_PATH="%JBOSS_HOME%\bin"

if "%STOP_SCRIPT%"=="" set STOP_SCRIPT=jboss-cli.bat

if /I "%IS_DOMAIN%" == "true" (
  if "%BASE%"=="" set BASE="%JBOSS_HOME%\domain"
  if "%CONFIG%"=="" set CONFIG=domain.xml
  if "%START_SCRIPT%"=="" set START_SCRIPT=domain.bat
  set STARTPARAM="/c#set#NOPAUSE=Y#&&#!START_SCRIPT!#-Djboss.domain.base.dir=!BASE!#--domain-config=!CONFIG!#--host-config=!HOSTCONFIG!"
  set STOPPARAM="/c %STOP_SCRIPT% --controller=%CONTROLLER% --connect %CREDENTIALS% --command=/host=!DC_HOST!:shutdown"
) else (
  if "%BASE%"=="" set "BASE=%JBOSS_HOME%\standalone"
  if "%CONFIG%"=="" set CONFIG=standalone.xml
  if "%START_SCRIPT%"=="" set START_SCRIPT=standalone.bat
  set STARTPARAM="/c#set#NOPAUSE=Y#&&#!START_SCRIPT!#-Djboss.server.base.dir=!BASE!#--server-config=!CONFIG!"
  set STOPPARAM="/c !STOP_SCRIPT! --controller=%CONTROLLER% --connect %CREDENTIALS% --command=:shutdown"
)

if "%LOGPATH%"=="" set LOGPATH="!BASE!\log"

if not exist "%BASE%" (
  echo The base directory does not exist: "%BASE%"
  goto endBatch
)

if not exist "%BASE%\configuration\%CONFIG%" (
  echo The configuration does not exist: "%BASE%\configuration\%CONFIG%"
  goto endBatch
)

if /I "%ISDEBUG%" == "true" (
  echo JBOSS_HOME="%JBOSS_HOME%"
  echo RUNAS=%RUNAS%
  echo SHORTNAME="%SHORTNAME%"
  echo DESCRIPTION="%DESCRIPTION%"
  echo STARTPARAM=%STARTPARAM%
  echo STOPPARAM=%STOPPARAM%
  echo LOGLEVEL=%LOGLEVEL%
  echo LOGPATH=%LOGPATH%
  echo CREDENTIALS=%CREDENTIALS%
  echo BASE="%BASE%"
  echo CONFIG="%CONFIG%"
  echo START_SCRIPT=%START_SCRIPT%
  echo START_PATH=%START_PATH%
  echo STOP_SCRIPT=%STOP_SCRIPT%
  echo STOP_PATH=%STOP_PATH%
  echo STDOUT="%STDOUT%"
  echo STDERR="%STDERR%"
)
if /I "%ISDEBUG%" == "true" (
  @echo on
)

@rem quotes around the "%DESCRIPTION%" but nowhere else
echo %PRUNSRV% install %SHORTNAME% %RUNAS% --DisplayName=%DISPLAYNAME% --Description="%DESCRIPTION%" --LogLevel=%LOGLEVEL% --LogPath=%LOGPATH% --LogPrefix=service --StdOutput=%STDOUT% --StdError=%STDERR% --StartMode=exe --Startup=%STARTUP_MODE% --StartImage=cmd.exe --StartPath=%START_PATH% ++StartParams=%STARTPARAM% --StopMode=exe --StopImage=cmd.exe --StopPath=%STOP_PATH%  ++StopParams=%STOPPARAM%

%PRUNSRV% install %SHORTNAME% %RUNAS% --DisplayName=%DISPLAYNAME% --Description="%DESCRIPTION%" --LogLevel=%LOGLEVEL% --LogPath=%LOGPATH% --LogPrefix=service --StdOutput=%STDOUT% --StdError=%STDERR% --StartMode=exe --Startup=%STARTUP_MODE% --StartImage=cmd.exe --StartPath=%START_PATH% ++StartParams=%STARTPARAM% --StopMode=exe --StopImage=cmd.exe --StopPath=%STOP_PATH%  ++StopParams=%STOPPARAM%
@rem %PRUNSRV% install "%SHORTNAME%" "%RUNAS%" --DisplayName="%DISPLAYNAME%" --Description="%DESCRIPTION%" --LogLevel="%LOGLEVEL%" --LogPath="%LOGPATH%" --LogPrefix=service --StdOutput="%STDOUT%" --StdError="%STDERR%" --StartMode=exe --Startup="%STARTUP_MODE%" --StartImage=cmd.exe --StartPath="%START_PATH%" ++StartParams="%STARTPARAM%" --StopMode=exe --StopImage=cmd.exe --StopPath="%STOP_PATH%"  ++StopParams="%STOPPARAM%"

@if /I "%ISDEBUG%" == "true" (
  @echo off
)

if errorlevel 8 (
  echo ERROR: The service %SHORTNAME% already exists
  goto endBatch
)
if errorlevel 0 (
  echo Service %SHORTNAME% installed
  goto endBatch
)
goto cmdEnd


REM the other commands take a /name parameter - if there is no ^<servicename^> passed as second parameter,
REM we silently ignore this and use the default SHORTNAME

:cmdUninstall
if /I "%~1"=="/name" (
  if not "%~2"=="" (
    set SHORTNAME="%~2"
  )
)
%PRUNSRV% stop %SHORTNAME%
if errorlevel 0 (
  %PRUNSRV% delete %SHORTNAME%
  if errorlevel 0 (
    echo Service %SHORTNAME% uninstalled
  )
) else (
  echo Unable to stop the service %SHORTNAME%
)
goto cmdEnd

:cmdStart
if /I "%~1"=="/name" (
  if not "%~2"=="" (
    set SHORTNAME="%~2"
  )
)
%PRUNSRV% start %SHORTNAME%
echo Service %SHORTNAME% starting...
goto cmdEnd

:cmdStop
if /I "%~1"=="/name" (
  if not "%~2"=="" (
    set SHORTNAME="%~2"
  )
)
%PRUNSRV% stop %SHORTNAME%
echo Service %SHORTNAME% stopping...
goto cmdEnd

:cmdRestart
if /I "%~1"=="/name" (
  if not "%~2"=="" (
    set SHORTNAME="%~2"
  )
)
%PRUNSRV% stop %SHORTNAME%
echo Service %SHORTNAME% stopping...
if "%errorlevel%" == "0" (
  %PRUNSRV% start %SHORTNAME%
  echo Service %SHORTNAME% starting...
) else (
  echo Unable to stop the service %SHORTNAME%
)
goto cmdEnd


:cmdEnd
REM if there is a need to add other error messages, make sure to list higher numbers first !
if errorlevel 2 (
  echo ERROR: Failed to load service %SHORTNAME% configuration
  goto endBatch
)
if errorlevel 0 (
  goto endBatch
)
echo "Unforseen error=%errorlevel%"

rem nothing below, exit
:endBatch
PHVsPg0KPGxpPkNvcHkgZG9jc1xjb250cmliXHNjcmlwdHNcc2VydmljZSBkaXJlY3Rvcnkg dG8gYmluPC9saT4NCjxsaT5SdW4gY21kIGFzIGFuIGFkbWluc2l0cmF0b3IgYW5kIGdvIHRv IGJpblxzY3JpcHRzPC9saT4NCjxsaT5SdW4gPGNvZGU+c2VydmljZS5iYXQgaW5zdGFsbCAv c3RhcnR1cDwvY29kZT48L2xpPg0KPGxpPlN0YXJ0IHRoZSBzZXJ2aWNlPC9saT4NCjwvdWw+ DQoNCjxwPkJlZm9yZSBydW5uaW5nIHRoZSBzZXJ2aWNlLmJhdCByZXBsYWNlIGl0cyBjb250 ZW50cyB3aXRoIHRoZSBmb2xsb3dpbmcgKG9yIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lv biBmcm9tIGdpdEh1YiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vd2lsZGZseS93aWxk Zmx5LWNvcmUvYmxvYi9tYXN0ZXIvY29yZS1mZWF0dXJlLXBhY2svc3JjL21haW4vcmVzb3Vy Y2VzL2NvbnRlbnQvZG9jcy9jb250cmliL3NjcmlwdHMvc2VydmljZS9zZXJ2aWNlLmJhdCI+ aHR0cHM6Ly9naXRodWIuY29tL3dpbGRmbHkvd2lsZGZseS1jb3JlL2Jsb2IvbWFzdGVyL2Nv cmUtZmVhdHVyZS1wYWNrL3NyYy9tYWluL3Jlc291cmNlcy9jb250ZW50L2RvY3MvY29udHJp Yi9zY3JpcHRzL3NlcnZpY2Uvc2VydmljZS5iYXQ8L2E+KS4NClRoZSBwcm9ibGVtIHdpdGgg MTAuMSByZWxlYXNlIGlzIHRoYXQgaW5zdGVhZCBvZjwvcD4NCg0KPHA+PGNvZGU+c2V0IERF U0NSSVBUSU9OPVdpbGRGbHkgQXBwbGljYXRpb24gU2VydmVyPC9jb2RlPjwvcD4NCg0KPHA+ d2UgaGF2ZTwvcD4NCg0KPHA+PGNvZGU+c2V0IERFU0NSSVBUSU9OPSZxdW90O1dpbGRGbHkg QXBwbGljYXRpb24gU2VydmVyJnF1b3Q7PC9jb2RlPiB3aGljaCBsZWFkcyB0byBkb3VibGUg cXVvdGluZyBpbiBwcnVuc3J2IHBhcmFtZXRlcnM8L3A+DQoNCjxwcmU+PGNvZGU+QGVjaG8g b2ZmDQpSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUkVNICBXaWxkRmx5IFNlcnZpY2UgU2Ny aXB0IGZvciBXaW5kb3dzDQpSRU0gICAgSXQgaGFzIHRvIHJlc2lkZSBpbiAlSkJPU1NfSE9N RSVcYmluDQpSRU0gICAgSXQgaXMgZXhwZWN0aW5nIHRoYXQgcHJ1bnNydi5leGUgcmVzaWRl IGluOg0KUkVNICAgICAgJUpCT1NTX0hPTUUlXGJpblxzZXJ2aWNlXA0KUkVNIEVhc2llc3Qg d2F5IHRvIG1ha2UgaXQgd29yayBpcyB0byBjb3B5IHdob2xlICZxdW90O3NlcnZpY2UmcXVv dDsgZGlyZWN0b3J5IHRvICVKQk9TU19IT01FJVxiaW4NClJFTQ0KUkVNICB2OSAyMDE2LTAy LTE2IGN1c3RvbWl6ZSBmb3IgV2lsZEZseSwgZml4IHdvcmtpbmcgb24gcGF0aHMgd2l0aCBz cGFjZXMgKFRvbWF6IENlcmFyKQ0KUkVNICB2OCAyMDE2LTAxLTIwIGN1c3RvbWl6ZSBmb3Ig RUFQIDcgKFBldHIgU2FrYXIpDQpSRU0gIHY3IDIwMTQtMDctMDkgYWRkZWQgL2xvZ3BhdGgg L3N0YXJ0dXAgL2NvbmZpZyAvaG9zdGNvbmZpZyAvYmFzZSAvZGVidWcNClJFTSAgICAgICAg ICAgICAgICAgICAgICBzaW1wbGlmaWVkL2NvcnJlY3RlZCB1c2Ugb2YgcXVvdGVzDQpSRU0N ClJFTSAgdjYgd2FzIHNoaXBwZWQgd2l0aCBFQVAgNi4yLjAgYW5kIHN1cHBvcnRzIGFsbCBw cmV2aW91cyB2ZXJzaW9ucyBvZiA2LnggYXMgd2VsbC4NClJFTSAgdjYgMjAxMy0wOC0yMSBh ZGRlZCAvbmFtZSAvZGVzYw0KUkVNICAgICAgICAgICAgICAgIGFkZGVkIC9zZXJ2aWNldXNl ciAvc2VydmljZXBhc3MNClJFTSAgICAgICAgICAgICAgICBleHRlbmRlZCBkaXJlY3Rvcnkg Y2hlY2tpbmcgZm9yIHZlcnNpb25zIGFuZCBsb2NhdGlvbnMNClJFTSAgICAgICAgICAgICAg ICBleHRlbmRlZCBjaGVja2luZyBvbiBvcHRpb24gdXNhZ2UNClJFTSAgdjUgMjAxMy0wNi0x MCBhZGFwdGVkIGZvciBFQVAgNi4xLjANClJFTSAgdjQgMjAxMi0xMC0wMyBTbWFsbCBjaGFu Z2VzIHRvIHByb3Blcmx5IGhhbmRsZXMgc3BhY2VzIGluIExvZ1BhdGgsIFN0YXJ0UGF0aCwN ClJFTSAgICAgICAgICAgICAgICBhbmQgU3RvcFBhdGggKEdlb3JnZSBSeXB5c2MpDQpSRU0g IHYzIDIwMTItMDktMTQgZml4ZWQgc2VydmljZSBsb2cgcGF0aA0KUkVNICAgICAgICAgICAg ICAgIGNtZCBsaW5lIG9wdGlvbnMgZm9yIGNvbnRyb2xsZXIsZG9tYWluIGhvc3QsIGxvZ2xl dmVsLA0KUkVNICAgICAgICB1c2VybmFtZSxwYXNzd29yZA0KUkVNICB2MiAyMDEyLTA5LTA1 IE5PUEFVU0Ugc3VwcG9ydA0KUkVNICB2MSAyMDEyLTA4LTIwIGluaXRpYWwgZWRpdA0KUkVN DQpSRU0gQXV0aG9yOiBUb20gRm9udGV5bmUgKHVubGVzcyBub3RlZCBhYm92ZSkNClJFTSA9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQ0Kc2V0bG9jYWwgRW5hYmxlRXh0ZW5zaW9ucyBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQoN CnNldCBERUJVRz0wDQppZiAmcXVvdDslREVCVUclJnF1b3Q7ID09ICZxdW90OzEmcXVvdDsg KA0KICAgIGVjaG8gJnF1b3Q7RGVidWcgaW5mbyBlbmFibGVkJnF1b3Q7DQogICAgZWNobyBv bg0KKQ0KDQpzZXQgJnF1b3Q7RElSTkFNRT0lfmRwMCUmcXVvdDsNCmlmICZxdW90OyVERUJV RyUmcXVvdDsgPT0gJnF1b3Q7MSZxdW90OyAoDQogICAgZWNobyBESVJOQU1FICZxdW90OyVE SVJOQU1FJXgmcXVvdDsNCikNCg0KaWYgZXhpc3QgJnF1b3Q7JURJUk5BTUUlLi5camJvc3Mt bW9kdWxlcy5qYXImcXVvdDsgKA0KICBSRU0gd2UgYXJlIGluIEpCT1NTX0hPTUUvYmluDQog IHNldCAmcXVvdDtXRT0lRElSTkFNRSUuLlwmcXVvdDsNCiAgZ290byA6V0VfRk9VTkQNCikg ZWxzZSBpZiBleGlzdCAmcXVvdDslRElSTkFNRSUuLlwuLlxqYm9zcy1tb2R1bGVzLmphciZx dW90OyAoDQogIFJFTSB3ZSBhcmUgaW4gYmluXHNlcnZpY2UgaW4gYSBXaWxkRmx5IGluc3Rh bGxhdGlvbg0KICBzZXQgJnF1b3Q7V0U9JURJUk5BTUUlLi5cLi5cJnF1b3Q7DQogIGdvdG8g OldFX0ZPVU5EDQopIGVsc2UgaWYgZXhpc3QgJnF1b3Q7JURJUk5BTUUlLi5cLi5cLi5camJv c3MtbW9kdWxlcy5qYXImcXVvdDsgKA0KICBSRU0gd2UgYXJlIGluIHNiaW4gaW4gYSA2LjAu eCBpbnN0YWxsYXRpb24NCiAgc2V0ICZxdW90O1dFPSVESVJOQU1FJS4uXC4uXC4uXCZxdW90 Ow0KICBnb3RvIDpXRV9GT1VORA0KKSBlbHNlICgNCiAgUkVNIHdlIHNob3VsZCBiZSBpbiBz YmluIGluIDYuMSBhbmQgdXANCiAgc2V0ICZxdW90O1dFPSVESVJOQU1FJS4uXC4uXC4uXC4u XC4uXC4uXCZxdW90Ow0KKQ0KDQppZiAmcXVvdDslREVCVUclJnF1b3Q7ID09ICZxdW90OzEm cXVvdDsgKA0KICAgIGVjaG8gV0Ugd2FzIG5vdCBmb3VuZCwgdXNpbmcgJnF1b3Q7JVdFJSZx dW90Ow0KKQ0KDQo6V0VfRk9VTkQNCmlmICZxdW90OyVERUJVRyUmcXVvdDsgPT0gJnF1b3Q7 MSZxdW90OyAoDQogICAgZWNobyBXRSAmcXVvdDslV0UlJnF1b3Q7DQopDQpwdXNoZCAmcXVv dDslV0UlJnF1b3Q7DQpzZXQgJnF1b3Q7UkVTT0xWRURfSkJPU1NfSE9NRT0lQ0QlJnF1b3Q7 DQpwb3BkDQpzZXQgV0U9DQpzZXQgRElSTkFNRT0NCmlmICZxdW90O3glSkJPU1NfSE9NRSUm cXVvdDsgPT0gJnF1b3Q7eCZxdW90OyAoDQogIHNldCAmcXVvdDtKQk9TU19IT01FPSVSRVNP TFZFRF9KQk9TU19IT01FJSZxdW90Ow0KKQ0KDQpwdXNoZCAmcXVvdDslSkJPU1NfSE9NRSUm cXVvdDsNCnNldCAmcXVvdDtTQU5JVElaRURfSkJPU1NfSE9NRT0lQ0QlJnF1b3Q7DQpwb3Bk DQoNCmlmICZxdW90OyVERUJVRyUmcXVvdDsgPT0gJnF1b3Q7MSZxdW90OyAoDQogICAgZWNo byBTQU5JVElaRURfSkJPU1NfSE9NRT0mcXVvdDslU0FOSVRJWkVEX0pCT1NTX0hPTUUlJnF1 b3Q7DQogICAgZWNobyBSRVNPTFZFRF9KQk9TU19IT01FPSZxdW90OyVSRVNPTFZFRF9KQk9T U19IT01FJSZxdW90Ow0KICAgIGVjaG8gSkJPU1NfSE9NRT0mcXVvdDslSkJPU1NfSE9NRSUm cXVvdDsNCikNCg0KaWYgbm90ICZxdW90OyVSRVNPTFZFRF9KQk9TU19IT01FJXgmcXVvdDsg PT0gJnF1b3Q7JVNBTklUSVpFRF9KQk9TU19IT01FJXgmcXVvdDsgKA0KICAgIGVjaG8gV0FS TklORyBKQk9TU19IT01FIG1heSBiZSBwb2ludGluZyB0byBhIGRpZmZlcmVudCBpbnN0YWxs YXRpb24gLSB1bnByZWRpY3RhYmxlIHJlc3VsdHMgbWF5IG9jY3VyLg0KICAgIGdvdG8gY21k RW5kDQopDQoNCnJlbSBGaW5kIGpib3NzLW1vZHVsZXMuamFyIHRvIGNoZWNrIEpCT1NTX0hP TUUNCmlmIG5vdCBleGlzdCAmcXVvdDslSkJPU1NfSE9NRSVcamJvc3MtbW9kdWxlcy5qYXIm cXVvdDsgKA0KICBlY2hvIENvdWxkIG5vdCBsb2NhdGUgJnF1b3Q7JUpCT1NTX0hPTUUlXGpi b3NzLW1vZHVsZXMuamFyJnF1b3Q7DQogIGdvdG8gY21kRW5kDQopDQoNCnNldCBQUlVOU1JW PQ0KaWYgJnF1b3Q7JVBST0NFU1NPUl9BUkNISVRFQ1RVUkUlJnF1b3Q7PT0mcXVvdDtBTUQ2 NCZxdW90OyAoDQogIGVjaG8gVXNpbmcgdGhlIFg4Ni02NGJpdCB2ZXJzaW9uIG9mIHBydW5z cnYNCiAgc2V0IFBSVU5TUlY9JnF1b3Q7JUpCT1NTX0hPTUUlXGJpblxzZXJ2aWNlXGFtZDY0 XHdpbGRmbHktc2VydmljZSZxdW90Ow0KKSBlbHNlICgNCiAgZWNobyBVc2luZyB0aGUgWDg2 LTMyYml0IHZlcnNpb24gb2YgcHJ1bnNydg0KICBzZXQgUFJVTlNSVj0mcXVvdDslSkJPU1Nf SE9NRSVcYmluXHNlcnZpY2Vcd2lsZGZseS1zZXJ2aWNlJnF1b3Q7DQopDQoNCmlmICZxdW90 OyVERUJVRyUmcXVvdDsgPT0gJnF1b3Q7MSZxdW90OyAoDQogICAgZWNobyBQUlVOU1JWICVQ UlVOU1JWJQ0KKQ0KDQplY2hvKA0KDQpyZW0gZGVmYXVsdHMNCnNldCBTSE9SVE5BTUU9V2ls ZGZseQ0Kc2V0IERJU1BMQVlOQU1FPVdpbGRGbHkNCnJlbSBOTyBxdW90ZXMgYXJvdW5kIHRo ZSBkZXNjcmlwdGlvbiBoZXJlICENCnNldCBERVNDUklQVElPTj1XaWxkRmx5IEFwcGxpY2F0 aW9uIFNlcnZlcg0Kc2V0IENPTlRST0xMRVI9bG9jYWxob3N0Ojk5OTANCnNldCBEQ19IT1NU PW1hc3Rlcg0Kc2V0IElTX0RPTUFJTj1mYWxzZQ0Kc2V0IExPR0xFVkVMPUlORk8NCnNldCBM T0dQQVRIPQ0Kc2V0IEpCT1NTVVNFUj0NCnNldCBKQk9TU1BBU1M9DQpzZXQgU0VSVklDRV9V U0VSPQ0Kc2V0IFNFUlZJQ0VfUEFTUz0NCnNldCBTVEFSVFVQX01PREU9bWFudWFsDQpzZXQg SVNERUJVRz0NCnNldCBDT05GSUc9DQpzZXQgSE9TVENPTkZJRz1ob3N0LnhtbA0Kc2V0IEJB U0U9DQoNCnNldCBDT01NQU5EPSUxDQpzaGlmdA0KaWYgL0kgJnF1b3Q7JUNPTU1BTkQlJnF1 b3Q7ID09ICZxdW90O2luc3RhbGwmcXVvdDsgICBnb3RvIGNtZEluc3RhbGwNCmlmIC9JICZx dW90OyVDT01NQU5EJSZxdW90OyA9PSAmcXVvdDt1bmluc3RhbGwmcXVvdDsgZ290byBjbWRV bmluc3RhbGwNCmlmIC9JICZxdW90OyVDT01NQU5EJSZxdW90OyA9PSAmcXVvdDtzdGFydCZx dW90OyAgICAgZ290byBjbWRTdGFydA0KaWYgL0kgJnF1b3Q7JUNPTU1BTkQlJnF1b3Q7ID09 ICZxdW90O3N0b3AmcXVvdDsgICAgICBnb3RvIGNtZFN0b3ANCmlmIC9JICZxdW90OyVDT01N QU5EJSZxdW90OyA9PSAmcXVvdDtyZXN0YXJ0JnF1b3Q7ICAgZ290byBjbWRSZXN0YXJ0DQoN CmVjaG8gRVJST1I6IGludmFsaWQgY29tbWFuZA0KDQo6Y21kVXNhZ2UNCmVjaG8gV2lsZEZs eSBTZXJ2aWNlIFNjcmlwdCBmb3IgV2luZG93cw0KZWNobyBVc2FnZToNCmVjaG8oDQplY2hv ICAgc2VydmljZSBpbnN0YWxsIF4mbHQ7b3B0aW9uc14mZ3Q7ICAsIHdoZXJlIHRoZSBvcHRp b25zIGFyZToNCmVjaG8oDQplY2hvICAgICAvc3RhcnR1cCAgICAgICAgICAgICAgICAgIDog U2V0IHRoZSBzZXJ2aWNlIHRvIGF1dG8gc3RhcnQNCmVjaG8gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBOb3Qgc3BlY2lmeWluZyBzZXRzIHRoZSBzZXJ2aWNlIHRvIG1hbnVh bA0KZWNobygNCmVjaG8gICAgIC9qYm9zc3VzZXIgXiZsdDt1c2VybmFtZV4mZ3Q7ICAgICA6 IEpCb3NzIHVzZXJuYW1lIHRvIHVzZSBmb3IgdGhlIHNodXRkb3duIGNvbW1hbmQuDQplY2hv ICAgICAvamJvc3NwYXNzIF4mbHQ7cGFzc3dvcmReJmd0OyAgICAgOiBQYXNzd29yZCBmb3Ig L2pib3NzdXNlcg0KZWNobygNCmVjaG8gICAgIC9jb250cm9sbGVyIF4mbHQ7aG9zdDpwb3J0 XiZndDsgICA6IFRoZSBob3N0OnBvcnQgb2YgdGhlIG1hbmFnZW1lbnQgaW50ZXJmYWNlLg0K ZWNobyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICVDT05UUk9M TEVSJQ0KZWNobygNCmVjaG8gICAgIC9ob3N0IFteJmx0O2RvbWFpbmhvc3ReJmd0O10gICAg ICA6IEluZGljYXRlcyB0aGF0IGRvbWFpbiBtb2RlIGlzIHRvIGJlIHVzZWQgd2l0aCBhbg0K ZWNobyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGRvbWFpbiBj b250cm9sbGVyIG5hbWUuDQplY2hvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZGVmYXVsdDogJURDX0hPU1QlDQplY2hvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTm90IHNwZWNpZnlpbmcgL2hvc3Qgd2lsbCBpbnN0YWxsIEpCb3NzIGluDQplY2hvICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhbG9uZSBtb2RlLg0KZWNobygN CmVjaG8gT3B0aW9ucyB0byB1c2Ugd2hlbiBtdWx0aXBsZSBzZXJ2aWNlcyBvciBkaWZmZXJl bnQgYWNjb3VudHMgYXJlIG5lZWRlZDoNCmVjaG8oDQplY2hvICAgICAvbmFtZSBeJmx0O3Nl cnZpY2VuYW1lXiZndDsgICAgICAgOiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZQ0KZWNobygN CmVjaG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAlU0hPUlRO QU1FJQ0KZWNobyAgICAgL2Rlc2MgXiZsdDtkZXNjcmlwdGlvbl4mZ3Q7ICAgICAgIDogVGhl IGRlc2NyaXB0aW9uIG9mIHRoZSBzZXJ2aWNlLCB1c2UgZG91YmxlDQplY2hvICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVzIHRvIGFsbG93IHNwYWNlcy4NCmVjaG8g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbXVtIDEwMjQgY2hhcmFjdGVy cy4NCmVjaG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAlREVT Q1JJUFRJT04lDQplY2hvKA0KZWNobyAgICAgL3NlcnZpY2V1c2VyIF4mbHQ7dXNlcm5hbWVe Jmd0OyAgIDogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IHVuZGVyIHdoaWNo DQplY2hvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlcnZpY2Ugc2hv dWxkIHJ1bi4NCmVjaG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgYW4g YWNjb3VudCBuYW1lIGluIHRoZSBmb3JtIG9mDQplY2hvICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgRG9tYWluTmFtZVxVc2VyTmFtZQ0KZWNobyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG5vdCB1c2VkLCB0aGUgc2VydmljZSBydW5zIGFz DQplY2hvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWwgU3lzdGVtIEFj Y291bnQuDQplY2hvICAgICAvc2VydmljZXBhc3MgXiZsdDtwYXNzd29yZF4mZ3Q7ICAgOiBw YXNzd29yZCBmb3IgL3NlcnZpY2V1c2VyDQplY2hvKA0KZWNobyBBZHZhbmNlZCBvcHRpb25z Og0KZWNobygNCmVjaG8gICAgIC9jb25maWcgXiZsdDt4bWxmaWxlXiZndDsgICAgICAgICA6 IFRoZSBzZXJ2ZXItY29uZmlnIHRvIHVzZQ0KZWNobyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGRlZmF1bHQ6IHN0YW5kYWxvbmUueG1sIC8gZG9tYWluLnhtbA0KZWNobyAg ICAgL2hvc3Rjb25maWcgXiZsdDt4bWxmaWxlXiZndDsgICAgIDogZG9tYWluIG1vZGUgb25s eSwgdGhlIGhvc3QgY29uZmlnIHRvIHVzZQ0KZWNobyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGRlZmF1bHQ6IGhvc3QueG1sDQplY2hvKA0KZWNobyAgICAgL2Jhc2UgXiZs dDtkaXJlY3RvcnleJmd0OyAgICAgICAgIDogVGhlIGJhc2UgZGlyZWN0b3J5IGZvciBzZXJ2 ZXIvZG9tYWluIGNvbnRlbnQNCmVjaG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBNdXN0IGJlIHNwZWNpZmllZCBhcyBhIGZ1bGx5IHF1YWxpZmllZCBwYXRoDQplY2hvICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogJUpCT1NTX0hPTUUlXHN0 YW5kYWxvbmUgb3INCmVjaG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAlSkJPU1NfSE9NRSVcZG9tYWluDQplY2hvKA0KZWNobyAgICAgL2xvZ2xldmVsIF4m bHQ7bGV2ZWxeJmd0OyAgICAgICAgIDogVGhlIGxvZyBsZXZlbCBmb3IgdGhlIHNlcnZpY2U6 ICBFcnJvciwgSW5mbywNCmVjaG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBX YXJuIG9yIERlYnVnIF4oQ2FzZSBpbnNlbnNpdGl2ZV4pDQplY2hvICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZGVmYXVsdDogJUxPR0xFVkVMJQ0KZWNobyAgICAgL2xvZ3Bh dGggXiZsdDtwYXRoXiZndDsgICAgICAgICAgIDogUGF0aCBvZiB0aGUgbG9nDQplY2hvICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBkZXBlbmRzIG9uIGRvbWFp biBvciBzdGFuZGFsb25lIG1vZGUNCmVjaG8gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAvYmFzZSBhcHBsaWVzIHdoZW4gL2xvZ3BhdGggaXMgbm90IHNldC4NCmVjaG8gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVKQk9TU19IT01FJVxkb21haW5cbG9n DQplY2hvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlSkJPU1NfSE9NRSVc c3RhbmRhbG9uZVxsb2cNCmVjaG8oDQplY2hvICAgICAvZGVidWcgICAgICAgICAgICAgICAg ICAgIDogcnVuIHRoZSBzZXJ2aWNlIGluc3RhbGwgaW4gZGVidWcgbW9kZQ0KZWNobygNCmVj aG8gT3RoZXIgY29tbWFuZHM6DQplY2hvKA0KZWNobyAgIHNlcnZpY2UgdW5pbnN0YWxsIFsv bmFtZSBeJmx0O3NlcnZpY2VuYW1lXiZndDtdDQplY2hvICAgc2VydmljZSBzdGFydCBbL25h bWUgXiZsdDtzZXJ2aWNlbmFtZV4mZ3Q7XQ0KZWNobyAgIHNlcnZpY2Ugc3RvcCBbL25hbWUg XiZsdDtzZXJ2aWNlbmFtZV4mZ3Q7XQ0KZWNobyAgIHNlcnZpY2UgcmVzdGFydCBbL25hbWUg XiZsdDtzZXJ2aWNlbmFtZV4mZ3Q7XQ0KZWNobygNCmVjaG8gICAgIC9uYW1lICBeJmx0O3Nl cnZpY2VuYW1lXiZndDsgICAgICA6IE5hbWUgb2YgdGhlIHNlcnZpY2U6IHNob3VsZCBub3Qg Y29udGFpbiBzcGFjZXMNCmVjaG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk ZWZhdWx0OiAlU0hPUlROQU1FJQ0KZWNobygNCmdvdG8gZW5kQmF0Y2gNCg0KOmNtZEluc3Rh bGwNCg0KOkxvb3BBcmdzDQppZiAmcXVvdDslfjEmcXVvdDsgPT0gJnF1b3Q7JnF1b3Q7IGdv dG8gZG9JbnN0YWxsDQoNCmlmIC9JICZxdW90OyV+MSZxdW90Oz09ICZxdW90Oy9kZWJ1ZyZx dW90OyAoDQogIHNldCBJU0RFQlVHPXRydWUNCiAgc2hpZnQNCiAgZ290byBMb29wQXJncw0K KQ0KaWYgL0kgJnF1b3Q7JX4xJnF1b3Q7PT0gJnF1b3Q7L3N0YXJ0dXAmcXVvdDsgKA0KICBz ZXQgU1RBUlRVUF9NT0RFPWF1dG8NCiAgc2hpZnQNCiAgZ290byBMb29wQXJncw0KKQ0KaWYg L0kgJnF1b3Q7JX4xJnF1b3Q7PT0gJnF1b3Q7L2NvbmZpZyZxdW90OyAoDQogIHNldCBDT05G SUc9DQogIGlmIG5vdCAmcXVvdDslfjImcXVvdDs9PSZxdW90OyZxdW90OyAoDQogICAgc2V0 IFQ9JX4yDQogICAgaWYgbm90ICZxdW90OyFUOn4wLDEhJnF1b3Q7PT0mcXVvdDsvJnF1b3Q7 ICgNCiAgICAgIHNldCBDT05GSUc9JX4yDQogICAgKQ0KICApDQogIGlmICZxdW90OyFDT05G SUchJnF1b3Q7ID09ICZxdW90OyZxdW90OyAoDQogICAgZWNobyBFUlJPUjogWW91IG5lZWQg dG8gc3BlY2lmeSBhIGNvbmZpZyBuYW1lDQogICAgZ290byBlbmRCYXRjaA0KICApDQogIHNo aWZ0DQogIHNoaWZ0DQogIGdvdG8gTG9vcEFyZ3MNCikNCmlmIC9JICZxdW90OyV+MSZxdW90 Oz09ICZxdW90Oy9ob3N0Y29uZmlnJnF1b3Q7ICgNCiAgc2V0IEhPU1RDT05GSUc9DQogIGlm IG5vdCAmcXVvdDslfjImcXVvdDs9PSZxdW90OyZxdW90OyAoDQogICAgc2V0IFQ9JX4yDQog ICAgaWYgbm90ICZxdW90OyFUOn4wLDEhJnF1b3Q7PT0mcXVvdDsvJnF1b3Q7ICgNCiAgICAg IHNldCBIT1NUQ09ORklHPSV+Mg0KICAgICkNCiAgKQ0KICBpZiAmcXVvdDshSE9TVENPTkZJ RyEmcXVvdDsgPT0gJnF1b3Q7JnF1b3Q7ICgNCiAgICBlY2hvIEVSUk9SOiBZb3UgbmVlZCB0 byBzcGVjaWZ5IGEgaG9zdC1jb25maWcgbmFtZQ0KICAgIGdvdG8gZW5kQmF0Y2gNCiAgKQ0K ICBzaGlmdA0KICBzaGlmdA0KICBnb3RvIExvb3BBcmdzDQopDQppZiAvSSAmcXVvdDslfjEm cXVvdDs9PSAmcXVvdDsvYmFzZSZxdW90OyAoDQogIHNldCBCQVNFPQ0KICBpZiBub3QgJnF1 b3Q7JX4yJnF1b3Q7PT0mcXVvdDsmcXVvdDsgKA0KICAgIHNldCBUPSV+Mg0KICAgIGlmIG5v dCAmcXVvdDshVDp+MCwxISZxdW90Oz09JnF1b3Q7LyZxdW90OyAoDQogICAgICBzZXQgQkFT RT0lfjINCiAgICApDQogICkNCiAgaWYgJnF1b3Q7IUJBU0UhJnF1b3Q7ID09ICZxdW90OyZx dW90OyAoDQogICAgZWNobyBFUlJPUjogWW91IG5lZWQgdG8gc3BlY2lmeSBhIGJhc2UgZGly ZWN0b3J5IG5hbWUNCiAgICBnb3RvIGVuZEJhdGNoDQogICkNCiAgc2hpZnQNCiAgc2hpZnQN CiAgZ290byBMb29wQXJncw0KKQ0KaWYgL0kgJnF1b3Q7JX4xJnF1b3Q7PT0gJnF1b3Q7L2Nv bnRyb2xsZXImcXVvdDsgKA0KICBzZXQgQ09OVFJPTExFUj0NCiAgaWYgbm90ICZxdW90OyV+ MiZxdW90Oz09JnF1b3Q7JnF1b3Q7ICgNCiAgICBzZXQgVD0lfjINCiAgICBpZiBub3QgJnF1 b3Q7IVQ6fjAsMSEmcXVvdDs9PSZxdW90Oy8mcXVvdDsgKA0KICAgICAgc2V0IENPTlRST0xM RVI9JX4yDQogICAgKQ0KICApDQogIGlmICZxdW90OyFDT05UUk9MTEVSISZxdW90OyA9PSAm cXVvdDsmcXVvdDsgKA0KICAgIGVjaG8gRVJST1I6IFRoZSBtYW5hZ2VtZW50IGludGVyZmFj ZSBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZSBmb3JtYXQgaG9zdDpwb3J0LCBleGFtcGxl OiAgMTI3LjAuMC4xOjk5OTkNCiAgICBnb3RvIGVuZEJhdGNoDQogICkNCiAgc2hpZnQNCiAg c2hpZnQNCiAgZ290byBMb29wQXJncw0KKQ0KaWYgL0kgJnF1b3Q7JX4xJnF1b3Q7PT0gJnF1 b3Q7L25hbWUmcXVvdDsgKA0KICBzZXQgU0hPUlROQU1FPQ0KICBpZiBub3QgJnF1b3Q7JX4y JnF1b3Q7PT0mcXVvdDsmcXVvdDsgKA0KICAgIHNldCBUPSV+Mg0KICAgIGlmIG5vdCAmcXVv dDshVDp+MCwxISZxdW90Oz09JnF1b3Q7LyZxdW90OyAoDQogICAgICBzZXQgU0hPUlROQU1F PSV+Mg0KICAgICAgc2V0IERJU1BMQVlOQU1FPSV+Mg0KICAgICkNCiAgKQ0KICBpZiAmcXVv dDshU0hPUlROQU1FISZxdW90OyA9PSAmcXVvdDsmcXVvdDsgKA0KICAgIGVjaG8gRVJST1I6 IFlvdSBuZWVkIHRvIHNwZWNpZnkgYSBzZXJ2aWNlIG5hbWUNCiAgICBnb3RvIGVuZEJhdGNo DQogICkNCiAgc2hpZnQNCiAgc2hpZnQNCiAgZ290byBMb29wQXJncw0KKQ0KaWYgL0kgJnF1 b3Q7JX4xJnF1b3Q7PT0gJnF1b3Q7L2Rlc2MmcXVvdDsgKA0KICBzZXQgREVTQ1JJUFRJT049 DQogIGlmIG5vdCAmcXVvdDslfjImcXVvdDs9PSZxdW90OyZxdW90OyAoDQogICAgc2V0IFQ9 JX4yDQogICAgaWYgbm90ICZxdW90OyFUOn4wLDEhJnF1b3Q7PT0mcXVvdDsvJnF1b3Q7ICgN CiAgICAgIHNldCBERVNDUklQVElPTj0lfjINCiAgICApDQogICkNCiAgaWYgJnF1b3Q7IURF U0NSSVBUSU9OISZxdW90OyA9PSAmcXVvdDsmcXVvdDsgKA0KICAgIGVjaG8gRVJST1I6IFlv dSBuZWVkIHRvIHNwZWNpZnkgYSBkZXNjcmlwdGlvbiwgbWF4aW11bSBvZiAxMDI0IGNoYXJh Y3RlcnMNCiAgICBnb3RvIGVuZEJhdGNoDQogICkNCiAgc2hpZnQNCiAgc2hpZnQNCiAgZ290 byBMb29wQXJncw0KKQ0KaWYgL0kgJnF1b3Q7JX4xJnF1b3Q7PT0gJnF1b3Q7L2pib3NzdXNl ciZxdW90OyAoDQogIHNldCBKQk9TU1VTRVI9DQogIGlmIG5vdCAmcXVvdDslfjImcXVvdDs9 PSZxdW90OyZxdW90OyAoDQogICAgc2V0IFQ9JX4yDQogICAgaWYgbm90ICZxdW90OyFUOn4w LDEhJnF1b3Q7PT0mcXVvdDsvJnF1b3Q7ICgNCiAgICAgIHNldCBKQk9TU1VTRVI9JX4yDQog ICAgKQ0KICApDQogIGlmICZxdW90OyFKQk9TU1VTRVIhJnF1b3Q7ID09ICZxdW90OyZxdW90 OyAoDQogICAgZWNobyBFUlJPUjogWW91IG5lZWQgdG8gc3BlY2lmeSBhIHVzZXJuYW1lDQog ICAgZ290byBlbmRCYXRjaA0KICApDQogIHNoaWZ0DQogIHNoaWZ0DQogIGdvdG8gTG9vcEFy Z3MNCikNCmlmIC9JICZxdW90OyV+MSZxdW90Oz09ICZxdW90Oy9qYm9zc3Bhc3MmcXVvdDsg KA0KICBzZXQgSkJPU1NQQVNTPQ0KICBpZiBub3QgJnF1b3Q7JX4yJnF1b3Q7PT0mcXVvdDsm cXVvdDsgKA0KICAgIHNldCBUPSV+Mg0KICAgIGlmIG5vdCAmcXVvdDshVDp+MCwxISZxdW90 Oz09JnF1b3Q7LyZxdW90OyAoDQogICAgICBzZXQgSkJPU1NQQVNTPSV+Mg0KICAgICkNCiAg KQ0KICBpZiAmcXVvdDshSkJPU1NQQVNTISZxdW90OyA9PSAmcXVvdDsmcXVvdDsgKA0KICAg IGVjaG8gRVJST1I6IFlvdSBuZWVkIHRvIHNwZWNpZnkgYSBwYXNzd29yZCBmb3IgL2pib3Nz cGFzcw0KICAgIGdvdG8gZW5kQmF0Y2gNCiAgKQ0KICBzaGlmdA0KICBzaGlmdA0KICBnb3Rv IExvb3BBcmdzDQopDQppZiAvSSAmcXVvdDslfjEmcXVvdDs9PSAmcXVvdDsvc2VydmljZXVz ZXImcXVvdDsgKA0KICBzZXQgU0VSVklDRV9VU0VSPQ0KICBpZiBub3QgJnF1b3Q7JX4yJnF1 b3Q7PT0mcXVvdDsmcXVvdDsgKA0KICAgIHNldCBUPSV+Mg0KICAgIGlmIG5vdCAmcXVvdDsh VDp+MCwxISZxdW90Oz09JnF1b3Q7LyZxdW90OyAoDQogICAgICBzZXQgU0VSVklDRV9VU0VS PSV+Mg0KICAgICkNCiAgKQ0KICBpZiAmcXVvdDshU0VSVklDRV9VU0VSISZxdW90OyA9PSAm cXVvdDsmcXVvdDsgKA0KICAgIGVjaG8gRVJST1I6IFlvdSBuZWVkIHRvIHNwZWNpZnkgYSB1 c2VybmFtZSBpbiB0aGUgZm9ybWF0IERPTUFJTlxVU0VSLCBvciAuXFVTRVIgZm9yIHRoZSBs b2NhbCBkb21haW4NCiAgICBnb3RvIGVuZEJhdGNoDQogICkNCiAgc2hpZnQNCiAgc2hpZnQN CiAgZ290byBMb29wQXJncw0KKQ0KaWYgL0kgJnF1b3Q7JX4xJnF1b3Q7PT0gJnF1b3Q7L3Nl cnZpY2VwYXNzJnF1b3Q7ICgNCiAgc2V0IFNFUlZJQ0VfUEFTUz0NCiAgaWYgbm90ICZxdW90 OyV+MiZxdW90Oz09JnF1b3Q7JnF1b3Q7ICgNCiAgICBzZXQgVD0lfjINCiAgICBpZiBub3Qg JnF1b3Q7IVQ6fjAsMSEmcXVvdDs9PSZxdW90Oy8mcXVvdDsgKA0KICAgICAgc2V0IFNFUlZJ Q0VfUEFTUz0lfjINCiAgICApDQogICkNCiAgaWYgJnF1b3Q7IVNFUlZJQ0VfUEFTUyEmcXVv dDsgPT0gJnF1b3Q7JnF1b3Q7ICgNCiAgICBlY2hvIEVSUk9SOiBZb3UgbmVlZCB0byBzcGVj aWZ5IGEgcGFzc3dvcmQgZm9yIC9zZXJ2aWNlcGFzcw0KICAgIGdvdG8gZW5kQmF0Y2gNCiAg KQ0KICBzaGlmdA0KICBzaGlmdA0KICBnb3RvIExvb3BBcmdzDQopDQpyZW0gdGhlIGhvc3Ru YW1lIGlzIG9wdGlvbmFsDQppZiAvSSAmcXVvdDslfjEmcXVvdDs9PSAmcXVvdDsvaG9zdCZx dW90OyAoDQogIHNldCBJU19ET01BSU49dHJ1ZQ0KICBpZiBub3QgJnF1b3Q7JX4yJnF1b3Q7 PT0mcXVvdDsmcXVvdDsgKA0KICAgIHNldCBUPSV+Mg0KICAgIGlmIG5vdCAmcXVvdDshVDp+ MCwxISZxdW90Oz09JnF1b3Q7LyZxdW90OyAoDQogICAgICBzZXQgRENfSE9TVD0lfjINCiAg ICAgIHNoaWZ0DQogICAgKQ0KICApDQogIHNoaWZ0DQogIGdvdG8gTG9vcEFyZ3MNCikNCmlm IC9JICZxdW90OyV+MSZxdW90Oz09ICZxdW90Oy9sb2dsZXZlbCZxdW90OyAoDQogIGlmIC9J IG5vdCAmcXVvdDslfjImcXVvdDs9PSZxdW90O0Vycm9yJnF1b3Q7IGlmIC9JIG5vdCAmcXVv dDslfjImcXVvdDs9PSZxdW90O0luZm8mcXVvdDsgaWYgL0kgbm90ICZxdW90OyV+MiZxdW90 Oz09JnF1b3Q7V2FybiZxdW90OyBpZiAvSSBub3QgJnF1b3Q7JX4yJnF1b3Q7PT0mcXVvdDtE ZWJ1ZyZxdW90OyAoDQogICAgZWNobyBFUlJPUjogL2xvZ2xldmVsIG11c3QgYmUgc2V0IHRv IEVycm9yLCBJbmZvLCBXYXJuIG9yIERlYnVnIF4oQ2FzZSBpbnNlbnNpdGl2ZV4pDQogICAg Z290byBlbmRCYXRjaA0KICApDQogIHNldCBMT0dMRVZFTD0lfjINCiAgc2hpZnQNCiAgc2hp ZnQNCiAgZ290byBMb29wQXJncw0KKQ0KaWYgL0kgJnF1b3Q7JX4xJnF1b3Q7PT0gJnF1b3Q7 L2xvZ3BhdGgmcXVvdDsgKA0KICBzZXQgTE9HUEFUSD0NCiAgaWYgbm90ICZxdW90OyV+MiZx dW90Oz09JnF1b3Q7JnF1b3Q7ICgNCiAgICBzZXQgVD0lfjINCiAgICBpZiBub3QgJnF1b3Q7 IVQ6fjAsMSEmcXVvdDs9PSZxdW90Oy8mcXVvdDsgKA0KICAgICAgc2V0IExPR1BBVEg9JX4y DQogICAgKQ0KICApDQogIGlmICZxdW90OyFMT0dQQVRIISZxdW90OyA9PSAmcXVvdDsmcXVv dDsgKA0KICAgIGVjaG8gRVJST1I6IFlvdSBuZWVkIHRvIHNwZWNpZnkgYSBwYXRoIGZvciB0 aGUgc2VydmljZSBsb2cNCiAgICBnb3RvIGVuZEJhdGNoDQogICkNCiAgc2hpZnQNCiAgc2hp ZnQNCiAgZ290byBMb29wQXJncw0KKQ0KZWNobyBFUlJPUjogVW5yZWNvZ25pc2VkIG9wdGlv bjogJTENCmVjaG8oDQpnb3RvIGNtZFVzYWdlDQoNCjpkb0luc3RhbGwNCnNldCBDUkVERU5U SUFMUz0NCmlmIG5vdCAmcXVvdDslSkJPU1NVU0VSJSZxdW90OyA9PSAmcXVvdDsmcXVvdDsg KA0KICBpZiAmcXVvdDslSkJPU1NQQVNTJSZxdW90OyA9PSAmcXVvdDsmcXVvdDsgKA0KICAg IGVjaG8gV2hlbiBzcGVjaWZ5aW5nIGEgdXNlciwgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUg cGFzc3dvcmQNCiAgICBnb3RvIGVuZEJhdGNoDQogICkNCiAgc2V0IENSRURFTlRJQUxTPS0t dXNlcj0lSkJPU1NVU0VSJSAtLXBhc3N3b3JkPSVKQk9TU1BBU1MlDQopDQoNCnNldCBSVU5B Uz0NCmlmIG5vdCAmcXVvdDslU0VSVklDRV9VU0VSJSZxdW90OyA9PSAmcXVvdDsmcXVvdDsg KA0KICBpZiAmcXVvdDslU0VSVklDRV9QQVNTJSZxdW90OyA9PSAmcXVvdDsmcXVvdDsgKA0K ICAgIGVjaG8gV2hlbiBzcGVjaWZ5aW5nIGEgdXNlciwgeW91IG5lZWQgdG8gc3BlY2lmeSB0 aGUgcGFzc3dvcmQNCiAgICBnb3RvIGVuZEJhdGNoDQogICkNCiAgc2V0IFJVTkFTPS0tU2Vy dmljZVVzZXI9JVNFUlZJQ0VfVVNFUiUgLS1TZXJ2aWNlUGFzc3dvcmQ9JVNFUlZJQ0VfUEFT UyUNCikNCg0KaWYgJnF1b3Q7JVNURE9VVCUmcXVvdDs9PSZxdW90OyZxdW90OyBzZXQgU1RE T1VUPWF1dG8NCmlmICZxdW90OyVTVERFUlIlJnF1b3Q7PT0mcXVvdDsmcXVvdDsgc2V0IFNU REVSUj1hdXRvDQoNCmlmICZxdW90OyVTVEFSVF9QQVRIJSZxdW90Oz09JnF1b3Q7JnF1b3Q7 IHNldCBTVEFSVF9QQVRIPSZxdW90OyVKQk9TU19IT01FJVxiaW4mcXVvdDsNCmlmICZxdW90 OyVTVE9QX1BBVEglJnF1b3Q7PT0mcXVvdDsmcXVvdDsgc2V0IFNUT1BfUEFUSD0mcXVvdDsl SkJPU1NfSE9NRSVcYmluJnF1b3Q7DQoNCmlmICZxdW90OyVTVE9QX1NDUklQVCUmcXVvdDs9 PSZxdW90OyZxdW90OyBzZXQgU1RPUF9TQ1JJUFQ9amJvc3MtY2xpLmJhdA0KDQppZiAvSSAm cXVvdDslSVNfRE9NQUlOJSZxdW90OyA9PSAmcXVvdDt0cnVlJnF1b3Q7ICgNCiAgaWYgJnF1 b3Q7JUJBU0UlJnF1b3Q7PT0mcXVvdDsmcXVvdDsgc2V0IEJBU0U9JnF1b3Q7JUpCT1NTX0hP TUUlXGRvbWFpbiZxdW90Ow0KICBpZiAmcXVvdDslQ09ORklHJSZxdW90Oz09JnF1b3Q7JnF1 b3Q7IHNldCBDT05GSUc9ZG9tYWluLnhtbA0KICBpZiAmcXVvdDslU1RBUlRfU0NSSVBUJSZx dW90Oz09JnF1b3Q7JnF1b3Q7IHNldCBTVEFSVF9TQ1JJUFQ9ZG9tYWluLmJhdA0KICBzZXQg U1RBUlRQQVJBTT0mcXVvdDsvYyNzZXQjTk9QQVVTRT1ZIyZhbXA7JmFtcDsjIVNUQVJUX1ND UklQVCEjLURqYm9zcy5kb21haW4uYmFzZS5kaXI9IUJBU0UhIy0tZG9tYWluLWNvbmZpZz0h Q09ORklHISMtLWhvc3QtY29uZmlnPSFIT1NUQ09ORklHISZxdW90Ow0KICBzZXQgU1RPUFBB UkFNPSZxdW90Oy9jICVTVE9QX1NDUklQVCUgLS1jb250cm9sbGVyPSVDT05UUk9MTEVSJSAt LWNvbm5lY3QgJUNSRURFTlRJQUxTJSAtLWNvbW1hbmQ9L2hvc3Q9IURDX0hPU1QhOnNodXRk b3duJnF1b3Q7DQopIGVsc2UgKA0KICBpZiAmcXVvdDslQkFTRSUmcXVvdDs9PSZxdW90OyZx dW90OyBzZXQgJnF1b3Q7QkFTRT0lSkJPU1NfSE9NRSVcc3RhbmRhbG9uZSZxdW90Ow0KICBp ZiAmcXVvdDslQ09ORklHJSZxdW90Oz09JnF1b3Q7JnF1b3Q7IHNldCBDT05GSUc9c3RhbmRh bG9uZS54bWwNCiAgaWYgJnF1b3Q7JVNUQVJUX1NDUklQVCUmcXVvdDs9PSZxdW90OyZxdW90 OyBzZXQgU1RBUlRfU0NSSVBUPXN0YW5kYWxvbmUuYmF0DQogIHNldCBTVEFSVFBBUkFNPSZx dW90Oy9jI3NldCNOT1BBVVNFPVkjJmFtcDsmYW1wOyMhU1RBUlRfU0NSSVBUISMtRGpib3Nz LnNlcnZlci5iYXNlLmRpcj0hQkFTRSEjLS1zZXJ2ZXItY29uZmlnPSFDT05GSUchJnF1b3Q7 DQogIHNldCBTVE9QUEFSQU09JnF1b3Q7L2MgIVNUT1BfU0NSSVBUISAtLWNvbnRyb2xsZXI9 JUNPTlRST0xMRVIlIC0tY29ubmVjdCAlQ1JFREVOVElBTFMlIC0tY29tbWFuZD06c2h1dGRv d24mcXVvdDsNCikNCg0KaWYgJnF1b3Q7JUxPR1BBVEglJnF1b3Q7PT0mcXVvdDsmcXVvdDsg c2V0IExPR1BBVEg9JnF1b3Q7IUJBU0UhXGxvZyZxdW90Ow0KDQppZiBub3QgZXhpc3QgJnF1 b3Q7JUJBU0UlJnF1b3Q7ICgNCiAgZWNobyBUaGUgYmFzZSBkaXJlY3RvcnkgZG9lcyBub3Qg ZXhpc3Q6ICZxdW90OyVCQVNFJSZxdW90Ow0KICBnb3RvIGVuZEJhdGNoDQopDQoNCmlmIG5v dCBleGlzdCAmcXVvdDslQkFTRSVcY29uZmlndXJhdGlvblwlQ09ORklHJSZxdW90OyAoDQog IGVjaG8gVGhlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZXhpc3Q6ICZxdW90OyVCQVNFJVxj b25maWd1cmF0aW9uXCVDT05GSUclJnF1b3Q7DQogIGdvdG8gZW5kQmF0Y2gNCikNCg0KaWYg L0kgJnF1b3Q7JUlTREVCVUclJnF1b3Q7ID09ICZxdW90O3RydWUmcXVvdDsgKA0KICBlY2hv IEpCT1NTX0hPTUU9JnF1b3Q7JUpCT1NTX0hPTUUlJnF1b3Q7DQogIGVjaG8gUlVOQVM9JVJV TkFTJQ0KICBlY2hvIFNIT1JUTkFNRT0mcXVvdDslU0hPUlROQU1FJSZxdW90Ow0KICBlY2hv IERFU0NSSVBUSU9OPSZxdW90OyVERVNDUklQVElPTiUmcXVvdDsNCiAgZWNobyBTVEFSVFBB UkFNPSVTVEFSVFBBUkFNJQ0KICBlY2hvIFNUT1BQQVJBTT0lU1RPUFBBUkFNJQ0KICBlY2hv IExPR0xFVkVMPSVMT0dMRVZFTCUNCiAgZWNobyBMT0dQQVRIPSVMT0dQQVRIJQ0KICBlY2hv IENSRURFTlRJQUxTPSVDUkVERU5USUFMUyUNCiAgZWNobyBCQVNFPSZxdW90OyVCQVNFJSZx dW90Ow0KICBlY2hvIENPTkZJRz0mcXVvdDslQ09ORklHJSZxdW90Ow0KICBlY2hvIFNUQVJU X1NDUklQVD0lU1RBUlRfU0NSSVBUJQ0KICBlY2hvIFNUQVJUX1BBVEg9JVNUQVJUX1BBVEgl DQogIGVjaG8gU1RPUF9TQ1JJUFQ9JVNUT1BfU0NSSVBUJQ0KICBlY2hvIFNUT1BfUEFUSD0l U1RPUF9QQVRIJQ0KICBlY2hvIFNURE9VVD0mcXVvdDslU1RET1VUJSZxdW90Ow0KICBlY2hv IFNUREVSUj0mcXVvdDslU1RERVJSJSZxdW90Ow0KKQ0KaWYgL0kgJnF1b3Q7JUlTREVCVUcl JnF1b3Q7ID09ICZxdW90O3RydWUmcXVvdDsgKA0KICBAZWNobyBvbg0KKQ0KDQpAcmVtIHF1 b3RlcyBhcm91bmQgdGhlICZxdW90OyVERVNDUklQVElPTiUmcXVvdDsgYnV0IG5vd2hlcmUg ZWxzZQ0KZWNobyAlUFJVTlNSViUgaW5zdGFsbCAlU0hPUlROQU1FJSAlUlVOQVMlIC0tRGlz cGxheU5hbWU9JURJU1BMQVlOQU1FJSAtLURlc2NyaXB0aW9uPSZxdW90OyVERVNDUklQVElP TiUmcXVvdDsgLS1Mb2dMZXZlbD0lTE9HTEVWRUwlIC0tTG9nUGF0aD0lTE9HUEFUSCUgLS1M b2dQcmVmaXg9c2VydmljZSAtLVN0ZE91dHB1dD0lU1RET1VUJSAtLVN0ZEVycm9yPSVTVERF UlIlIC0tU3RhcnRNb2RlPWV4ZSAtLVN0YXJ0dXA9JVNUQVJUVVBfTU9ERSUgLS1TdGFydElt YWdlPWNtZC5leGUgLS1TdGFydFBhdGg9JVNUQVJUX1BBVEglICsrU3RhcnRQYXJhbXM9JVNU QVJUUEFSQU0lIC0tU3RvcE1vZGU9ZXhlIC0tU3RvcEltYWdlPWNtZC5leGUgLS1TdG9wUGF0 aD0lU1RPUF9QQVRIJSAgKytTdG9wUGFyYW1zPSVTVE9QUEFSQU0lDQoNCiVQUlVOU1JWJSBp bnN0YWxsICVTSE9SVE5BTUUlICVSVU5BUyUgLS1EaXNwbGF5TmFtZT0lRElTUExBWU5BTUUl IC0tRGVzY3JpcHRpb249JnF1b3Q7JURFU0NSSVBUSU9OJSZxdW90OyAtLUxvZ0xldmVsPSVM T0dMRVZFTCUgLS1Mb2dQYXRoPSVMT0dQQVRIJSAtLUxvZ1ByZWZpeD1zZXJ2aWNlIC0tU3Rk T3V0cHV0PSVTVERPVVQlIC0tU3RkRXJyb3I9JVNUREVSUiUgLS1TdGFydE1vZGU9ZXhlIC0t U3RhcnR1cD0lU1RBUlRVUF9NT0RFJSAtLVN0YXJ0SW1hZ2U9Y21kLmV4ZSAtLVN0YXJ0UGF0 aD0lU1RBUlRfUEFUSCUgKytTdGFydFBhcmFtcz0lU1RBUlRQQVJBTSUgLS1TdG9wTW9kZT1l eGUgLS1TdG9wSW1hZ2U9Y21kLmV4ZSAtLVN0b3BQYXRoPSVTVE9QX1BBVEglICArK1N0b3BQ YXJhbXM9JVNUT1BQQVJBTSUNCkByZW0gJVBSVU5TUlYlIGluc3RhbGwgJnF1b3Q7JVNIT1JU TkFNRSUmcXVvdDsgJnF1b3Q7JVJVTkFTJSZxdW90OyAtLURpc3BsYXlOYW1lPSZxdW90OyVE SVNQTEFZTkFNRSUmcXVvdDsgLS1EZXNjcmlwdGlvbj0mcXVvdDslREVTQ1JJUFRJT04lJnF1 b3Q7IC0tTG9nTGV2ZWw9JnF1b3Q7JUxPR0xFVkVMJSZxdW90OyAtLUxvZ1BhdGg9JnF1b3Q7 JUxPR1BBVEglJnF1b3Q7IC0tTG9nUHJlZml4PXNlcnZpY2UgLS1TdGRPdXRwdXQ9JnF1b3Q7 JVNURE9VVCUmcXVvdDsgLS1TdGRFcnJvcj0mcXVvdDslU1RERVJSJSZxdW90OyAtLVN0YXJ0 TW9kZT1leGUgLS1TdGFydHVwPSZxdW90OyVTVEFSVFVQX01PREUlJnF1b3Q7IC0tU3RhcnRJ bWFnZT1jbWQuZXhlIC0tU3RhcnRQYXRoPSZxdW90OyVTVEFSVF9QQVRIJSZxdW90OyArK1N0 YXJ0UGFyYW1zPSZxdW90OyVTVEFSVFBBUkFNJSZxdW90OyAtLVN0b3BNb2RlPWV4ZSAtLVN0 b3BJbWFnZT1jbWQuZXhlIC0tU3RvcFBhdGg9JnF1b3Q7JVNUT1BfUEFUSCUmcXVvdDsgICsr U3RvcFBhcmFtcz0mcXVvdDslU1RPUFBBUkFNJSZxdW90Ow0KDQpAaWYgL0kgJnF1b3Q7JUlT REVCVUclJnF1b3Q7ID09ICZxdW90O3RydWUmcXVvdDsgKA0KICBAZWNobyBvZmYNCikNCg0K aWYgZXJyb3JsZXZlbCA4ICgNCiAgZWNobyBFUlJPUjogVGhlIHNlcnZpY2UgJVNIT1JUTkFN RSUgYWxyZWFkeSBleGlzdHMNCiAgZ290byBlbmRCYXRjaA0KKQ0KaWYgZXJyb3JsZXZlbCAw ICgNCiAgZWNobyBTZXJ2aWNlICVTSE9SVE5BTUUlIGluc3RhbGxlZA0KICBnb3RvIGVuZEJh dGNoDQopDQpnb3RvIGNtZEVuZA0KDQoNClJFTSB0aGUgb3RoZXIgY29tbWFuZHMgdGFrZSBh IC9uYW1lIHBhcmFtZXRlciAtIGlmIHRoZXJlIGlzIG5vIF4mbHQ7c2VydmljZW5hbWVeJmd0 OyBwYXNzZWQgYXMgc2Vjb25kIHBhcmFtZXRlciwNClJFTSB3ZSBzaWxlbnRseSBpZ25vcmUg dGhpcyBhbmQgdXNlIHRoZSBkZWZhdWx0IFNIT1JUTkFNRQ0KDQo6Y21kVW5pbnN0YWxsDQpp ZiAvSSAmcXVvdDslfjEmcXVvdDs9PSZxdW90Oy9uYW1lJnF1b3Q7ICgNCiAgaWYgbm90ICZx dW90OyV+MiZxdW90Oz09JnF1b3Q7JnF1b3Q7ICgNCiAgICBzZXQgU0hPUlROQU1FPSZxdW90 OyV+MiZxdW90Ow0KICApDQopDQolUFJVTlNSViUgc3RvcCAlU0hPUlROQU1FJQ0KaWYgZXJy b3JsZXZlbCAwICgNCiAgJVBSVU5TUlYlIGRlbGV0ZSAlU0hPUlROQU1FJQ0KICBpZiBlcnJv cmxldmVsIDAgKA0KICAgIGVjaG8gU2VydmljZSAlU0hPUlROQU1FJSB1bmluc3RhbGxlZA0K ICApDQopIGVsc2UgKA0KICBlY2hvIFVuYWJsZSB0byBzdG9wIHRoZSBzZXJ2aWNlICVTSE9S VE5BTUUlDQopDQpnb3RvIGNtZEVuZA0KDQo6Y21kU3RhcnQNCmlmIC9JICZxdW90OyV+MSZx dW90Oz09JnF1b3Q7L25hbWUmcXVvdDsgKA0KICBpZiBub3QgJnF1b3Q7JX4yJnF1b3Q7PT0m cXVvdDsmcXVvdDsgKA0KICAgIHNldCBTSE9SVE5BTUU9JnF1b3Q7JX4yJnF1b3Q7DQogICkN CikNCiVQUlVOU1JWJSBzdGFydCAlU0hPUlROQU1FJQ0KZWNobyBTZXJ2aWNlICVTSE9SVE5B TUUlIHN0YXJ0aW5nLi4uDQpnb3RvIGNtZEVuZA0KDQo6Y21kU3RvcA0KaWYgL0kgJnF1b3Q7 JX4xJnF1b3Q7PT0mcXVvdDsvbmFtZSZxdW90OyAoDQogIGlmIG5vdCAmcXVvdDslfjImcXVv dDs9PSZxdW90OyZxdW90OyAoDQogICAgc2V0IFNIT1JUTkFNRT0mcXVvdDslfjImcXVvdDsN CiAgKQ0KKQ0KJVBSVU5TUlYlIHN0b3AgJVNIT1JUTkFNRSUNCmVjaG8gU2VydmljZSAlU0hP UlROQU1FJSBzdG9wcGluZy4uLg0KZ290byBjbWRFbmQNCg0KOmNtZFJlc3RhcnQNCmlmIC9J ICZxdW90OyV+MSZxdW90Oz09JnF1b3Q7L25hbWUmcXVvdDsgKA0KICBpZiBub3QgJnF1b3Q7 JX4yJnF1b3Q7PT0mcXVvdDsmcXVvdDsgKA0KICAgIHNldCBTSE9SVE5BTUU9JnF1b3Q7JX4y JnF1b3Q7DQogICkNCikNCiVQUlVOU1JWJSBzdG9wICVTSE9SVE5BTUUlDQplY2hvIFNlcnZp Y2UgJVNIT1JUTkFNRSUgc3RvcHBpbmcuLi4NCmlmICZxdW90OyVlcnJvcmxldmVsJSZxdW90 OyA9PSAmcXVvdDswJnF1b3Q7ICgNCiAgJVBSVU5TUlYlIHN0YXJ0ICVTSE9SVE5BTUUlDQog IGVjaG8gU2VydmljZSAlU0hPUlROQU1FJSBzdGFydGluZy4uLg0KKSBlbHNlICgNCiAgZWNo byBVbmFibGUgdG8gc3RvcCB0aGUgc2VydmljZSAlU0hPUlROQU1FJQ0KKQ0KZ290byBjbWRF bmQNCg0KDQo6Y21kRW5kDQpSRU0gaWYgdGhlcmUgaXMgYSBuZWVkIHRvIGFkZCBvdGhlciBl cnJvciBtZXNzYWdlcywgbWFrZSBzdXJlIHRvIGxpc3QgaGlnaGVyIG51bWJlcnMgZmlyc3Qg IQ0KaWYgZXJyb3JsZXZlbCAyICgNCiAgZWNobyBFUlJPUjogRmFpbGVkIHRvIGxvYWQgc2Vy dmljZSAlU0hPUlROQU1FJSBjb25maWd1cmF0aW9uDQogIGdvdG8gZW5kQmF0Y2gNCikNCmlm IGVycm9ybGV2ZWwgMCAoDQogIGdvdG8gZW5kQmF0Y2gNCikNCmVjaG8gJnF1b3Q7VW5mb3Jz ZWVuIGVycm9yPSVlcnJvcmxldmVsJSZxdW90Ow0KDQpyZW0gbm90aGluZyBiZWxvdywgZXhp dA0KOmVuZEJhdGNoDQo8L2NvZGU+PC9wcmU+DQo=

Tuesday, October 11, 2016

Install PostgeSQL on Ubuntu 16.04

Based on https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-16-04

Install PosgreSQL:

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib
  • Find out where configuration files are stored:

sudo -u postgres psql # use \q to exit

show config_file; # somethis like /etc/postgresql/9.5/main...
\q
  • Cchange in posgresql.config

    • #listen_addresses = 'localhost' # what IP address(es) to listen on;
    • to listen_addresses = '*' # what IP address(es) to listen on;
  • Add in pg_hba.conf

    • host all all 10.0.0.0/8 md5 Change through psql the password for database login postgres:
    • \password postgres
  • Restart postgresql:

    • exit (to logout from postgres user session)
    • systemctl restart postgreql
IyBJbnN0YWxsIFBvc3RnZVNRTCBvbiBVYnVudHUgMTYuMDQNCg0KQmFzZWQgb24gW2h0dHBzOi8vd3d3LmRpZ2l0YWxvY2Vhbi5jb20vY29tbXVuaXR5L3R1dG9yaWFscy9ob3ctdG8taW5zdGFsbC1hbmQtdXNlLXBvc3RncmVzcWwtb24tdWJ1bnR1LTE2LTA0XShodHRwczovL3d3dy5kaWdpdGFsb2NlYW4uY29tL2NvbW11bml0eS90dXRvcmlhbHMvaG93LXRvLWluc3RhbGwtYW5kLXVzZS1wb3N0Z3Jlc3FsLW9uLXVidW50dS0xNi0wNCAiSW5zdGFsbCIpDQoNCkluc3RhbGwgUG9zZ3JlU1FMOg0KYGBgDQpzdWRvIGFwdC1nZXQgdXBkYXRlDQpzdWRvIGFwdC1nZXQgaW5zdGFsbCBwb3N0Z3Jlc3FsIHBvc3RncmVzcWwtY29udHJpYg0KYGBgDQoNCi0gRmluZCBvdXQgd2hlcmUgY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgc3RvcmVkOg0KDQpzdWRvIC11IHBvc3RncmVzIHBzcWwgIyB1c2UgXHEgdG8gZXhpdA0KDQpgYGANCnNob3cgY29uZmlnX2ZpbGU7ICMgc29tZXRoaXMgbGlrZSAvZXRjL3Bvc3RncmVzcWwvOS41L21haW4uLi4NClxxDQpgYGANCg0KLSBDY2hhbmdlIGluIHBvc2dyZXNxbC5jb25maWcNCgktIGAjbGlzdGVuX2FkZHJlc3NlcyA9ICdsb2NhbGhvc3QnCQkjIHdoYXQgSVAgYWRkcmVzcyhlcykgdG8gbGlzdGVuIG9uO2ANCgktIHRvIGBsaXN0ZW5fYWRkcmVzc2VzID0gJyonCQkjIHdoYXQgSVAgYWRkcmVzcyhlcykgdG8gbGlzdGVuIG9uO2ANCg0KLSBBZGQgaW4gcGdfaGJhLmNvbmYNCgktIGhvc3QgICAgYWxsICAgICAgICAgICAgIGFsbCAgICAgICAgICAgICAxMC4wLjAuMC84ICAgICAgICAgICAgICBtZDUNCkNoYW5nZSB0aHJvdWdoIGBwc3FsYCB0aGUgcGFzc3dvcmQgZm9yIGRhdGFiYXNlIGxvZ2luIHBvc3RncmVzOg0KCS0gXHBhc3N3b3JkIHBvc3RncmVzDQoNCi0gUmVzdGFydCBwb3N0Z3Jlc3FsOg0KCS0gZXhpdCAodG8gbG9nb3V0IGZyb20gcG9zdGdyZXMgdXNlciBzZXNzaW9uKQ0KCS0gc3lzdGVtY3RsIHJlc3RhcnQgcG9zdGdyZXFs

Install Wildfly 10.1 on Ubuntu Server 16.04

Install Wildfly 10.1 on Ubuntu 16.04

Be sure to use the same Java version as the one used as compilation target of generated WAR.

Run the following script:

sudo apt-get update
apt install software-properties-common
add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

cd /tmp
wget http://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.tar.gz
tar -xzvf wildfly-10.1.0.Final.tar.gz
mv wildfly-10.1.0.Final wildfly
cp -R  wildfly /opt/

groupadd -r wildfly
useradd -r -g wildfly -d /opt/wildfly -s /sbin/nologin wildfly
chown -R wildfly:wildfly /opt/wildfly

cd wildfly/docs/contrib/scripts/systemd

mkdir /etc/wildfly
cp wildfly.conf /etc/wildfly/
cp wildfly.service /etc/systemd/system/
cp launch.sh /opt/wildfly/bin/
chmod +x /opt/wildfly/bin/launch.sh

# do not launch wildfly through standalone.sh->it will screw up file permissions

systemctl start wildfly.service
systemctl enable wildfly.service
  • Watch out for CRLF EndOfLine (should be just LFs)
  • Check that Wildfly is running through systemctl status wildfly

In order to check from outside current VM/physical machine that Wildfly was started change standalone.xml content so that:

        <interface name="public">
            <any-address/>
        </interface>

There might be required some other changes to the default distribution. Besure that wildfly user is owner all added items (chown -R wildfly:wildfly /opt/wildfly/modules)

Add EclipseLink Support

  • Download eclipselink.jar to modules\system\layers\base\org\eclipse\persistence\main
  • Change module.xml so that:
    <resources>
        <resource-root path="jipijapa-eclipselink-10.1.0.Final.jar"/>
        <resource-root path="eclipselink.jar">
            <filter>
                <exclude path="javax/**" />
            </filter>
        </resource-root>
    </resources>

Add SQL Server support

  • Create modules\system\layers\base\com\microsoft\sqlserver\jdbc\main
  • Download sqljdbc4.jar
  • Create module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="com.microsoft.sqlserver.jdbc">
    <resources>
        <resource-root path="sqljdbc4.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>

Add PostgreSQL Support

  • Create modules\system\layers\base\org\postgresql\main
  • Download latest JDBC PostgreSQL driver
  • Create module.xml(change driver name acordingly):
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="org.postgresql">
    <resources>
        <!-- Make sure this matches the name of the JAR you are installing -->
        <resource-root path="postgresql-9.4-1202.jdbc4.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.servlet.api" optional="true"/>
    </dependencies>
</module>

Restart Wildfly...

Velocity Note

If some of the used components in generated WAR use Velocity you will encounter the following error in server.log (during hot deployment or Wildfly restart): Error configuring AvalonLogSystem : java.io.FileNotFoundException: /velocity.log (Permission denied). This is due to the fact that velocity.properties (as found in velocity jar, path org\apache\velocity\runtime\defaults\ states:

runtime.log = velocity.log

The quick solution is to create an empty velocity.log file in the root of your file system with full access (?) for wildfly user.

IyBJbnN0YWxsIFdpbGRmbHkgMTAuMSBvbiBVYnVudHUgMTYuMDQNCg0KKipCZSBzdXJlIHRvIHVzZSB0aGUgc2FtZSBKYXZhIHZlcnNpb24gYXMgdGhlIG9uZSB1c2VkIGFzIGNvbXBpbGF0aW9uIHRhcmdldCBvZiBnZW5lcmF0ZWQgV0FSLioqDQoNClJ1biB0aGUgZm9sbG93aW5nIHNjcmlwdDoNCmBgYA0Kc3VkbyBhcHQtZ2V0IHVwZGF0ZQ0KYXB0IGluc3RhbGwgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24NCmFkZC1hcHQtcmVwb3NpdG9yeSBwcGE6d2VidXBkOHRlYW0vamF2YQ0Kc3VkbyBhcHQtZ2V0IHVwZGF0ZQ0Kc3VkbyBhcHQtZ2V0IGluc3RhbGwgb3JhY2xlLWphdmE4LWluc3RhbGxlcg0KDQpjZCAvdG1wDQp3Z2V0IGh0dHA6Ly9kb3dubG9hZC5qYm9zcy5vcmcvd2lsZGZseS8xMC4xLjAuRmluYWwvd2lsZGZseS0xMC4xLjAuRmluYWwudGFyLmd6DQp0YXIgLXh6dmYgd2lsZGZseS0xMC4xLjAuRmluYWwudGFyLmd6DQptdiB3aWxkZmx5LTEwLjEuMC5GaW5hbCB3aWxkZmx5DQpjcCAtUiAgd2lsZGZseSAvb3B0Lw0KDQpncm91cGFkZCAtciB3aWxkZmx5DQp1c2VyYWRkIC1yIC1nIHdpbGRmbHkgLWQgL29wdC93aWxkZmx5IC1zIC9zYmluL25vbG9naW4gd2lsZGZseQ0KY2hvd24gLVIgd2lsZGZseTp3aWxkZmx5IC9vcHQvd2lsZGZseQ0KDQpjZCB3aWxkZmx5L2RvY3MvY29udHJpYi9zY3JpcHRzL3N5c3RlbWQNCg0KbWtkaXIgL2V0Yy93aWxkZmx5DQpjcCB3aWxkZmx5LmNvbmYgL2V0Yy93aWxkZmx5Lw0KY3Agd2lsZGZseS5zZXJ2aWNlIC9ldGMvc3lzdGVtZC9zeXN0ZW0vDQpjcCBsYXVuY2guc2ggL29wdC93aWxkZmx5L2Jpbi8NCmNobW9kICt4IC9vcHQvd2lsZGZseS9iaW4vbGF1bmNoLnNoDQoNCiMgZG8gbm90IGxhdW5jaCB3aWxkZmx5IHRocm91Z2ggc3RhbmRhbG9uZS5zaC0+aXQgd2lsbCBzY3JldyB1cCBmaWxlIHBlcm1pc3Npb25zDQoNCnN5c3RlbWN0bCBzdGFydCB3aWxkZmx5LnNlcnZpY2UNCnN5c3RlbWN0bCBlbmFibGUgd2lsZGZseS5zZXJ2aWNlDQpgYGANCg0KLSBXYXRjaCBvdXQgZm9yIENSTEYgRW5kT2ZMaW5lIChzaG91bGQgYmUganVzdCBMRnMpDQotIENoZWNrIHRoYXQgV2lsZGZseSBpcyBydW5uaW5nIHRocm91Z2ggYHN5c3RlbWN0bCBzdGF0dXMgd2lsZGZseWANCg0KSW4gb3JkZXIgdG8gY2hlY2sgZnJvbSBvdXRzaWRlIGN1cnJlbnQgVk0vcGh5c2ljYWwgbWFjaGluZSB0aGF0IFdpbGRmbHkgd2FzIHN0YXJ0ZWQgY2hhbmdlIHN0YW5kYWxvbmUueG1sIGNvbnRlbnQgc28gdGhhdDoNCmBgYHhtbA0KICAgICAgICA8aW50ZXJmYWNlIG5hbWU9InB1YmxpYyI+DQogICAgICAgICAgICA8YW55LWFkZHJlc3MvPg0KICAgICAgICA8L2ludGVyZmFjZT4NCmBgYA0KVGhlcmUgbWlnaHQgYmUgcmVxdWlyZWQgc29tZSBvdGhlciBjaGFuZ2VzIHRvIHRoZSBkZWZhdWx0IGRpc3RyaWJ1dGlvbi4gQmVzdXJlIHRoYXQgd2lsZGZseSB1c2VyIGlzIG93bmVyIGFsbCBhZGRlZCBpdGVtcyAoYGNob3duIC1SIHdpbGRmbHk6d2lsZGZseSAvb3B0L3dpbGRmbHkvbW9kdWxlc2ApDQoNCiMjIEFkZCBFY2xpcHNlTGluayBTdXBwb3J0DQoNCi0gRG93bmxvYWQgZWNsaXBzZWxpbmsuamFyIHRvIGBtb2R1bGVzXHN5c3RlbVxsYXllcnNcYmFzZVxvcmdcZWNsaXBzZVxwZXJzaXN0ZW5jZVxtYWluYA0KLSBDaGFuZ2UgYG1vZHVsZS54bWxgIHNvIHRoYXQ6DQpgYGB4bWwNCiAgICA8cmVzb3VyY2VzPg0KICAgICAgICA8cmVzb3VyY2Utcm9vdCBwYXRoPSJqaXBpamFwYS1lY2xpcHNlbGluay0xMC4xLjAuRmluYWwuamFyIi8+DQoJCTxyZXNvdXJjZS1yb290IHBhdGg9ImVjbGlwc2VsaW5rLmphciI+DQoJCQk8ZmlsdGVyPg0KCQkJCTxleGNsdWRlIHBhdGg9ImphdmF4LyoqIiAvPg0KCQkJPC9maWx0ZXI+DQoJCTwvcmVzb3VyY2Utcm9vdD4NCiAgICA8L3Jlc291cmNlcz4NCmBgYA0KDQojIyBBZGQgU1FMIFNlcnZlciBzdXBwb3J0DQoNCi0gQ3JlYXRlIGBtb2R1bGVzXHN5c3RlbVxsYXllcnNcYmFzZVxjb21cbWljcm9zb2Z0XHNxbHNlcnZlclxqZGJjXG1haW5gDQotIERvd25sb2FkIGBzcWxqZGJjNC5qYXJgDQotIENyZWF0ZSBgbW9kdWxlLnhtbGA6DQpgYGB4bWwNCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQo8bW9kdWxlIHhtbG5zPSJ1cm46amJvc3M6bW9kdWxlOjEuMyIgbmFtZT0iY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYyI+DQogICAgPHJlc291cmNlcz4NCiAgICAgICAgPHJlc291cmNlLXJvb3QgcGF0aD0ic3FsamRiYzQuamFyIi8+DQogICAgPC9yZXNvdXJjZXM+DQogICAgPGRlcGVuZGVuY2llcz4NCiAgICAgICAgPG1vZHVsZSBuYW1lPSJqYXZheC5hcGkiLz4NCiAgICAgICAgPG1vZHVsZSBuYW1lPSJqYXZheC50cmFuc2FjdGlvbi5hcGkiLz4NCiAgICA8L2RlcGVuZGVuY2llcz4NCjwvbW9kdWxlPg0KYGBgIA0KDQojIyBBZGQgUG9zdGdyZVNRTCBTdXBwb3J0DQoNCg0KLSBDcmVhdGUgYG1vZHVsZXNcc3lzdGVtXGxheWVyc1xiYXNlXG9yZ1xwb3N0Z3Jlc3FsXG1haW5gDQotIERvd25sb2FkIGxhdGVzdCBKREJDIFBvc3RncmVTUUwgZHJpdmVyDQotIENyZWF0ZSBgbW9kdWxlLnhtbGAoY2hhbmdlIGRyaXZlciBuYW1lIGFjb3JkaW5nbHkpOg0KYGBgeG1sDQo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KPG1vZHVsZSB4bWxucz0idXJuOmpib3NzOm1vZHVsZToxLjMiIG5hbWU9Im9yZy5wb3N0Z3Jlc3FsIj4NCiAgICA8cmVzb3VyY2VzPg0KICAgICAgICA8IS0tIE1ha2Ugc3VyZSB0aGlzIG1hdGNoZXMgdGhlIG5hbWUgb2YgdGhlIEpBUiB5b3UgYXJlIGluc3RhbGxpbmcgLS0+DQogICAgICAgIDxyZXNvdXJjZS1yb290IHBhdGg9InBvc3RncmVzcWwtOS40LTEyMDIuamRiYzQuamFyIi8+DQogICAgPC9yZXNvdXJjZXM+DQogICAgPGRlcGVuZGVuY2llcz4NCiAgICAgICAgPG1vZHVsZSBuYW1lPSJqYXZheC5hcGkiLz4NCiAgICAgICAgPG1vZHVsZSBuYW1lPSJqYXZheC50cmFuc2FjdGlvbi5hcGkiLz4NCiAgICAgICAgPG1vZHVsZSBuYW1lPSJqYXZheC5zZXJ2bGV0LmFwaSIgb3B0aW9uYWw9InRydWUiLz4NCiAgICA8L2RlcGVuZGVuY2llcz4NCjwvbW9kdWxlPg0KYGBgDQoNCiMjIFJlc3RhcnQgV2lsZGZseS4uLg0KDQojIyBWZWxvY2l0eSBOb3RlDQoNCklmIHNvbWUgb2YgdGhlIHVzZWQgY29tcG9uZW50cyBpbiBnZW5lcmF0ZWQgV0FSIHVzZSBWZWxvY2l0eSB5b3Ugd2lsbCBlbmNvdW50ZXIgdGhlIGZvbGxvd2luZyBlcnJvciBpbiBzZXJ2ZXIubG9nIChkdXJpbmcgaG90IGRlcGxveW1lbnQgb3IgV2lsZGZseSByZXN0YXJ0KTogYEVycm9yIGNvbmZpZ3VyaW5nIEF2YWxvbkxvZ1N5c3RlbSA6IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOiAvdmVsb2NpdHkubG9nIChQZXJtaXNzaW9uIGRlbmllZClgLiBUaGlzIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHZlbG9jaXR5LnByb3BlcnRpZXMgKGFzIGZvdW5kIGluIHZlbG9jaXR5IGphciwgcGF0aCBgb3JnXGFwYWNoZVx2ZWxvY2l0eVxydW50aW1lXGRlZmF1bHRzXGAgc3RhdGVzOg0KYGBgDQpydW50aW1lLmxvZyA9IHZlbG9jaXR5LmxvZw0KYGBgDQpUaGUgcXVpY2sgc29sdXRpb24gaXMgdG8gY3JlYXRlIGFuIGVtcHR5IGB2ZWxvY2l0eS5sb2dgIGZpbGUgaW4gdGhlIHJvb3Qgb2YgeW91ciBmaWxlIHN5c3RlbSB3aXRoIGZ1bGwgYWNjZXNzICg/KSBmb3Igd2lsZGZseSB1c2VyLg0KIA==

Thursday, October 6, 2016

Graylog2 & MongoDB

Graylog uses an instance of MongoDB as a configuration repository. Browsing data can be done (for instance) by using Robomango:

  • Install Robomango, free edition (Robomango)
  • Configure a connection, providing Address (IP or FQDN) and Port (27017)
  • Happy browsing!
R3JheWxvZyB1c2VzIGFuIGluc3RhbmNlIG9mIE1vbmdvREIgYXMgYSBjb25maWd1cmF0aW9uIHJlcG9zaXRvcnkuIEJyb3dzaW5nIGRhdGEgY2FuIGJlIGRvbmUgKGZvciBpbnN0YW5jZSkgYnkgdXNpbmcgUm9ib21hbmdvOg0KDQotIEluc3RhbGwgUm9ib21hbmdvLCBmcmVlIGVkaXRpb24gKFtSb2JvbWFuZ29dKGh0dHBzOi8vcm9ib21vbmdvLm9yZy9idXkpKQ0KLSBDb25maWd1cmUgYSBjb25uZWN0aW9uLCBwcm92aWRpbmcgQWRkcmVzcyAoSVAgb3IgRlFETikgYW5kIFBvcnQgKDI3MDE3KQ0KLSBIYXBweSBicm93c2luZyE=

Graylog2 Rules

Running server side rules that drop/enrich messages is quite simple:

  • edit /opt/graylog/conf/graylog.conf by adding the following line rules_file = /opt/graylog/conf/rules.drl (there is special empty section starting with the comment # Drools Rule File (Use to rewrite incoming log messages)
  • add /opt/graylog/conf/rules.drl file with the appropriate content
  • restart graylog (sudo graylog-ctl start, etc.)

Sample rules file

import org.graylog2.plugin.Message
import java.util.regex.Matcher
import java.util.regex.Pattern

rule "WildFly10"
  when
      m : Message( getField("source_id") == "WildFly10" )
  then
      Matcher matcher = Pattern.compile("^\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2},\\d{3}\\s(\\w+)").matcher(m.getMessage());
      if (matcher.find()) {
         m.addField("event-level", matcher.group(1));
      }
end
UnVubmluZyBzZXJ2ZXIgc2lkZSBydWxlcyB0aGF0IGRyb3AvZW5yaWNoIG1lc3NhZ2VzIGlzIHF1aXRlIHNpbXBsZToNCg0KLSBlZGl0IGAvb3B0L2dyYXlsb2cvY29uZi9ncmF5bG9nLmNvbmZgIGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIGxpbmUgYHJ1bGVzX2ZpbGUgPSAvb3B0L2dyYXlsb2cvY29uZi9ydWxlcy5kcmxgICh0aGVyZSBpcyBzcGVjaWFsIGVtcHR5IHNlY3Rpb24gc3RhcnRpbmcgd2l0aCB0aGUgY29tbWVudCBgIyBEcm9vbHMgUnVsZSBGaWxlIChVc2UgdG8gcmV3cml0ZSBpbmNvbWluZyBsb2cgbWVzc2FnZXMpYA0KLSBhZGQgYC9vcHQvZ3JheWxvZy9jb25mL3J1bGVzLmRybGAgZmlsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50DQotIHJlc3RhcnQgZ3JheWxvZyAoYHN1ZG8gZ3JheWxvZy1jdGwgc3RhcnRgLCBldGMuKQ0KDQpTYW1wbGUgcnVsZXMgZmlsZQ0KYGBgDQppbXBvcnQgb3JnLmdyYXlsb2cyLnBsdWdpbi5NZXNzYWdlDQppbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXINCmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybg0KDQpydWxlICJXaWxkRmx5MTAiDQogIHdoZW4NCiAgICAgIG0gOiBNZXNzYWdlKCBnZXRGaWVsZCgic291cmNlX2lkIikgPT0gIldpbGRGbHkxMCIgKQ0KICB0aGVuDQogICAgICBNYXRjaGVyIG1hdGNoZXIgPSBQYXR0ZXJuLmNvbXBpbGUoIl5cXGR7NH0tXFxkezJ9LVxcZHsyfVxcc1xcZHsyfTpcXGR7Mn06XFxkezJ9LFxcZHszfVxccyhcXHcrKSIpLm1hdGNoZXIobS5nZXRNZXNzYWdlKCkpOw0KICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7DQogICAgICAgICBtLmFkZEZpZWxkKCJldmVudC1sZXZlbCIsIG1hdGNoZXIuZ3JvdXAoMSkpOw0KICAgICAgfQ0KZW5kDQpgYGANCg==

Graylog2 Collector

The new approach

Server side controlled configuration

Staring with Graylog 2 the a new collector approach (Graylog Collector Sidecar) is proposed, based on wrapping NXLog.

Installation is straightforward, as indicated in online documents (sample for Windows, a later post might share Ubuntu experience).

Install NXLog:

  • Download NXLog Windows installation kit NXLog downloads
  • Run the installer
  • Run (as an administrator) "C:\Program Files (x86)\nxlog\nxlog.exe" -u; this will un-install nxlog as a service but will keep binaries

Now download and install latest collector-sidecar binaries (Collector-Sidecar releases)

Before installing/starting the collector as a service:

  • On the server administration site go to System->Collectors->Manage Configurations
  • Add a configuration with a meaningful name
    • Add one or more relevant tags
    • Add an Output (by choosing from already configured Inputs)
    • Add one or more inputs; for file type inputs you can check the multi-line option and provide a RegEx for the start pattern, like /^\d{2}\.\d{2}\.\d{4}/ (notice enclosing slashes!)

Go back to the monitored computer and edit C:\Program Files (x86)\graylog\collector-sidecar\collector-sidecar.yaml:

  • update server_url
  • update to a meaningful name the node_id
  • add one of the tags previously defined in the tags list
  • install and start the service (run as administrator):
    • "C:\Program Files (x86)\graylog\collector-sidecar\graylog-collector-sidecar.exe" -service install
    • "C:\Program Files (x86)\graylog\collector-sidecar\graylog-collector-sidecar.exe" -service start

*Service can be started/stopped also from Task manager (Services tab, collector-sidecar Name) or from Services Manager (Graylog collector sidecar Display name).

Now we should have automatically created, based on the previously defined configuration, the nxlog configuration file C:\Program Files (x86)\graylog\collector-sidecar\generated\nxlog.conf and in administration site the collector should be listed in System->Collectors section.

Please notice that if there is some error in the yaml configuration file the service will not start and no error message will be logged (it happened to me if I commented the tags list, see next section)

Locally controlled configuration

Under certain conditions you might need to use advanced NXLog features which are not supported by the server side configuration. You can do the following trick:

  • Start with the approach described in the previous section and check that everything goes fine; at this moment we should have a valid NXLog configuration file
  • Move the configuration file in another directory and change the configuration_path value to that file
  • Remove all valid tags and add a dummy one that does not exists in server side configuration; do not remove the tags entry or leave the list empty since the collector will not start and no error message will be logged
  • Restart the collector-sidecar service
  • If everything works as expected, read carefully the NXLog manual and do your own enhancements to the configuration
  • Restart the collector-sidecar service

I applied the approach because I needed an aditional message field (Exec $source_id = 'WildFly10';) source_id for one of the inputs, like shown below.

<Input 576d1d3d659fb107f722db38>
    Module im_file
    File "C:\Java\wildfly-10.0.0.Final\standalone\log\server.log"
    PollInterval 1
    SavePos True
    ReadFromLast True
    Recursive False
    RenameCheck False
    Exec $FileName = file_name(); # Send file name with each message
    Exec $source_id = 'WildFly10';
    InputType 576d1d3d659fb107f722db38-multiline
</Input>

The full yaml configuration file content:

server_url: http://graylog.mycompany.local:12900
tls_skip_verify: false
node_id: graylog-collector-sidecar-devsrv
collector_id: file:C:\Program Files (x86)\graylog\collector-sidecar\collector-id
tags:
    - undefined
log_path: C:\Program Files (x86)\graylog\collector-sidecar
update_interval: 10
backends:
    - name: nxlog
      enabled: true
      binary_path: C:\Program Files (x86)\nxlog\nxlog.exe
#      configuration_path: C:\Program Files (x86)\graylog\collector-sidecar\generated\nxlog.conf
      configuration_path: C:\Program Files (x86)\graylog\collector-sidecar\conf\nxlog.conf

As an alternate approach (I haven't tested but it should work) is to go for the first option (server side controlled configuration) but instead of defining Outputs/Inputs just place all nxlog.conf content in the default nxlog snippet, in the Windows section. Be sure you have in sync the collector side client_id with the one in the nxlog.conf content, Output section (see Exec $gl2_source_collector = '0324bd79-b9a9-458e-9977-d0eecbd2d347';):

<Output 576cf426659fb107f722b011>
    Module om_tcp
    Host graylog.mycompany.local
    Port 12201
    OutputType  GELF_TCP
    Exec $short_message = $raw_event; # Avoids truncation of the short_message field.
    Exec $gl2_source_collector = '0324bd79-b9a9-458e-9977-d0eecbd2d347';
    Exec $Hostname = hostname_fqdn();
</Output>

Duplicate configuration on another server

Once we have a collector configured we can duplicate easily the installation on another one:

  • Perform the NXLog installation steps
  • Install the collector-sidecar (just run the setup)
  • Copy yaml and nxlog.conf files on the target server
  • Change the yaml to reflect the right node_id
  • Change the content of the collector-id with some unique string (a GUID?)
  • Change the nxlog.conf Output tag to reflect the collector-id value
IyBUaGUgbmV3IGFwcHJvYWNoDQoNCiMjIFNlcnZlciBzaWRlIGNvbnRyb2xsZWQgY29uZmlndXJhdGlvbg0KDQpTdGFyaW5nIHdpdGggR3JheWxvZyAyIHRoZSBhIG5ldyBjb2xsZWN0b3IgYXBwcm9hY2ggKGBHcmF5bG9nIENvbGxlY3RvciBTaWRlY2FyYCkgaXMgcHJvcG9zZWQsIGJhc2VkIG9uIHdyYXBwaW5nIGBOWExvZ2AuDQoNCkluc3RhbGxhdGlvbiBpcyBzdHJhaWdodGZvcndhcmQsIGFzIGluZGljYXRlZCBpbiBvbmxpbmUgZG9jdW1lbnRzIChzYW1wbGUgZm9yIFdpbmRvd3MsIGEgbGF0ZXIgcG9zdCBtaWdodCBzaGFyZSBVYnVudHUgZXhwZXJpZW5jZSkuDQoNCkluc3RhbGwgTlhMb2c6DQoNCi0gRG93bmxvYWQgTlhMb2cgV2luZG93cyBpbnN0YWxsYXRpb24ga2l0IFtOWExvZyBkb3dubG9hZHNdKGh0dHBzOi8vbnhsb2cub3JnL3Byb2R1Y3RzL254bG9nLWNvbW11bml0eS1lZGl0aW9uL2Rvd25sb2FkICJOWExvZyBkb3dubG9hZHMiKQ0KLSBSdW4gdGhlIGluc3RhbGxlcg0KLSBSdW4gKGFzIGFuIGFkbWluaXN0cmF0b3IpIGAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxueGxvZ1xueGxvZy5leGUiIC11YDsgdGhpcyB3aWxsIHVuLWluc3RhbGwgYG54bG9nYCBhcyBhIHNlcnZpY2UgYnV0IHdpbGwga2VlcCBiaW5hcmllcw0KDQpOb3cgZG93bmxvYWQgYW5kIGluc3RhbGwgbGF0ZXN0IGNvbGxlY3Rvci1zaWRlY2FyIGJpbmFyaWVzIChbQ29sbGVjdG9yLVNpZGVjYXIgcmVsZWFzZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9HcmF5bG9nMi9jb2xsZWN0b3Itc2lkZWNhci9yZWxlYXNlcykpDQoNCkJlZm9yZSBpbnN0YWxsaW5nL3N0YXJ0aW5nIHRoZSBjb2xsZWN0b3IgYXMgYSBzZXJ2aWNlOg0KDQotIE9uIHRoZSBzZXJ2ZXIgYWRtaW5pc3RyYXRpb24gc2l0ZSBnbyB0byBTeXN0ZW0tPkNvbGxlY3RvcnMtPk1hbmFnZSBDb25maWd1cmF0aW9ucw0KLSBBZGQgYSBjb25maWd1cmF0aW9uIHdpdGggYSBtZWFuaW5nZnVsIG5hbWUNCgktIEFkZCBvbmUgb3IgbW9yZSByZWxldmFudCB0YWdzDQoJLSBBZGQgYW4gT3V0cHV0IChieSBjaG9vc2luZyBmcm9tIGFscmVhZHkgY29uZmlndXJlZCBJbnB1dHMpDQoJLSBBZGQgb25lIG9yIG1vcmUgaW5wdXRzOyBmb3IgZmlsZSB0eXBlIGlucHV0cyB5b3UgY2FuIGNoZWNrIHRoZSBtdWx0aS1saW5lIG9wdGlvbiBhbmQgcHJvdmlkZSBhIFJlZ0V4IGZvciB0aGUgc3RhcnQgcGF0dGVybiwgbGlrZSBgL15cZHsyfVwuXGR7Mn1cLlxkezR9L2AgKG5vdGljZSBlbmNsb3Npbmcgc2xhc2hlcyEpDQoNCkdvIGJhY2sgdG8gdGhlIG1vbml0b3JlZCBjb21wdXRlciBhbmQgZWRpdCBgQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxncmF5bG9nXGNvbGxlY3Rvci1zaWRlY2FyXGNvbGxlY3Rvci1zaWRlY2FyLnlhbWxgOg0KDQotIHVwZGF0ZSBzZXJ2ZXJfdXJsDQotIHVwZGF0ZSB0byBhIG1lYW5pbmdmdWwgbmFtZSB0aGUgbm9kZV9pZA0KLSBhZGQgb25lIG9mIHRoZSB0YWdzIHByZXZpb3VzbHkgZGVmaW5lZCBpbiB0aGUgdGFncyBsaXN0DQotIGluc3RhbGwgYW5kIHN0YXJ0IHRoZSBzZXJ2aWNlIChydW4gYXMgYWRtaW5pc3RyYXRvcik6DQoJLSBgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcZ3JheWxvZ1xjb2xsZWN0b3Itc2lkZWNhclxncmF5bG9nLWNvbGxlY3Rvci1zaWRlY2FyLmV4ZSIgLXNlcnZpY2UgaW5zdGFsbGANCgktIGAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxncmF5bG9nXGNvbGxlY3Rvci1zaWRlY2FyXGdyYXlsb2ctY29sbGVjdG9yLXNpZGVjYXIuZXhlIiAtc2VydmljZSBzdGFydGANCg0KKlNlcnZpY2UgY2FuIGJlIHN0YXJ0ZWQvc3RvcHBlZCBhbHNvIGZyb20gVGFzayBtYW5hZ2VyIChTZXJ2aWNlcyB0YWIsIGBjb2xsZWN0b3Itc2lkZWNhcmAgTmFtZSkgb3IgZnJvbSBTZXJ2aWNlcyBNYW5hZ2VyIChgR3JheWxvZyBjb2xsZWN0b3Igc2lkZWNhcmAgRGlzcGxheSBuYW1lKS4NCg0KTm93IHdlIHNob3VsZCBoYXZlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCwgYmFzZWQgb24gdGhlIHByZXZpb3VzbHkgZGVmaW5lZCBjb25maWd1cmF0aW9uLCB0aGUgbnhsb2cgY29uZmlndXJhdGlvbiBmaWxlIGBDOlxQcm9ncmFtIEZpbGVzICh4ODYpXGdyYXlsb2dcY29sbGVjdG9yLXNpZGVjYXJcZ2VuZXJhdGVkXG54bG9nLmNvbmZgIGFuZCBpbiBhZG1pbmlzdHJhdGlvbiBzaXRlIHRoZSBjb2xsZWN0b3Igc2hvdWxkIGJlIGxpc3RlZCBpbiBTeXN0ZW0tPkNvbGxlY3RvcnMgc2VjdGlvbi4NCg0KUGxlYXNlIG5vdGljZSB0aGF0IGlmIHRoZXJlIGlzIHNvbWUgZXJyb3IgaW4gdGhlIHlhbWwgY29uZmlndXJhdGlvbiBmaWxlIHRoZSBzZXJ2aWNlIHdpbGwgbm90IHN0YXJ0IGFuZCBubyBlcnJvciBtZXNzYWdlIHdpbGwgYmUgbG9nZ2VkIChpdCBoYXBwZW5lZCB0byBtZSBpZiBJIGNvbW1lbnRlZCB0aGUgdGFncyBsaXN0LCBzZWUgbmV4dCBzZWN0aW9uKQ0KDQojIyBMb2NhbGx5IGNvbnRyb2xsZWQgY29uZmlndXJhdGlvbg0KDQpVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgeW91IG1pZ2h0IG5lZWQgdG8gdXNlIGFkdmFuY2VkIE5YTG9nIGZlYXR1cmVzIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgc2lkZSBjb25maWd1cmF0aW9uLiBZb3UgY2FuIGRvIHRoZSBmb2xsb3dpbmcgdHJpY2s6DQotIFN0YXJ0IHdpdGggdGhlIGFwcHJvYWNoIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiBhbmQgY2hlY2sgdGhhdCBldmVyeXRoaW5nIGdvZXMgZmluZTsgYXQgdGhpcyBtb21lbnQgd2Ugc2hvdWxkIGhhdmUgYSB2YWxpZCBOWExvZyBjb25maWd1cmF0aW9uIGZpbGUNCi0gTW92ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGluIGFub3RoZXIgZGlyZWN0b3J5IGFuZCBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb25fcGF0aCB2YWx1ZSB0byB0aGF0IGZpbGUNCi0gUmVtb3ZlIGFsbCB2YWxpZCB0YWdzIGFuZCBhZGQgYSBkdW1teSBvbmUgdGhhdCBkb2VzIG5vdCBleGlzdHMgaW4gc2VydmVyIHNpZGUgY29uZmlndXJhdGlvbjsgZG8gbm90IHJlbW92ZSB0aGUgdGFncyBlbnRyeSBvciBsZWF2ZSB0aGUgbGlzdCBlbXB0eSBzaW5jZSB0aGUgY29sbGVjdG9yIHdpbGwgbm90IHN0YXJ0IGFuZCBubyBlcnJvciBtZXNzYWdlIHdpbGwgYmUgbG9nZ2VkDQotIFJlc3RhcnQgdGhlIGNvbGxlY3Rvci1zaWRlY2FyIHNlcnZpY2UNCi0gSWYgZXZlcnl0aGluZyB3b3JrcyBhcyBleHBlY3RlZCwgcmVhZCBjYXJlZnVsbHkgdGhlIE5YTG9nIG1hbnVhbCBhbmQgZG8geW91ciBvd24gZW5oYW5jZW1lbnRzIHRvIHRoZSBjb25maWd1cmF0aW9uDQotIFJlc3RhcnQgdGhlIGNvbGxlY3Rvci1zaWRlY2FyIHNlcnZpY2UNCg0KSSBhcHBsaWVkIHRoZSBhcHByb2FjaCBiZWNhdXNlIEkgbmVlZGVkIGFuIGFkaXRpb25hbCBtZXNzYWdlIGZpZWxkIChgRXhlYyAkc291cmNlX2lkID0gJ1dpbGRGbHkxMCc7YCkgc291cmNlX2lkIGZvciBvbmUgb2YgdGhlIGlucHV0cywgbGlrZSBzaG93biBiZWxvdy4NCmBgYA0KPElucHV0IDU3NmQxZDNkNjU5ZmIxMDdmNzIyZGIzOD4NCglNb2R1bGUgaW1fZmlsZQ0KCUZpbGUgIkM6XEphdmFcd2lsZGZseS0xMC4wLjAuRmluYWxcc3RhbmRhbG9uZVxsb2dcc2VydmVyLmxvZyINCglQb2xsSW50ZXJ2YWwgMQ0KCVNhdmVQb3MJVHJ1ZQ0KCVJlYWRGcm9tTGFzdCBUcnVlDQoJUmVjdXJzaXZlIEZhbHNlDQoJUmVuYW1lQ2hlY2sgRmFsc2UNCglFeGVjICRGaWxlTmFtZSA9IGZpbGVfbmFtZSgpOyAjIFNlbmQgZmlsZSBuYW1lIHdpdGggZWFjaCBtZXNzYWdlDQoJRXhlYyAkc291cmNlX2lkID0gJ1dpbGRGbHkxMCc7DQoJSW5wdXRUeXBlIDU3NmQxZDNkNjU5ZmIxMDdmNzIyZGIzOC1tdWx0aWxpbmUNCjwvSW5wdXQ+DQoNCmBgYA0KDQpUaGUgZnVsbCB5YW1sIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250ZW50Og0KYGBgDQpzZXJ2ZXJfdXJsOiBodHRwOi8vZ3JheWxvZy5teWNvbXBhbnkubG9jYWw6MTI5MDANCnRsc19za2lwX3ZlcmlmeTogZmFsc2UNCm5vZGVfaWQ6IGdyYXlsb2ctY29sbGVjdG9yLXNpZGVjYXItZGV2c3J2DQpjb2xsZWN0b3JfaWQ6IGZpbGU6QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxncmF5bG9nXGNvbGxlY3Rvci1zaWRlY2FyXGNvbGxlY3Rvci1pZA0KdGFnczoNCiAgICAtIHVuZGVmaW5lZA0KbG9nX3BhdGg6IEM6XFByb2dyYW0gRmlsZXMgKHg4NilcZ3JheWxvZ1xjb2xsZWN0b3Itc2lkZWNhcg0KdXBkYXRlX2ludGVydmFsOiAxMA0KYmFja2VuZHM6DQogICAgLSBuYW1lOiBueGxvZw0KICAgICAgZW5hYmxlZDogdHJ1ZQ0KICAgICAgYmluYXJ5X3BhdGg6IEM6XFByb2dyYW0gRmlsZXMgKHg4Nilcbnhsb2dcbnhsb2cuZXhlDQojICAgICAgY29uZmlndXJhdGlvbl9wYXRoOiBDOlxQcm9ncmFtIEZpbGVzICh4ODYpXGdyYXlsb2dcY29sbGVjdG9yLXNpZGVjYXJcZ2VuZXJhdGVkXG54bG9nLmNvbmYNCiAgICAgIGNvbmZpZ3VyYXRpb25fcGF0aDogQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxncmF5bG9nXGNvbGxlY3Rvci1zaWRlY2FyXGNvbmZcbnhsb2cuY29uZg0KYGBgDQoNCkFzIGFuIGFsdGVybmF0ZSBhcHByb2FjaCAoSSBoYXZlbid0IHRlc3RlZCBidXQgaXQgc2hvdWxkIHdvcmspIGlzIHRvIGdvIGZvciB0aGUgZmlyc3Qgb3B0aW9uIChzZXJ2ZXIgc2lkZSBjb250cm9sbGVkIGNvbmZpZ3VyYXRpb24pIGJ1dCBpbnN0ZWFkIG9mIGRlZmluaW5nIE91dHB1dHMvSW5wdXRzIGp1c3QgcGxhY2UgYWxsIG54bG9nLmNvbmYgY29udGVudCBpbiB0aGUgZGVmYXVsdCBueGxvZyBzbmlwcGV0LCBpbiB0aGUgV2luZG93cyBzZWN0aW9uLiBCZSBzdXJlIHlvdSBoYXZlIGluIHN5bmMgdGhlIGNvbGxlY3RvciBzaWRlIGNsaWVudF9pZCB3aXRoIHRoZSBvbmUgaW4gdGhlIG54bG9nLmNvbmYgY29udGVudCwgT3V0cHV0IHNlY3Rpb24gKHNlZSBgRXhlYyAkZ2wyX3NvdXJjZV9jb2xsZWN0b3IgPSAnMDMyNGJkNzktYjlhOS00NThlLTk5NzctZDBlZWNiZDJkMzQ3JztgKToNCg0KYGBgDQo8T3V0cHV0IDU3NmNmNDI2NjU5ZmIxMDdmNzIyYjAxMT4NCglNb2R1bGUgb21fdGNwDQoJSG9zdCBncmF5bG9nLm15Y29tcGFueS5sb2NhbA0KCVBvcnQgMTIyMDENCglPdXRwdXRUeXBlICBHRUxGX1RDUA0KCUV4ZWMgJHNob3J0X21lc3NhZ2UgPSAkcmF3X2V2ZW50OyAjIEF2b2lkcyB0cnVuY2F0aW9uIG9mIHRoZSBzaG9ydF9tZXNzYWdlIGZpZWxkLg0KCUV4ZWMgJGdsMl9zb3VyY2VfY29sbGVjdG9yID0gJzAzMjRiZDc5LWI5YTktNDU4ZS05OTc3LWQwZWVjYmQyZDM0Nyc7DQoJRXhlYyAkSG9zdG5hbWUgPSBob3N0bmFtZV9mcWRuKCk7DQo8L091dHB1dD4NCmBgYA0KDQojIyMgRHVwbGljYXRlIGNvbmZpZ3VyYXRpb24gb24gYW5vdGhlciBzZXJ2ZXINCg0KT25jZSB3ZSBoYXZlIGEgY29sbGVjdG9yIGNvbmZpZ3VyZWQgd2UgY2FuIGR1cGxpY2F0ZSBlYXNpbHkgdGhlIGluc3RhbGxhdGlvbiBvbiBhbm90aGVyIG9uZToNCg0KDQotIFBlcmZvcm0gdGhlIE5YTG9nIGluc3RhbGxhdGlvbiBzdGVwcw0KLSBJbnN0YWxsIHRoZSBjb2xsZWN0b3Itc2lkZWNhciAoanVzdCBydW4gdGhlIHNldHVwKQ0KLSBDb3B5IHlhbWwgYW5kIG54bG9nLmNvbmYgZmlsZXMgb24gdGhlIHRhcmdldCBzZXJ2ZXINCi0gQ2hhbmdlIHRoZSB5YW1sIHRvIHJlZmxlY3QgdGhlIHJpZ2h0IG5vZGVfaWQNCi0gQ2hhbmdlIHRoZSBjb250ZW50IG9mIHRoZSBjb2xsZWN0b3ItaWQgd2l0aCBzb21lIHVuaXF1ZSBzdHJpbmcgKGEgR1VJRD8pDQotIENoYW5nZSB0aGUgbnhsb2cuY29uZiBPdXRwdXQgdGFnIHRvIHJlZmxlY3QgdGhlIGNvbGxlY3Rvci1pZCB2YWx1ZSAg