#!/bin/bash
#This Source Code Form is subject to the terms of the Mozilla
#Public License, v. 2.0. If a copy of the MPL was not distributed
#with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

check_py_ver(){
	if [ "$1" ]; then
		if [ -f "$1" ]; then
			PYVER=$($1 --version 2>&1)
			PYV=$(echo $PYVER | sed 's/.* \([0-9]\).\([0-9]*\).*/\1\2/')
			if [ "$PYV" -ge "36" ] || [ "$PYV" -eq "27" ]; then
				echo "$PYVER"				
				return 0
			fi
		fi
	fi
	return 1
}

if [ "$1" = "-pypath" ]; then
	PYPTH=$2
	check_py_ver $PYPTH
	if [ "$?" = "1" ]; then
		echo "Error: Missing or Invalid Python. Required version 3.6+ or 2.7. Try to use -pypath <path>"
		exit 1
	fi
else
	PYPTH=$(which "python3" 2>/dev/null)
	check_py_ver $PYPTH
	if [ "$?" = "1" ]; then
		PYPTH=$(which "python2.7" 2>/dev/null)
		check_py_ver $PYPTH
		if [ "$?" = "1" ]; then
			echo "Error: Missing or Invalid Python. Required version 3.6+ or 2.7. Try to use -pypath <path>"
			exit 1
		fi
	fi
fi

echo "Extracting file ..."
SKIP=`awk '/^__TARFILE_BEGIN__/ { print NR + 1; exit 0; }' $0`
APPDT=$(date +"%Y%m%d%H%M%S")
PATH_INSTALL="/tmp/dwagent_install$APPDT"
THIS=`readlink -f $0`
rm -r -f $PATH_INSTALL
mkdir $PATH_INSTALL
cd $PATH_INSTALL
tail -n +$SKIP $THIS | tar -x
chown $(id -u):$(id -g) $PATH_INSTALL -R
echo "Running installer ..."
export PYTHONIOENCODING=utf-8
$PYPTH installer.py $@
echo "Removing temp directory ..."
rm -r -f $PATH_INSTALL
exit 0
__TARFILE_BEGIN__
cacerts.pem                                                                                         0000644 0001750 0001750 00000025453 14113401240 012472  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 -----BEGIN CERTIFICATE-----
MIIEsTCCA5mgAwIBAgIQCKWiRs1LXIyD1wK0u6tTSTANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xNzExMDYxMjIzMzNaFw0yNzExMDYxMjIzMzNaMF4xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xHTAbBgNVBAMTFFJhcGlkU1NMIFJTQSBDQSAyMDE4MIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEA5S2oihEo9nnpezoziDtx4WWLLCll/e0t1EYemE5n
+MgP5viaHLy+VpHP+ndX5D18INIuuAV8wFq26KF5U0WNIZiQp6mLtIWjUeWDPA28
OeyhTlj9TLk2beytbtFU6ypbpWUltmvY5V8ngspC7nFRNCjpfnDED2kRyJzO8yoK
MFz4J4JE8N7NA1uJwUEFMUvHLs0scLoPZkKcewIRm1RV2AxmFQxJkdf7YN9Pckki
f2Xgm3b48BZn0zf0qXsSeGu84ua9gwzjzI7tbTBjayTpT+/XpWuBVv6fvarI6bik
KB859OSGQuw73XXgeuFwEPHTIRoUtkzu3/EQ+LtwznkkdQIDAQABo4IBZjCCAWIw
HQYDVR0OBBYEFFPKF1n8a8ADIS8aruSqqByCVtp1MB8GA1UdIwQYMBaAFAPeUDVW
0Uy7ZvCj4hsbw5eyPdFVMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEF
BQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADA0BggrBgEFBQcBAQQo
MCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBCBgNVHR8E
OzA5MDegNaAzhjFodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRHbG9i
YWxSb290Q0EuY3JsMGMGA1UdIARcMFowNwYJYIZIAYb9bAECMCowKAYIKwYBBQUH
AgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCwYJYIZIAYb9bAEBMAgG
BmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggEBAH4jx/LKNW5ZklFc
YWs8Ejbm0nyzKeZC2KOVYR7P8gevKyslWm4Xo4BSzKr235FsJ4aFt6yAiv1eY0tZ
/ZN18bOGSGStoEc/JE4ocIzr8P5Mg11kRYHbmgYnr1Rxeki5mSeb39DGxTpJD4kG
hs5lXNoo4conUiiJwKaqH7vh2baryd8pMISag83JUqyVGc2tWPpO0329/CWq2kry
qv66OSMjwulUz0dXf4OHQasR7CNfIr+4KScc6ABlQ5RDF86PGeE6kdwSQkFiB/cQ
ysNyq0jEDQTkfa2pjmuWtMCNbBnhFXBYejfubIhaUbEv2FOQB3dCav+FPg5eEveX
TVyMnGo=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgx
MTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjCBjzELMAkGA1UEBhMCR0IxGzAZBgNV
BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UE
ChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQDEy5TZWN0aWdvIFJTQSBEb21haW4g
VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA1nMz1tc8INAA0hdFuNY+B6I/x0HuMjDJsGz99J/LEpgPLT+N
TQEMgg8Xf2Iu6bhIefsWg06t1zIlk7cHv7lQP6lMw0Aq6Tn/2YHKHxYyQdqAJrkj
eocgHuP/IJo8lURvh3UGkEC0MpMWCRAIIz7S3YcPb11RFGoKacVPAXJpz9OTTG0E
oKMbgn6xmrntxZ7FN3ifmgg0+1YuWMQJDgZkW7w33PGfKGioVrCSo1yfu4iYCBsk
Haswha6vsC6eep3BwEIc4gLw6uBK0u+QDrTBQBbwb4VCSmT3pDCg/r8uoydajotY
uK3DGReEY+1vVv2Dy2A0xHS+5p3b4eTlygxfFQIDAQABo4IBbjCCAWowHwYDVR0j
BBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFI2MXsRUrYrhd+mb
+ZsF4bgBjWHhMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAbBgNVHSAEFDASMAYGBFUdIAAw
CAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0
LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr
BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv
bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov
L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAMr9hvQ5Iw0/H
ukdN+Jx4GQHcEx2Ab/zDcLRSmjEzmldS+zGea6TvVKqJjUAXaPgREHzSyrHxVYbH
7rM2kYb2OVG/Rr8PoLq0935JxCo2F57kaDl6r5ROVm+yezu/Coa9zcV3HAO4OLGi
H19+24rcRki2aArPsrW04jTkZ6k4Zgle0rj8nSg6F0AnwnJOKf0hPHzPE/uWLMUx
RP0T7dWbqWlod3zu4f+k+TY4CFM5ooQ0nBnzvg6s1SQ36yOoeNDT5++SR2RiOSLv
xvcRviKFxmZEJCaOEDKNyJOuB56DPi/Z+fVGjmO+wea03KbNIaiGCpXZLoUmGv38
sbZXQm2V0TP2ORQGgkE49Y9Y3IBbpNV9lXj9p5v//cWoaasm56ekBYdbqbe4oyAL
l6lFhd2zi+WJN44pDfwGF/Y4QA5C5BIG+3vzxhFoYt/jmPQT2BVPi7Fp2RBgvGQq
6jG35LWjOhSbJuMLe/0CjraZwTiXWTb2qHSihrZe68Zk6s+go/lunrotEbaGmAhY
LcmsJWTyXnW0OMGuf1pGg+pRyrbxmRE1a6Vqe8YAsOf4vmSyrcjC8azjUeqkk+B5
yOGBQMkKW+ESPMFgKuOXwIlCypTPRpgSabuY0MLTDXJLR27lk8QyKGOHQ+SwMj4K
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
jjxDah2nGN59PRbxYvnKkKj9
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP
R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx
sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm
NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg
Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG
/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB
Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA
FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw
AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw
Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB
gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W
PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl
ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz
CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm
lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4
avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2
yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O
yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids
hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+
HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
nLRbwHOoq7hHwg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----                                                                                                                                                                                                                     communication.py                                                                                    0000755 0001750 0001750 00000127370 14407021004 013570  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

import ssl
import struct
import time
import socket
import threading
import xml.etree.ElementTree
import os
import math
import utils
import json

BUFFER_SIZE_MAX = 65536-10
BUFFER_SIZE_MIN = 1024


SIZE_INTEGER=math.pow(2,32)
SIZE_LONG=math.pow(2,64)


#_SOCKET_TIMEOUT_CONNECT = 10
_SOCKET_TIMEOUT_READ = 20

_cacerts_path="cacerts.pem"
_proxy_detected = {}
_proxy_detected["semaphore"]=threading.Condition()
_proxy_detected["check"] = False
_proxy_detected["info"] = None

def is_windows():
    return utils.is_windows()

def is_linux():
    return utils.is_linux()

def is_mac():
    return utils.is_mac()

def get_time():
    return utils.get_time()

def get_ssl_info():
    sslret=ssl.OPENSSL_VERSION + " ("
    #if hasattr(ssl, 'PROTOCOL_TLSv1_3'):
    #    sslret += "TLSv1.3"
    if hasattr(ssl, 'PROTOCOL_TLSv1_2'):
        sslret += "TLSv1.2" 
    elif hasattr(ssl, 'PROTOCOL_TLSv1_1'):
        sslret += "TLSv1.1"
    elif hasattr(ssl, 'PROTOCOL_TLSv1'):
        sslret += "TLSv1"
    else:
        sslret += "Unknown"
    sslret += ")"
    return sslret

def _get_ssl_ver():
    #if hasattr(ssl, 'PROTOCOL_TLSv1_3'):
    #    return ssl.PROTOCOL_TLSv1_3
    if hasattr(ssl, 'PROTOCOL_TLSv1_2'):
        return ssl.PROTOCOL_TLSv1_2 
    if hasattr(ssl, 'PROTOCOL_TLSv1_1'):
        return ssl.PROTOCOL_TLSv1_1
    if hasattr(ssl, 'PROTOCOL_TLSv1'):
        return ssl.PROTOCOL_TLSv1
    if hasattr(ssl, 'PROTOCOL_TLS'):
        return ssl.PROTOCOL_TLS
    return ssl.PROTOCOL_SSLv23 #DEFAULT

def _connect_proxy_http(sock, host, port, proxy_info):
    usr = proxy_info.get_user()
    pwd = proxy_info.get_password()
    arreq=[]
    arreq.append("CONNECT %s:%d HTTP/1.0" % (host, port))
    if usr is not None and len(usr)>0:
        auth=utils.bytes_to_str(utils.enc_base64_encode(utils.str_to_bytes(usr + ":" + pwd,"utf8")))
        arreq.append("\r\nProxy-Authorization: Basic %s" % (auth))
    arreq.append("\r\n\r\n")
    sock.sendall(utils.str_to_bytes("".join(arreq)))
    resp = Response(sock)
    if resp.get_code() != '200':
        raise Exception("Proxy http error: " + str(resp.get_code()) + ".")
    

def _connect_proxy_socks(sock, host, port, proxy_info):
    usr = proxy_info.get_user()
    pwd = proxy_info.get_password()
    if proxy_info.get_type()=='SOCKS5':
        arreq = []
        arreq.append(struct.pack(">BBBB", 0x05, 0x02, 0x00, 0x02))
        sock.sendall(utils.bytes_join(arreq))
        resp = sock.recv(2)
        ver = utils.bytes_get(resp,0)
        mth = utils.bytes_get(resp,1)
        if ver!=0x05:
            raise Exception("Proxy socks error: Incorrect version.")
        if mth!=0x00 and mth!=0x02:
            raise Exception("Proxy socks error: Method not supported.")
        if mth==0x02:
            if usr is not None and len(usr)>0 and pwd is not None and len(pwd)>0:
                arreq = []
                arreq.append(struct.pack(">B", 0x01))
                arreq.append(struct.pack(">B", len(usr)))
                for c in usr:
                    arreq.append(struct.pack(">B", ord(c)))
                arreq.append(struct.pack(">B", len(pwd)))
                for c in pwd:
                    arreq.append(struct.pack(">B", ord(c)))                
                sock.sendall(utils.bytes_join(arreq))
                resp = sock.recv(2)
                ver = utils.bytes_get(resp,0)
                status = utils.bytes_get(resp,1)
                if ver!=0x01 or status != 0x00:
                    raise Exception("Proxy socks error: Incorrect Authentication.")
            else:
                raise Exception("Proxy socks error: Authentication required.")
        arreq = []
        arreq.append(struct.pack(">BBB", 0x05, 0x01, 0x00))
        try:
            addr_bytes = socket.inet_aton(host)
            arreq.append(b"\x01")
            arreq.append(addr_bytes)
        except socket.error:
            arreq.append(b"\x03")
            arreq.append(struct.pack(">B", len(host)))
            for c in host:
                arreq.append(struct.pack(">B", ord(c)))
        arreq.append(struct.pack(">H", port))
        sock.sendall(utils.bytes_join(arreq))
        resp = sock.recv(1024)
        ver = utils.bytes_get(resp,0)
        status = utils.bytes_get(resp,1)
        if ver!=0x05 or status != 0x00:
            raise Exception("Proxy socks error.")
    else:
        remoteresolve=False
        try:
            addr_bytes = socket.inet_aton(host)
        except socket.error:
            if proxy_info.get_type()=='SOCKS4A':
                addr_bytes = b"\x00\x00\x00\x01"
                remoteresolve=True
            else:
                addr_bytes = socket.inet_aton(socket.gethostbyname(host))
            
        arreq = []
        arreq.append(struct.pack(">BBH", 0x04, 0x01, port))
        arreq.append(addr_bytes)
        if usr is not None and len(usr)>0:
            for c in usr:
                arreq.append(struct.pack(">B", ord(c)))
        arreq.append(b"\x00")
        if remoteresolve:
            for c in host:
                arreq.append(struct.pack(">B", ord(c)))
            arreq.append(b"\x00")
        sock.sendall(utils.bytes_join(arreq))
        
        resp = sock.recv(8)
        if len(resp)<2:
            raise Exception("Proxy socks error.")
        if utils.bytes_get(resp,0) != 0x00:
            raise Exception("Proxy socks error.")
        status = utils.bytes_get(resp,1)
        if status != 0x5A:
            raise Exception("Proxy socks error.")

def _detect_proxy_windows():
    prxi=None
    try:
        sproxy=None
        import _winreg
        aReg = _winreg.ConnectRegistry(None,_winreg.HKEY_CURRENT_USER)
        aKey = _winreg.OpenKey(aReg, r"Software\Microsoft\Windows\CurrentVersion\Internet Settings")
        try: 
            subCount, valueCount, lastModified = _winreg.QueryInfoKey(aKey)
            penabled=False
            pserver=None
            for i in range(valueCount):                                           
                try:
                    n,v,t = _winreg.EnumValue(aKey,i)
                    if n.lower() == 'proxyenable':
                        penabled = v and True or False
                    elif n.lower() == 'proxyserver':
                        pserver = v
                except EnvironmentError:                                               
                    break
            if penabled and pserver is not None:
                sproxy=pserver
        finally:
            _winreg.CloseKey(aKey)   
        if sproxy is not None:
            stp=None
            sho=None
            spr=None            
            lst = sproxy.split(";")
            for v in lst:
                if len(v)>0:
                    ar1 = v.split("=")
                    if len(ar1)==1:
                        stp="HTTP"
                        ar2 = ar1[0].split(":")
                        sho=ar2[0]
                        spr=ar2[1]
                        break
                    elif ar1[0].lower()=="http":
                        stp="HTTP"
                        ar2 = ar1[1].split(":")
                        sho=ar2[0]
                        spr=ar2[1]
                        break
                    elif ar1[0].lower()=="socks":
                        stp="SOCKS5"
                        ar2 = ar1[1].split(":")
                        sho=ar2[0]
                        spr=ar2[1]
                    
            if stp is not None:
                prxi = ProxyInfo()
                prxi.set_type(stp)
                prxi.set_host(sho)
                prxi.set_port(int(spr))
                #print("PROXY WINDOWS DETECTED:" + stp + "  " + spr)
                
    except:
        None
    return prxi

def _detect_proxy_linux():
    prxi=None
    try:
        sprx=None
        sprx=os.getenv("all_proxy")
        if "http_proxy" in os.environ:
            sprx = os.environ["http_proxy"]
        elif "all_proxy" in os.environ:
            sprx = os.environ["all_proxy"]
        if sprx is not None:
            stp=None
            if sprx.endswith("/"):
                sprx=sprx[0:len(sprx)-1]            
            if sprx.lower().startswith("socks:"):
                stp="SOCKS5"
                sprx=sprx[len("socks:"):]
            elif sprx.lower().startswith("http:"):
                stp="HTTP"
                sprx=sprx[len("http:"):]
            if stp is not None:
                sun=None
                spw=None
                sho=None
                spr=None
                ar = sprx.split("@")
                if len(ar)==1:
                    ar1 = sprx[0].split(":")
                    sho=ar1[0]
                    spr=ar1[1]
                else: 
                    ar1 = sprx[0].split(":")
                    sun=ar1[0]
                    spw=ar1[1]
                    ar2 = sprx[1].split(":")
                    sho=ar2[0]
                    spr=ar2[1]
                prxi = ProxyInfo()
                prxi.set_type(stp)
                prxi.set_host(sho)
                prxi.set_port(int(spr))
                prxi.set_user(sun)
                prxi.set_password(spw)
    except:
        None
    return prxi

def release_detected_proxy():
    global _proxy_detected
    _proxy_detected["semaphore"].acquire()
    try:
        _proxy_detected["check"]=False
        _proxy_detected["info"]=None
    finally:
        _proxy_detected["semaphore"].release()

def _set_detected_proxy_none():
    global _proxy_detected
    _proxy_detected["semaphore"].acquire()
    try:
        _proxy_detected["check"]=True
        _proxy_detected["info"]=None
    finally:
        _proxy_detected["semaphore"].release()
    
def set_cacerts_path(path):
    global _cacerts_path
    _cacerts_path=path

def _connect_socket(host, port, proxy_info, timeout=_SOCKET_TIMEOUT_READ):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
        sock.settimeout(timeout)
        bprxdet=False
        prxi=proxy_info
        if prxi is None or prxi.get_type() is None or proxy_info.get_type()=='SYSTEM':
            global _proxy_detected
            _proxy_detected["semaphore"].acquire()
            try:
                if not _proxy_detected["check"]:
                    try:
                        if is_windows():
                            _proxy_detected["info"] = _detect_proxy_windows()
                        elif is_linux():
                            _proxy_detected["info"] = _detect_proxy_linux()
                        elif is_mac():
                            _proxy_detected["info"]=None
                    except:
                        _proxy_detected=None
                if _proxy_detected is not None:
                    bprxdet=True
                    prxi = _proxy_detected["info"]
                _proxy_detected["check"]=True
            finally:
                _proxy_detected["semaphore"].release()
            
        conn_ex=None    
        func_prx=None
        if prxi is None or prxi.get_type() is None or prxi.get_type()=='NONE':
            sock.connect((host, port))
        elif prxi.get_type()=='HTTP':
            try:
                sock.connect((prxi.get_host(), prxi.get_port()))
                func_prx=_connect_proxy_http
            except:
                conn_ex=utils.get_exception()
        elif prxi.get_type()=='SOCKS4' or prxi.get_type()=='SOCKS4A' or prxi.get_type()=='SOCKS5':
            try:
                sock.connect((prxi.get_host(), prxi.get_port()))
                func_prx=_connect_proxy_socks
            except:
                conn_ex=utils.get_exception()
        else:
            sock.connect((host, port))
        
        if func_prx is not None:
            try:
                func_prx(sock, host, port, prxi)
            except:
                conn_ex=utils.get_exception()
        
        if conn_ex is not None:
            if bprxdet:
                try:
                    release_detected_proxy()
                    sock.close()
                    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
                    sock.settimeout(timeout)
                    sock.connect((host, port)) #TRY TO CONNECT WITHOUT PROXY
                    _set_detected_proxy_none()
                    bprxdet=False
                except:
                    raise conn_ex
            else:
                raise conn_ex
                
        
        while True:
            try:
                #VALIDA CERITFICATI
                global _cacerts_path
                if hasattr(ssl, 'SSLContext'):
                    ctx = ssl.SSLContext(_get_ssl_ver())
                    if _cacerts_path!="":
                        ctx.verify_mode = ssl.CERT_REQUIRED
                        ctx.check_hostname = True
                        ctx.load_verify_locations(_cacerts_path)
                        sock = ctx.wrap_socket(sock,server_hostname=host)
                    else:
                        sock = ctx.wrap_socket(sock)
                else:
                    iargs = None
                    try:
                        import inspect
                        iargs = inspect.getargspec(ssl.wrap_socket).args
                    except:                   
                        None
                    if iargs is not None and "cert_reqs" in iargs and "ca_certs" in iargs and _cacerts_path!="": 
                        sock = ssl.wrap_socket(sock, ssl_version=_get_ssl_ver(), cert_reqs=ssl.CERT_REQUIRED, ca_certs=_cacerts_path)
                    else:
                        sock = ssl.wrap_socket(sock, ssl_version=_get_ssl_ver())
                break
            except:
                conn_ex=utils.get_exception()
                if bprxdet:
                    if "CERTIFICATE_VERIFY_FAILED" in str(conn_ex):
                        try: 
                            release_detected_proxy()
                            sock.close()
                            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                            sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
                            sock.settimeout(timeout)
                            sock.connect((host, port)) #TRY TO CONNECT WITHOUT PROXY
                            _set_detected_proxy_none()
                            bprxdet=False
                        except:
                            raise conn_ex
                    else:                        
                        raise conn_ex                    
                else:
                    raise conn_ex  
            
            
    except:
        e=utils.get_exception()
        sock.close()
        raise e
    return sock

def prop_to_xml(prp):
    ardata = []
    ardata.append('<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">');
    root_element = xml.etree.ElementTree.Element("properties")
    for key in prp:
        child = xml.etree.ElementTree.SubElement(root_element, "entry")
        child.attrib['key'] = key
        child.text = prp[key]
    ardata.append(utils.bytes_to_str(xml.etree.ElementTree.tostring(root_element)));
    return ''.join(ardata)

def xml_to_prop(s):
    prp = {}
    root = xml.etree.ElementTree.fromstring(utils.buffer_new(s,0,len(s)))
    for child in root:
        prp[child.attrib['key']] = child.text
    return prp

def _split_utl(url):
    lnhttps = 8
    #legge server e porta
    p=url[lnhttps:].find('/')
    host=url[lnhttps:lnhttps+p]
    port=443
    i=host.find(':')
    if i>=0:
        port=int(host[i+1:])
        host=host[:i]
    #Legge path
    u = url[p+lnhttps:]
    return {'host':host,  'port':port,  'path':u}

def download_url_file(urlsrc, fdest, proxy_info=None, response_transfer_progress=None):
    sredurl=None
    sp = _split_utl(urlsrc)
    #Richiesta al server
    sock = _connect_socket(sp["host"], sp["port"], proxy_info)
    try:
        req = Request("GET", sp["path"],  {'Host' : sp["host"] + ':' + str(sp["port"],),  'Connection' : 'close'})
        sock.sendall(req.to_message())
    
        #Legge risposta
        if utils.path_exists(fdest):
            utils.path_remove(fdest)
        ftmp = fdest + "TMP"
        if utils.path_exists(ftmp):
            utils.path_remove(ftmp)        
        resp = Response(sock, ftmp, response_transfer_progress)
        if resp.get_code() == '301':
            sredurl=resp.get_headers()["Location"]
        elif resp.get_code() != '200':
            raise Exception("Download error " + str(resp.get_code()) + ".")
    finally:
        sock.shutdown(1)
        sock.close();
    if sredurl is not None:
        download_url_file(sredurl, fdest, proxy_info, response_transfer_progress)
    else:
        if utils.path_exists(ftmp):
            utils.path_move(ftmp, fdest)

def get_url_prop(url, proxy_info=None):
    sredurl=None
    sp = _split_utl(url)    
    sock = _connect_socket(sp["host"], sp["port"], proxy_info)
    try:
        req = Request("GET", sp["path"],  {'Host' : sp["host"] + ':' + str(sp["port"],),  'Connection' : 'close'})
        sock.sendall(req.to_message())
        
        prpresp = None;
        resp = Response(sock)
        if resp.get_code() == '200':
            rtp="xml"
            try:
                hds = resp.get_headers()  
                if hds is not None and "Content-Type" in hds:
                    if hds["Content-Type"]=="application/json":
                        rtp="json"
            except:
                None
            if rtp=="json":
                prpresp = json.loads(resp.get_body())
            else:
                prpresp = xml_to_prop(resp.get_body())
        elif resp.get_code() == '301':
            sredurl=resp.get_headers()["Location"]
        else:
            raise Exception("Get url properties error " + str(resp.get_code())  + ".")
    finally:
        sock.shutdown(1)
        sock.close();
    if sredurl is not None:
        prpresp = get_url_prop(sredurl,proxy_info)
    return prpresp

def ping_url(url, proxy_info=None):
    tmret=-1
    try:
        tm=time.time()
        sp = _split_utl(url)
        sock = _connect_socket(sp["host"], sp["port"], proxy_info,timeout=2)
        try:
            req = Request("GET", sp["path"],  {'Host': sp["host"] + ':' + str(sp["port"],),  'Connection': 'close'})
            sock.sendall(req.to_message())
            resp = Response(sock)
            if resp.get_code() == '200':
                tmret=round(time.time()-tm,3)                
        finally:
            sock.shutdown(1)
            sock.close();
    except:
        None
    return tmret

class ProxyInfo:
    def __init__(self):
        self._type="None"
        self._host=None
        self._port=None
        self._user=None
        self._password=None
        
    def set_type(self, ptype):
        self._type=ptype
    
    def set_host(self, host):
        self._host=host
        
    def set_port(self, port):
        self._port=port
    
    def set_user(self,  user):
        self._user=user
    
    def set_password(self,  password):
        self._password=password
    
    def get_type(self):
        return self._type
    
    def get_host(self):
        return self._host
        
    def get_port(self):
        return self._port
    
    def get_user(self):
        return self._user
    
    def get_password(self):
        return self._password
        

class Request:
    def __init__(self, method, url, prp=None):
        self._method = method
        self._url = url
        self._prp = prp
        self._body = None

    def set_body(self, body):
        self._body = body

    def to_message(self):
        arhead = []
        arhead.append(self._method)
        arhead.append(' ')
        arhead.append(self._url)
        arhead.append(' ')
        arhead.append('HTTP/1.1')
        if self._prp is not None:
            for k in self._prp:
                arhead.append('\r\n')
                arhead.append(k)
                arhead.append(': ')
                arhead.append(self._prp[k])
            
        if self._body is not None:
            arhead.append('\r\n')
            arhead.append('Compression: zlib')
            arhead.append('\r\n')
            arhead.append('Content-Length: ')
            arhead.append(str(len(self._body)));
        arhead.append('\r\n')
        arhead.append('\r\n')
        if self._body is not None:
            arhead.append(self._body)
        return utils.str_to_bytes(''.join(arhead))

class Response_Transfer_Progress:
    
    def __init__(self, events=None):
            self._on_data=None
            self._properties={}
            self._byte_transfer=0
            self._byte_length=0
            if events is not None:
                if 'on_data' in events:
                    self._on_data=events['on_data']
    
    def set_property(self, key, value):
        self._properties[key]=value
    
    def get_property(self, key):
        if key not in self._properties:
            return None
        return self._properties[key]
    
    def get_byte_transfer(self):
        return self._byte_transfer
    
    def get_byte_length(self):
        return self._byte_length
    
    def fire_on_data(self,  byte_transfer,  byte_length):
        self._byte_transfer=byte_transfer
        self._byte_length=byte_length
        if self._on_data is not None:
            self._on_data(self)

class Response:
    def __init__(self, sock, body_file_name=None,  response_transfer_progress=None):
        data = bytes()
        while utils.bytes_to_str(data).find('\r\n\r\n') == -1:
            app=sock.recv(1024 * 4)
            if app is None or len(app)==0:
                raise Exception('Close connection')
            data += app 
        ar = utils.bytes_to_str(data).split('\r\n\r\n')
        head = ar[0].split('\r\n')
        appbody = []
        appbody.append(data[len(ar[0])+4:])
        self._code = None
        self._headers = {}
        clenkey=None
        for item in head:
            if self._code is None:
                self._code = item.split(' ')[1]
            else:
                apppos = item.index(':')
                appk=item[0:apppos].strip()
                if appk.lower()=="content-length":
                    clenkey=appk
                self._headers[appk] = item[apppos+1:].strip()
        #Legge eventuale body
        if self._code != '301' and clenkey is not None:
            self._extra_data=None
            lenbd = int(self._headers[clenkey])
            fbody=None
            try:
                jbts=utils.bytes_join(appbody)
                if body_file_name is not None:
                    fbody=utils.file_open(body_file_name, 'wb')
                    fbody.write(jbts)
                cnt=len(jbts)
                if response_transfer_progress is not None:
                    response_transfer_progress.fire_on_data(cnt,  lenbd)
                szbuff=1024*2
                buff=None
                while lenbd > cnt:
                    buff=sock.recv(szbuff)
                    if buff is None or len(buff)==0:
                        break
                    cnt+=len(buff)
                    if response_transfer_progress is not None:
                        response_transfer_progress.fire_on_data(cnt,  lenbd)
                    if body_file_name is None:
                        appbody.append(buff)
                    else:
                        fbody.write(buff)
            finally:
                if fbody is not None:
                    fbody.close()
                else:
                    self._body=utils.bytes_join(appbody)
        else:
            self._extra_data=utils.bytes_join(appbody)
            if len(self._extra_data)==0:
                self._extra_data=None

    def get_extra_data(self):
        return self._extra_data

    def get_code(self):
        return self._code

    def get_headers(self):
        return self._headers
    
    def get_body(self):
        return self._body


class Worker(threading.Thread):
    
    def __init__(self, parent,  queue, i):
        self._parent = parent
        threading.Thread.__init__(self, name=self._parent.get_name() + "_" + str(i))
        self.daemon=True
        self._queue=queue
        
    def run(self):
        while not self._parent._destroy:
            func, args, kargs = self._queue.get()
            if func is not None:
                try: 
                    func(*args, **kargs)
                except: 
                    e=utils.get_exception()
                    self._parent.fire_except(e)
                self._queue.task_done()

class ThreadPool():
    
    def __init__(self, name, queue_size, core_size , fexcpt):
            self._destroy=False
            self._name=name
            self._fexcpt=fexcpt
            self._queue = utils.Queue(queue_size)
            for i in range(core_size):
                self._worker = Worker(self, self._queue, i)
                self._worker.start()
    
    def get_name(self):
        return self._name 

    def fire_except(self, e):
        if self._fexcpt is not None:
            self._fexcpt(e)

    def execute(self, func, *args, **kargs):
        if not self._destroy:
            self._queue.put([func, args, kargs])
    
    def destroy(self):
        self._destroy=True #DA GESTIRE


class QueueTask():
    
    def __init__(self, tpool):
        self._task_pool=tpool
        self._semaphore = threading.Condition()
        self.list = []
        self.running = False
        
    
    def _exec_func(self):
        while True:
            func = None
            self._semaphore.acquire()
            try:
                if len(self.list)==0:
                    self.running = False
                    break;
                func = self.list.pop(0)
            finally:
                self._semaphore.release()
            func();
                        
        
    def execute(self, f, only_if_empty=False):
        self._semaphore.acquire()
        try:
            if not self.running:
                self.list.append(f);
                self.running=True;
                self._task_pool.execute(self._exec_func)
            else:
                if only_if_empty:
                    if len(self.list)<2: #con < 2 sono sicuro che almeno l'ultimo viene eseguito
                        self.list.append(f)
                else:
                    self.list.append(f)
        finally:
            self._semaphore.release()
        
        
            
class BandwidthCalculator:
    
    def __init__(self, ckint=0.5, ccint=5.0):
        self._semaphore = threading.Condition()
        self._current_byte_transfered=0
        self._last_byte_transfered=0
        self._last_time=0
        self._bps=0
        self._buffer_size=BUFFER_SIZE_MIN
        self._check_intervall=ckint
        self._calc_intervall=ccint
        self._calc_ar=[]
        self._calc_elapsed=0
        self._calc_transfered=0
    
    def set_check_intervall(self,i):
        self._semaphore.acquire()
        try:
            self._check_intervall=i
        finally:
            self._semaphore.release()
    
    def get_check_intervall(self):
        self._semaphore.acquire()
        try:
            return self._check_intervall
        finally:
            self._semaphore.release()
            
    def add(self, c):
        self._semaphore.acquire()
        try:
            self._current_byte_transfered += c
            self._calculate()
        finally:
            self._semaphore.release()
    
    def _calculate(self):
        tm=get_time() 
        transfered=self._current_byte_transfered-self._last_byte_transfered
        elapsed = (tm - self._last_time)
        if elapsed<0:
            elapsed=0
            self._last_time=tm
        if elapsed>self._check_intervall:
            self._calc_ar.append({"elapsed":elapsed, "transfered":transfered})
            self._calc_elapsed+=elapsed
            self._calc_transfered+=transfered
            while len(self._calc_ar)>1 and self._calc_elapsed>self._calc_intervall:
                ar = self._calc_ar.pop(0)
                self._calc_elapsed-=ar["elapsed"]
                self._calc_transfered-=ar["transfered"]
            self._bps=int(float(self._calc_transfered)*(1.0/self._calc_elapsed))
            self._calculate_buffer_size()
            self._last_time=tm
            self._last_byte_transfered=self._current_byte_transfered        
    
    def get_bps(self):
        return self._bps
    
    def get_buffer_size(self):
        return self._buffer_size
    
    def _calculate_buffer_size(self):
        self._buffer_size=int(0.1*float(self._bps))
        if self._buffer_size<BUFFER_SIZE_MIN:
            self._buffer_size=BUFFER_SIZE_MIN
        elif self._buffer_size>BUFFER_SIZE_MAX:
            self._buffer_size=BUFFER_SIZE_MAX
        else:
            self._buffer_size=int((float(self._buffer_size)/512.0)*512.0)
        
    
    def get_transfered(self):
        self._semaphore.acquire()
        try:
            return self._current_byte_transfered
        finally:
            self._semaphore.release()

'''
class BandwidthLimiter:
    
    def __init__(self,sync=True):
        if sync:
            self._semaphore = threading.Condition()
        else:
            self._semaphore = None
        self._last_time=0
        self._bandlimit=0
        self._last_wait=0
        self._buffsz=0        
        self.set_bandlimit(0)
     
     
    def _semaphore_acquire(self):
        if self._semaphore is not None:
            self._semaphore.acquire()
    
    def _semaphore_release(self):
        if self._semaphore is not None:
            self._semaphore.release()
    
    def get_bandlimit(self):
        self._semaphore_acquire()
        try:
            return self._bandlimit
        finally:
            self._semaphore_release()
        
    def set_bandlimit(self,pbps):
        self._semaphore_acquire()
        try:
            if self._bandlimit==pbps:
                return
            if pbps>0:
                self._bandlimit=pbps
                self._buffsz=calculate_buffer_size(pbps)
            else:
                self._bandlimit=0
                self._buffsz=BUFFER_SIZE_MAX
        finally:
            self._semaphore_release()
        
    def get_buffer_size(self):
        self._semaphore_acquire()
        try:
            return self._buffsz
        finally:
            self._semaphore_release()
    
    def get_waittime(self, c):
        self._semaphore_acquire()
        try:
            tm=get_time() 
            timeout = 0
            if c > 0:
                if self._bandlimit > 0:
                    if tm>=self._last_time:
                        elapsed = (tm - self._last_time) - self._last_wait
                        maxt = float(self._bandlimit)*elapsed
                        timeout = float(c-maxt)/float(self._bandlimit) 
                        self._last_wait=timeout
                        if self._last_wait<-1.0:
                            self._last_wait=0.0
                        self._last_time=tm
                        if timeout < 0.0:
                            timeout=0.0
                    else:
                        self._last_time=tm 
                        self._last_wait=0.0
            return timeout
        finally:
            self._semaphore_release()
            
'''
            
class ConnectionCheckAlive(threading.Thread):
    _KEEPALIVE_INTERVALL = 30
    _KEEPALIVE_THRESHOLD = 5
    
    def __init__(self, conn):
        threading.Thread.__init__(self, name="ConnectionCheckAlive")
        self.daemon=True
        self._connection=conn
        self._counter=utils.Counter()
        self._connection_keepalive_send=False
        self._semaphore = threading.Condition()

    def _send_keep_alive(self):
        try:
            if not self._connection.is_close():
                self._connection._send_ws_ping()
                #print("SESSION - PING INVIATO!")                
        except:
            #traceback.print_exc()
            None

    def reset(self):
        self._semaphore.acquire()
        try:
            if self._connection_keepalive_send:
                #print("SESSION - PING RESET!")
                self._counter.reset()
                self._connection_keepalive_send = False
        finally:
            self._semaphore.release()
        
            
    def run(self):
        #print("Thread alive started: " + str(self._connection))        
        bfireclose=False
        while not self._connection.is_shutdown():
            time.sleep(1)
            self._semaphore.acquire()
            try:
                #Verifica alive
                if not self._connection_keepalive_send:                    
                    #print("Thread alive send counter: " + str(self._counter.get_value()) + " " + str(self._connection))                    
                    if self._counter.is_elapsed((ConnectionCheckAlive._KEEPALIVE_INTERVALL-ConnectionCheckAlive._KEEPALIVE_THRESHOLD)):
                        self._connection_keepalive_send=True
                        self._send_keep_alive()
                        #print("Thread alive send: " + str(self._connection))
                        
                else:
                    if self._counter.is_elapsed((ConnectionCheckAlive._KEEPALIVE_INTERVALL+ConnectionCheckAlive._KEEPALIVE_THRESHOLD)):
                        bfireclose=not self._connection.is_close()
                        break                  
            finally:
                self._semaphore.release()
        self._connection.shutdown();
        if bfireclose is True:
            self._connection.fire_close(True)        
        #print("Thread alive stopped: " + str(self._connection))

class ConnectionReader(threading.Thread):
    
    def __init__(self, conn):
        threading.Thread.__init__(self, name="ConnectionReader")
        self.daemon=True
        self._connection = conn

    def _read_fully(self, sock, ln):
        data = []
        cnt=0
        while ln > cnt:
            s = sock.recv(ln-cnt)
            if s is None or len(s) == 0:
                return ''
            self._connection._tdalive.reset();
            data.append(s)
            cnt+=len(s)
        return utils.bytes_join(data)
        
    
    def run(self):
        #print("Thread read started: " + str(self._connection))        
        bfireclose=False
        bconnLost=True
        sock = self._connection.get_socket()
        try:
            while not self._connection.is_shutdown():
                data = self._read_fully(sock, 2)
                if len(data) == 0:
                    bfireclose=not self._connection.is_close()
                    break
                else:
                    lendt=0;
                    bt1=utils.bytes_get(data,1);
                    if bt1 <= 125:
                        if bt1 > 0:
                            lendt = bt1;
                        else:
                            bt0=utils.bytes_get(data,0);
                            if bt0 == 136: #CLOSE  
                                bconnLost=False                              
                                bfireclose=not self._connection.is_close()
                                break
                            elif bt0 == 138: #PONG
                                #print("SESSION - PONG RICEVUTO!")
                                continue
                            else:
                                continue    
                    elif bt1 == 126:
                        data = self._read_fully(sock, 2)
                        if len(data) == 0:
                            bfireclose=not self._connection.is_close()
                            break
                        lendt=struct.unpack('!H',data)[0]
                    elif bt1 == 127:
                        data = self._read_fully(sock, 4)
                        if len(data) == 0:
                            bfireclose=not self._connection.is_close()
                            break
                        lendt=struct.unpack('!I',data)[0]
                    #Legge data
                    if lendt>0:
                        data = self._read_fully(sock, lendt)
                        if len(data) == 0:
                            bfireclose=not self._connection.is_close()
                            break
                    elif lendt==0:
                        data=""
                    else:
                        bfireclose=not self._connection.is_close()
                        break
                    self._connection.fire_data(data)
                    
        except:
            e=utils.get_exception()
            bfireclose=not self._connection.is_close()
            #traceback.print_exc()
            self._connection.fire_except(e) 
        self._connection.shutdown()
        if bfireclose is True:
            self._connection.fire_close(bconnLost)        
        #print("Thread read stopped: " + str(self._connection))
        

class Connection:
            
    def __init__(self, events):
        self._close=True
        self._connection_lost=False
        self._shutdown=False
        self._on_data= None
        self._on_close = None
        self._on_except = None
        if events is not None:
            if "on_data" in events:
                self._on_data = events["on_data"]
            if "on_close" in events:
                self._on_close = events["on_close"]
            if "on_except" in events:
                self._on_except = events["on_except"]
        self._lock_status = threading.Lock()
        self._lock_send = threading.Lock()
        self._proxy_info = None
        self._sock = None
        self._tdalive = None
        self._tdread = None
        #WEBSOCKET DATA
        self._ws_data_b0 = 0;
        self._ws_data_b0 |= 1 << 7;
        self._ws_data_b0 |= 0x2 % 128;
        self._ws_data_struct_1=struct.Struct("!BBI")
        self._ws_data_struct_2=struct.Struct("!BBBBI")
        self._ws_data_struct_3=struct.Struct("!BBII")
        #WEBSOCKET PING
        self._ws_ping_b0 = 0
        self._ws_ping_b0 |= 1 << 7;
        self._ws_ping_b0 |= 0x9 % 128;
        self._ws_ping_struct=struct.Struct("!BBI")
        #WEBSOCKET CLOSE
        self._ws_close_b0 = 0;
        self._ws_close_b0 |= 1 << 7;
        self._ws_close_b0 |= 0x8 % 128;
        self._ws_close_struct=struct.Struct("!BBI")
                
            
    def open(self, prop, proxy_info):
        
        if self._sock is not None:
            raise Exception("Already connect!")

        #Apre socket
        self._prop = prop
        self._proxy_info = proxy_info
        self._sock = _connect_socket(self._prop['host'], int(self._prop['port']), proxy_info)
        try:
            #Invia richiesta
            appprp = {}
            for k in prop:
                if prop[k] is not None:
                    appprp["dw_" + k]=prop[k];
                    
                    
            appprp["host"] = prop['host'] + ":" + prop['port']
            appprp["Connection"] = 'keep-alive, Upgrade'
            appprp["Upgrade"] = 'websocket'
            appprp["Sec-WebSocket-Key"] = 'XV3+Fd9KMg54tXP7Tsrl8Q=='
            appprp["Sec-WebSocket-Version"] = '13'
                    
            req = Request("GET", "/openraw.dw", appprp)
            self._sock.sendall(req.to_message())
    
            #Legge risposta
            resp = Response(self._sock);
            if resp.get_code() != '101':
                if resp.get_body() is not None:
                    raise Exception(resp.get_body())
                else:
                    raise Exception("Server error.")
                        
            self._close=False
            self._sock.settimeout(None)
            
            #Avvia thread alive
            self._tdalive = ConnectionCheckAlive(self)
            self._tdalive.start()
    
            #Avvia thread lettura
            self._tdread = ConnectionReader(self)
            self._tdread.start()
            return resp            
                            
        except:
            e=utils.get_exception()
            self.shutdown()
            raise e
    
    def get_socket(self):
        return self._sock
    
   
    def send(self, data):
        self._send_ws_data(data)
        
    def fire_data(self, dt):
        if self._on_data is not None:
            self._on_data(dt)        
            
    def fire_close(self,connlost):        
        with self._lock_status:
            self._connection_lost=connlost
            onc=self._on_close
            self._on_data= None
            self._on_close = None
            self._on_except = None
        if onc is not None:
            onc()
    
    def fire_except(self,e):  
        if self._on_except is not None:
            self._on_except(e) 
    
    def _send_ws_data(self,dt):
        if self._sock is None:
            raise Exception('connection closed.')
        self._lock_send.acquire()
        try:
            length = len(dt);
            if length <= 125:
                ba=bytearray(self._ws_data_struct_1.pack(self._ws_data_b0, 0x80|length,0)) #rnd=random.randint(0,2147483647)
            elif length <= 0xFFFF:
                ba=bytearray(self._ws_data_struct_2.pack(self._ws_data_b0, 0xFE,length >> 8 & 0xFF,length & 0xFF,0)) #rnd=random.randint(0,2147483647)
            else: 
                ba=bytearray(self._ws_data_struct_3.pack(self._ws_data_b0, 0xFF,length,0)) #rnd=random.randint(0,2147483647)
            ba+=dt
            utils.socket_sendall(self._sock,ba)
        finally:
            self._lock_send.release()
            
    def _send_ws_close(self):
        if self._sock is None:
            raise Exception('connection closed.')
        self._lock_send.acquire()
        try:
            utils.socket_sendall(self._sock,self._ws_close_struct.pack(self._ws_close_b0, 0x80 | 0, 0)) #rnd=random.randint(0,2147483647)
        finally:
            self._lock_send.release() 
    
    def _send_ws_ping(self):
        if self._sock is None:
            raise Exception('connection closed.')
        self._lock_send.acquire()
        try:
            utils.socket_sendall(self._sock,self._ws_ping_struct.pack(self._ws_ping_b0, 0x80 | 0, 0)) #rnd=random.randint(0,2147483647)
        finally:
            self._lock_send.release()

    def is_close(self):
        with self._lock_status:
            bret = self._close
        return bret
    
    def is_connection_lost(self):
        with self._lock_status:
            bret = self._connection_lost
        return bret        
    
    def is_shutdown(self):
        with self._lock_status:
            bret = self._shutdown
        return bret
    
    def close(self):
        bsendclose=False
        try:
            with self._lock_status:
                if not self._close:
                    self._close=True
                    bsendclose=True
                    self._on_data= None
                    self._on_close = None
                    self._on_except = None
                    #print("session send stream close.")
            if bsendclose:
                self._send_ws_close();
                #Attende lo shutdown
                cnt = utils.Counter()
                while not self.is_shutdown():
                    time.sleep(0.2)
                    if cnt.is_elapsed(10):
                        break
        except:
            None
            
    
    def shutdown(self):
        
        with self._lock_status:
            if self._shutdown:
                return
            self._close=True
            self._shutdown=True
        
        if self._sock is not None:
            #Chiude thread alive
            #if (self._tdalive is not None) and (not self._tdalive.is_close()):
            #    self._tdalive.join(5000)
            self._tdalive = None

            #Chiude thread read
            #if (self._tdread is not None) and (not self._tdread.is_close()):
            #    self._tdread.join(5000)
            self._tdread = None
            
            try:                
                self._sock.shutdown(socket.SHUT_RDWR)
            except:
                None
            try:
                self._sock.close()
            except:
                None
            self._sock = None
            self._prop = None
            self._proxy_info = None
                                                                                                                                                                                                                                                                                detectinfo.py                                                                                       0000644 0001750 0001750 00000010371 14143430345 013045  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

import platform
import subprocess
import sys
import utils

def is_windows():
    return (platform.system().lower().find("window") > -1)

def is_linux():
    return (platform.system().lower().find("linux") > -1)

def is_mac():
    return (platform.system().lower().find("darwin") > -1)

def is_os_32bit():
    return not sys.maxsize > 2**32

def is_os_64bit():
    return sys.maxsize > 2**32

def check_hw_string(s):
    if s is not None:
        if "raspberry" in s.lower():
            return "RaspberryPi"
        elif "wandboard" in s.lower():
            return "Wandboard"
        elif "pine64" in s.lower() or "rock64" in s.lower():
            return "Pine64"
    return None

def get_hw_name():
    sapp = platform.machine()
    if is_linux() and ((len(sapp)>=3 and sapp[0:3].lower()=="arm") or (len(sapp)>=7 and sapp[0:7].lower()=="aarch64")):
        #VERIFICA SE RASPBERRY
        try:
            if utils.path_exists("/sys/firmware/devicetree/base/model"):
                fin=utils.file_open("/sys/firmware/devicetree/base/model","r")
                appmdl = fin.read()
                fin.close()
                appmdl=check_hw_string(appmdl);
                if appmdl is not None:
                    return appmdl
            appmdl=check_hw_string(platform.node());
            if appmdl is not None:
                return appmdl
        except:
            None
    return None


def get_native_suffix():
    try:
        hwnm = get_hw_name()
        if hwnm == "RaspberryPi":
            if is_os_64bit():
                return "linux_arm64_v1"
            else:
                return "linux_armhf_v2"        
        elif hwnm == "Wandboard":
            if is_os_64bit():
                return "linux_arm64_v1"
            else:
                return "linux_armhf_v1"
        elif hwnm == "Pine64":
            if is_os_64bit():
                return "linux_arm64_v1"
            else:
                return "linux_armhf_v2"
        
        sapp = platform.machine()
        if sapp is not None:
            if sapp.upper()=="AMD64" or sapp.lower()=="x86_64" or sapp.lower()=="i386" or sapp.lower()=="x86" or (len(sapp)==4 and sapp[0]=="i" and sapp[2:4]=="86"):
                if is_linux():
                    if is_os_64bit():
                        return "linux_x86_64"
                    elif is_os_32bit():
                        return "linux_x86_32"
                elif is_windows():
                    if is_os_64bit():
                        return "win_x86_64"
                    elif is_os_32bit():
                        return "win_x86_32"
                elif is_mac():
                    if is_os_64bit():
                        return "mac_x86_64"
                    elif is_os_32bit():
                        return "mac_x86_32"                
            elif is_linux() and len(sapp)>=3 and sapp[0:3].lower()=="arm":
                try:
                    if is_os_64bit():
                        return "linux_arm64_v1"
                    else:
                        p = subprocess.Popen("readelf -A /proc/self/exe | grep Tag_ABI_VFP_args", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
                        (o, e) = p.communicate()
                        if len(e)==0:
                            if len(o)>0:
                                return "linux_armhf_v1"
                            else:
                                None
                                #return "linux_armel"
                except:
                    None
            elif is_linux() and len(sapp)>=7 and sapp[0:7].lower()=="aarch64":
                return "linux_arm64_v1"
            elif is_windows() and sapp.upper()=="ARM64":
                return "win_x86_32" 
            elif is_mac() and sapp.upper()=="ARM64":
                return "mac_arm64_v1" 
    except:
        None
    if is_linux():
        return "linux_generic" 
    return None

if __name__ == "__main__":
    print(get_native_suffix())
                                                                                                                                                                                                                                                                           dwaggdi_arm64_v1.so                                                                                 0000644 0001750 0001750 00000236310 14140517152 013741  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 ELF              V      @       6         @ 8  @                                 v"     v"                  X,     X,     X,           
                   ,     ,     ,                                                $       $              Ptd   P     P     P                        Qtd                                                  Rtd   X,     X,     X,                                 GNU I܃:*SWFb*P    a         
   cR $ 
NX Q  	 h X5
    $  H        D      ! LX$D@ 
c                                                                                                                                                                                                                                                                                                                               KF RkU(A]#kx}փğ<FKVvT<TyY DaNC3 	4蠇!2í6YT3|!^;PF)J˅Y^;^;䒘h;xY 8* Ȑ [`CE짗-keXy^;vaspTsy*˹[)L-j3@d5F"!k`qX[y|(tVkө`ұ|ܫQ&')%Sv5!}d3=*@ǐ7_,DQ	w2"0$6LesIG4+fuFϺ7zWc==Qj|GO-Yl[?vD_]x`67Gyፓ]BLSX                                 	 L                    ,             ;                                          l                     9                     .
                     
                                          &                     4                     
                     q                     ;                                          +                     8                     f                     U
                     =                                                                                                                              v                     D                     I                     n	                     a	                                                               4                                                                                                         R   "                   f	                     '                                          v                                                                                    	                                                                                                         [                     ~                                                               
                                                                                                                                                    	                     m                                          e                                          y                                          s                                                               '                                          a                                             f                                          /                                          m                     r
                     b                     
                                          a                     C                                                               	                                          u                                          
                     P                                                                                                                                                                        j                     0                                                               	                     H                                                               &                     B
                                                                                                           9                     J                                                               m                                          }                                                                                                                                
                     8                                                                                                      4                     c             	    5              "        T       f    g      ,       b
    5                                 h`             J
     6            u   "               6    j      p       i
    06                4                 Э            
    X5                a      d       	    X6                @\                 p6               "               G     p      |      ]    _             	
    5                [             '  "  H             
    `            M                 =  "                   `[      `                        ]    p                g      P       u     [      `       ?
    6                xk               "        T                 X       Q    ]                                 4             I    P      L      k                 &    n               "                   p6                             	          T          pk             K    0f      T      	     6            e    h                                   `                	 L                  в               "               W                     (d                 d                                "  (                  5            9    ]      P       K          |           4             s    8                 6                8h             z    g      ,           c                 p6               "                                    i                 k               "                                    5            U    b                              9    He                               Z    85                H             	    }                 \      `           b      0                                             a      p       /    4                j             n    (6                 ]      `         "  (             
    h             h    b      T       @     Z                 p6             x
    P5            `  "               
          X           i      p       :    a              H    X             y  "  (      `       	    }      P/          p      T           Hc      D                 <          c      0          "               N    6              "                ]    8k      8           x             
    h5                m      x       V  "  0             	    86                       L       __gmon_start__ _init _fini _ITM_deregisterTMCloneTable _ITM_registerTMCloneTable __cxa_finalize _Jv_RegisterClasses _ZNSt6vectorIP9DWAWindowSaIS1_EED2Ev _ZdlPv _ZNSt6vectorIP9DWAWindowSaIS1_EED1Ev _ZNSt6vectorIP13DWANotifyIconSaIS1_EED2Ev _ZNSt6vectorIP13DWANotifyIconSaIS1_EED1Ev _ZNSt6vectorIP7DWAFontSaIS1_EED2Ev _ZNSt6vectorIP7DWAFontSaIS1_EED1Ev _ZNSt6vectorIP8DWAImageSaIS1_EED2Ev _ZNSt6vectorIP8DWAImageSaIS1_EED1Ev _ZN10JSONWriterD2Ev _ZN10JSONWriterD1Ev wcslen _ZSt19__throw_logic_errorPKc _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9_M_createERmm wmemcpy _Z20removeWindowByHandlem windowList _ZdlPvm memmove _Z17getWindowByHandlem _Z13getWindowByIDi _Z17getNotifyIconByIDi notifyIconList _ZSt24__throw_out_of_range_fmtPKcz _Z21getNotifyIconByHandlem _Z11getFontByIDi fontList _Z12getImageByIDi imageList _Z17ChooseBetterStylemm _Z16addImageToBufferPwRPm _ZN11ImageReaderC1Ev _ZN11ImageReader4loadEPKw _ZN11ImageReader8isLoadedEv _ZN11ImageReader8getWidthEv _ZN11ImageReader9getHeightEv malloc _ZN11ImageReader8getPixelEjjPhS0_S0_S0_ _ZN11ImageReader7destroyEv _Unwind_Resume __gxx_personality_v0 DWAGDIUnloadFont display XFreeFontSet DWAGDIPosSizeWindow XFreePixmap XGetWindowAttributes XCreatePixmap XMoveResizeWindow DWAGDIDestroyWindow XDestroyIC XDestroyWindow DWAGDISetTitle XwcTextListToTextProperty XSetWMName DWAGDIGetScreenSize screen DWAGDIGetImageSize DWAGDIShow XMapWindow XMoveWindow DWAGDIHide XUnmapWindow DWAGDIToFront XRaiseWindow DWAGDIPenColor DWAGDIPenWidth DWAGDIDrawLine XSetForeground XDrawLine DWAGDIDrawEllipse XDrawArc DWAGDIFillEllipse XFillArc DWAGDIUnloadImage DWAGDIDrawImage XDrawPoint _Z13getFontAscentii DWAGDIGetTextHeight DWAGDIGetTextWidth XwcTextEscapement DWAGDIDrawText XwcDrawString DWAGDIGetMousePosition root XQueryPointer DWAGDIFillRectangle XFillRectangle DWAGDIRepaint XSendEvent DWAGDIClipRectangle XSetClipRectangles DWAGDIClearClipRectangle XSetClipMask DWAGDISetClipboardText DWAGDIGetClipboardText DWAGDIUpdateNotifyIcon _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9_M_assignERKS4_ DWAGDIDestroyNotifyIcon _Z10drawNotifyP13DWANotifyIconii _Z13detectKeyTypeP9DWAWindowP7_XEvent XwcLookupString _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6appendEPKw _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9_M_appendEPKwm jonextevent _ZN10JSONWriter9addStringENSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEES5_ free realloc _ZSt20__throw_length_errorPKc _Z17detectMouseButtonP7_XEvent DWAGDILoop g_callEventMessage getenv setlocale XOpenDisplay screenid XInternAtom wm_protocols wm_delete_window XSetLocaleModifiers XScreenOfDisplay im XOpenIM best_style XGetIMValues x11_fd exitloop XFree colormap in_fds tv select XPending XNextEvent XFreeColormap XCloseDisplay _ZN10JSONWriter5clearEv _ZN10JSONWriter11beginObjectEv _ZN10JSONWriter9addNumberENSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEEi _ZN10JSONWriter9endObjectEv _ZN10JSONWriter9getStringB5cxx11Ev XCopyArea _ZN10JSONWriter10addBooleanENSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEEb XRefreshKeyboardMapping XSetInputFocus stderr fwrite DWAGDIEndLoop _ZNSt6vectorIP9DWAWindowSaIS1_EE19_M_emplace_back_auxIJRKS1_EEEvDpOT_ _Znwm _Z9addWindowimP4_XGCP4_XIC DWAGDINewWindow XWhitePixel XCreateWindow XSetWMProtocols XCreateGC wcpcpy wcstok XChangeProperty XVaCreateNestedList XCreateIC XGetICValues XSetICFocus XSelectInput XAllocSizeHints XSetWMNormalHints _ZNSt6vectorIP13DWANotifyIconSaIS1_EE19_M_emplace_back_auxIJRKS1_EEEvDpOT_ _Z13addNotifyIconi DWAGDICreateNotifyIcon XMatchVisualInfo XCreateColormap sprintf XGetSelectionOwner _ZNSt6vectorIP7DWAFontSaIS1_EE19_M_emplace_back_auxIJRKS1_EEEvDpOT_ _Z7addFonti DWAGDILoadFont XCreateFontSet XFreeStringList XFontsOfFontSet _ZNSt6vectorIP8DWAImageSaIS1_EE19_M_emplace_back_auxIJRKS1_EEEvDpOT_ _Z8addImagei DWAGDILoadImage _ZNSt8ios_base4InitC1Ev _ZNSt8ios_base4InitD1Ev __cxa_atexit _ZN10JSONWriterC1Ev main _ZN10JSONWriterC2Ev _ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7compareEPKw _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE8_M_eraseEmm _ZN10JSONWriter10beginArrayEv _ZN10JSONWriter8endArrayEv _ZN10JSONWriter7addPropENSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEE _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7reserveEm _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9_M_mutateEmmPKwm _ZN10JSONWriter6lengthEv _ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEED2Ev _ZTVNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEE _ZTVSt15basic_streambufIwSt11char_traitsIwEE _ZNSt6localeD1Ev _ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEED1Ev _ZTVSt9basic_iosIwSt11char_traitsIwEE _ZTTNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEE _ZNSt8ios_baseC2Ev _ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E _ZTVNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEE _ZNSt6localeC1Ev _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi _ZNSt8ios_baseD2Ev _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIbEERS2_T_ _ZN10JSONWriter9addNumberENSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEEy _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIyEERS2_T_ _ZN10JSONWriter9addNumberENSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEEm _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertImEERS2_T_ _ZN10JSONWriter9addNumberENSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEEl _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIlEERS2_T_ _ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEED0Ev _ZN11ImageReaderC2Ev _ZN11ImageReader7readBMPEPKw wcstombs _ZTTSt14basic_ifstreamIcSt11char_traitsIcEE _ZTVSt9basic_iosIcSt11char_traitsIcEE _ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E _ZTVSt14basic_ifstreamIcSt11char_traitsIcEE _ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev _ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode _ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate _ZNSi4readEPcl _ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv _ZTVSt13basic_filebufIcSt11char_traitsIcEE _ZNSt12__basic_fileIcED1Ev _ZTVSt15basic_streambufIcSt11char_traitsIcEE _ZNSi5seekgElSt12_Ios_Seekdir memset _ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev _ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev libX11.so.6 libXpm.so.4 libstdc++.so.6 libm.so.6 libgcc_s.so.1 libc.so.6 _edata __bss_start __bss_start__ __bss_end__ __end__ _end GCC_3.0 GLIBC_2.17 CXXABI_1.3 GLIBCXX_3.4.20 CXXABI_1.3.9 GLIBCXX_3.4 GLIBCXX_3.4.21 GLIBCXX_3.4.9                                                                                                                                                                             	                                                                                                                                                                   P&y  	                     #                 ӯk   .     p   9     yѯ   H     t)   U     q   a     )   p      X,           Y      `,           W      h,           X      p,           X      x,           Y      4           4     .                  .       	           .       
           .                  .                  .                  .                  .                  .                  .       &           .       +           .                   /                  /       2           /                  /                   /                  (/                  0/                  8/       =           @/                  H/                  P/       I           X/                  `/       J           h/       K           p/                  x/                  /                  /                  /       b           /                  /                  /       p           /       |           /       }           /                  /                  /                  /                  /                  4       k            0                  0                  0                  0                   0                  (0                  00                  80                  @0                  H0                  P0                  X0                  `0                  h0                  p0                  x0                  0                  0                  0                  0                  0                  0                  0                  0                  0                  0                  0                  0                  0                  0                  0                  0                   1                   1                  1       !           1       "            1       #           (1                  01       $           81       %           @1                  H1       &           P1       '           X1       (           `1       )           h1       *           p1                  x1       ,           1                  1       -           1                  1                  1       .           1       /           1       0           1       1           1                  1                  1                  1       3           1       4           1       5           1                  1                   2       6           2       7           2       8           2       9            2       :           (2                  02       ;           82                  @2       <           H2                  P2       >           X2       ?           `2       @           h2       A           p2       B           x2       C           2       D           2                  2                  2                  2       E           2       F           2       G           2       H           2                  2                  2       L           2       M           2       N           2                  2       O           2       P            3       Q           3       R           3       S           3       T            3       U           (3                  03                  83       V           @3       W           H3       X           P3       Y           X3       Z           `3       [           h3       \           p3       ]           x3       ^           3       _           3       `           3                  3       a           3       c           3       d           3       e           3       f           3       g           3       h           3       i           3       j           3       k           3                  3       l           3                   4                  4       m           4       n           4       o            4       q           (4       r           04       s           84       t           @4       u           H4       v           P4       w           X4                  `4                  h4       x           p4       y           x4       z           4       {           4                  4                  4       |           4       ~           4                  4                  4                  4                  4                  {  {_    {  G?      @    @"    
@B    @b    @    @    @    @    "@   &@"   *@B   .@b   2@   6@   :@   >@   B@   F@"   J@B   N@b   R@   V@   Z@   ^@   b@   f@"   j@B   n@b   r@   v@   z@   ~@   @   @"   @B   @b   @   @   @   @   @   @"   @B   @b   @   @   @   @   @   @"   @B   @b   @   @   @   @   @   @"   @B   @b   @   @   @   @   A   A"   
AB   Ab   A   A   A   A   "A	   &A"	   *AB	   .Ab	   2A	   6A	   :A	   >A	   BA
   FA"
   JAB
   NAb
   RA
   VA
   ZA
   ^A
   bA   fA"   jAB   nAb   rA   vA   zA   ~A   A   A"   AB   Ab   A   A   A   A   A   A"   AB   Ab   A   A   A   A   A   A"   AB   Ab   A   A   A   A   A   A"   AB   Ab   A   A   A   A   B   B"   
BB   Bb   B   B   B   B   "B   &B"   *BB   .Bb   2B   6B   :B   >B   BB   FB"   JBB   NBb   RB   VB   ZB   ^B   bB   fB" { S  @   `   
  @  T@   7J  B  	 T  ҭ @
  @  T@      @@ @SA?x {Ĩ_    { S  Д  sB.     GRGU   G    cG G|      clG hG|      cG |G|      SAcG G|  {¨      R_{    s    @{¨B@ Gt    {    s    @{¨B@ Gd   G@  P_    ! ! !  ?8   T  !GA    _     ! !  !C!A!A    BGb  @  _ {    `S9@ 5   tG     hB}  R`9@{¨_    2 @a     !G{   ?{{ S  G#@ ˄C$ s @a@   T R   sxaa@?  @ TA ? eTSA{¨_     T @C@ G  ҆ SA{¨ GҔG@  ц SA{¨    G@c cC  @@  T R   Հxb@_   T" _ #T  _   * G@c cC  @ @ k T R   Հxb @_ k  T" _ #T  _  !lG%@B BCb  @F # @ k T R   ?  Txa$ @  k  Ta ? T _{@   @8 	  !lG%@B BCb  @F #@  T R   ?  Txa$@    Ta ? T _{@   @8    * G@c cC  @ @ k T R   Հxb @_ k  T" _ #T  _   * G@c cC  @ @ k T R   Հxb @_ k  T" _ #T  _   _ @ T@#@_   T_   _ _x_   _{ [#S sck( ro  TG@@  o@SA[BcCkDsE{˨_< *`~   o  |} s 0|@a s@ |@?  RW R` ;    Q kH T~}   G**vB9s B9B9B9B<Sc@ *@` *  * |@`h4"   Q kT *G@ a   { [  SG$@c cC  @a@ k  T R  xaa@?  k` TA ? 4}TSA[B{è_ @ a@ dG  @G@    ?   Tb DCd Gc  SA [B{èl ղ@ { [*c*S**@    @fG@Ja@#@B_@*a@*@D` a@*@***vV)SA[BcC{ͨ_ { S h` @   fG@@a@@SA{è SA@{è_{ S  K     " RsfG R`@`@@HSA@{ƨ_   !\G! @"@  !@ _{ S   A @ a  SA@{ƨ_֡@ a   { S	    @fG@bF)a@@SA{¨ SA{¨_ {     @{@dG  @I{_{     @{@dG  @{_{ S* **  "*B*s~@ SA@{è_ _ { [*c*S**    AfG@****cC[Bb@a@@SA{Ĩ2 SA[BcC{Ĩ_ C{C [*c*S**@    AfG@y@Rb@a@*@***  R SA[BcC{Ĩ_ C{C [*c*S**x@    AfG@U@Rb@a@*@***  R SA[BcC{Ĩ_ { [  SG$@c cC  @a@ k  T R  xaa@?  k` TA ? 4}TSA[B{è_ `" {G@    ?   Tb DC Gc  `@ @  SA[B{è @@ { S*k)[cs *_ @ T     R,{gGk@ R<   s   Q kc T**{A9qTA9A9A9A@c\S`@b@*B *B|@o@B@A@d `@*s j  Q kT   Q kTSA[BcCkDsE{Ȩ_ {*    @{_  R{_ {*    @{_  R{_ {* S@   *`@SA{¨{  RSA{¨_{ [*k*S*c * * @  TSA[BcCkD{Ũ_   aAfG@i@**u@@s@ k ***SA[BcCkD{ŨC    {C   G   dG     @  @I qa  TF)a ) @{Ĩ_{ [*c*S**G    AfG@$****cC[Bb@a@@SA{Ĩ\ SA[BcC{Ĩ_ { S*[***$    O    R dG N	
N  @3 NE@ R+ `N<SA[B{Ϩ_ { S*[***   @ F R% R RdG Rs yw y{ y  @ ySA[B{Ĩ_{     @{ `dG  @( {__   _{ [Sc' `    # RgG" R@a@@B C  @ / 	 T 	 T y/@C@B db   @@G x!` T  TB@c K@a   C K B G    @  TL`:@  q T`>@  q T
R	 ҿ R?| CgG?| ?| ?|   @a@S `@[ :SA[BcC{Ԩ_֡c 1C /@K @b" G )C@ c K@` @   7 աCG b" ?x  { Sy      dG@  @  "  3  @    @  TSA{Ĩ_{ [#S ck*s*3 a@ ra TG@@  SA[BcCkDsE{˨_֡3@8d)( k	 TXs~" |@wK? k R T R? ; 7   Q k T   Q kH TUk$Uz  Ts  դF?@**^B9qTB9  B9B9 dG\S3@c2@*B *  @@B|@  @@** dG  @Is {   R3Ys~s |@zKG@ a  ga{ S [ ck+   
@CRd q|3g@ 1$ T qB  @ T+ T q T7@b? > T"? $B TB? $B 3 Tb? $B > T#҂? $B5 TB? G Tb? `H T? @I T?  J T? L T? `M T? @N T"? `O T"? @P T? P Tb? P Tb?  Q T? Q T"x$ğ_ $C`G T_  P T? Q T? Q T? $B P T"? $BQ Tc? $BP TC? $BQ T#҂? $BP T? $B@Q T? $B TA  !  V  B  HU T _@  g@ q T qm T` b Q |~B  H   |c B~  Z  CB 3@# @ K  T ! T36 [   `#?x3:C  @ O  T `! T    x3@SG.@9C  @  T@B  @  T|[  C`B  @ S  T   T0  ?x3;C  @ W h T  T- @SG x3@9C  @  TT@B  @  TO [@6 R   R *+@SA[BcCkD{ݨ_ֳ[@ RB  T6C AK@  A#?K@@ a~~  
@*0 q *g@T qB  s~TX Z  C@#B k =@ ; h T ` T3- Y  o  ?x3B { -@ ?  T  T    x3@SG{@B  @  Tk@B  @  T[  C`B  @ C  T  Tv OK x6 C s~Ӡ ? @ T@   7ic O@  a#O@@, ա S@  aS@@= ա ҵW@  W@@> V  ւ  )T@   9@Cc @+`CaD@C }V    iT@   9 @B  @  Tm[@B  @  Thb sB G  T ` T  @SG x3@C  @  TR@B  @  TM6 R[@ V  y  T@   9V  o  T@   9# AG@  ?G@@ ա 3C@  a1C@@I ա %?@{  !#?@{@ ա ;@k s A#;@k@ !C	aC#$!@ CN>V  B  )T@   95V  ւ  T@   9+V    T@   9!V    ( T V  
   T 
V  B  멽T@   9V  ւ  iT@   9V    )T@   9V    멹T@   9A  !@A  !A  !@	A  !	A  !
A  ! 
A  !A  !`A  ! }A  !xA  ! sA  ! nA  !iA  !d@   9{@B  ? `  T=k@B  T@9C  ? `  T1@B  @  T, @9C  ? `  T#@B  aT@   9o@   9l   @C  ? T    T@ q  T q xS_ A  { s  Sc  bcG[kC @   9  R  pfG` \A   R!:  fG   R#GA  !:`  `@  "GA  @   `:9`@  GBG@a  $|yt@c c@C      !\G    `@  sG` XA  c!;   O@G" @y  4  R6   s " _ k T @ hu 6!T@s " EO@" @y  _ kT  #B   GfGbcG! @B @#t@!@` (@   G   G    @ ?`B G @G  @9	 5 G    O  '  ҥG   @)G  q ư k  DZ =|=	|@= Ț  =====xf@f 
x& =JfG@7 4C@SA0 q` T q( T qB T q C T q`` T q } T< q T$ q` T( q` T q TX qAT@EAAm@G  @94  G P@ ˔C* 4 Q fGG   @@s B  BC_ WTxs@!@[(ATG R@   s c  k  T@  ?  Tb DCZs @kc  ѣ aT  fGG@! @@( SA[BcCkDsE{ƨ_acG  ! @  ?e ՠ@3    \  RGC@GW @ g H T   T;[ @  ?x# aB C g @ S C@( T   T9RGk x<Yg@aB  @  TW@ @  T\  aB cg @ W GH T  T#6k _x#RG@g@aB  @  T\  aB g @ W G T ` T.k _x#RG{Ag@aB  @  Tr\  aB g @ W GH T  T+k _x#RGAg@aB  @  TWC  aB `g @ W G T  T(k _x<RGAg@aB  @  T=C  aB `@g k@ W GȮ T   T%k _x<RGAg@aB  @  T#RGacG4 @g@?֠g@aB  @  TfG@@($O)&P)  @	*@*  G ՠ@WC   \  RG?@kW (@ g H T  T2[ @  ?x# aB ? g @ S ?@h T  T2RGk x<}g@aB  @  TW@ @  T\  aB cg @ W G T ` T1k _x#C@RGB @)g@aB  @  TC@ r TC  |B ``g C @ W C@( T T k x8RGAB  g@aB  @  TC  |B `g C @ W C@ T T k x8RGABBӦg@aB  @  TuC  |B ` g C @ W C@ T Tx k x8 RRGg@aB  @  T[C  |B ``g C @ W C@ T `Tx k x8 RRGrg@aB  @  TARGacG4 @g@?֠g@aB  T2{ ՠ@?   \  ; RGC =C@W ;@C M@ g C@ T  TC \  [ aB x#g ; @ C S F T   T  C@k x!RGg@aB  @  TW@ @  T\  W CC @ g C@ T  TC [ aB x#@   C g 	@ S C@ȕ T  T< k x<RGng@aB  @  TW@ @  T\  aB c; C g @ W ;@C@( T   T#	k _x#?@RGB @g@aB  @  T\  aB g @ W Gȝ T  Tk _x#RGAg@aB  @  T\  aB g @ W G T   Tk _x#RGAg@aB  @  Ti\  aB #g @ W G T   TCk _x#y *RGg@aB  @  TLRGacG4 @g@?@?    \  RGC SC@W e@ g Ȫ T  Tc \  [ aB x#g T @ C S F T  T  C@k x!RGg@aB  @  T	W@ @  T\  W CC 3@ g C@Ƞ T  Tc [ aB x#@   C g "@ S C@ T   T\ k x<RGg@aB  @  TW@ @  T\  aB c; C g @ W ;@C@ T   T k x#?@ @RG1g@aB  @  T\  aB g @ W G T  T# k x#RGAg@aB  @  T\  aB g @ W GH T  T k x#RGAg@aB  @  T\  aB #g @ W G T ` TC k _x# *RGg@aB  @  TeRG6acG4 @!g@?$ ՠ@?     <  RGC kC@W }@ g  T @ T <  [ aB x#g l @ C S Fz T ` T B{ C@k x!RGg@aB  @  T!W@ @  T<  W CC K@ g C@u T   Tu [ aB x#    `C g :@ S C@(q T @ Tq k x<RGg@aB  @  TW@ @  T<  aB c; C g @ W ;@C@(k T  Tk k x#?@ @RGIg@aB  @  T<  aB g @ W GH` T  T` k x#RGA.g@aB  @  T<  aB g @ W G[ T  T[ k x#RGAg@aB  @  T<  aB #g @ W GU T  TC k _x# *RGg@aB  @  T}RGNacG4 @9g@?< Հ@ ҡ@B R(@C @]  <  ? RG|W ?@@ g ?@( T `M T <  [ aB x8g |@ S G T @ Tx k x8RGg@aB  @  T4W@ @  T0<  W C? ^@ g ?@ T  T [ <  aB x8? g M@ S ?@ T  TX k x8RGg@aB  @  TW@ @  T<  aB cg .@ W Gh T  T؈ k x8C@ @RG^g@aB  @  TRGacG4 @g@?֤ ՠ@+C  K  <  ? RG@W ?@@ g ?@ T ; T <  [ aB x8g @ S G| T  T} k x8RGOg@aB  @  TW@ @  T<  W C? @ g ?@Hw T @ Tw [ <  aB x8c? g @ S ?@s T  Ts k x8RG g@aB  @  TsW@ @  To<  aB cg @ W GH T  T k x8C@ @RGg@aB  @  TSRG$acG4 @g@? ՀRGa ՠ@ @8  @ G  @?  7T  @ G  @?  6T  RGK!  !q!  !mRGG@g@ @  TW@ @  T!  !@\!  ! XRGG@g@ @  TW@ @  T!  !`GRG@oG@g@ @  TRGacG4 @g@?  ңC W g@C@_ W@g@  ңC g W@C@o cW@g@5 ա S@g o !  !S@g@ ңC g W@C@o a@W@g@  ңC g W@C@o aW@g@W  ңC g W@C@o W@g@-  ңC g W@C@o W@g@ @ @ @ @ @ @     8D  ՠ?@  @  `xD `D 0 ң? hg W@?@o ceW@g@ ա YS@g o !  !VS@g@e ң? JW g@?@_ GW@g@E ՠ@= @@+Z)` /S@g o !  !,S@g@J ңC  W g@C@_ CW@g@* S@C@g o S@C g@ ңC W g@C@_  W@g@  @   @ # ңC g W@C@o #W@g@I ңC g W@C@o W@g@ ңC g W@C@o W@g@@ @     D ;@  @  ңC g W@C@o W@g@	 ңC g W@C@o cW@g@ ңC g W@C@o cW@g@ ҅S@g o !  !`S@g@o ңC vW g@C@_ CsW@g@O hS@C@g o fS@C g@" ңC YW g@C@_ VW@g@ ңC Jg W@C@o #GW@g@ ңC ;g W@C@o 8W@g@ ңC ,g W@C@o )W@g@k ңC g W@C@o cW@g@@ S@g o !  !S@g@ ңC  W g@C@_ CW@g@ S@C@g o S@C g@ ңC W g@C@_ W@g@ ңC g W@C@o #W@g@b ңC g W@C@o W@g@8@ @ @ @ 0@ @ G@ @   @   @     pE @ @  Җg W@C@o a`W@g@1 ҈g W@C@o a W@g@	 zg W@C@o awW@g@ lg W@C@o a`iW@g@@ @ :@ @ @ @ k    E E  @ 0@K A q . T qT  RGL!  !r!  ! nRGG@g@ @  TW@ @  T!  !@]!  ! YRGG@g@ @  TW@ @  T!  !`HRG@pG@g@ @  TRGacG4 @g@?֡G@g@ Tj S@g o cS@g@] W g@_ Cg@W@? S@g o S@g@ W g@_ g@W@ ҿg W@o cW@g@ ҲS@g o S@g@ ҥW g@_ Cg@W@l ҘS@g o S@g@A    E   @ @ @ @ @ @ @ >#D &@ @ @ @ #D 2 fg W@o cdW@g@ YW g@_ Wg@W@@ @ @ @ @ @ @ @ `D `E `D `E   @ F @ @ $F   @ ~@ @ \q_M       :! cGc @`@       ;B! cGc @`@4	% W@B  @  Tg@sB  ? `  Tg@bB  ?  T  RG4!  !!  !  RG\G@g@ @  TW@ @  T!  !@!  !RGGG@g@ @  TW@ @  T!  !`RG@G@g@ @  TRGZacG4 @Eg@?֒2    @8s} zymuisr{zonwvsrqhdXba`ih[XWVo|QPO        '        ! R G  9_ { [ * S!       G  @  ? ` Ta     @G!   SA[B{Ĩ_  @ { [  k  S*G3gG5 Rc*s* *@*`@)e[ `@  F **!Gt@b! @G8@* RB @  *    `@*BG5`@  O q%RUz@z@ Tq  T#q Tt
  ; 5  е ~ H  |c   c R   |}N @3*  ҅     q *T34 |}[}*  45gG!  != R@& !  @! > R  @* RR;;@     G @   C " @!  !@>   RB@J   '  %  #  !  `> G>c ?!`? @   G  @ + S S !  !? 	ҢS@ B  9gG @O@@  @c(#A'A/A @*` @@a2 `6  SA[BcCkDsE{ڨ_  O NN NN== = <  `@H^qaT`@!  *!; !  `@*!@<`@* RR Һ0	" 3gG!  !;" R`@ !  !@=`@" R`@' R RR Ҟ3gG!  !;" R`@s !  !<     @8 f {   * ҿ`        ClG  d@a@  ? ` Ta     @BlG!  A @{è_  0@ 	{ S[  c#  Ѣ/ afG  RR@!@@ RS@t@!@   S@C҂@% R@!G  **w ! @   R   @d   ҷ` Q   a@ @  C!  @!? R   a@@G R RR=a@	Ҁ@B  !  !  BGB @@ R @^   fGc R" RC@a@@B j W J@ 7  T   T 7@@B db   @@ x!` T  TB@c @a     B     @  TCfG!  ! #R|  R| | | C@| | | 	| C	| 	| 	| 
|  R  Ҡ@ Re@ #@SA[BcC{Ũ	_  @B A ա ҿ 7@  b" ?x H@ @b"  c @`     78                  {   * ғ        CG  a@? ` Ta     @BG!  A @{è_  l@ { S  [3 YfG Cc!  @! `  O@?  q  T+@`@  `
 1  qm Te@ Ҧ3@xbB d@aX@ kJ  Ta c\@! ? km  T*a  kLTSA[B@{Ǩ_!  @!u` !  @! l` `!  @!c` @!  @! Z`  !  @!Q`  !  @!@H`  { S *      9   ~)*   t  @G@?  TA 3  @BG!  A SA{è_  @ { S   ( @ SA{è_   dGN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          @`   _      @`   _      @`   _      @`   _    A?    T _    { S  @c@[   C   I T N@@s˿`C@  Tj3  s" w  {cCN 
 SA[B{Ĩ_s"  ? T  ҡ|    { S  @c@[   C   I T[ N@@s˿`C@  Tj3  s" w  AcCN 
 SA[B{Ĩ_s"  ? T  ҡ|    { S  @c@[   C   I T! N@@s˿`C@  Tj3  s" w  cCN 
 SA[B{Ĩ_s" S ? T  ҡ|    { S  @c@[   C   I T N@@s˿`C@  Tj3  s" w  cCN 
 SA[B{Ĩ_s"  ? T  ҡ|    @  | _{ S3  sB @ !    T SA{¨    9{ @Sb  _  T  `B  @`  @  T    7)cxb!  !" ң)  *@sB  @  TwU 43  sb@ !   T @SA{Ũ_փ@a ?  T"      !      9       @sB  ? `  THB { S  s q@ !    T SA{¨R    9{ @Sb  _  T  `B  @`  @  T    7cxb  !" ң)  *@sB  @  TU 4  s<@ !   T @SA{Ũ_փ@a ?  T" Ҁ     !      9?       @sB  ? `  T { S  " [ a@ ( T 
@a@  T   Ba@  T [BSA{è    9{ S4L@c[B ks~s; @  T    7;sB  7 ( T ` T ? _x3;@B  @  T  s"b@ !  H T  @B X@     9CZ  ?@   տ q` T	 T q  Trq T  ˵B   T s@ ?@ T@xt2 q TT& q T* q 
 T" q T;@B |   TC@ Tx3 ? _ T;@O  s _b@ !  H T B;@B  @  TSA[BcCkDsE{ɨ_ տ6 q!T  ˵B T    9]:  T    ˵. IT    9I  ˵$ 	T    9?  ˵  T    95  ˵ T    9+  T {$   @;@ b ҅ ; 7@C F)@ %?@{    9;@B  ? `  T    9    9    9    9  @ ?  _@c  *_{b _  S  h Tc@ B  `  @  T    7 cxb  !" ң)  *@B  @  Tic@*U  5` QSA@{Ũ_     !  @B  ? `  TUO{ S@[  B s~Ӏ @@  T    7sB   T `	 T  [B ?x3SA{Ũ_ ա  =@ 
 ;@@[B ?x3SA{Ũ_ b _  T@ B  `  @Tcxb  !" ң) z *@B  @  T 5@B  3 @ss~ӿ@TsB  	T բ@ [B  ?x3SA{Ũ_     !  @B  ? `  T@ { S[cB 6P@cks~ӣs @  T    7f ՔB  *c ( T  T4% w _x4s@aB  @  T`    9G   OB[G @  3Y@  =#	  ="^s `|j"      O`  G"` !  Gs !@ ?=w C=G= sGRa"  @  w `+bC *@ C   @? i T@C 7 c      7@?  7 
@C S   T    7 բ7@˵B ?  T ` T C W ? ?x5  T"C C    T[@K@  S [ C W    @  T9HVC@9C  @  T1  ab@ !  h T DGasG@b C  c @  T`GB w Z[G`ֶGB A@s !^bj! -SA[BcCkDsE{ƨ_5 ˵B ;  T 	 T C g ? ?x5@	 T"C C  	 Tk@K@`c k C g    aT s c@{ c@s@  @  ;@c k 7@;@C@c@ ?@S [ 7@GS@i @ @W )SS@o` @g )Kc@aBFik@f ՠ[@bC@9C  ? `  T-     9  G`!@  us@sB  ? Tr `" . ^s |j { S[cB 6P@cks~ӣs @  T    7 ՔB  U Sc ( T  T4% w _x4Rs@aB  @  TA`    U9G   OB[G @  3Y@  =#	  ="^s `|j"F      O`  G"` !  Gs !@ ?=w C=G=] sGRa"  @  w `+bC )*6@ C   @? i T@C 7 c      7@?  7 
@C S   T    7 բ7@˵B ?  T ` T C W ? ?x5  T"C C    T[@K@  S [ C W    @  THC@9C  @  T  еb@ !  h T GasG@b C  c @  T`GB w ;Z[G`ֶGB A@s !^bj! SA[BcCkDsE{ƨ_5 ˵B ;  T 	 T C g ? ?x5@	 T"C C  	 Tk@K@`c k C g    aT ҃s c@{ c@s@  @  q;@c k 7@o;@C@c@ c?@S [ 7@aGS@i @ @W )S@o` @g )c@aBik@f ՠ[@bC@9C  ? `  T'     9k  G`!@  3	s@sB  ? T `"  ^s |j { S[cB 6P@cks~ӣs @  T    7 ՔB  c ( T  T4% w _x4s@aB  @  T`    9G   OB[G @  3Y@  =#	  ="^s `|j"      O`  G"` !  Gs !@ ?=w C=G= sGRa"  @  w `+bC @ C   @? i T@C 7 c      7/@?  7 
@C S   T    7$ բ7@˵B ?  T ` T C W ? ?x5  T"C C    T[@K@  S [ C W    @  TaH~C@9C  @  TY  еb@ !  h T lGasG@b C  c @  T@`GB w Z[G`ֶGB A@s !^bj! USA[BcCkDsE{ƨ_5 ˵B ;  T 	 T C g ? ?x5@	 T"C C  	 Tk@K@`c k C g    aT s c@{ c@s@  @  ;@c k 7@;@C@c@ ?@S [ 7@GS@i @ @W ){S@o` @g )sc@aBnik@f ՠ[@bC@9C  ? `  TU     9  G`!@  s@sB  ? T `" V ^s |j { S[cB 6P@cks~ӣs @  T    7" ՔB  c ( T  T4% w _x4zs@aB  @  Ti`    }9G   OB[G @  3Y@  =#	  ="^s `|j"n      O`  G"` !  Gs !@ ?=w C=G= sGRa"  @  w `+bC Qb@ C   @? i T@C 7 c      7@?  7 
@C S   T    7 բ7@˵B ?  T ` T C W ? ?x5  T"C C    T[@K@  S [ C W    @  THC@9C  @  T  еb@ !  h T  GasG@b C  c @  T`GB w cZ[G`ֶGB A@s !^bj! SA[BcCkDsE{ƨ_5 ˵B ;  T 	 T C g ? ?x5@	 T"C C  	 Tk@K@`c k C g    aT ҫs c@{ c@s@  @  ҙ;@c k 7@;@C@c@ ҋ?@S [ 7@GS@i @ @W )S@o` @g )c@aBik@f ՠ[@bC@9C  ? `  TOG     9  G`!@  [1s@sB  ? T. `"  ^s |j { S[cB 6P@cks~ӣs @  T    7 ՔB  c ( T  T4% w _x4s@aB  @  T`    9G   OB[G @  3Y@  =#	  ="^s `|j"      O`  G"` !  Gs !@ ?=w C=G= sGRa"  @  w `+bC @ C   @? i T@C 7 c      7W@?  7 
@C S   T    7L բ7@˵B ?  T ` T C W ? ?x5  T"C C    T[@K@  S [ C W    @  THC@9C  @  T  b@ !  h T GasG@b C  c @  Th`GB w Z[G`ֶGB A@s !^bj! }SA[BcCkDsE{ƨ_5 ˵B ;  T 	 T C g ? ?x5@	 T"C C  	 Tk@K@`c k C g    aT ?s c@{ =c@s@  @  -;@c k 7@+;@C@c@ ?@S [ 7@GS@i @ @W )S@o` @g )c@aBik@f ՠ[@bC@9C  ? `  T}     9'  G`!@  s@sB  ? T `" ~ ^s |j {  `   !pG $@!@  a @  T  @!G!@ {¨8    {  `   !pG $@!@  a @  T  !G!@ $@{¨ҟ 9|  |)  _ 9|)  _ @9_ @_ @_@9 4@ kI T@k T	 @"*? q" B	 @B|_ q|'Ig8  9@ @| He8  9@ @|B Hb8b  9  T    9_ @ @ uS  @H`8  9_ { c   S[ks- |@<   c|  c#~ #`"Ic	9"G   OVGg	9 @ +V@ ==^; wj ? ^`   G`  `B ;  .aB `" `B R@ ;@ R ^` A R?  j TB e@y@R?  k` T`B  9G6@  G`B !Gb ; !@  C `  `"!xG!@ C yVG^`"; B wj! ?   SA[BcCkDsE{ƨ_ RAO / RAGc  's  # R; B  @  qT@?  qT#@ |o@ |z  q   | |@ 
 Tb  T   o@ R@?@ T #@  q ZZZ_@ T*   rT@  K?  q T  q* R|@m T@!@6" R @  klT  R  9y;@^a! @! 2Ve;@^a! @! 2Nl@B  @*  qT R R@!@7 @  kT T @    T:  T_ @#  _ I TJk@  Z:  Rw  1k   R`    `  y R      h  VG`"!@  - `B ^ ; wj!?  J{ {_    basic_string::_M_construct null not valid       vector::_M_range_check: __n (which is %zu) >= this->size() (which is %zu)       basic_string::append    LANG    Could not open display.
        WM_PROTOCOLS    WM_DELETE_WINDOW        Couldn't open input method      queryInputStyle _NET_WM_WINDOW_TYPE     _NET_WM_WINDOW_TYPE_MENU        _NET_WM_WINDOW_TYPE_DIALOG      _NET_WM_WINDOW_TYPE_DOCK        _NET_WM_ICON    CARDINAL        fontSet statusAttributes        preeditAttributes       clientWindow    inputStyle      filterEvents    _XEMBED_INFO    _NET_SYSTEM_TRAY_S%i    _NET_SYSTEM_TRAY_OPCODE -*-*-medium-*-*--13-*-*-*-*-*-*-*       -*-*-medium-*-*--12-*-*-*-*-*-*-*       -*-*-*-*-*--13-*-*-*-*-*-*-*    -*-*-*-*-*--12-*-*-*-*-*-*-*    -*-*-medium-*-*--14-*-*-*-*-*-*-*       -*-*-*-*-*--14-*-*-*-*-*-*-*    -*-*-*-*-*--*-*-*-*-*-*-*-*     E   S   C   A   P   E           F   1           F   2           F   3           F   4           F   5           F   6           F   7           F   8           F   9           F   1   0       F   1   1       F   1   2       P   R   I   N   T       S   C   R   O   L   L   O   C   K       P   A   U   S   E       B   R   E   A   K       B   A   C   K   S   P   A   C   E       T   A   B       R   E   T   U   R   N           C   A   P   S   L   O   C   K           S   H   I   F   T   L   O   C   K       D   E   L   E   T   E           L   E   F   T           R   I   G   H   T       U   P           D   O   W   N           H   O   M   E           E   N   D       t   y   p   e           K   E   Y       v   a   l   u   e       C   H   A   R           n   a   m   e           R   E   P   A   I   N   T       i   d           x       y       w   i   d   t   h       h   e   i   g   h   t           K   E   Y   B   O   A   R   D           s   h   i   f   t       c   t   r   l           a   l   t       c   o   m   m   a   n   d       M   O   U   S   E       a   c   t   i   o   n           M   O   V   E           b   u   t   t   o   n           B   U   T   T   O   N   _   D   O   W   N       B   U   T   T   O   N   _   U   P       N   O   T   I   F   Y           A   C   T   I   V   A   T   E           C   O   N   T   E   X   T   M   E   N   U       W   I   N   D   O   W           I   N   A   C   T   I   V   E           O   N   C   L   O   S   E       
       basic_string::substr    %s: __pos (which is %zu) > this->size() (which is %zu)  basic_string::erase     {       }   ,           ,       [       ]   ,           "       :               \   "           \   /           \   b           \   f           \   n           \   r           \   t           \   \           "   ,           vector::_M_default_append       ;  Z   Np  HO  @P  HP  PH  Q  R  S  pS  S0  pTP  Th  0U  U  0W  XH  X  0Y  Y  Y   @Z8  Zp  Z  Z  @[   H[  [`  h\  \  ]  8_X  h_  _  _  `@	  0ah	  a	  xb	  b
   c@
  (cX
  0cp
  Pe
  e
  g0  Pu  pu  Ф  H      8  0    ph     x    (  @  X        (  0  H   x  P      P    (    h    p   p    @     8H  P`  `x  h  p  x  8  x0             zR x           x              4   x              L   x              d   x              |   x           ,      K    A@AABk     <      (N    A AAX
 AN
 BK        N`                O`              4  XO    \C        T  O    \C        t  P`                `P`                PP                  zPLR x'      L   $   P    AAABDBS
 A     <   ,   R    A0AABW
 AW
 B 4   l  R    AAADa   4     8Sp    A0ABR
 BC  ,     pSd    A`AB
	T           S            4   l  S   v  A`AA
	BT
 A     4   \   TT    A AAM
 BB      ,      T0    AAE
 CA       ,      T0    AAE
 CA       ,      TD    A0AABK        $  8T           D   <  (T    A@AADU
 BD     4     pT    APAA@ADZ  4     T    APAA@ADZ  <      U    A0AABW
 AW
 B D   4  UT   AAAF
	K      ,   |  V,    ABD
 AB       ,     V,    ABD
 AB       4     VP    A BAK
 AC      L     V    AP
	AADBN
 A]    $   d  xWp    APCA@DR  D     W    A@AADU
 BD     ,     X    AAABg ,     Xp    A@AABV  ,   4  X8    AAE
 EA          d  X              |  X           <     X  
  A('AA$#C&%"!a
 A  ,     Zx   	  A@AAZ     L   L  Z  	  AAABDBS
 A     L     \|  	  A:9AA87D6543D210
 A            i           T     iP/  	  ABBAAA87C@?<;E>=:9
A A       	  ؘ           <   ,	      A@AACC^
 A       4   l	      A@AACY
 A      L   	     AA43AA0/B,+D21D.-B*)
 A    <   	      A@AACC^
 A       $   4
  h    A0AAY
 BL     Н  n
  AARQABPONMBLKCJ
A B      <   
  8    A@AACC^
 A       $   
  `|    A0AAU
 B4        ApAAB
	Bq
 A  <   L      A@AACC^
 A       ,   	      L	  A0AA[
 B ,     T    A0AABO     $     x@    A AAy      HA           $   ,  8A<    A AAI       T  `           ,   l  XX    A AAO
 A     4   
  L  N  AP
	ADm
 A      ,     X    A AAO
 A     4   L  L    AP
	ADm
 A      4   <  ع    A0AAEf
 A      L     hT    AAABF
	
 B          p           4   $  h   d  EP
	CABb
 A     L   \     >  AP
	AACZ
 BR
 Bu
 A$   d  8T    A CAO    T         AALKAAJICHGDFEDCBA
A A     T   ,      AALKAAJICHGDFEDCBA
A A     T     P    AALKAAJICHGDFEDCBA
A A     T         AALKAAJICHGDFEDCBA
A A     T   4       AALKAAJICHGDFEDCBA
A A     $   D  `    A CAQ       l                                                                                             T   D  X<    ABPOAAJIDNMLKDHGFEi
A A        T  @           $   l  8<<    A AAI        ,  8      ,h   
    $  4  @   oP  4   	 
       |    ,     P  
\ \ \ \ \ \   \ D  ] ^   \ ^ \ \   ^ H  ] ] ] ^ ] ^   ^ 0  \  \ !^ "\ #^ $\ $  %\ %0  &^ (^ )^ *^ *\ +] ,  ,\ ,<  .] /] 0] 0  1] 10  2] 4] 5] 5  5] 5t  6] 6] 7  7] 7] 7  8] 8  8] 8D  9] :  =] >\  >\ ?  ?\ @  D\ D  E\ E  G\ H  H\ I  NY NY O  OY OY O  PY P  PY PY Q  QY R8  RX S  SX U  Z\ Z\ Z  Z\ Z\ [  [[ [  [\ ]  
,      8 $  L  l   L  l   ,D            X  | (  DT   (  OH  
 
  
 0	  
   <	 		 
  

 
  OH  
 
  
 0	  
   <	 		 
  

 
  OH  
 
  
 0	  
   <	 		 
  

 
  OH  
 
  
 0	  
   <	 		 
  

 
  OH  
 
  
 0	  
   <	 		 
  

 
  1	 
 ,
 	 	 
 	 	$                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    Y      W      X      X      Y                                                                                                   L                          X,                           x,                   o                                    
       ~                           /            p                           >             :                   	              o    X9      o           o    V7      o                                                                                           ,                                                                                                                                                                                                                                                                                                                                                                     M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      M      4             GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516  .shstrtab .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .text .fini .rodata .eh_frame_hdr .eh_frame .gcc_except_table .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss .comment                                                                                                 $                                 o                                               (                                                   0                         ~                             8   o       V7      V7                                 E   o       X9      X9                                  T             :      :                                 ^      B       >      >      p                          h             L      L                                    c             M      M      	                            n             V      V                                   t                                                       z                         p
                                          P     P                                               0     0                                                                                                   X,     X,                                                x,     x,                                               ,     ,                                                ,     ,                                             .     .     P                                         /     /                                              4     4                                                4     4                                        0               4     -                                                   5                                                                                                                                                                                                                                                                                                                                                           dwaggdi_armhf_v1.so                                                                                 0000644 0001750 0001750 00000136242 14140517152 014110  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 ELF          (    PJ  4   h    4    (     p                                                0 0 t  p           Ȱ  0 0                       $   $         Qtd                                   GNU  /Af1k       '             >                              	  .   O   %                    Q       |   ,                     U                            +                                  <                      ~   n                                            [   r      u       g                                       #       T                                                  :   4          S           y          d       i   j              o                                               W                }   Y       f            x      s   )                     N          q                 =                                                ?   l   E                      \   a       F                                        3   b                    z          w       A               I                           J                                        X   (   M                 6   "   /      ;   m                         $                                                                                                                                                                                                    	                                                                                  !              @                  
        2      H                 K   D                             ]       _                                         C   c                                             G      9          t   L                                       p   *                                          7   5   V       h                                                                                 0   {       ^           1         P         B                       e                                                
                    8   k           `                 -                                                      &              Z         R                                 v                                                         a          
    R Sh D Q L@  P D 	 X(l5J   $$ h  @  	F      Ix@@ `@	                                                                                                                                                                                                                                                                                              
                            KF Rk5UKvjx)A]#ğ}ֲFKV=TyY wT<Da 	OC346íYT3}KPF:`)K˅YŜ:xY h8* Ŝ [`ŜCE짗-keYyva	spTsŜK*˹[)Ldj3@-4FC"!qXk`[ҩ`y|)tVkұ|.ܫQ&'R)%}dw5!3=@*ǐ7KЙ_,Q	wds0$6Lؖ2"Ip
>G4+fuFϺ7zWc==Qk|O-#b?v[YlE_je6Gy`6yፓ]LSX                    LB       
     0                                                                        (
                                       B                                         a                                                                                             N             q                          |             z              \	             E             u                                                    <             ,                                       A                          
                           _                            d             ~
                          M                                                    `             6             8                             ^                                       Q                          H                          (             
             	                                       -                          
             U                          
                          0             J                                                    '             m
                          ~                                       Z                                       U                                       _             S                                                                                                        
             G                                                    k             (                          7             8                                         |                          l                          W             e                          @             F             W             x             9             
                                                    r                                       X                                                                                                                     =                                       W                          R           "                  	R       B  n  H     3  5      E  u     "    p              "    i  h     q  5      ]  5        l  l       r  P     x  6        	     "     m        h5      -  $5      m  Mm  <       j  X        6      <   6        u      @  5        !l         i  X       mh  `   "    	R         S  T       Q     "         "    }i  D     9  [  L    Z   6        9i  D       p  $       s       	  W  L      R          -k         P         ya  L      $5      i  AR          L         =t  L    q       "  G   6        s         o       	  W       Q  6        M^  ,    	  h  \   "             ^  ݖ         MB       
 K    \            "    A  (       M         %o  T     j  n  T       9  <   "         "    j  4     !  $5          L       L5          `       p       s  6      1  q  x     3  n       O   6        d  L    O  )     "     L       x  q  H     G       "  /  	s       <  @5        	M         m  >       yo  x     S  M  x              '	  h  \   "    X5      $  5|       +  qj  D       45      6  M         n  (     ?  m  @        L         -r  \     W       "    6      o  j  D     s  9  <   "    yV         m  4       h  l     ;   6      h  d5        !R        N  q  P     +  )     "    m       Z  u     "  u   J       C  E|        њ  &     {  P  0  "    	     "  	  An  (       M  L    $  in         6        %T  T      V         r  (       p5      q  s  t       6        S        __gmon_start__ _init _fini _ITM_deregisterTMCloneTable _ITM_registerTMCloneTable __cxa_finalize _Jv_RegisterClasses main _ZNSt8ios_base4InitC1Ev __aeabi_atexit _ZNSt8ios_base4InitD1Ev _ZN11ImageReaderC2Ev _ZN11ImageReaderC1Ev _ZN11ImageReader7destroyEv _ZN11ImageReader8isLoadedEv _ZN11ImageReader8getWidthEv _ZN11ImageReader9getHeightEv _ZN11ImageReader8getPixelEjjPhS0_S0_S0_ _ZNSt6vectorIhSaIhEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPhS1_EEjRKh memset _Znwj memmove _ZdlPv _ZSt20__throw_length_errorPKc __aeabi_unwind_cpp_pr0 _ZN11ImageReader7readBMPEPKw wcstombs _ZNSt8ios_baseC2Ev _ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E _ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev _ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode _ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate _ZNSi4readEPci _ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv _ZNSt12__basic_fileIcED1Ev _ZNSt6localeD1Ev _ZNSt8ios_baseD2Ev _ZNSi5seekgExSt12_Ios_Seekdir _ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev __cxa_end_cleanup _ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev _ZNSt9basic_iosIcSt11char_traitsIcEED2Ev _ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev _ZTVSt9basic_iosIcSt11char_traitsIcEE _ZTTSt14basic_ifstreamIcSt11char_traitsIcEE _ZTVSt14basic_ifstreamIcSt11char_traitsIcEE _ZTVSt13basic_filebufIcSt11char_traitsIcEE _ZTVSt15basic_streambufIcSt11char_traitsIcEE __gxx_personality_v0 _ZN11ImageReader4loadEPKw _ZN10JSONWriterC2Ev _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE _ZN10JSONWriterC1Ev _ZN10JSONWriter11beginObjectEv wcslen _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwj _ZN10JSONWriter9endObjectEv _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jj _ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEjjj _ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_ _ZSt20__throw_out_of_rangePKc _ZNSbIwSt11char_traitsIwESaIwEED1Ev _ZN10JSONWriter10beginArrayEv _ZN10JSONWriter8endArrayEv _ZN10JSONWriter7addPropESbIwSt11char_traitsIwESaIwEE _ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_ _ZN10JSONWriter9addStringESbIwSt11char_traitsIwESaIwEES3_ _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_ _ZNSbIwSt11char_traitsIwESaIwEE7reserveEj _ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv _ZN10JSONWriter5clearEv _ZN10JSONWriter6lengthEv _ZN10JSONWriter9getStringEv _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED2Ev _ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE _ZTVSt15basic_streambufIwSt11char_traitsIwEE _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED1Ev _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEl _ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E _ZNSt6localeC1Ev _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIlEERS2_T_ _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEjjRKS1_ wmemcpy _ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_ _ZSt19__throw_logic_errorPKc _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev _ZNSt9basic_iosIwSt11char_traitsIwEED2Ev _ZTVSt9basic_iosIwSt11char_traitsIwEE _ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE _ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEi _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEy _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIyEERS2_T_ _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEm _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertImEERS2_T_ _ZN10JSONWriter10addBooleanESbIwSt11char_traitsIwESaIwEEb _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIbEERS2_T_ _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED0Ev pthread_cancel _ZNSt6vectorIP13DWANotifyIconSaIS1_EED2Ev _ZNSt6vectorIP13DWANotifyIconSaIS1_EED1Ev _ZNSt6vectorIP9DWAWindowSaIS1_EED2Ev _ZNSt6vectorIP9DWAWindowSaIS1_EED1Ev _ZNSt6vectorIP7DWAFontSaIS1_EED2Ev _ZNSt6vectorIP7DWAFontSaIS1_EED1Ev _ZNSt6vectorIP8DWAImageSaIS1_EED2Ev _ZNSt6vectorIP8DWAImageSaIS1_EED1Ev _ZN10JSONWriterD2Ev _ZN10JSONWriterD1Ev _Z20removeWindowByHandlem windowList _Z17getWindowByHandlem _Z13getWindowByIDi _Z17getNotifyIconByIDi notifyIconList _Z21getNotifyIconByHandlem _Z11getFontByIDi fontList _ZN11ImageReaderD2Ev _ZN11ImageReaderD1Ev _Z12getImageByIDi imageList _Z17ChooseBetterStylemm _Z16addImageToBufferPwRPm malloc DWAGDIUnloadFont XFreeFontSet display DWAGDIPosSizeWindow XFreePixmap XGetWindowAttributes XCreatePixmap XMoveResizeWindow DWAGDIDestroyWindow XDestroyIC XDestroyWindow DWAGDISetTitle XwcTextListToTextProperty XSetWMName DWAGDIGetScreenSize screen DWAGDIGetImageSize DWAGDIShow XMapWindow XMoveWindow DWAGDIHide XUnmapWindow DWAGDIToFront XRaiseWindow DWAGDIPenColor DWAGDIPenWidth DWAGDIDrawLine XSetForeground XDrawLine DWAGDIDrawEllipse XDrawArc DWAGDIFillEllipse XFillArc DWAGDIUnloadImage DWAGDIDrawImage XDrawPoint _Z13getFontAscentii __aeabi_unwind_cpp_pr1 DWAGDIGetTextHeight DWAGDIGetTextWidth XwcTextEscapement DWAGDIDrawText XwcDrawString DWAGDIGetMousePosition XQueryPointer root DWAGDIFillRectangle XFillRectangle DWAGDIRepaint XSendEvent DWAGDIClipRectangle XSetClipRectangles DWAGDIClearClipRectangle XSetClipMask DWAGDISetClipboardText DWAGDIGetClipboardText DWAGDIUpdateNotifyIcon _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_ DWAGDIDestroyNotifyIcon _Z10drawNotifyP13DWANotifyIconii _Z13detectKeyTypeP9DWAWindowP7_XEvent XwcLookupString free _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKw realloc jonextevent _Z17detectMouseButtonP7_XEvent DWAGDILoop getenv setlocale XOpenDisplay XInternAtom XSetLocaleModifiers XScreenOfDisplay XOpenIM XGetIMValues XFree select XPending XNextEvent XFreeColormap XCloseDisplay XCopyArea XRefreshKeyboardMapping XSetInputFocus g_callEventMessage wm_protocols wm_delete_window screenid im best_style colormap x11_fd exitloop in_fds tv fwrite stderr DWAGDIEndLoop _ZNSt6vectorIP9DWAWindowSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z9addWindowimP4_XGCP4_XIC DWAGDINewWindow XWhitePixel XCreateWindow XSetWMProtocols XCreateGC wcpcpy wcstok XChangeProperty XVaCreateNestedList XCreateIC XGetICValues XSetICFocus XSelectInput XAllocSizeHints XSetWMNormalHints _ZNSt6vectorIP13DWANotifyIconSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z13addNotifyIconi DWAGDICreateNotifyIcon XMatchVisualInfo XCreateColormap sprintf XGetSelectionOwner _ZNSt6vectorIP7DWAFontSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z7addFonti DWAGDILoadFont XCreateFontSet XFreeStringList XFontsOfFontSet _ZNSt6vectorIP8DWAImageSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z8addImagei DWAGDILoadImage libX11.so.6 libXpm.so.4 libstdc++.so.6 libm.so.6 libgcc_s.so.1 libc.so.6 _edata __bss_start __bss_start__ __bss_end__ __end__ _end GLIBC_2.4 GCC_3.5 CXXABI_ARM_1.3.3 GLIBCXX_3.4.9 CXXABI_1.3 GLIBCXX_3.4                                                                                                                                                                                                                                                                                                                                                            ii   T                 U&y   ^                 I   f     )   w     ӯk        t)         0    0    0    0    0     5    t4  x4   |4  4 	  4   4   4   4   4   4   4   4 !  4 '  4 )  4   4 3  4 4  4 
 4   4 >  4   4 B  4   4 G  4   4   4   4   4   4   4 e  4   4 k  4   4 r   5  5   5 }  5   5   5   5   5   1   1   1   1   1   1   1   2   2   2   2   2   2   2   2    2   $2   (2   ,2   02   42   82   <2   @2   D2   H2   L2   P2   T2   X2   \2   `2   d2    h2 "  l2 #  p2   t2 $  x2 %  |2 &  2 (  2   2 *  2   2   2 +  2 ,  2 -  2 .  2   2 /  2 0  2 1  2 2  2 5  2 6  2 7  2 8  2 9  2 :  2 ;  2 <  2 =  2 ?  2 @  2 A  2 C  2 D  2 E  2 F  2 H  2    3 I  3 J  3   3   3  3   3 K  3    3   $3 L  (3 M  ,3 N  03 O  43   83 P  <3   @3 Q  D3 R  H3   L3   P3 S  T3 T  X3 U  \3 V  `3 W  d3 X  h3 Y  l3 Z  p3 [  t3 \  x3 ]  |3 ^  3 _  3 `  3   3 a  3 b  3   3   3 c  3   3 d  3 f  3   3 g  3 h  3   3 i  3 j  3   3   3 l  3 m  3 n  3   3 o  3 p  3 q  3   3   3 s  3 t  3 u  3 v   4 w  4 x  4 y  4 z  4 {  4 |  4   4 ~   4   $4   (4   ,4   04  44   84   <4   @4   D4   H4   L4   P4   T4   X4   \4   `4   d4   h4   l4   p4       -p   Əʌp Əʌh Əʌ` ƏʌXxGF ƏʌL ƏʌD Əʌ< Əʌ4 Əʌ, Əʌ$ Əʌ ƏʌxGF Əʌ Əʌ  ƏʌxGF Əʌ ƏʌxGF ƏʌxGF Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ|xGF Əʌp Əʌh Əʌ` ƏʌX ƏʌP ƏʌH Əʌ@ Əʌ8xGF Əʌ, Əʌ$ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ ƏʌxGF Əʌx Əʌp Əʌh Əʌ` ƏʌX ƏʌP ƏʌH Əʌ@ Əʌ8 Əʌ0 Əʌ( Əʌ  Əʌ Əʌ Əʌ Əʌ xGF Əʌ Əʌ Əʌ Əʌ ƏʌxGF Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌx Əʌp Əʌh Əʌ` ƏʌX ƏʌP ƏʌH Əʌ@ Əʌ8 Əʌ0 Əʌ( Əʌ  Əʌ Əʌ Əʌ Əʌ  Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ ƏʌxxGF Əʌl Əʌd Əʌ\ ƏʌT ƏʌL ƏʌD Əʌ< Əʌ4 Əʌ, Əʌ$ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ ƏʌxGF Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌx ƏʌpxGF Əʌd Əʌ\ ƏʌT ƏʌL ƏʌD Əʌ< Əʌ4 Əʌ, Əʌ$
JF
IzDRXZ_S AC  *ѿ_pG hB`pG~    
JF
IzDRXZ_S AC  *ѿ_pG hB`pGJ      pG8ML}D|D(F^KJ(FzDX8@ b      J  8ML}D|D(FDKJ(FzDX8@ 2         %#O$LD$N|D8F~D("K2F8FX KX8FzK2F8FXK2FX`F]``KXvK2FX`F]``KXjK2FX`F]``KX`K2FX`F]``KX@P         (     8    4  ,         @  KJ{DXpG    J	HzD2xD*K{D JX +ИG        
H
KxD
J{DzDs[ IRX *FG         
JzD
Kx{Dj	JX#K{DhK"{Dp  R  D      HxDKh{DJXG@        "`B``v`aBapG  #v`aCapG ~pGhpG ipG~dhB)iB&=Fih6&(.F->]&phhDfx&phhDxp#+ppGhhxp-OF  ӰFF!FN(~D #	HF J #XF1 1` J11111Xh:a8iX, Pc`X tK0 X"`{a 30L 0`0 IF"#h ( ӀS ! 0 F" h:DBSB80  ( yi0  0K"`X3`h bKL X3`hX, 9i P "0b`BwF # F 
" #H F"$ # F " #< F" F"
 # F " #( F"h +*i * "wji 3#(FrEh<k` #zj F  hUki3#(F	8[F3	*i * +/F`{`)h FZFID h  F{h+i

DSE#+vBS AiA>)#hS AiA46+i +F)h FZFID+i

DE)h FjhR|(F F@ 0 X<:i  P #c`0 *0 @X<9i P #c`0          $  -CFFF *WGhhB DEO;F`Ѹ#Dk`g0FIF"FC[hCBdاB,9	BO8T@FF	 x"FB)h	8FJFXkhDLD	 F1FJFL(hLD/`l``8FIF"Fhh h`  IF0Fl`BFC8FAF$kh1FBFhh1FFF )ХHxDB L  KJ{DX3`pG     8FL|D Ff!FF(F8@һM  h0FS<$MZB}D7FO3 IyDJFX=B[M}D(F:)FF F0"hR,QB F"  ((F~
HxD	HxD"  ZM    L  L  L  8FL|D F!FF(F8@f>L  h0FS<$MZB}D7FO3 IyDBJFX=B[M}D(F)FF F>0"hR,QB F"b b ((F
HxDH	HxDD   L    K  0K  @K  FMFN}D~D(F)FF F9F F(F~)FF F0Fv1FF F@ K  tK  -OLF|DBKXB@L|D FN!FF3hS3hS, *gsJ $sIЁzD̑yD̡DȱD DD2	- 
- - S, *0F3hYRROBR (9F3hRB!P B@S,4B S, *0F3hS$P -`о"-=&-PFQFFN3h4S,BCL|D F!FF:BF/-
\-HFIFF&@FAFFFXFYFF
'M}D(F)FF "M}D  F8  ( F !B|BB'l8 (? F     K  J  J  J  K  J  J  ^J  I  I  h !FR,ݾ hpFMS<}DFpZBFO3IyDKFX=B	#hS8HxD  ((FiFf~S<>  
I    G  hpF"NS<F~D3 F)F FpZB)O3IyD<KFX>B
 *+h F)FS<;n i (0FHxDN,   vH    >G  -OF	F@F	DzK	Z@=B@@
tJ #Z F2104567KZ0]hhU<
PBJ #Z` J
Z KZ0#,8FIF  + <BjSE 𙀺   ! 	OXFjF yFQFZFE@Ӏ 			HF<	
E@@FIF 	E@DHFIFF@F^ 6?
B@BU,8
B9RE0к 6 ! 	OXFF FQFZFREb 			HF      FF 	HF *AH 	xDHF8F;H 	xD	  (?uHFo
  (?_PFY  (?v8Fp  (?(F "  C+  "  C+ $8U<8
C, 	.	(               F  E  D  -OF	F*@F	DK	Z@=B@@
J #Z F2104567KZ0]hhU<
PJ #Z` J
Z bKZ0#,p8FIF  + <BjSE 𙀺   ! 	OXFF yFQFZFE@Ӏ 			HF	
E@@FIFz	E@DHFHIFF@F 6?
B@U,8
BV9RE0к 6 ! 	OXF\F FQFZFEb 			HF.      FF 	HF *AH 	xD^HF8F8P;H 	xDP	 q (?uHF o
 e (?_PFY Y (?v8Fp M (?(F "  C+  "  C+ $8U<8
C, F		               ^C  A  A  -OF	FFPF	D,K	[`?B@0(	&J #[ F2104567K[0_hhW<
	 I J #[ J
[ K[0P#HF"F+Fj  + Bc٫B  -  !OXFF qF)FZFlB@		 F	=B@PF!F<BxqL|D F!FFPF
 <BwW,8
B9B) -/ !OXFF F)FZF
BX		 F*h`*h`FF F~ *>HxD FNHF9HxD  ( F{  (?m(F|g  ( Fr|  (?ɮ8Ff " `C+  " `C+ 7	 ~W<8
C	, b	\	 n              @  >  j>  -OF	F@F	DK	Z@=B@@
J #Z F2104567KZ0]hhU<
P`J #Z` J
Z &KZ0#,48FIF2  + <BjSE 𙀺   ! 	OXFF yFQFZFE@Ӏ 			HFZ	
E@@FIF>	E@DHFIFF@F| 6?
B@`U,8
B9RE0к 6 ! 	OXF F FQFZFpEb 			HF      FF 	HF *AH 	xD"HF8F;H 	xD	 5 (?uHFo
 ) (?_PFY  (?v8Fp  (?(F "  C+  "  C+ $8U<8
C, 
	L	F D              <  @;  $;  -OF	FH@F	DK	Z@=B@@
J #Z F2104567KZ0]hhU<
PJ #Z` J
Z KZ0#,8FIF  + <BjSE 𙀺   ! 	OXFF yFQFZF2E@Ӏ 			HF	
E@@FIF	E@DHFfIFF@F 6?
B@U,8
Bt9RE0к 6 ! 	OXFzF FQFZFEb 			HFL      FF 	HF6 *AH 	xD|HF8FVn;H 	xDn	  (?uHF>o
  (?_PF2Y w (?v8F&p k (?(F "  C+  "  C+ $82U<8
C, d		               9  7  7  pFMK}DFjX>3`KXB
K FX3@; Fp  (0F         pFMK}DFjX>3`KXBK FX3@; FF Fp  (0F^        KJ{DX ,hchB* #RKahB3FB)aE	(F  F{`@   8  KJ{D0X" m
hShB
 #Q/ThB3B "F0pG*F  8  KJ{D0X" m
hhB
 #Q/hB3B "F0pG*FT  8  KJ{DpX" m
hnhB #BQ/hB3B "Fp*FFpHxD   4  5  KJ{DpX" m
hnhB #BQ/hB3B "Fp*FFpHxD   4  l5  KJ{D0X" m
hhB
 #Q/hB3B "F0pG*F`    KJ{D0X" m
hhB
 #Q/hB3B "F0pG*F    p @s@s B+FpG pc FFpG-OFF!F* (`F 0 F @ ` @
 &
O``z8B-GF $  1F"Fb 4  0BbCB"ZQ58B6 pDK\p$ h#hB #RO!hB3BO &Kah\0h	 BZВ {h; F{`@K       -GFFFM}DF KAiX(hJah(h ah:F(hCF b-hahRFKF`a(FH    M}DFFhh0FD8FK1FX(h(hai@    p^F	HxDt	M"#EY (h(hah2Fpz    KJ{DXhh`iC`pGH    0FF)Ff ```F	0 p	M}DFhKAhX(h>(hahiip@Gp    L|D8KAhXh@     L|D8KAhXh@|     pFFF E%EDap pG -AFFFM}DF
KhiX(h>aihCF
(h :    -AFFFM}DFKhiX(haihOD(h # 3F    -AFFFnM}DFKhiX(haihOD(h # 3F    KJ{DX$ h#hB #RO!hB3BO & @	 BZВ ({h`h;{` F@ V    -OF԰DF FR ( X &%	&(F'0(F $(F48B7	"F(F1F '0+K% $[0BB&0ChL 4h (Fp8B(F68B    F h F h 8FF|FH F!FFhh8@8-GFFFFrODF(F` ( ,F K"ihX8h)FPF=hwhh@F QF:F3F(F    0LKFI|D
XaX hF	h	|(
+`k`0 2      -AFFFM}DF
KhiX(haihCF
(h ޿    -CFFFM}DFб !`"0F"ch "
!IO C 	hXah  hl    𵇰LFFF|D갱 "Ip0FP`dXh  h$$* @    L|D@K "hXh@'    pG   pG-AF*M}DF (9'H#".X 0h$0hh:FAF KX=B#i +ci + !`"(F6h0h "O C&!iaih $ q ((F        p(M}DFȱKhXh #` `#acaKXF=1F=Bp 6 ((FiF0Fz      -OFNJFzD6Yh2 (dp
B` &Ei  (8
O 	8EB $45p8BLبEȿB IF"F80  +( 0A @@@@"hK^0h3Fh  td p`		6td p` <    -OF( F!FDF *F 
#;i(FȿZ %+Zza&Ѐ $(Fj}i=EE@ F<FE|D F	t!FFHF{iS< +@u;i+ .ݳ F3 # $	+YI04BT #( I&0yD:F<>@, yD2F445(,Z@ Fj
E@rj
E@::F0 yDIF2F4  F04|k<DE@:<k<DE@ā$F{+?xhOrBOrOqDBB|D?yOrOqDBB|D?mOrOqDBB|D?aOrOqtDBB|D?UOrdDB|D?MOrXDB|D?EOrLDB|D?=Or@DB|D?5Or4DB|D?-Or(DB|D?%OrDB|D?OrDB|D?OarDB|D?OrLB|D?OrLB|D?OkrB ԀOrB ǀ#O	qB O aB OqB OrB ـOrB ̀OrOqBB OQrOqBB OSrOqBB ORrOqBB ̀OTrOqBB ԀOPrOqBB ÀOrBOWrB	IHFyD  (Fj!FF *F 3F8;i(Fȿ]I:F 	yD>I yD2FKZ@ Fi	E@̀i	E@𹀨I2F  	yD$ IF F $|j<DE@<j<DEv$"L|D0L|D-	IHFyD/	IHFyD'	IHFyD	IHFyD	IHFyD	IHFyD	IHFyD 1 (?(F	{IHFyDn	xIHFyDf	uIHFyD^HF\  (?5 F.  ( F$  (?q Fj$ .  *	  (?@HFj9	  (?-HF^& 
 	
  (?PFD0 	F4   (? F*( , 
 ~ (?PF 0    X,   .  J.  (  -  j+  ^+  R+  F+  B+  >+  :+  6+  2+  .+  .+  .+  .+  8+  R+  +  d+  j+  :+  0+  *  )  )  B*  N*  )  )  2*  X,  *  ,  @k((   pG-O˰j:~DX`
	xDF   :V   ( 9 "yD: "XyD`  :X`
xD  x0FuX F+`d:`JhX`4Y !F
F `  jD:X ` ( 8 # $yD,:X <` 4EKh@PS$0@B9h4& E8`FIyD 0*h  4Y	hh
kyDyD
`)VyD) @zDG9)zDXx )l9X;|C %B @9F*F+F`O|BFOlOndD	W.@	O		LG.@HIBw4Y  8   (n  22+j+ "+ ԁ+ Ձ+ + '+ ʃ	+ Ѓ
+ =!+ Є+6 (:;x )8X ' $+hjhԀS$`4  qh0F Bkh $(hBZВ kh4;Bk`  h  K	hGM64 ( Y<8XX(FV(F$8FyD FZFyD(F9F"F8VOE@ޅOE@ZF FyD(F!FhOE@ZF FyD(F!F7OE@݅ZF FyDr(F!F8OE@؅ZF FyD`(F!F9OE@ӅhZF FyDN(F!F:OE@΅(F6	 F)FhGLE@ʅ9  YiZh7h8:  6~ (?6XX(F(F8FyD FZFyD(F9F"F6VOE@OE@ZF FyD(F!Fh*OE@2 ( lZF FyD>(F!FrOE@HZF FyD>(F!F^OE@$ZF FyD(F!F "LOE@~ZF FyD(F!F ":OE@y(Ft	 F)FhGLE?8? (? F2f6
 (?ԭP5XX(F(Fx8FyDDl FZFyD>(F9F"F$5VKE@5KE@A88FyD"0 FZFyD(F9F"FOE@8OE@BZF FyD
(F!FhLOE@<ZF FyD(F!F::OE@7ZF FyD(F!F;(OE@2 FZFyD2F!F(FOE@*(F	 F)Fh.G:6
 (?$KXX(F2(Fh88FyD0 FZFyD(F9F"FvKVKE@KE@I8FyDtI FZFyDn(F9F"FVOE@OE@IZF FyDX
(F!FhOE@IZF FyDF(F!F:OE@IZF FyD4(F!F;OE@I FZFyD$2JF!F(FlOE@(F	 F)FhG6h
 ( KXX(F(FI8FyDI FZFyD(F9F"FKVKE@xKE@I8FyDI FZFyD(F9F"FOE@OE@ IZF FyD
(F!FhOE@IZF FyD(F!F:OE@iIZF FyD(F!F;OE@eI FZFyD~2F!F(FOE@^(Fb	 F)FhG  "6+FpԻ6
 (?ͫQKXX(F(FsI8FyD@qI FZFyD:(F9F"F EKVKE@)KE@5eI8FyD cI FZFyD(F9F"F OE@.OE@8XIZF FyD
(F!FhLOE@3(F	 F)FhhGs(Fz_   <  #    z#    x#    H#          *#    v'    z)  ^(    b'  )    '        (  x%  ~%    f%  L%  0%  %  %  $  $  #  :$  *$  $  $  "  #  d#  r#  >"  $"  "  "  0!  &"  
"  J"           !          .!      j  L        `     >  6 (?Ǫ7hB9hBD9X\	X(F(FZF8F. FJF((F9F"F F@8F>ZF8F FJF(F9F"F F,8F(JF F(F!FhN F(F	 F)FhlG Fd6J
 (?]8XX(Fj(F8Fd FZFyD(F9F"FP8VKE@hKE@t48FyD( FZFyD(F9F"FOE@{OE@ZF FyD
(F!FhOE@U(Ft	 F)FhG6F (?穁h   FDڹ6 (?ө?+ R+̩d7X\	X(F(F`ZF8FyD<T FJFyD6(F9F"F FN8FJ4ZF8FyD$, FJFyD(F9F"F F48F2JF FyD
(F!FhT F"(F	 F)FhrG6!"XxDh  6!"XxDh h F` F8FV8 (?8F*OE?8 (?8F8w (?8F8j (?8F 8] (?"8F8P (?'8F!8C (?,8F&86 (?0 F*8( (?f8FOE?b8 (?\8FVc8 (?b8F\V8 (?p8FjI8 (?w8Fq<8 (?|8Fzv/8 (?8Fl{"*&8 (?êF\KE?8 (?FJ8 (?ª8F<OE?8 (?8F,8 (?8F8| (?ê8F8o (?Ȫ8Fº8b (?Ъ8Fʺ8R (?FKE?8@ (?F꺓81 (?8FOE?8! (?8Fl8 (?8F_8 (?8FR8 (?8FE8 (?8F88 (?8Fv+3/8 (?ϫFdKE?˫8 (?ëFR8 (?̫8FDOE?ȫ8 (?«8F48 (?ǫ8F(8 (?۪Fպ8v (?8FOE?8f (?ڪ8FԺ8Y (?ߪ8Fٺ8L (?N8FH8? (?U8FO80 (?Fz~8 (?FKE?8 (?F~aWVHxD8 (?8FGL8 (?8FOE?{8 (?u8Fto*2KX\	X(F(F:IZF8FyD8I FJFyD(F9F"F F8F0IZF8FyD.I FJFyD(F9F"F F8F'IJF FyD(F!Fh F(F	 F)Fh*G (      z    T  ~  0  h  >  N  0      F            KJ{DX"ppG ܟ    -CF  FFFDM $K}DaDaaaXYhhB`Yh1Y`F   8  -O $`dKDx` 	:aFZ0Y	aKiZ`(h1hi6h:i-hhIxc(FZh )Fuj%j&0+FJiaFZ (hj(hi"F#Fd` 倸 $ X qXFYF  
# FI$ FyDFF (T $N%F~DFOXFF jZFLF j$  1F&FF((> 	 ,	(FOOFF챹ihIyDPiFIhyD "Hi "Fh ! 2Fi(FP|iFKZ hRh h  IFFyDRhKiIZ KyDZ0Fhh |M}K}D|M{D}DF0Fb -ruI,#F(FyDz(F`jBBOii h +FihxhilF h" h@izoo d<iahahaF,P0#iaFEaFP`bai(hj0F?й ?i"LI(hyDKI"yDF(h.hiBF#N0F &$ HO!P0#iaFEaFP`bai(h( Fvi"0I hyDl.I"yDF hdi$hi2FE &# F $P $i"!I(hyDL I"yDF(hDihHxD R                                       F  
  
  d
  
  	  F J #zD``aCaKX3C`K`XYhhB`Yh1Y`F D    4  -O尊F{O	zIDL "# %|XO	F h `!h  +FFv!h O2t F*FcIyX 	hB
F+F*FF` h`h#FCaF0    h"@FrLI*F hyDjh4O 8F hF OhHL h"~;K;IDXyDh*FD h>F hF (C<# h	"  hhBFQF
N0'KXB+, !`"8F!I " hyD!#0,
  # $23)F4"F#F1pFh 657Xe h)FO 2   (8Fz(      	    F	      F J #zDC```K`XYhhB`Yh1Y`FИ    p@>M?IyDF=HxDEY (h`` ($ +Z #`h`` (hRhllB`[BĿ`FBp&I(h yD`` (!I(h yD`` (I(h yD`` (I(h yD`` (I(h yD`` (I(h yD``   $  ~            
  pF  M #}DF0#`c```#acaa#wK&`XAhhB`Ah1A` Fp F4\    8FF!F FZ F(` FRh`8 F h FF h FF h FF h FKJ{D0FhX=B F0  ((F*     F h F-CFChhFBS`ChI``hЊ )F2,`h[5^ iB6ُo@FfFhF'0!hk_	O	0FJFchD		[п HF)F:F  hOD `iOOO .-CFChhFBS`ChI``hЊ )F,`h[5^ iB6ُo@F FhF'0!hk_	O	0FJFchD		[п HF)F:F hOD `iOOO .-CFChhFBS`ChI``hЊ )Ff,`h[5^ iB6ُo@FFhF'0!hk_	O	0FJF@chD		[п HF)F:F4 hOD `iOOO .-CFChhFBS`ChI``hЊ )F ,`h[5^ iB6ُo@F4FhF'0!hk_	O	0FJFchD		[п HF)F:F hODP `iOOO .   vector::_M_fill_insert  basic_string::substr    basic_string::erase basic_string::_S_construct null not valid   {       }   ,       [       ]   ,       :           \   "       \   /       \   b       \   f       \   n       \   r       \   t       \   \       "   ,       vector::_M_range_check  LANG    Could not open display.
    WM_PROTOCOLS    WM_DELETE_WINDOW    Couldn't open input method  queryInputStyle _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_MENU    _NET_WM_WINDOW_TYPE_DIALOG  _NET_WM_WINDOW_TYPE_DOCK    _NET_WM_ICON    CARDINAL    fontSet inputStyle  clientWindow    preeditAttributes   statusAttributes    filterEvents    _XEMBED_INFO    _NET_SYSTEM_TRAY_S%i    _NET_SYSTEM_TRAY_OPCODE -*-*-medium-*-*--13-*-*-*-*-*-*-*   -*-*-medium-*-*--12-*-*-*-*-*-*-*   -*-*-*-*-*--13-*-*-*-*-*-*-*    -*-*-*-*-*--12-*-*-*-*-*-*-*    -*-*-medium-*-*--14-*-*-*-*-*-*-*   -*-*-*-*-*--14-*-*-*-*-*-*-*    -*-*-*-*-*--*-*-*-*-*-*-*-* E   S   C   A   P   E       F   1       F   2       F   3       F   4       F   5       F   6       F   7       F   8       F   9       F   1   0       F   1   1       F   1   2       P   R   I   N   T       S   C   R   O   L   L   O   C   K       P   A   U   S   E       B   R   E   A   K       B   A   C   K   S   P   A   C   E       R   E   T   U   R   N       C   A   P   S   L   O   C   K       S   H   I   F   T   L   O   C   K       D   E   L   E   T   E       L   E   F   T       R   I   G   H   T       H   O   M   E       E   N   D       t   y   p   e       K   E   Y       v   a   l   u   e       C   H   A   R       T   A   B       n   a   m   e       R   E   P   A   I   N   T       i   d       x       y       w   i   d   t   h       h   e   i   g   h   t       K   E   Y   B   O   A   R   D       s   h   i   f   t       c   t   r   l       a   l   t       c   o   m   m   a   n   d       M   O   U   S   E       a   c   t   i   o   n       M   O   V   E       b   u   t   t   o   n       B   U   T   T   O   N   _   D   O   W   N       B   U   T   T   O   N   _   U   P       N   O   T   I   F   Y       A   C   T   I   V   A   T   E       C   O   N   T   E   X   T   M   E   N   U       W   I   N   D   O   W       I   N   A   C   T   I   V   E       O   N   C   L   O   S   E       
       4?K  $        D        ء   ( LT        ( LT         >  R   | &  0l R$  d   8 Z4     H8 Y   p                    8 Y   p                    x8 Y   x                    8 Y   p                    8 Y   p                    @       $ 
  4 :            # 4  D *    ؞   8^ d          i0  	       	   	  
 	 
 
 	 	     ,?
 *                      <  	 	 	  	  	  
  
  
  
  
    !   ! @  ! !   ! !   "   "   "   "   # 6  # #   # #   $   $   $   '   ' 4  ' '   & &   '   '   $   $   % >  % %   % %   &   (               4  ' '   ( (   )   ( n  * *   * *   *   *   )* )* )  )* )* *  ** *  ** T2 <p  ^   8?$    ^     &V N     Ԟ   <   l    40|   ,<P(LpԸ   |$   ػļ<ؽ    X̾   ܾ,
80   T    <   pDd          L  J  J  %K  yL                                       MB          0          0            ot	     \     |  
              1                ,=     ;             o;  o   o8  o                                           0         XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB                                                                                                                                                                               5 GCC: (Debian 4.7.2-5) 4.7.2 A6   aeabi ,   7-A 
A	
", .shstrtab .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .text .fini .rodata .ARM.extab .ARM.exidx .eh_frame .init_array .fini_array .jcr .dynamic .got .data .bss .comment .ARM.attributes                                                          $                  "             \                  o   t	  t	                 (         |  |                0         \  \                   8   o   8  8                 E   o   ;  ;                  T   	      ;  ;                 ]   	      ,=  ,=                 f         LB  LB  
                  a         XB  XB                  l         PJ  PJ  dT                 r                               x                                       |  |  0                      p                                                                0                              0                              0 İ                             0 Ȱ                          1 ر  H                          5                               $5 $                          0       $                        p        @  7                                w                       XB            hB            lB            B            B             C            C            (C            ,C            DC            HC            TC            XC            C            C            @D            DD            LE            PE            F            F            PF            TF            XH            \H            XI            \I            I            I          $a $d $t                                                                                                                                                                                                                                                                                                                                                               dwaggdi_armhf_v2.so                                                                                 0000644 0001750 0001750 00000161527 14140517152 014115  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 ELF          (    J  4      4    (     p                                              Y Y t  p               Y  Y                       $   $         Qtd                                   GNU z4TݥoF1       '             >                              	  .   O   %                    Q       |   ,                     U                            +                                  <                      ~   n                                            [   r      u       g                                       #       T                                                  :   4          S           y          d       i   j              o                                               W                }   Y       f            x      s   )                     N          q                 =                                                ?   l   E                      \   a       F                                        3   b                    z          w       A               I                           J                                        X   (   M                 6   "   /      ;   m                         $                                                                                                                                                                                                    	                                                                                  !              @                  
        2      H                 K   D                             ]       _                                         C   c                                             G      9          t   L                                       p   *                                          7   5   V       h                                                                                 0   {       ^           1         P         B                       e                                                
                    8   k           `                 -                                                      &              Z         R                                 v                                                         a          
    R Sh D Q L@  P D 	 X(l5J   $$ h  @  	F      Ix@@ `@	                                                                                                                                                                                                                                                                                              
                            KF Rk5UKvjx)A]#ğ}ֲFKV=TyY wT<Da 	OC346íYT3}KPF:`)K˅YŜ:xY h8* Ŝ [`ŜCE짗-keYyva	spTsŜK*˹[)Ldj3@-4FC"!qXk`[ҩ`y|)tVkұ|.ܫQ&'R)%}dw5!3=@*ǐ7KЙ_,Q	wds0$6Lؖ2"Ip
>G4+fuFϺ7zWc==Qk|O-#b?v[YlE_je6Gy`6yፓ]LSX                    LB       
     Y                    D             
                                       `                          "                                                      a               
             	                           
                          E             R
             D                                       z                           P             `                                                    '             `                          q                          #             +                           c
                            O                                                     V	                                                    6             8               4             u             
                                                                                                                                  ^             D                          ,             Y
             
                           7                          5             ,                          =             [                                                                 
             E             w                                                    
                          j             j                                                                                                        2             
                          m             V             3                          "                                                                   R             p
                                                                 ^             k                          |
                          !                                       p             ]                                       	             F	                          6                          	                                                     [	                                                    
             R           "                    $     p  ,W  t       L^      n        "    Z           L  "           V  D^      B  P^        LT         H]  |     ]  h^        (      "          m  ]      -  |]         LU  d     9  LP         p^      <  x^        	  a  t	    %  H^        S         O              "      $       ب  |       T  L  "    H      "    @O  x     *  D      ?  T^        N  x     #  Z  4     =  ^       (        Q    0       0R  X      @         l        |]       b  h         8  $       _               "  G  x^       &   ^         lY  4    ~         6  `^      r  Է             "             I           LB       
 6         ^  H      "    ,        t         $X         W       s    `   "      L  "    Q  `     !  |]                  ]        \         Z         X^      O  [       a  (W       O  x^                 h      "    8  $       D\  t              "  T  ^  0    e  ]      1  |         U  d       X       q         ~  8  $     _       "    ]      (
  @k       T  P  x       ]      M           V  8     V  T  X       \         \       B    L  "    d^        XQ  x         `   "  
  Ȭ         DV  L       N       ;  x^       M  ]        8  0     l  [         h      "    U  0             "  u   J       G
  \k        ̗  <       D    "  9  (      "  7  V  8     b  P      R   W  (       \^      	  T  t    F  ܬ          ]  <     f  ]        <_       
  l^      o          __gmon_start__ _init _fini _ITM_deregisterTMCloneTable _ITM_registerTMCloneTable __cxa_finalize _Jv_RegisterClasses main _ZNSt8ios_base4InitC1Ev __aeabi_atexit _ZNSt8ios_base4InitD1Ev _ZNSt6vectorIP13DWANotifyIconSaIS1_EED2Ev _ZdlPv _ZNSt6vectorIP13DWANotifyIconSaIS1_EED1Ev _ZNSt6vectorIP9DWAWindowSaIS1_EED2Ev _ZNSt6vectorIP9DWAWindowSaIS1_EED1Ev _ZNSt6vectorIP7DWAFontSaIS1_EED2Ev _ZNSt6vectorIP7DWAFontSaIS1_EED1Ev _ZNSt6vectorIP8DWAImageSaIS1_EED2Ev _ZNSt6vectorIP8DWAImageSaIS1_EED1Ev _ZN10JSONWriterD2Ev _ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_ _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE _ZN10JSONWriterD1Ev _Z20removeWindowByHandlem memmove windowList _Z17getWindowByHandlem _Z13getWindowByIDi _Z17getNotifyIconByIDi _ZSt20__throw_out_of_rangePKc notifyIconList __aeabi_unwind_cpp_pr0 _Z21getNotifyIconByHandlem _Z11getFontByIDi fontList _ZN11ImageReaderD2Ev _ZN11ImageReaderD1Ev _Z12getImageByIDi imageList _Z17ChooseBetterStylemm _Z16addImageToBufferPwRPm _ZN11ImageReaderC1Ev _ZN11ImageReader4loadEPKw _ZN11ImageReader8isLoadedEv _ZN11ImageReader8getWidthEv _ZN11ImageReader9getHeightEv malloc _ZN11ImageReader8getPixelEjjPhS0_S0_S0_ _ZN11ImageReader7destroyEv __cxa_end_cleanup __gxx_personality_v0 DWAGDIUnloadFont XFreeFontSet display DWAGDIPosSizeWindow XFreePixmap XGetWindowAttributes XCreatePixmap XMoveResizeWindow DWAGDIDestroyWindow XDestroyIC XDestroyWindow DWAGDISetTitle XwcTextListToTextProperty XSetWMName DWAGDIGetScreenSize screen DWAGDIGetImageSize DWAGDIShow XMapWindow XMoveWindow DWAGDIHide XUnmapWindow __aeabi_unwind_cpp_pr1 DWAGDIToFront XRaiseWindow DWAGDIPenColor DWAGDIPenWidth DWAGDIDrawLine XSetForeground XDrawLine DWAGDIDrawEllipse XDrawArc DWAGDIFillEllipse XFillArc DWAGDIUnloadImage DWAGDIDrawImage XDrawPoint _Z13getFontAscentii DWAGDIGetTextHeight DWAGDIGetTextWidth wcslen XwcTextEscapement DWAGDIDrawText XwcDrawString DWAGDIGetMousePosition XQueryPointer root DWAGDIFillRectangle XFillRectangle DWAGDIRepaint memset XSendEvent DWAGDIClipRectangle XSetClipRectangles DWAGDIClearClipRectangle XSetClipMask DWAGDISetClipboardText DWAGDIGetClipboardText DWAGDIUpdateNotifyIcon _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_ _ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_ _ZNSbIwSt11char_traitsIwESaIwEED1Ev DWAGDIDestroyNotifyIcon _Z10drawNotifyP13DWANotifyIconii _Z13detectKeyTypeP9DWAWindowP7_XEvent XwcLookupString free _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwj _ZN10JSONWriter9addStringESbIwSt11char_traitsIwESaIwEES3_ _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKw realloc _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_ jonextevent _Z17detectMouseButtonP7_XEvent DWAGDILoop getenv setlocale XOpenDisplay XInternAtom XSetLocaleModifiers XScreenOfDisplay XOpenIM XGetIMValues XFree select XPending XNextEvent XFreeColormap XCloseDisplay _ZN10JSONWriter5clearEv _ZN10JSONWriter11beginObjectEv _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEi _ZN10JSONWriter9endObjectEv _ZN10JSONWriter9getStringEv XCopyArea _ZN10JSONWriter10addBooleanESbIwSt11char_traitsIwESaIwEEb XRefreshKeyboardMapping XSetInputFocus g_callEventMessage wm_protocols wm_delete_window screenid im best_style colormap x11_fd exitloop in_fds tv stderr fwrite DWAGDIEndLoop _ZNSt6vectorIP9DWAWindowSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Znwj _Z9addWindowimP4_XGCP4_XIC DWAGDINewWindow XWhitePixel XCreateWindow XSetWMProtocols XCreateGC wcpcpy wcstok XChangeProperty XVaCreateNestedList XCreateIC XGetICValues XSetICFocus XSelectInput XAllocSizeHints XSetWMNormalHints _ZNSt6vectorIP13DWANotifyIconSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z13addNotifyIconi DWAGDICreateNotifyIcon XMatchVisualInfo XCreateColormap sprintf XGetSelectionOwner _ZNSt6vectorIP7DWAFontSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z7addFonti DWAGDILoadFont XCreateFontSet XFreeStringList XFontsOfFontSet _ZNSt6vectorIP8DWAImageSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z8addImagei DWAGDILoadImage _ZN10JSONWriterC1Ev pthread_cancel _ZN11ImageReaderC2Ev _ZNSt6vectorIhSaIhEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPhS1_EEjRKh _ZSt20__throw_length_errorPKc _ZN11ImageReader7readBMPEPKw wcstombs _ZNSt8ios_baseC2Ev _ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E _ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev _ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode _ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate _ZNSi4readEPci _ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv _ZNSt12__basic_fileIcED1Ev _ZNSt6localeD1Ev _ZNSt8ios_baseD2Ev _ZNSi5seekgExSt12_Ios_Seekdir _ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev _ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev _ZNSt9basic_iosIcSt11char_traitsIcEED2Ev _ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev _ZTVSt9basic_iosIcSt11char_traitsIcEE _ZTTSt14basic_ifstreamIcSt11char_traitsIcEE _ZTVSt14basic_ifstreamIcSt11char_traitsIcEE _ZTVSt13basic_filebufIcSt11char_traitsIcEE _ZTVSt15basic_streambufIcSt11char_traitsIcEE _ZN10JSONWriterC2Ev _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jj _ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEjjj _ZN10JSONWriter10beginArrayEv _ZN10JSONWriter8endArrayEv _ZN10JSONWriter7addPropESbIwSt11char_traitsIwESaIwEE _ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_ _ZNSbIwSt11char_traitsIwESaIwEE7reserveEj _ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv _ZN10JSONWriter6lengthEv _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED2Ev _ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE _ZTVSt15basic_streambufIwSt11char_traitsIwEE _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED1Ev _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEl _ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E _ZNSt6localeC1Ev _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIlEERS2_T_ _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEjjRKS1_ wmemcpy _ZSt19__throw_logic_errorPKc _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev _ZNSt9basic_iosIwSt11char_traitsIwEED2Ev _ZTVSt9basic_iosIwSt11char_traitsIwEE _ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE _ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEy _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIyEERS2_T_ _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEm _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertImEERS2_T_ _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIbEERS2_T_ _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED0Ev libX11.so.6 libXpm.so.4 libstdc++.so.6 libm.so.6 libgcc_s.so.1 libc.so.6 _edata __bss_start __bss_start__ __bss_end__ __end__ _end GLIBC_2.4 GCC_3.5 CXXABI_ARM_1.3.3 GLIBCXX_3.4.9 CXXABI_1.3 GLIBCXX_3.4                                                                                                                                                                                                                                                                                                                                                            ii   T                 U&y   ^                 I   f     )   w     ӯk        t)         Y    Y    Y    Y    Y    x]    \  \   \  \ 	  \   \   \   \   \   \   \   \ !  \ '   ] )  ]   ] 3  ] 4  ] 
 ]   ] >  ]    ] B  $]   (] G  ,]   0]   4]   8]   <]   @]   D] e  H]   L] k  P]   T] r  X]  \]   `] }  d]   h]   l]   p]   t]   <Z   @Z   DZ   HZ   LZ   PZ   TZ  XZ   \Z   `Z   dZ   hZ   lZ   pZ   tZ   xZ   |Z   Z   Z   Z   Z   Z   Z   Z   Z   Z   Z   Z   Z   Z   Z   Z   Z    Z "  Z #  Z   Z $  Z %  Z &  Z (  Z   Z *  Z   Z   Z +  Z ,  Z -  Z .  Z    [ /  [ 0  [ 1  [ 2  [ 5  [ 6  [ 7  [ 8   [ 9  $[ :  ([ ;  ,[ <  0[ =  4[ ?  8[ @  <[ A  @[ C  D[ D  H[ E  L[ F  P[ H  T[   X[ I  \[ J  `[   d[   h[  l[   p[ K  t[   x[   |[ L  [ M  [ N  [ O  [   [ P  [   [ Q  [ R  [   [   [ S  [ T  [ U  [ V  [ W  [ X  [ Y  [ Z  [ [  [ \  [ ]  [ ^  [ _  [ `  [   [ a  [ b  [   [   [ c  [   [ d   \ f  \   \ g  \ h  \   \ i  \ j  \    \   $\ l  (\ m  ,\ n  0\   4\ o  8\ p  <\ q  @\   D\   H\ s  L\ t  P\ u  T\ v  X\ w  \\ x  `\ y  d\ z  h\ {  l\ |  p\   t\ ~  x\   |\   \   \   \  \   \   \   \   \   \   \   \   \   \   \   \   \   \   \   \   @- -  Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌx Əʌp Əʌh Əʌ` ƏʌX ƏʌP ƏʌH Əʌ@ Əʌ8 Əʌ0 Əʌ( Əʌ  Əʌ Əʌ Əʌ Əʌ  Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌx Əʌp Əʌh Əʌ` ƏʌX ƏʌP ƏʌH Əʌ@ Əʌ8 Əʌ0 Əʌ( Əʌ  Əʌ Əʌ Əʌ Əʌ  Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌx Əʌp Əʌh Əʌ` ƏʌX ƏʌP ƏʌH Əʌ@ Əʌ8 Əʌ0 Əʌ( Əʌ  Əʌ Əʌ Əʌ Əʌ  Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌx Əʌp Əʌh Əʌ` ƏʌX ƏʌP ƏʌH Əʌ@ Əʌ8 Əʌ0 Əʌ( Əʌ  Əʌ Əʌ Əʌ Əʌ  Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌx Əʌp Əʌh Əʌ` ƏʌX ƏʌP ƏʌH Əʌ@ Əʌ8 Əʌ0 Əʌ( Əʌ  Əʌ Əʌ Əʌ Əʌ  Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ Əʌ ƏʌD D  0   R  
@/  R/   @  /   D D  0   R  
@/  R/   @  /     /8@-,P,@P # 0@   8@J @   | @-P@P `0@`  80 Pp 0  .0 0  PPP0$0 0  PPP|0t0 0  PPP\0T0 0  PPP<0@\  8   (     8    4  ,         @  8@-,P,@P  0@   8@     0 00  S/   @-808 0  00` S$00 0  S3/  H   @-@ @0  00`4 C1 ?0    R2/X T    L @- D0  0  R4 0  S  
(0 0 0     D    4 @-  ,0  0  R  
 0  S   
3/@8 @   @-0 0`p PlEQ @0  S  0    @  Q  
0 S Q  
0aC!  
 !RppG p@  8  h0h 0@-0 @aDA  
  0  S	  
 0     \  
0 S    / X 8  h0h 0@-0 @aDA  
   0  S	  
 0      \  
0 S    / 
 8  8@-|0| 00 @aDA  
  PD 0  S 0  	   S  
    \  
0 S   8  8   d
 4  |v  8@-|0| 00 @aDA  
  PD0  S 0  	   S  
   \  
0 S   8  8   	 4  u  h0h 0@-0 @aDA  
   0  S 0        \  
0 S    / @	   h0h 0@-0 @aDA  
   0  S 0        \  
0 S    /      P  
  Q  
D0  !0  S
  
0   S  
 S  
 /< S  /  O-<M @     PC  
  @ A      @   t    @4 `  i @  V  p @Q  0 
 0  ( 0,  $ @P  @  T` ,   P   
 <Ѝ   @-p0p`bL @ 0  S 0    @Q   Q  
0 S PT00  !	   Q  
 aB!  
!00C 0@     E-lMp`| @P  
p0P  '       0 . 
 0  p` !lЍ   @-@PP @P   x 0P    @(   p@- MD00 `P  
8 @P  @0  u    Ѝp    0  00 0   00/p   0@-$M P @'     Y0   S  
 ;$Ѝ0 Qfp@-f400 @Pp( P     0p@   @-S 00  P 0  @   @-E 00  P 0  @T   p@-@P`4  PTH@p/A-M`p(L @P  
@0 P  g(0   0 p0OЍ   A-M`p\ @P  
P0 P  J00   0 00Z<0 p0	Ѝl   A-M`p\ @P  
P0 P  )00   0 00Z<0 p0Ѝ   0 0p@-`bLp @ 0  S 0    @Q   Q  
0 Sp P 	   Q  
 aB!  
!0 0C  P0   
q p@nx   O-,M@ 0    P  Y:  
P  `%&'p m0 @00   f@ @ P   :$0   p'0 S% p $&0  $(    0   0 0 {` @ P*,Ѝ    @-   P @-   P 8@- @ PP8 z   8@G-MPp 1 @ |  P  T `  
h0   k
  P`@0	 T p
 0  ?Ѝ    xx x0@-0M0,  0 $ @ (    0 P(0 0,000Ѝd      A-M`pL @P  
@0 P  !(0   0 p0Ѝ    E-lMph@@ PP  
` `  000 (000(0$p  0   `9{lЍT    p@-M`P@T  P  
(0a1<0QA0  0 00  0Ѝp    @-$00  P    0  @OX    /  /A-M QP @P2  
  p0`    pD      00PPE U  0  S  0  S  0P `  @0  @00L00  P09 P0
Ѝ   P  +      p@-MPP @P  
0`0  ] 00000`0 P00&i@@D T  Ѝp   P q       O-\Mp < 0< 100O<   PG  
 p<   WF   `<   X 00I   (8<  @  Z/  P @  @P<  @  T4   X W0  
<   0]80 (  S008 4$ 0  0  0  P0< <   P   
m\ЍO< @`D`O< @u D < q    O- DM p( `IP0K @  0L0K0 
0L0 P P@Q s  
' S` H *  
	   P H@@D Tn   K SP0' S 
' S S 
t't S SQ  h

 HpK
   H00  S  L0 S
  U100Mp! 00 \ 014 K\ KYXK0 K	 S64K0 KP 0H XX 4H X\ , K\ K@( K	 < ,K( K(PPE UY ,PPE U& P
Р4&4 S S  
(&( S S  
& S  
& S  
& S  
& S  
% S  
% S  
% S  
% S  
% S  
% S  
% S  
% S  
% S  
  R  
A S  
 R  
% S  
% S  
% S S  
x%x S S  
l%l S S  
`%` S S  
T%T S S  
H%H S S  
<%< S SR0HpK \L P0K @  0L0K0 0L0 P P@QD K\ KHpKXK@ K	 4DK@ KP @ppG W  DppG W  t< K	 HpK8 K <K8 K
8PPE U  <PPE U  P





죟
䣟
ܣ
ԣ
̣
ģ
꼣
괣
ꬣ
ꤣ
ꜣ
HpK HpK lHpK XHpK DHpK 0HpK HpK  {  P TKVHpK HpK HpK  a  P TK< Y  Pz TK4v0 K4 KHpK
Р  H  P TK# @  P TK, Ko( Kl 2  P TK (  PE TKA8 KW< KU   P& TK"   P TK@ KAD K?HpK4              f  ,h  Ph  (  g                          a      k    	            Q    S    R    T    P    W    e  xe  pe  4e  b  b  |b  b  b  b  b  d  b  b  b  b  b  b  b  b  $c  b  b  Hc  Lc  b  b  c  0e  b  d  4  P/ P   /O-KMo?`0$0      {  (?  P  : 
  'x?x  0,0    \?040  P  2  D?P0! ",? 0  ?  0     ?@  P   
 0` `> @p \ @    @ \  01   P `@ \   h 0  p!  "0 0 T> $  0    3/88.8> 8< 0$0  > .0   @0D HL      PG  =0A|   S @   P/0 0-2 b "!= 0 @   PS  
  0 SQ  
 S  
" SX 
 SY 
 S 
 SS 
 S 
	 S 

 S 
! S 
 S ^  P
 s     P
<P pcGq @     0  cBTa *a  @a  T0 @   Q  
 aB!  
!-0@0C T000     aKߍ$ 03/   P   
<dph@PX  T  8 	 3  T<h p@
 WE d p@
 WL 	    0   h p@
 WG P	    h p@
 WC  	    h p@
 W? 	    h p@
 W; 	    h p@
 W7  ]$   Ph 5/h @@
 T3  0@   0@@ @ u  P  
:dph@PX  (T   	   )<:h p@
 W
 d p@
 W 	   0   >h p@
 W   z  P' 
@	     h p@
 W 	  y  "! h p@
 W 	  j   h p@
 W 	  ]   h p@
 W  $   Ph 5/h @@
 T}
 @  Py \{u r   P( m
T0 08dph@PX {    ( 	 #  8h 0@
 S d 0@
 S |   l 	   h p@
 W d p@
 W ,	  (0   h p@
 W 	    h p@
 W 	    h p@
 W  	     uh p@
 W  B$   Ph 5/q n  P( 
T0 06dph@PX      	    6h 0@
 S d 0@
 S     	   h p@
 W d p@
 W P	  {(0   h p@
 W 	  m  h p@
 W 	  `  h p@
 W  	 S f   h p@
 W	  $   Ph 5/   P(  
T0 04dph@PX }    * 	 %  4h 0@
 S d 0@
 S     	   h p@
 W d p@
 W t	  (0   h p@
 W @	    h p@
 W" 	    h p@
 W  	     wh p@
 W  D$   Ph 5/s   0F j  P( 
T0 02dph@PX  (    	   2h 0@
 S d 0@
 S     	   h p@
 W d p@
 W 	  w(0   h p@
 W  $   Ph 5/   <  L[    8[    0[    Z          Z          ^  `    `  ^  _  X^      '    \  \  [  [  [  X[  <[  Y  `Z  Y  Y  Y  Y  Y  W  X  X  X  DW  W  V  W  U  V  V  V  HU  U  T  U  S  T  T  T  LS   S  R  S  Q  S  xR  S  8Q  O    hN  O  (M  L  M  L  M  K  (F  0  @F  <>  (  B  PD  xC  $D  HB     P  5
,   0 R04  0 R+\0dpXPh@ ; ^\8	   <
   ` o m@	   D
   P _ ]H
   0   l R ;$   Ph 5/ G e  P( 
T0 0|1dph@PX  L    	   2h 0@
 Si d 0@
 Sr ,   < 	    h p@
 Wy d p@
 W |	  s(0   h p@
 W]  $   Ph 5/ 5 @P
l   d tx E (  P  
0 S\ 
 S~3dpXPh@  X	  ;h\ 
 5    	  ( 
 #    
   0     $   PHh 5/L,440    0  T4T0    0u    | z @;  P \d p@
 W
 @0  P \ @'  P \ @  P \ @  P \ @  P \ @  P \ @  P \ @  P \d p@
 W
 @  P \ @  P \ @  P \ @  P \w @  P \n @  P \ejg @00  P5 \d 0@
 S2
 @00  P, \y(QN @  P4 \od p@
 W1
 @  P- \d)6 @  P2 \[.- @w  P6 \R2$ @n  P: \I6 @e  P@ \@< @0Y0  Pa \3d 0@
 S^
 @0L0  PX \&T @A  P` \d p@
 W]
 @6  PY \U @-  P^ \Z @$  Pb \^ @  P \ @  P \ @	  P \ @00  P	 \d 0@
 S
 @00  P  \ @  P \d p@
 W
 @  P \ @  P \ @00  PS \Ozw @  P[ \d p@
 WX
 @  PT \P_ @  PY \UV @  P \{M @  P \rDG @00  P \f>=: @00  P \Yd 0@
 S
 @0r0  P \L$   @d  P \? @Z  P \5d p@
 W~
 @O  Pz \*v|<dpXPh@ 3 V	  \ 
   V e c	   
   D S Q 
   0   _ E .$   Ph 5/0 00   /    A- PM  `p h@h0@  `p0  Q  
 Q   Ѝ  L   8  O-`ᜥ M
pP@     0 dV ~  0 1 @ 0 ,    @$P(K	$0     v   0d V V   
KV  
 V 
  WU  
 + 
00M @ \ K   PB  
Dd @`Pp  !    P3 @ K    P  
 KpM P  T
 	#!	 P  T  
0   `       0   P@@  @3  0  c"!  
 0$    03 3 `0 P     20PP` @  T`W  
 K0 G 9 )O   0  s0 K @  lx   t0     K   0      1	 KV.  
  X;
   H  `  A$K  0 ,  P b#\!a00 @ 0           @   0$K   , @  0    20     @  $K h              B  A  :  :    :     :    9  9   :  9  8  (8  O! X7  \7  6  7  6  @- @M X 0p  0000\00 00L0 @0  Q  
  Q   Ѝ  W     4  G-M$ r2pL@  0  P `  q  0L zh PxP  0  X  LP,t]0      0    00    E    a 4P8     40Px!  p1p0     D    PP7  <0  $     q	0 ( E 0g000ppG W$  p  ` !0    0P  @ 00 0   pލ  ( o  P ,J0 h      
   T5  L"    5    h4  @- @M p 0\  000L0  @0  Q  
  Q   Ѝ   d    p@- MQ1P`0 0 0 @    P   
0  S    000  z  P    Q H0L P00 S0 R Ѝp0   0 0  P 0   0 0  P 0   0 0  P 0   0 0  P h0   0 0  P @0   0 0     3  2  |2  p2  d2  \2  P2  p@- `M  P 0P @ 00000000 X0@ ` 
  Q  
  Q @@ Ѝp @     8@-P@@ ^     8@- @    P   
 @- @    P   
 @- @    P   
 @- @    P   
 P0P 00@-M P0PE U @   Ѝ0 T  P /    @- @    P   
 E-P0M S @  
  S 0Ce A  @  
! b @Ѝ 0aC1)  
` Sa)  Aq  6  `1  S 01 0aC  

 
 0
0eCq  
q
  z  p  P   
@aAqv  VチAq
E-P0M S @  
  S 0Ce A  @  
! bP @Ѝ 0aC1)  
` Sa)  Aq    `1  S 01 0aC  

 
 20
0eCq  
q
  '  p  P   
aAqv  VチAq
E-P0M S @  
  S 0Ce A  @  
! b @Ѝ 0aC1)  
` Sa)  Aq    `1  S 01 0aC  

 
 0
0eCq  
q
    p  P   
aAqv  VチAq
E-P0M S @  
  S 0Ce A  @  
! b @Ѝ 0aC1)  
` Sa)  Aq  =  `1  S 01 0aC  

 
 0
0eCq  
q
    p  P   
GaAqv  VチAq
          / 00000/ / / /0 -  \*  
 \'  P U$  @PE b  TP,@ PA TP P P,\,P PP %$  0"  0 0! 0  00 /O- @   QM  PYTP00M ! O K|$ 0$K 80KT!  `$<070K4000,0(0 ` <aP! P 81 O/K  4MKp  0<!0 KMKMK   P  
<1O/K    0   OKQK $3$K 3 R$  
MKH  P  
0<1p3 pp0MK041< KL3FK0041( $0K TP0<a K  8!0 K 0 0OK
  0OKK  0 0OK  0OK OK  0 0OK  0OK 0  S   Rڒ   `  S0 1 SEKX  0005 0 0OK@!  I  
0  S0Á2  
00 0h  R    S+  
X1\ OK
  OKX!\10	 S00r<1OK00 U\<1O/K00 Ld0  S
 OK
 v0 Y OK alQK b 0LqOKO/K@ MK0$K0P!OK <a! 0819 OK 5MK@0$K0P<a 081갺        BM    $  jE- PRM @`B  
p  g U  a U ;  *e W0I  0 X0O   
 ЍE  pb UM   W 0 Wb A   0b0 p
    V  
 
 0
 SP  
 
   
P  P   
p p ЍPh 
    X      
  ЍE 0   b  Xbp
   \(  0 000 0/    8@- P@@    8@(   00@- @0P C RPM.    0 `   0 PPE U    S	  
PP }   Ѝ0   B Q    B 00  P 0,   0$   - 뤳  (    (  ,'  8'  8@- P@@ N   8@~T'   00@- @0P C RPM.    0  e  0 PPE U    S	  
PP )   ZЍ0   B Q     0|0  P A0,   $    T  t'    &  %  %  p@- @dP`P    *  0``       p@$&  %  O-M4C  ` @O3 0@@ T0  B@       00 0   RR  
"崂崢崒崲   
	 @'  	 Uk  

 Uy  
 Un  
   R    0P  p  W     P   w  0 B PQ p @ T  *   R    0Qq UN  
" U1  
   U	 r	    0@  T: tA@ b    @@ T7  Ѝ/ U  
\ U
 Q
    J   { C   t <   mPP 3   dPP  )    Z  @  P J @{  PD A@갰    l%  ,%  %  %  H%  ,%  4%  $$   #  #     0  0p@- @0P  SPM   Ѝp C R    0 | p0 `0PPE U	   0  V0  @<    :  P   T4  <"    !   0p@-P0`  S`M @    Ѝp C R    0 0  0``F V    R 0 00CqH   k     P   NX  T!       O-M T$  $	84$P@PE U  T 4 (p000T0 40P0(P00   3H ` 0  T #( 00  , 4080<0@0D0x#0T  ,  ,  L P0 
"@0   S  |  
8< SN  	 Sr  
  Y  
i K    [ 0_  
 	 00 Z    ! 
 $$0-$I Y   
 J Zr  t

 
   4PppG 0 ` W( T`,0W   H 0,0! 0 (PT T0}Ѝ	 [%  
  Y*  
i K   | [ 0  
 	 00 Z    ! 
 $$0       0 0 
 P  [
    m
 2 ^i    d   P' #   P    P
    Py	 u$ $ > 00 (P , 2P                  h  O-M T$ u $	84$P@PE U  T 4 (p000T0 40P0(P00   3H ` 0  T #( 00  , 4080<0@0D0x#0T  ,  ,  L P0 
@0   S  |  
8< SN  	 Sr  
  Y  
i K    [ 0_  
 	 00 Z    ! 
 $$0	$I Y   
w J Zr  t

 
   PppG 0 ` W( T`,0W   H 0,0 0 (PT T0YЍ	 [%  
  Y*  
i K   X [ 0  
 	 00 Z    ! 
 $$0       0 0 
 P  [
    I
  :E    @   P' #   P    P
    Py	 u$ $  00 (P ,                     O-M \d$ @PP $`<4$pH X  T  4 (000T0400(00   3H  0  T #( 00  , 4080<0@0D0Z|#0T  ,  ,  L P0g	  0+@0   S  |  
8`<P SN   Sr  
  U  
`e Fa   @ V @0_  
  00 T    `! @ $$0$PPE U   Q @@D Tr  tB@    P@@D 0  T( T,0W   H 0,0 0 (T T03Ѝ V%  
  U*  
`e Fa   @2 V @0  
  0Z0 T    `! @ $$0       0 0 @ P  V
  @  # 	   @     P& "   P {   P s   Py ku$ $  q00 ( , ,                d  @  O-M T$ + $	84$P@PE U  T 4 (p000T0 40P0(P00   b3H ` 0  T #( 00  , 4080<0@0D05x#0T  ,  ,  L P0B 
@0   S  |  
8< SN  	 Sr  
  Y  
i K   ] [ 0_  
 	 00 Z    ! 
 $$0$I Y   
- J Zr  t

 
   PppG 0 ` W( T`,0W   H 0,0 0 (PT T0Ѝ	 [%  
  Y*  
i K    [ 0  
 	 060 Z    ! 
 $$0p       0 0 
 Pa  [
    
         P' _#   P W   P
 O   Py	 Gu$ $  M00 (P , gꘝ                    O-M T$  $	e84$P@PE U  T `4 (p000T0 40P0(P00   >3H ` 0  T #( 00  , 4080<0@0D0x#0T  ,  ,  L P0 
@0   S  |  
8< SN  	 Sr  
  Y  
i K   9 [ 0_  
 	 0a0 Z    ! 
 $$0$I Y   
	 J Zr  t

 q
   PppG 0 ` W( T`,0W   H 0,0 0 (PT T0Ѝ	 [%  
  Y*  
i K    [ 0  
 	 00 Z    ! 
 $$0L       0 0 
 P=  [
    
       u  P' ;# m  P 3 e  P
 + ]  Py	 #u$ v$ s )00 (P , C              d  D
   
  p@- @pPp0P$`0`F0 0X0M0 V  H0 000 Ѝp   P ꌔ        p@- @xPx0P$`0`F0 0`0M0 V
  P0 000 ) Ѝp   P         @-vector::_M_range_check  LANG    Could not open display.
    WM_PROTOCOLS    WM_DELETE_WINDOW    Couldn't open input method  queryInputStyle _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_MENU    _NET_WM_WINDOW_TYPE_DIALOG  _NET_WM_WINDOW_TYPE_DOCK    _NET_WM_ICON    CARDINAL    fontSet inputStyle  clientWindow    preeditAttributes   statusAttributes    filterEvents    _XEMBED_INFO    _NET_SYSTEM_TRAY_S%i    _NET_SYSTEM_TRAY_OPCODE -*-*-medium-*-*--13-*-*-*-*-*-*-*   -*-*-medium-*-*--12-*-*-*-*-*-*-*   -*-*-*-*-*--13-*-*-*-*-*-*-*    -*-*-*-*-*--12-*-*-*-*-*-*-*    -*-*-medium-*-*--14-*-*-*-*-*-*-*   -*-*-*-*-*--14-*-*-*-*-*-*-*    -*-*-*-*-*--*-*-*-*-*-*-*-* E   S   C   A   P   E       F   1       F   2       F   3       F   4       F   5       F   6       F   7       F   8       F   9       F   1   0       F   1   1       F   1   2       P   R   I   N   T       S   C   R   O   L   L   O   C   K       P   A   U   S   E       B   R   E   A   K       B   A   C   K   S   P   A   C   E       R   E   T   U   R   N       C   A   P   S   L   O   C   K       S   H   I   F   T   L   O   C   K       D   E   L   E   T   E       L   E   F   T       R   I   G   H   T       H   O   M   E       E   N   D       t   y   p   e       K   E   Y       v   a   l   u   e       C   H   A   R       T   A   B       n   a   m   e       R   E   P   A   I   N   T       i   d       x       y       w   i   d   t   h       h   e   i   g   h   t       K   E   Y   B   O   A   R   D       s   h   i   f   t       c   t   r   l       a   l   t       c   o   m   m   a   n   d       M   O   U   S   E       a   c   t   i   o   n       M   O   V   E       b   u   t   t   o   n       B   U   T   T   O   N   _   D   O   W   N       B   U   T   T   O   N   _   U   P       N   O   T   I   F   Y       A   C   T   I   V   A   T   E       C   O   N   T   E   X   T   M   E   N   U       W   I   N   D   O   W       I   N   A   C   T   I   V   E       O   N   C   L   O   S   E       
       vector::_M_fill_insert  basic_string::substr    basic_string::erase basic_string::_S_construct null not valid   {       }   ,       [       ]   ,       :           \   "       \   /       \   b       \   f       \   n       \   r       \   t       \   \       "   ,       z        y    X `                           y# X  p 8    xy ,  `     \y   4    @yG iH               	 	 	       x?
 <  	+ 	+ 	  	, 
  
, 
  
, 
  -   -   - T  - -   .    .   /   /   /   / \  / /   0 0   1   1   1   2   2 P  2 2   3 3   3   4   4   8   8 P  9 8   7 7   8   8   4   5   5 \  5 5   6 6   6   :   #+ #+ #  $+ $+ $  $+ $  $+ %L  %9 %9 &  &: &: '  '; '  ': '  (= )= )  )= )= )  *= *  *= *  ;= ;= <  <= <= <  <= =  ==    uG L       u?#         u   H     uG K	 	 4	 $  	    	 l   	  	   8u 4  D    u 4  D     u   ( d        t H  X 0    t 0(  d L    t8 _  (                      4t8 _  (                      s8 _  ,                      \s8 _  (                      r8 _  (                       s   xy   {dl|(}_}~t~   ~P~<Xl\   $$
04,X_|$   (P,Љ@<   P$   @вlܸp|lоx   _   x   _      ,   hl4       M  J  K  PL  lM                                       LB          Y          Y            ot	     \     |  
              0Z                ,=     ;             o;  o   o8  o                                            Y         XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB  XB                                                                                                                                                                              x] GCC: (Debian 4.7.2-5+rpi1) 4.7.2 A2   aeabi (   6 	
", .shstrtab .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .text .fini .rodata .ARM.extab .ARM.exidx .eh_frame .init_array .fini_array .jcr .dynamic .got .data .bss .comment .ARM.attributes                                                         $                  "             \                  o   t	  t	                 (         |  |                0         \  \                   8   o   8  8                 E   o   ;  ;                  T   	      ;  ;                 ]   	   B   ,=  ,=                 f         LB  LB                    a         XB  XB                  l         J  J  |                 r                               x                                       |  |                        p                                                               Y                              Y                              Y                               Y                            0Z 0  H                         x] x                             |] |                          0       |  !                      p          3                                                       XB            hB            lB          $a $d                                                                                                                                                                          dwaggdi_x86_32.so                                                                                   0000644 0001750 0001750 00000221530 14140517152 013331  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 ELF              A  4   H     4    (                  F F          H H( H( $  `           h h( h(             Ptd0  0  0            Qtd                                          9   )             >                p                   a         ]   N                                                  R      4             f                    }                                                 J                          u   8                     ;             $                   |          !              .          *                 P                7   "                                                                x           ^   s             +              v      A                    Z                                  i   I             o                       (      V   X   q                            r       l                                                                                                                                                                                                                                                                 %   ,       '                           6                                      &                          C              F               =   U               K                           S       H           `   #       \       5           h       D       O   c       /   @       Y                  n                                     ~          w               M       3                                t           0       2      -              g                  j   T   [      y   e               <          d       L   z           {       B           ?      b              Q                                      k                W          :           G                E      _             m      1                                                              p7            A       
     t                        0                                   H(           \(           d(           `,           ,                         ~          C      
 P    B    
 8	            
      !      b  Q  >    
   V  f    
   ,                          
   W  X    
    @C      
             {    5    
         
 x                 "           3           ~      B    C   
 A                  q                 	  ,      V  T  y    
 U              ,        `-            g              
 %  W  ,    
 u      l      ~            	      u      m      P      <   T      
 '	  ,      V
      X        U  f    
                 C      
               ,          U  " 
   U      
 z  Q  n    
     %  " 
 \           %  0     
 F      E            "     	               ,                       "   
   p      
                   T                  9  W      
       q            o        `Y      
 ?   PB  g    
 $      ^           <      ^            R	      -             }      j      6                     *    
 ]                  
 b  ,        @K  V    
               h-      
  d  #   
 8   Q  L    
               p7        	  ,               
         
       X                   O      
 H      D         i     
 q                         x  RD   
 H            :       " 
 9      !                  y      >      
  ,                                x-      h  p  !    
 i            j                             :        ]     
 u      F        R      
      8    
 t	      &         ,         \     
   U  f    
               J      
 h  0  r   
       $      	             K  D    
 a      B        0O      
 u      ~      n      p        F  \    
             j      W      ]  ,      J      @      C
            z	      8            ]      F  PD  u    
   M  m   
 Q            +
              -        Y  &   
                  d                  	            l   B  (    
   l,        p      
 T  L      
 
      I     %  S  W    
 n  @F      
                   
 .      =     W               U  " 
 "              @R      
 	           T      @      K  @J  f    
             b	      :            @         B      
    t        	  ,      ;  k     
 -      b            C        P  U  " 
 #            	      7                "   	             pW  ,    
    C      
   `      
             
  P  c   
       =     (           	      y      &    c   
 	      	     	                  !      w                          l,      -  K      
 	              -      	            {    U  " 
       S      b      V      ]                 (      X       
       (      t  0M      
   `  B    
 #  l-      
                  @            g      _                  -       I  |    
 V  X      
                         
            ;
      4        pP      
       g       @  5    
 ;  ,         -                       j      +               W            [  G     
             m      ~        P     
         
 O  0G  w    
 $  0j     
 \            H	           G  PQ  >    
 .                 %      .                                       __gmon_start__ _init _fini __cxa_finalize _Jv_RegisterClasses _Z17ChooseBetterStylemm __gxx_personality_v0 DWAGDIGetScreenSize screen DWAGDIPenWidth DWAGDISetClipboardText DWAGDIGetClipboardText _Z17detectMouseButtonP7_XEvent DWAGDIEndLoop exitloop imageList _ZdlPv fontList notifyIconList windowList _ZNSt8ios_base4InitD1Ev DWAGDIGetMousePosition root display XQueryPointer _ZNSt8ios_base4InitC1Ev __cxa_atexit jonextevent _ZN10JSONWriterC1Ev _ZNSt6vectorIP8DWAImageSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ memmove _Znwj _ZSt20__throw_length_errorPKc _ZSt17__throw_bad_allocv _Unwind_Resume _Z8addImagei _ZN11ImageReaderC1Ev DWAGDILoadImage _ZN11ImageReader4loadEPKw _ZN11ImageReader8getWidthEv _ZN11ImageReader9getHeightEv _ZNSt6vectorIP7DWAFontSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z7addFonti DWAGDILoadFont XCreateFontSet XFreeStringList XFontsOfFontSet _ZNSt6vectorIP13DWANotifyIconSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z13addNotifyIconi _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE _Z12getImageByIDi _ZSt20__throw_out_of_rangePKc _ZNSt6vectorIP9DWAWindowSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z9addWindowimP4_XGCP4_XIC _Z13getWindowByIDi DWAGDIClearClipRectangle XSetClipMask DWAGDIClipRectangle XSetClipRectangles DWAGDIRepaint memset XSendEvent DWAGDIFillRectangle XSetForeground XFillRectangle DWAGDIDrawImage _ZN11ImageReader8getPixelEjjPhS0_S0_S0_ XDrawPoint DWAGDIFillEllipse XFillArc DWAGDIDrawEllipse XDrawArc DWAGDIDrawLine XDrawLine DWAGDIPenColor DWAGDIToFront XRaiseWindow DWAGDIHide XUnmapWindow DWAGDIShow XMapWindow XMoveWindow DWAGDISetTitle XwcTextListToTextProperty XSetWMName DWAGDIPosSizeWindow XFreePixmap XGetWindowAttributes XCreatePixmap XMoveResizeWindow _Z17getWindowByHandlem _Z20removeWindowByHandlem DWAGDIDestroyWindow XDestroyIC XDestroyWindow _Z21getNotifyIconByHandlem _Z17getNotifyIconByIDi DWAGDIUnloadFont XFreeFontSet _Z11getFontByIDi DWAGDIGetTextWidth wcslen XwcTextEscapement DWAGDIGetTextHeight _Z13getFontAscentii DWAGDIDrawText XwcDrawString DWAGDIUnloadImage _ZN11ImageReader7destroyEv DWAGDIGetImageSize _Z10drawNotifyP13DWANotifyIconii _ZN11ImageReader8isLoadedEv _Z16addImageToBufferPwRPm malloc DWAGDINewWindow screenid XWhitePixel XCreateWindow wm_delete_window XSetWMProtocols XCreateGC XAllocSizeHints XSetWMNormalHints XFree wcpcpy wcstok free realloc XInternAtom XChangeProperty XVaCreateNestedList best_style im XCreateIC XGetICValues XSetICFocus XSelectInput DWAGDICreateNotifyIcon XMatchVisualInfo XCreateColormap sprintf XGetSelectionOwner _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_ _ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_ _ZN9__gnu_cxx18__exchange_and_addEPVii _ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_ DWAGDIDestroyNotifyIcon DWAGDIUpdateNotifyIcon _Z13detectKeyTypeP9DWAWindowP7_XEvent XwcLookupString _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwj _ZN10JSONWriter9addStringESbIwSt11char_traitsIwESaIwEES3_ _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_ DWAGDILoop g_callEventMessage getenv setlocale XOpenDisplay wm_protocols XSetLocaleModifiers XScreenOfDisplay XOpenIM XGetIMValues colormap x11_fd in_fds tv select XPending XNextEvent _ZN10JSONWriter5clearEv _ZN10JSONWriter11beginObjectEv _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEi _ZN10JSONWriter9endObjectEv _ZN10JSONWriter9getStringEv XCopyArea _ZN10JSONWriter10addBooleanESbIwSt11char_traitsIwESaIwEEb XRefreshKeyboardMapping XSetInputFocus XFreeColormap XCloseDisplay stderr fwrite _ZN11ImageReaderC2Ev _ZNSt6vectorIhSaIhEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPhS1_EEjRKh _ZN11ImageReader7readBMPEPKw wcstombs _ZNSt8ios_baseC2Ev _ZTTSt14basic_ifstreamIcSt11char_traitsIcEE _ZTVSt14basic_ifstreamIcSt11char_traitsIcEE _ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev _ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E _ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode _ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate _ZTVSt13basic_filebufIcSt11char_traitsIcEE _ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv _ZNSt12__basic_fileIcED1Ev _ZTVSt15basic_streambufIcSt11char_traitsIcEE _ZNSt6localeD1Ev _ZTVSt9basic_iosIcSt11char_traitsIcEE _ZNSt8ios_baseD2Ev _ZNSi4readEPci _ZNSi5seekgExSt12_Ios_Seekdir _ZN10JSONWriterC2Ev _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEjjj _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructIPwEES4_T_S5_RKS1_St20forward_iterator_tag _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEjjRKS1_ wmemcpy _ZSt19__throw_logic_errorPKc _ZN10JSONWriter7addPropESbIwSt11char_traitsIwESaIwEE _ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_ _ZN10JSONWriter10beginArrayEv _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jj _ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw _ZN10JSONWriter6lengthEv _ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE _ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE _ZTVSt15basic_streambufIwSt11char_traitsIwEE _ZNSt6localeC1Ev _ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE _ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEb _ZNSbIwSt11char_traitsIwESaIwEED1Ev _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev _ZTVSt9basic_iosIwSt11char_traitsIwEE _ZNSbIwSt11char_traitsIwESaIwEE7reserveEj _ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv _ZN10JSONWriter8endArrayEv _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEm _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEm _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEy _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEl _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEl main libX11.so.6 libXpm.so.4 libstdc++.so.6 libm.so.6 libgcc_s.so.1 libc.so.6 _edata __bss_start _end GCC_3.0 GLIBC_2.1.3 GLIBC_2.0 CXXABI_1.3 GLIBCXX_3.4                                                                                                                                                                                                                                                                                                                                                 P&y                0   si	        ii                    ӯk   	     t)         L(    P(    T(    t)    `,    d,    P)   T)   X)   \) %  `) (  d) )  h) 2  l) 8  p) B  x) X  |) Z  ) [  ) `  ) p  ) q  ) s  ) ~  )   )   )   )   )   )   )   )   )   )   )   )   )   )   )   )   )   h,   )   )   )   )   )   )    *   *   *   *   *   *   *    * !   * "  $* #  (* $  ,* '  0* *  4* +  8* ,  <* -  @* .  D* /  H* 0  L* 1  P* 3  T* 4  X* 5  \* 7  `* 9  d* <  h* =  l* ?  p* @  t* A  x* C  |* E  * F  * G  * H  * J  * K  * M  * N  * O  * P  * Q  * R  * S  * T  * U  * V  * W  * Y  * ^  * b  * c  * d  * f  * h  * i  * k  * l  * m  * n  * o  * r  * t  * u   + v  + w  + x  + z  + |  + }  +   +    +   $+   (+   ,+   0+   4+   8+   <+   @+   D+   H+   L+   P+   T+   X+   \+   `+   d+   h+   l+   p+   t+   x+   |+   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +   +    ,   ,   ,   ,   ,   ,   ,   ,    ,   $,   (,   ,,   0,   4,   8,   <,   @,   D,   H,   L,   P,   T,   X,   \,   U
  
  諻                h       h      h      h      h        h(   $   h0   (   h8   p,   h@   `0   hH   P4   hP   @8   hX   0<   h`    @   hh   D   hp    H   hx   L   h   P   h   T   h   X   h   \   h   `   h   d   h   h   h   pl   h   `p   h   Pt   h   @x   h   0|   h       h      h       h      h      h     h     h     h      h(     h0     h8  p   h@  `   hH  P   hP  @   hX  0   h`      hh     hp      hx     h     h     h     h     h     h     h     h  p   h  `   h  P   h  @   h  0   h      h    h     h    h     h    h    h    h      h(  $  h0  (  h8  p,  h@  `0  hH  P4  hP  @8  hX  0<  h`   @  hh  D  hp   H  hx  L  h  P  h  T  h  X  h  \  h  `  h  d  h  h  h  pl  h  `p  h  Pt  h  @x  h  0|  h     h    h     h    h     h    h    h    h     h(    h0    h8  p  h@  `  hH  P  hP  @  hX  0  h`     hh    hp     hx    h    h    h    h    h    h    h    h  p  h  `  h  P  h  @  h  0  h      h    h     h    h     h    h    h    h      h(  $  h0  (  h8  p,  h@  `0  hH  P4  hP  @8  hX  0<  h`   @  hh  D  hp   H  hx  L  h  P  h  T  h  X  h  \  h  `  h  d  h  h  h  pl  h  `p  h  Pt  h  @x  h  0|  h     h          US    [P  tX[ÐUS   #     u8t  $  ҋ  uƃ  X[]É'    US,     tt$Y[]Ë$ÐUVuMt2tNȁ  %  9t;ȃ9tt(&    ^]É%   =   u퍶    '    ^]Ð&    USMy  BBA[]Ð&    U]Ðv '    U]Ðv '    U1]Ð&    UEP4   t
1]Ð     U勁 ]Ð    USs   t$X[]Í    USC   t$Z[]Í    US|   t$RY[]Í    USL   t$"X[]Í    USó    $X[]Í        UVSP  EuD$ ED$ED$ED$ED$ED$D$ D$ $HHuEEFP[^]Ðv '    U]g  Hut
]u]Á  u  $1ɍDL$$t$@t$1ҍ>T$t$$     @    @    1D$t$$     @    @    1D$t$$     @    @    1D$t$$     @    @    1D$t$$R]u]U     ]        U8]Î  }u$    Ǎ@$E}Q;Qtt:BAE]u}]ÍED$T$$ۉƉ<$t4$\t& U]Ed  uu}$xE<$D$<$<$F]u}]Ít& UVSâ   $   N;N@    @    @    EEttAFE [^]ÍED$L$4$ᐐ&    UWVS!  LE$)ƍED$E̍ED$EȍED$EčD$$FtzE~E$EF    F    D$ED$F$/E~2}1t& '    QH9V}VQLQH9V}V@9EuރL[^_]ËẺD$EȉD$EĉD$D$$FRẺD$EȉD$EĉD$D$$FẺD$EȉD$EĉD$D$$FẺD$EȉD$EĉD$D$$YFẺD$EȉD$EĉD$D$$%FẺD$EȉD$EĉD$!D$$FQUVS{   $   9N|UBE;NB    B    ttAFE [^]ÍED$L$4$t& U]Î  u}}@)ȉu1]u}]198t	B9u9rۍ=$2v '    UWS"   $    I   1󫋻UOE;OB    B    EBEBEBttAGE [_]ÍED$L$<$lU$Î  t$|$}@)ȉu1$t$|$]198tB9uݍv '    US3  E$;t1҉T$@D$ $[]Í        USL  4E$tXE1ɉL$fEEfEEfEEfE   D$   D$ED$1D$BD$ $4[]Ð&    '    U   ]EH  }u$Ptiu`   1T$D$4$ E   Gt$EEEEEEEEE   D$1D$GD$ $]u}]Í        U(]EÛ  }u$tR@D$GD$$ED$ED$ED$ED$GD$GD$$]u}]Í    UWVSz  LE$E܋E$Ku܅-  %  p4$EUE؍EUԍUE    EЉU̍    4$1t& 4$GH9   E؋Uԉ|$4$D$EЉT$ỦD$ET$D$g}uEUM	ЋU	L$BD$$MEMUGD$EȉD$BD$BD$$V4$H9O    '    E4$H;EL[^_]ÐU8]EÛ  }u$ta@D$GD$$ Z  D$ 1D$ED$ED$ED$ED$GD$GD$$<]u}]Ð    U8]Ed  }u$ta@D$GD$$ Z  D$ 1D$ED$ED$ED$ED$GD$GD$$l]u}]Ð    U(]E[  }u$ctR@D$GD$$OED$ED$ED$ED$GD$GD$$]u}]Í    U]E4  uu}}$tU		։p]u}]Ít& USÃ  E$t@D$ $ []ÉUSC  E$Kt@D$ $[]ÉU(]Ed  }u$t6@D$$FGD$GD$GD$$w]u}]ÉU8]EË  }u$tK      t$ED$EEL$D$$ED$GD$$b]u}]Ð        U   ]Ea  }u$    @D$$ED$GD$$ED$ED$ED$GD$$qGEGEGED$ED$ED$ED$GD$$%]u}]U$.  t$|$}@)ȉu1$t$|$]1	9xtB9uܐ&    UWVS:  z1҉)}v 0}E9~tB9u[^_]ËE9Euh4$[^_])EUD$T$}<$ːU]E;  u}$CtA@~E<$\E$!|$$FD$$]u}]Ð    U]'þ  u}}@)ȉu1]u}]1	9xtB9u9wۍ=$bv '    U]N  u}}@)ȉu1]u}]198t	B9u9wۍ=$v '    UWVSJ  P1)4    }u49>t@9u[^_]ËFD$ $XM8PA9uo4$[^_])T$D$$Ґv '    U].  u}}@)ȉu1]u}]198t	B9u9rۍ=$v '    U]E$û  u}}$1t<$0|$D$F$]u}]Ð&    USc  E$[1҅tPZ[]Ít& US3  E$+1҅tPY[]Ít& U8]Ed  }u$U$E      GD$GD$$E$:UT$ƋE$Ut$uT$UD$ED$GD$BD$GD$$]u}]Í&    '    UWVS!  J1)4    }u09>tB9u[^_]ÍF$M8PA9u)Fjt$4$[^_])T$D$$Í    UH]n  uu؉}}4$E4$D$14$I4$oGE؅t$}]u}]ÉƋE؅t$_4$G&    '    UWVSJ  \EԉE$UBD$E$U$uEԅt$\[^_]ËUEPUPE$9EE    ~(EU4E$\u)UċU$r9EE      UĉUЋE)EỦ$H;E   uȍt& Eȉ)ǋE$&H9   E9E}M9u~HEỦD$ED$ED$ED$E|$T$$}EMUtt& Fҋ   	ЋU	L$BD$$EЋUt$D$BD$BD$$F+EЋUU$fEU4E$/u)UƋEԅt$*4$v '    UWVSñ  \EԉE$ED$E$tE$iE    uEԅt$Eă\[^_]ËE$YƋE$|uĉ$ƋE0E$$E0E$?E   E    E$H9E   E1Ekt& ED$ED$ED$ED$Ẻ|$D$E$EGUMEȋ0E	E	E	щ0EЋE$H9vE[E$?ƋEԅt$4$q&    UWVSz    }D$$UE   T$,   T$(   P(t$ T$$1ҋ@$T$D$UT$ED$UT$ED$ $D$0   D$D$0T$$'1D$1D$0D$$Qd+4t+   U 0   EV VFFt$0D$$24$,    + E       M   E ,$	U    )čt$?T$4$E荓( D$T$4$  118U䉕$       <$M@8<<uv   ttftE$:@ D$$    T$t]$E    $T$~7@D$8$f<8$   1D$D$$1D$D$$|$1ɋ8L$D$t$T$    T$0D$$Z8$,@)  1D$@$    D$D$1D$$D$D$t$ t$0D$T$ D$D$ $4$3E    t'1D$ED$D$<$<$QEO! D$0D$$+|$4D$0T$E$ƍLD$0D$$r`D$XD$TD$0D$$UFEVFe[^_]Á,  6rU 0   EV VFFt$0D$$
4$   D$TD$$_Ƹ   D$h4      D$TD$$$|$ƍ   D$$   EED$1D$    T$D$|$t$0D$$1   Tt$D$$   L$ƍe=$o,$&    UWV1SO    E$|ED$   D$    D$   $D$Et$D$      D$D$711҉t$|tEpD$,
   D$(ED$$   D$ ED$1D$   D$   D$D$ D$$|1ɉB1҉L$T$D$$l|B|    @   @   D$BD$$m4$   P1D$D$$U1ɉT$    T$|L$t$E    D$D$E   BD$$Y|L" D$BD$$ 4$D$(D$1D$t$$'D$$IC        uԉD$Et$T$D$$|t$uBD$$ED$E4$D$|t$$8u;|   `   D$14$D$Y!   1ɉL$ =D$$8    (|$1,10Bt$4181<1D$1D$D$$Ĭ  [^_]Ð   L$D$$qD$F$
ED$4$uǃ;|u<$D$F$zڍED$4$7ɐ        U(]  ut0;|u
]u]øD$F$ލED$4$͉$v '    U8]Eë  u}$t[@D$ $v|F    F    F    GEEF    D$F$u9u]u}]ÍFT$$AۍED$4$ʋuE9uE$4FL$$ۍED$4$ː&    '    UWVS
á     E$     D$   u܉D$Et$D$$,t$uGD$$nED$E4$D$xGt$$u;|   G~yG~r`   |D$14$D$   |GE    E    EGEGt$1t$E   D$GD$$Ĝ   [^_]úFT$$YED$4$AEuǃ;|u<$tFL$$:ڍED$4$ɐ        UWVSJ  |$(   }u"
   E|$t$T$D$ED$UB$E~E}l  |EE  }+1M$u9|  e[^_]ÉЋE=  e  =    =    =  /  =  t&   =  t& 5  =  t& %  =  t& X  =  t& H  =  t&   =  t&   =  t&   =  t& '  =  t&   =  t& @  =  t&   =  t&    =a  t&   =  t& z  =  t&   =k  t& ,  =  t& 	  =	  t&   =  t&   =   t& z  =  t&   =  t&   =  t& 	  =  t&   =  t&   =  t&   =Q  t&   =  t& {  =S  t& X  =  t& H  =R  t& %  =  t&   =T  t&   =  t&   =P  t&   =  t&   =W  t& t=  u8T4$1&    L4$D$Et$$E0  }t& uUMe"   1҃)čt$'&    B9UuEU    EމD$D$U$CE߉D$}̍tD$<$'Mt|$L$$}̃9|u  }ȃ9|  E}ЉD$t$<$ED$uԍD$4$t|$t$$Ruԃ9|i  uЃ9|  e   ED$M$LE|$t$ED$UT$ML$UB$EEE:EۉD$}dD$<$E܉D$utD$4$t|$t$$yu9|  u9|  E}D$<$cE݉D$učD$4$wt|$t$$uă9|'  u9|     rX4$eF04$R3d4$? FL$$:ED$4$o&p4$D$F$sED$4$,	GT$$CoED$<$[D$G$QED$<$=D$F${ED$4$g|4$)
4$4$4$4$4$4$4$D$F$E   D$4$iD$F$ED$4$ 4$*D$F$$ED$4$ZFT$$qED$4$*4$4$(4$r4$~_X4$kL@4$X9Ƌe}9|uA4$Ƌ}Ѓ9|t׸D$G$ED$<$a뮍GT$${ED$<$8끉$'    sƋ}9|aD$G$+EED$<$1Ƌ}9|D$G$ED$<$Ƌ}ȃ9|D$G$ED$<$S}̉ƃ9|tGL$$ZED$<$]&    q@4$v84$ch4$oP(4$\=4$I*4$64$#4$}ƃ9|6GL$$sED$<$,v '    }ĉƃ9|"D$G$ED$<$Կ/(t& '    }ԉƃ9|	D$G$ED$<$tt& '    v '    UWVSA  \  EU$$   D$$    L(  1ɍsL$D$$1ҍT$D$$r$47      LT$4$1D$1D$1D$$v9(  1D$D$D$$f9     t;1F9~/A%  9uF$D$.9щ$   D0A$        '    8 J  1    󫋓11@'       L$|$D$t$@$$軽{  <D$$Y<g  f  "`  j  t& p
      	t&   
  !  t& L$`$D$\D$8 B
)  1A)9$  4GFD$$~4$9u1Fh9c  WA9t)T$D$$Ðt& $    L$  t$st$%#D$D$<$I$D$ D$4$'|$tt$<$ ;|  9|h  8%D$D$4$轻t|$t$$g9|  &PD$D$4$jt|$t$$9|  'TD$D$4$|$tt$<$9|  (XD$D$4$ĺt|$t$$n9|  )\D$D$4$qt|$t$$9|  t$(t7T$$H<$֍w9|  \TPD$XT$$T$L$ L$D$BD$BD$BD$$L$t$kt$*D$8D$<$A+D$ D$4$t|$t$$蹺 ;|  9|  $8,D$D$4$赸t|$t$$_$9|>  L$<$袽s  l(4$-D$\D$<t|$t$$膻(9|O  l.D$,tD$<$tt$|$$-,9|  /D$0D$4$薷t1D$t$$޺09|  0D$4D$4$Gt1D$t$<$菺49|  t$8t2L$$8<$֍w9|GT$$苽ED$4$D&    <$躺L$t<$Ut$1D$D$<$+2D$@D$4$	t|$t$$裷@;|  <9|g  3D$DD$<$觵4D$HD$4$腵|$tt$<$H9|  D9|  L85D$D$4$t|$t$$ųL9|  6\D$PD$4$ȴt|$t$$rP9|{  7`D$TD$4$u|$tt$<$T9|  X$趲4$Ǎ8D$ D$t|$t$$²X9|k  t$Ϲ\t7T$$\<$֍w9|GT$$^ED$4$L$t`$Bt$9D$D$<$:D$dD$4$t|$t$$萴d;|y  `9|  ;D$hD$<$蔲<D$lD$4$r|$tt$<$l9|  h9|:  p8=D$D$4$t|$t$$貰p9|  >\D$tD$4$赱t|$t$$_t9|2  ?`D$xD$4$b|$tt$<$x9|  |$裯4$Ǎ@D$ D$t|$t$$误|9|X  t$輶t7T$$ܯ<$֍w9|GT$$KED$4$&    L$ʴ 	  t$(t$ڶAD$D$<$BD$D$4$ܯt|$t$$v;|  9|  CD$LD$<$zDD$D$4$X|$tt$<$9|  9|   8ED$D$4$t|$t$$蘭9|Q  F\D$D$4$蛮t|$t$$E9|  G`D$D$4$H|$tt$<$9|  $艬4$ǍHD$ D$t|$t$$蕬9|  t$袳t7T$$¬<$֍w9|D$G$1ED$4$1D$   D$LD$$|_L$艱Ct$t$虳SD$D$<$转TD$D$4$蛬t|$t$$5;|  9|6  UD$D$<$9VD$D$4$|$tt$<$豭9|  9|R  8WD$D$4$譫t|$t$$W9|  t$dt7T$$脪<$֍w9|D$G$cEۉD$4$謩OL$y3t$׭t$艱XD$D$<$譪YD$D$4$苪t|$t$$%;|  9|s  ZD$ D$<$)[D$D$4$|$tt$<$衫9|  9|   8\D$D$4$蝩t|$t$$G 9|
  t$Tt7T$$t<$֍w9|oD$G$SED$4$蜧?t$,L$VP; X;t$薫t$H]D$D$$`^D$D$4$>tt$D$$ҩ;|v&  9|&  _D$$D$$Ч`D$D$4$讧tt$D$$B9|'  9|8&  a7D$D$<$Dtt$|$$9|2*  t<$0|$$!<$֍w9|D$G$萭 ED$4$IL$ƩD$FD$$[4$D$D$oL$lzp  bt$t$辬ND$tD$$֥OD$D$4$败tt$D$$H;|'  9|k'  PD$D$$FQD$D$4$$tt$D$$踦9| '  9|k'  R7D$D$<$躤tt$|$$d9|c  t<$q0|$$藣<$֍w9|GT$$vEωD$4$迢bt$
t$輪ID$tD$$ԣJD$D$4$貣tt$D$$F;|  9|  KD$D$$DLD$D$4$"tt$D$$趤9|   9|  M7D$D$<$踢tt$|$$b9|[  t<$o0|$$蕡<$֍w9|D$G$tEÉD$4$轠`GL$$ԨqD$4$芠D$F$表cD$4$WD$F$ngD$4$$D$F$;|dD$4$eD$F$oD$4$辟D$F$էdmD$4$苟MD$F$袧kD$4$XFL$$oXiD$4$%AD$$D$负e[^_]øD$F$wD$4$辞D$F$ԦtD$4$芞D$F$衦sD$4$WD$F$nED$4$'F|$$>yED$4$eD$F$ED$4$ǝD$F$ޥiED$4$藝UD$F$讥ED$4$gF|$$~aED$4$7MD$F$NED$4$D$F$}ED$4$לiD$F$8ED$4$觜$D$F$辤ED$4$wD$F$莤FED$4$G2FL$$^ED$4$D$F$.ED$4$F|$$ED$4$跛D$F$ΣED$4$臛D$F$螣*ED$4$WD$F$n&EщD$4$'F|$$>ED$4$xD$F$kED$4$ǚWF|$$ޢD$4$蔚&    D$F$褢c}D$4$ZLD$F$qEىD$4$*D$F$AE։D$4$~FT$$MEՉD$4$ʙ9D$F$E҉D$4$蚙D$F$象!{D$4$g
FL$$~yD$4$4~&    D$F$D5ED$4$!D$F$ED$4$͘D$F$/ED$4$蝘F|$$贠ED$4$mD$F$脠eED$4$=QD$F$TED$4$FT$$$ED$4$ݗD$F$UED$4$譗AD$F$ğED$4$}D$F$蔟qEމD$4$M]FT$$d,E݉D$4$=$
$RƉ4$HƋh9|tGL$$ɍED$<$躖븉봉밉Ƌ;|tD$G$蹞eD$<$sn ƃ;|tGT$$wbD$<$1끉(on       |$t$D$Z$貞 D$   D$   D$$聞ƃ9|D$G$輝fD$<$rmfƃ9|OD$G$k3hD$<$!ƃ9|GT$$jD$<$Дƃ9|D$G$МlD$<$膔zsƃ9|\D$G$x@nD$<$.)O9|D$G$.pD$<$ޓƋ;|D$G$қuD$<$舓 ƃ;|tGT$$茛rD$<$Fv$ƃ9|*D$G$FvD$<$ƍ        (ƃ9|D$G$ؚxD$<$莒,ƃ9|kGT$$臚OzD$<$=810ƃ9|D$G$6|D$<$4ƃ9|D$G$~D$<$袑ƍG9|GL$$蛙cED$$NI:5@ƃ;|uL<;|D$G$3ED$<$D$G$ED$<$蹐닉ƋD9|GL$$赘}ED$<$niHƃ9|tD$G$rED$<$/|>pƍ    Lƃ9|GT$$ED$<$ʏPƃ9|D$G$×ED$<$|wpTƃ9|YD$G$u=ED$<$.)"Xƃ9|D$G$'ED$<$O9|GL$$ED$<$蓎Ƌ`;|wD$G$蓖[ED$<$LGdƃ;|tD$G$PED$<$|t& '    et& '    lƃ9|D$G$ED$<$衍Ƌ;|D$G$衕iEӉD$<$ZUƃ;|tD$G$^EЉD$<$|&    gƋ9|GL$$ED$<$Ƌ;|D$G$躔ED$<$snƃ;|tD$G$wED$<$4|(n'    Wt& '    fƉ'    ƃ9|GT$$ED$<$誋ƃ9|   9|yD$G$蕓]ED$<$NIpƃ9|2GT$$NED$<$D$G$XED$<$׊Dv Ɖ%Ƌ;|D$G$賒{E߉D$<$lgƃ9|PD$G$l4ED$<$% ƃ;|]GL$$%AE܉D$<$މ-D$F$ED$4$觉uW9| D$G$袑j ED$$UPAv 9Ɖ'    3    t& '    t& '    t& '    '    't& '    Ɖ'    tƃ9|D$G$ȐED$<$聈|xƃ9|eD$G$聐IED$<$:5.|ƃ9|D$G$3ED$<$O9|GL$$ED$<$蟇&    yt& '    `t& '    lt& '    t& '    ~t& '    
t& '    /t& '    Ɖ'    Ƌ9|D$G$E׉D$<$躆&    t& '    ^t& '    t& '    p ƃ9|\GL$$x@ED$<$1,ƃ9|GL$$1EԉD$<$&    ƃ9|D$G$؍E؉D$<$葅O9|(uD$G$葍Y(EډD$<$D?')t& '    Ɖ'    ƃ9|D$G$ẺD$<$фF|$$E͉D$4$衄mW9|$GL$$行i$EΉD$$TO'9Ɖ'    3$Ƌ;|D$G$3ED$<$ƃ;|tD$G$ED$<$譃|`t& '    eD$F$诋VED$4$hBD$F$;ED$4$8',Ƌ9|D$G$1ED$<$ƃ9|tD$G$ED$<$諂|FT$$ED$4${EFL$$荊ED$4$F	t& at& '    lt& '    Ɖ'    ƃ9|D$G$ED$<$ƃ9|D$G$躉ED$<$sngƃ9|PD$G$l4ED$<$% O9|	GT$$%ED$<$؀    Ut& '    t& '    t& '    ƃ;|  ;|gD$G$胈KED$<$<7D$F$SnED$4$ZD$F$#SED$4$?TD$F$ED$4$Ƌ9|{D$G$藇_ED$<$PKƃ9|tGL$$TED$<$|FT$$(ED$4$~>@v '    D$G$߆+ED$<$~    O9|,lD$G$舆P,ED$<$;~6ƃ9|D$G$6ED$<$}-ƃ;|  ;|D$G$ՅEǉD$<$}W9|0rD$G$莅V0ED$$A}<5Ƌ9|D$G$:EˉD$<$|ƃ9|tD$G$EȉD$<$||nFT$$迄yEƉD$4$x|eD$F$菄EɉD$4$H|FL$$_EŉD$4$|D$F$/yEʉD$4${eƍt& ƃ9|D$G$ӃED$<${D$F$裃ED$4$\{P&    q&    )D$G$OIEĉD$<${5     밐U(}}]u>l  W;WtKtBBGEM0B)ȋM)D$L$$~E0]u}]Ðt& Ћ)=?      t 9   &    1?   U$guEM)Ɖt$D$$}UtMwEU$)ƋEt$D$k}t$-EEuGEG&?q$Ȁc{U(}}]uރuk  W;WtKtBBGEM0B)ȋM)D$L$$|E0]u}]Ðt& Ћ)=?      t 9   &    1?   U$uEM)Ɖt$D$$:|UtMwEU$)ƋEt$D$|t$́EEuGEG&?q$hzU(}}]u~j  W;WtKtBBGE}M0B))D$L$$_{E0]u}]Ðt& 7)=?      t 9   &    1?   U$}uEM)Ɖt$D$$zUtMwMEU$)Ήt$D$zt$mEUEGEЉG&?q$~xU(}}]uõh  W;WtKtBBGE}M0B))D$L$$yE0]u}]Ðt& 7)=?      t 9   &    1?   U$G|uEM)Ɖt$D$$zyUtMwMEU$)Ήt$D$Kyt$EUEGEЉG&?q$|Cw$ÐUE@ @    @    @    ]Ð&    '    UE]@Ít& UE]@Ðt& UE]@Ðt& USi g  Ht[]Ðt&   u퍃  $"uD$1D$d$Dw[]Í    U     ]US~Óf    $}Z[]Í        U4$u|$M~    V;Uv{F9vt)ȍxF׉EЋEVUЋTEVUЋTEtE      4$|$]ËNEDU ܍        UE     @    @    @ @    @    @    ]Ðv '    UE     @    @    @ @    @    @    ]Ðv '    U1WVS\  r}	e  uD$$    t$2wP)ԍ|$D$t$<$w`$sE E    E H@E    E    FE    E    1AA `4$:ut$$8z   D$|$4$sG  1ɉL$@Љ$lxt   FF $r$*u$q1ɍF${we[^_]Ðt& E   T$D$$Zyf}BMtf$DrHʋB$D$IwpB$D$!w
   11ɉ|$t$L$4$xE   T$D$4$x1D$   D$1D$4$x   |$E4$D$yx   L$E4$D$^x   1҉D$1T$D$4$Qx   D$E4$D$&xEP@ЋAE ЉI)9   )E)H1D$1MD$L$4$wEH   P1tȍt& '    @u)Ur~O  11    '    L$U
ȉD$$#wGƋE9xʋuFED$)D$L$U$p@4$T$)ЉD$v븋ƋBB $o$q$n1B$t4$uƋ$n$)qaƋ$m1A$ssZ
11L$U
ȉD$$:u   D$T$D$$uGM9yƋ$mhv '    USEv-^  D$E$$t[]ÐUWVS,Udv]     Ep@)9   E0)9M  9ʍE   9E          U܉$qMuǋ<$)Ɖt$47D$nMUt&    BIuEMƉuqM)Ήt$ED$U$nMt$xtEUM܉8EBB,[^_]ËE EۋE)9r`E)T$4$D$rUEJ)ȉB|$M$L$:nEx;utMEB9ֈu,[^_]É)ЉT$4$D$mUEB)ȋ})D$)ƋU4$T$mMu9M6EΉt& MۈB9u,[^_]EmE 9E[D$q`[  UE|]ÉU1ɉSEL$tç[  R$T$1҉T$o[]Ð&     w[  UE|]ÉU]sN[  u}}4$nt$<$D$lE<$D$o4$nt$<$D$pl4$nt$<$D$Xl]u}]ÐU]'sþZ  u4$Cnt$D$E$l]u]Í&    '    U]rnZ  u4$mt$D$E$k]u]Í&    '    U8}}]u~rZ  E @tUP9   uD$T$|$4$lED$4$!juE;|uWEt!E|$$kE]u}] @|$HD$1D$E$yl͍($YoD$F$uoED$4$2g뀀} u<$pou;|tD$F$*o΍ED$4$f뽐        U8}}]u.qX  E PtfB9rouT$D$|$4$kED$4$huE;|u:Uu@Ht& '    @]u}]Í($*nFL$$FnED$4$f띀} u<$Anu;|tD$F$m΍ED$4$e뽍&    '    UWVS  EuoÔW  4$ED$iUt$$eu܃;|}  P$`fE    E    E zRE    E    GGE    E    $P $PB1҉(1014181<1@D,$l|B(   H(D$L$!m$$D$d<u   49   "}T$D$ED$8$guEt$<$jl4$bjE|$$ju9|   4$3iUt$$D$ g$h  [^_]ÍE#D$8}L$T$$fuEt$<$k4$i_L}D$<$kEFL$$#kJED$4$b6FL$$jgED$4$bS<$9i$g$j4$iȉȋB(L$hB($b$$x$]h$/ju܉;|<F|$$i ED$4$aNt& u9|F|$$iED$4$@a&    '    UWVSk!S  ,Eu4$D$2eEt$$3au;|b  4$sfUt$$D$@d|UE@D$EE܉$JfU  E       t& 	O  
t& g  n  B>  E<20F;pw@~U܉t$$eEP@    p<    t& UEU9*  @yXEu2tRZ"t{t& Pd4$Oe&    D$E܉t$$c닋E$d뛍4$e΃/   \	4$d몍4$d        U܉D$t$$b4$d؋U$UdE4$d볍4$}d룍4$md E܋UD$$e4$Hdt$D$E$bu9|u?,[^_]ùFL$$fED$4$T^n&    FT$$dfED$4$!^똋}ƃ;|u4$WfD$G$f܍ED$<$]ˋ}ƃ9|tGL$$eED$<$]뒉$e&    '    U8U]u}gsO  @P9   D$EuT$4$D$LbD$4$_uǃ;|unu.U@P9   )1ɉD$EL$T$$b4$zbUt$$D$G`]u}]Í($dD$F$dvED$4$\b=$nduǃ;|u<$d$dD$F$jd؍ED$4$'\ǐ        U8U]u}lfN  @P9   D$EuT$4$D$`D$4$^uǃ;|unu.U@P9   )1ɉD$EL$T$$xa4$
aUt$$D$^]u}]Í($<cD$F$XcvED$4$[b=$buǃ;|u<$6c$.cD$F$b؍ED$4$Zǐ        UWVS
eáL     Eu܉4$D$^Et$$Zu܃;|  P1$h[1ɉ,E    E    zRE E    GGE    E    $E    0P $PB1҉(181<1@D4$a|B(   H(D$L$+bE$<$D$6\<u  49   "T$D$ED$8$\UuEt$$xau9|0  UD$$_u9|   4$1^t$D$E$[<$]   [^_]Ív E#D$8L$T$$E[uEt$$`4$^PLD$E$`0FT$$`;ED$4$W'F|$$_LED$4$W8D$F$_ED$4$kW$]<$\$_⋵L9|B(>  B($W$$x$)]$^@u9|<FL$$^ ED$4$cVu܉;|D$F$b^ED$4$V^'    t& '    @E4$q\lD$F$]ED$4$U&    UWVS  Eu_uG  U4$ED$}YUt$$~Uuԃ;|  H1$6V1ɉ(E    E    zRE E    G GE    E    E    ,P HB1҉ 1$1418<0$[|B    @ D$D$\T$D$$U4u؅8  ,9   T$D$ED$0$^WE}؍ED$<$9\u9|Y  E|$$HZu؃9|   4$XUt$$D$V$X  [^_]Ít& ED$0L$T$$VE܍}؍E܉D$<$[u܃9|VD$F$Z:ED$4$R&t& D}؉D$<$3[FT$$ZED$4$cRD$F$zZED$4$3RD$F$JZED$4$RwƋ}؃9|u$@W4$(ZGT$$Y΍ED$<$Q뫉$YǋƍB D$ XB $R x$W4$wY$랋}ԉƃ;|*D$G$&YED$<$P}ƃ9|D$G$XED$<$P}܉ƃ9|GL$$XjED$<$WPV}؉ƃ9|PGL$$ZX4ED$<$P t& '    t& '    v '    UWVS:ZA     Eu܉4$D$SEt$$Ou܃;|y  P$P1E    E    E zRE    E    GGE    E    $,P $PB1҉(14181<1@D0$LV|B(   H(D$L$[WE$$D$0W<u   49   "T$D$ED$8$Qu}Et$<$V4$TE|$$Tu9|   4$qSUt$$D$>Q$S   [^_]ÍE#D$8L$T$$1Qu}Et$<$V4$T_L}D$<$UEFT$$aUJED$4$M6F|$$1UkED$4$LWu9|u $#R$UF|$$TȍED$4$L뷉4$S뙉럋L9|B(   B($L$$x$eR$7Tu܉;|u>$TD$F$ScED$4$KOD$F$SED$4$nK뙉u9|sFL$$`SWED$4$KC&    v '    UWVSZU<     Eu܉4$D$NEt$$ Ku܃;|y  P$K1E    E    E zRE    E    GGE    E    $,P $PB1҉(14181<1@D0$lQ|B(   H(D$L${RE$$D$O<u   49   "T$D$ED$8$Lu}Et$<$Q4$OE|$$Ou9|   4$NUt$$D$^L$0N   [^_]ÍE#D$8L$T$$QLu}Et$<$,Q4$$O_L}D$<$
QEFT$$PJED$4$:H6F|$$QPkED$4$
HWu9|u $CM$%PF|$$OȍED$4$G뷉4$:N뙉럋L9|B(   B($G$$x$M$WOu܉;|u>$5OD$F$OcED$4$FOD$F$NED$4$F뙉u9|sFL$$NWED$4$9FC&    U(E]tP8  9Eu}tputwƋE1|$)ƋE4$D$GPǉUt3Et$$D$ IEG    7    ]u}]ËUG֋|Eۍ\$NL$q1UQY]aÍv '    USO@7  Ht[]Ðt&   u퍃  $bED$1D$$$G[]Í    U     ]US<O6    $(NZ[]ÐUVSOâ6  |p@tЋu[^]ÐUS    [\6  $NY[vector::_M_insert_aux -*-*-*-*-*--13-*-*-*-*-*-*-* -*-*-*-*-*--12-*-*-*-*-*-*-* -*-*-*-*-*--14-*-*-*-*-*-*-* -*-*-*-*-*--*-*-*-*-*-*-*-* vector::_M_range_check _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_MENU _NET_WM_WINDOW_TYPE_DIALOG _NET_WM_WINDOW_TYPE_DOCK _NET_WM_ICON CARDINAL fontSet statusAttributes preeditAttributes clientWindow inputStyle filterEvents _XEMBED_INFO _NET_SYSTEM_TRAY_S%i _NET_SYSTEM_TRAY_OPCODE LANG Could not open display.
 WM_PROTOCOLS WM_DELETE_WINDOW Couldn't open input method queryInputStyle -*-*-medium-*-*--13-*-*-*-*-*-*-*   -*-*-medium-*-*--12-*-*-*-*-*-*-*   -*-*-medium-*-*--14-*-*-*-*-*-*-*   
       E   S   C   A   P   E       F   1       F   2       F   3       F   4       F   5       F   6       F   7       F   8       F   9       F   1   0       F   1   1       F   1   2       P   R   I   N   T       S   C   R   O   L   L   O   C   K       P   A   U   S   E       B   R   E   A   K       B   A   C   K   S   P   A   C   E       T   A   B       R   E   T   U   R   N       C   A   P   S   L   O   C   K       S   H   I   F   T   L   O   C   K       D   E   L   E   T   E       L   E   F   T       R   I   G   H   T       H   O   M   E       E   N   D       K   E   Y       t   y   p   e       v   a   l   u   e       C   H   A   R       R   E   P   A   I   N   T       n   a   m   e       i   d       x       y       w   i   d   t   h       h   e   i   g   h   t       K   E   Y   B   O   A   R   D       s   h   i   f   t       c   t   r   l       a   l   t       c   o   m   m   a   n   d       M   O   U   S   E       M   O   V   E       a   c   t   i   o   n       b   u   t   t   o   n       B   U   T   T   O   N   _   D   O   W   N       B   U   T   T   O   N   _   U   P       N   O   T   I   F   Y       A   C   T   I   V   A   T   E       C   O   N   T   E   X   T   M   E   N   U       W   I   N   D   O   W       I   N   A   C   T   I   V   E       O   N   C   L   O   S   E       vector::_M_fill_insert  basic_string::_S_construct NULL not valid   :           [       {       \   "       \   /       \   b       \   f       \   n       \   r       \   t       \   \       "   ,       ]   ,       }   ,       basic_string::substr basic_string::erase    ;  Z    F  F  F<  F\  F|  F  G  G   H  H   Jl  J   K  K  MT  Nx  N  O  pO  O4  PPT   Q|  Q   S  S  @T  T@   Uh  `U  U  V  V  pW   WH  `Xl  X  PY  Y  pZ	  Z0	  @[X	  p[x	  [	  \	  0]	  ]
  _0
  aT
  Phx
  l
  l
   n
  o  `|4  D     ,    @X  px          @  <  P\    p  |      0$  Pl    0       ,  P   t            (  D  @h  `           zPLR |I-       $   Cg       ABA   D   lC(       ABA   d   |C       AB         lC       AB         \C       AD         LC       AB         LC       LB        D$       ABA    $  Du       ABE      H  xDP      ABFO $   l  tU      ABFI   $     E   O  ABFQ   $     F\       ABFQF  $     \U      ABFI         Fw       ABB      0  pF      ABC$   T  LU      ABFI       |  4H|       ABB  $     Hf       ABFQ   $     8U      ABFI         H       ABB  $     IV       ABFS      <  TID       ABA   \  I       ABA$   |  I       ABIT   $     |J       ABFT         Jm      ABC$     0L       ABFT   $     L       ABFT   $   @   M       ABFT   $   h  ML       ABFQF       M>       ABA     M>       ABA$     Mn       ABFT   $     8N       ABFT   $      N       ABIT   $   H  HOW       ABFS       p  O       ABC$     Oy       ABFT   $     DPf       ABFQ   $     Pf       ABFQ         P       ABC$   0  `Qf       ABFQ   $   X  QX       ABFT        Q,       ABA     Q,       ABA$      R       ABFT         R       ABC$     DS     ABFNF      4  S&    ABC    X  U    ABC    |  4W    ABC$     ]#    ABBC         ae     ABFN $     $b    ABFT         c    ABC    8  d    ABC    \  $qRD  5  ABC     !       AB               AB               AB        к       AB       	  Z       ABD    	  $       ABA    @	          ABFG    d	  ̻5       AB      	  5       AB       	  %      ABF    	      ADI   	  *       ABD   
         LB      ,
  8       ADD   L
         LB   $   l
  D       ABIT   $   
         ABFQ       
  DB       ABFN     
  pB       ABFN $     C  
  ABFI   $   ,  "  
  ABFI       T  r  
  ABI    x  (    ABC      c  %  ABO      c  $  ABO      <  #  ABC      8    ABI    ,      ABC    P    V  ABC       zPR |   $           D 	FCBA    H   Z    ABD   d   $    ABA    !  .z s  #  2h |    2     /   1     (          C] `   "  w     &]          N       	 	 
  
 
 
                          G  Q Q 	Q 	R 	S 
S 
S T T U T U U %  V H  V V W X X   X X Y Y Z Z [ Z %  [ \ H  ] ^ \ \ ] ] ^ ^ _ _ _ _   ` ` %  ` b 5  Q a b P P b P g h m n m   f n %   n  o  5  !e !e !e "f "d " #f #f ${ ${ $z $z %  %{ %{ %%  &| &| 'H  'd (c (c (p )p )r )p *r *%  *s +t +5  +j ,i ,j ,i -i -g .l .q .%  .Ł /P /f  0 0~ 1} 1 1 2 2 2 3  3 3 4  5 5 6 6 6 7ڄ 7t 7t 8  8u 8v 9  9v 9v :v :x ;x ;x ;l <i <  <k <k =k =Q > >Q >l ?l ?l @ @  @o AV AV Be Bp Bo Co Co C\ D] Dz Ez Ez E{ F{ Ff Ff Gd Ge Hc Hf Ha If Ip Jp Jp Jp Kq Kq Kq Lq Lz MP MP MP NQ Nl Nl Ol Ol Pi P  PS QR QR R6  SR TS TT UU UU VV WX WX XX YX YY ZZ [[ [[ \] \^ ]^ ^^ ^^ __ __ `` ab aނ bb cp cd dd df ef ef gh gi hi hi ij jl jl kl kk mh mn no oo pq qr rr st st tt uu uu vw ww wv wv xz yy yx yx z} {} || |} } ~~ ~    ˀ    ň P      Ć  Ї ʈ Gs  A   F	  	 
 
   0	 !L 6       Hf     |.  = c                        6!  0 c           G  Y A   %   G  Y A   %   |$  3 [    	 	      	   	 	       	 	
 6  E m     	 
     	     
         	 	 

 
 $  3 Y               	     '    		 $  3 Y               	     '    		    F  0                                                 p7     t                  
               )               2     81     H        o0  o   o.  o                                                                               `,                                                                                                     h(         7  7  7  7  7  7  7  8  8  .8  >8  N8  ^8  n8  ~8  8  8  8  8  8  8  8  8  9  9  .9  >9  N9  ^9  n9  ~9  9  9  9  9  9  9  9  9  :  :  .:  >:  N:  ^:  n:  ~:  :  :  :  :  :  :  :  :  ;  ;  .;  >;  N;  ^;  n;  ~;  ;  ;  ;  ;  ;  ;  ;  ;  <  <  .<  ><  N<  ^<  n<  ~<  <  <  <  <  <  <  <  <  =  =  .=  >=  N=  ^=  n=  ~=  =  =  =  =  =  =  =  =  >  >  .>  >>  N>  ^>  n>  ~>  >  >  >  >  >  >  >  >  ?  ?  .?  >?  N?  ^?  n?  ~?  ?  ?  ?  ?  ?  ?  ?  ?  @  @  .@  >@  N@  ^@  n@  ~@  @  @  @  @  @  @  @  @  A  A  .A  >A  NA  ^A  nA  `, `(      GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  .shstrtab .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .text .fini .rodata .eh_frame_hdr .eh_frame .gcc_except_table .ctors .dtors .jcr .dynamic .got .got.plt .data .bss .comment                                                                                                                                  !   o   .  .                 .   o   0  0                  =   	      81  81  H               F   	      2  2       	         O         p7  p7                    J         7  7  	                U         A  A                   [         t  t                    a                              i         0  0                   w                                         J                          H( H                            \( \                            d( d                            h( h                          P) P                           )                           `, `                            , l (                                l 
                               v                                                                                                                                                                                           dwaggdi_x86_64.so                                                                                   0000644 0001750 0001750 00000231620 14140517152 013337  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 ELF          >    PV      @       -         @ 8  @                                 !     !                  !     !     !     H       
                   ("     ("     ("                        Ptd                                     Qtd                                                                  @   -             E             7   v             9      i         d                                                      W      :             m                                             !                        P                         {   >                     B             '                            $   G           2          .                 U                =   %                                                                 ~           e   y             /              |      I                    a                                  T   O              u                       ,      ]   ^   \               Y             x      r                                                                                                                                                                                                                            "       #                                                   )       0       +   (               F           <                              *       N                              ;                   6   D   [                   Q           _           X               h   &       c                           K              3   H           `                      t                                               }           S       8                         z           4          1                      n           o   p   Z   b         l                      ?       R   g   C                  J                 j                 w                              q                V   k          A   M         L      f                 s      5                                                                        HL                   
 PV                    x                                                                                                 !                   "                    "                   *                   @*                                 f                    	   
 z             	             U       G   
 W      #                    |       s                       
        *          
       U       	    h*                                    
 o               
 P      U       %	   
 z               " 
             S                      
   
 p      1          
  W      y       	                   1                   F                                                              
  X      -                                       E       j                    X                        *            8   
        {                           7    *            >    @+            H             a       u   
              #   
 Ѝ                                                     y             	                   |       B   
 P      k                    V           *                         Z       P
                       
       ^                             
 `z                                 0    *                               	  " 
       e         
 `                
 0      _       9             &                    !         
 d            t
             2                                                                      *               
 0Y               
                           t       \                    7   
                           r                    x       m   
                  
 y      Y       H
             v      x             -                                                                              b                          
   
                                  6                   	    x*            3   
 ^            \   
       8                            '    P+               
 P               
       L                    	           HL              m                    [    *            ?    
 V             
   
              A                    l   
 0             F             
       ?   
 @                          d          
       ?                             " 
  y                                                                  "           `*                         f       ~             -      V	    +            R   
                           3      	             a                   w       -             
          
             r   
                  
  W             s                    #                   3	    p*               
                
        ^                              
 `                          )          
 @Z      U                   	       7                   o   
        ,                           Q   
                                 W                    
   
 P}      X       B                     L             M       	    *            F                                                     7       	   
 @{      g          
 0      E                                             M	    +            T   
 Ў                                                      
 0z                0*                
                 
                           I      +   
       :       
   
 |      r       0   
 Pt                                  "                  g                    h                     " 
       e                             
       p                              
       U                                         
                              
 Pz                  x              f    *            n   
                          D       Q             1         " 
 0      e                          G                    +                      
                 
 pz             V                        
 W             2                     c                      
 pb      5      V
                    i                                          
 c      5                   _                   
                           Q                       0*                          	          
 0                +                                   " 
       e                          .                    s             P          
 `      \      n             P          
              e   
 W      #       e	    `+            L                                                     i                                                                  -   
        p       @   
              _                       
                 
 0      1           *            <	    +                                            l       +                                                              z   
  ~                                                   d   
 i            
   
              n   
 }      g       W   
 0                                                      
 Љ      *                          F	                    p	             |                                                   __gmon_start__ _init _fini __cxa_finalize _Jv_RegisterClasses _ZN10JSONWriterC2Ev _ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE __gxx_personality_v0 _ZN10JSONWriter5clearEv _ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEmmm _ZN10JSONWriterC1Ev _ZNSbIwSt11char_traitsIwESaIwEE12_S_constructIPwEES4_T_S5_RKS1_St20forward_iterator_tag _ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEmmRKS1_ wmemcpy _ZSt19__throw_logic_errorPKc _ZN10JSONWriter7addPropESbIwSt11char_traitsIwESaIwEE wcslen _ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwm _ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_ _ZN10JSONWriter10beginArrayEv _ZN10JSONWriter11beginObjectEv _Unwind_Resume _ZN10JSONWriter9getStringEv _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mm _ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw _ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_ _ZSt20__throw_out_of_rangePKc _ZN9__gnu_cxx18__exchange_and_addEPVii _ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_ _ZN10JSONWriter6lengthEv _ZN10JSONWriter10addBooleanESbIwSt11char_traitsIwESaIwEEb _ZNSt8ios_baseC2Ev _ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE _ZTVSt15basic_streambufIwSt11char_traitsIwEE _ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE _ZNSt6localeC1Ev _ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE _ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEb _ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_ _ZNSbIwSt11char_traitsIwESaIwEED1Ev _ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev _ZNSt6localeD1Ev _ZTVSt9basic_iosIwSt11char_traitsIwEE _ZNSt8ios_baseD2Ev _ZN10JSONWriter9addStringESbIwSt11char_traitsIwESaIwEES3_ _ZNSbIwSt11char_traitsIwESaIwEE7reserveEm _ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv _ZN10JSONWriter8endArrayEv _ZN10JSONWriter9endObjectEv _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEm _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEm _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEy _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEi _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi _ZN10JSONWriter9addNumberESbIwSt11char_traitsIwESaIwEEl _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEl _Z17ChooseBetterStylemm DWAGDIGetScreenSize screen DWAGDIPenWidth DWAGDISetClipboardText DWAGDIGetClipboardText _Z17detectMouseButtonP7_XEvent DWAGDIEndLoop exitloop imageList _ZdlPv fontList notifyIconList windowList _ZNSt8ios_base4InitD1Ev DWAGDIGetMousePosition root display XQueryPointer _ZNSt8ios_base4InitC1Ev __cxa_atexit jonextevent _ZNSt6vectorIP8DWAImageSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ memmove _Znwm _ZSt20__throw_length_errorPKc _ZSt17__throw_bad_allocv _Z8addImagei _ZN11ImageReaderC1Ev DWAGDILoadImage _ZN11ImageReader4loadEPKw _ZN11ImageReader8getWidthEv _ZN11ImageReader9getHeightEv _ZNSt6vectorIP7DWAFontSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z7addFonti DWAGDILoadFont XCreateFontSet XFreeStringList XFontsOfFontSet _Z12getImageByIDi _ZNSt6vectorIP13DWANotifyIconSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z13addNotifyIconi DWAGDIUnloadImage _ZN11ImageReader7destroyEv DWAGDIGetImageSize _Z17getNotifyIconByIDi _Z21getNotifyIconByHandlem _ZNSt6vectorIP9DWAWindowSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_ _Z9addWindowimP4_XGCP4_XIC _Z17getWindowByHandlem _Z20removeWindowByHandlem _Z13getWindowByIDi DWAGDIClearClipRectangle XSetClipMask DWAGDIClipRectangle XSetClipRectangles DWAGDIRepaint memset XSendEvent DWAGDIFillRectangle XSetForeground XFillRectangle DWAGDIDrawImage _ZN11ImageReader8getPixelEjjPhS0_S0_S0_ XDrawPoint DWAGDIFillEllipse XFillArc DWAGDIDrawEllipse XDrawArc DWAGDIDrawLine XDrawLine DWAGDIPenColor DWAGDIToFront XRaiseWindow DWAGDIHide XUnmapWindow DWAGDIShow XMapWindow XMoveWindow DWAGDISetTitle XwcTextListToTextProperty XSetWMName DWAGDIDestroyWindow XDestroyIC XDestroyWindow XFreePixmap DWAGDIPosSizeWindow XGetWindowAttributes XCreatePixmap XMoveResizeWindow DWAGDIUnloadFont XFreeFontSet _Z11getFontByIDi DWAGDIGetTextWidth XwcTextEscapement DWAGDIGetTextHeight _Z13getFontAscentii DWAGDIDrawText XwcDrawString _Z10drawNotifyP13DWANotifyIconii _ZN11ImageReader8isLoadedEv _Z16addImageToBufferPwRPm malloc DWAGDINewWindow screenid XWhitePixel XCreateWindow wm_delete_window XSetWMProtocols XCreateGC wcpcpy wcstok free realloc XInternAtom XChangeProperty XVaCreateNestedList best_style im XCreateIC XFree XGetICValues XSetICFocus XSelectInput XAllocSizeHints XSetWMNormalHints DWAGDICreateNotifyIcon XMatchVisualInfo XCreateColormap sprintf XGetSelectionOwner _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_ DWAGDIDestroyNotifyIcon DWAGDIUpdateNotifyIcon _Z13detectKeyTypeP9DWAWindowP7_XEvent XwcLookupString DWAGDILoop g_callEventMessage getenv setlocale XOpenDisplay wm_protocols XSetLocaleModifiers XScreenOfDisplay XOpenIM XGetIMValues colormap x11_fd in_fds tv select XPending XNextEvent XFreeColormap XCloseDisplay XCopyArea XRefreshKeyboardMapping XSetInputFocus stderr fwrite _ZN11ImageReaderC2Ev _ZNSt6vectorIhSaIhEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPhS1_EEmRKh _ZN11ImageReader7readBMPEPKw wcstombs _ZTTSt14basic_ifstreamIcSt11char_traitsIcEE _ZTVSt14basic_ifstreamIcSt11char_traitsIcEE _ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev _ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E _ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode _ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate _ZTVSt13basic_filebufIcSt11char_traitsIcEE _ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv _ZNSt12__basic_fileIcED1Ev _ZTVSt15basic_streambufIcSt11char_traitsIcEE _ZTVSt9basic_iosIcSt11char_traitsIcEE _ZNSi4readEPcl _ZNSi5seekgElSt12_Ios_Seekdir main libX11.so.6 libXpm.so.4 libstdc++.so.6 libm.so.6 libgcc_s.so.1 libc.so.6 _edata __bss_start _end GCC_3.0 CXXABI_1.3 GLIBCXX_3.4 GLIBC_2.2.5                                                                                                                                                                                                                                                                                                                                                  P&y                0   ӯk        t)                    ui	   
      !            |      !                   "                   @$            *     *            *      *            "     #                    $                   $                   $        )           $        ,            $        -           ($        7           0$        >           8$        J           H$        \           P$        ^           X$        a           `$        b           h$        h           p$        v           x$        y           $                   $                   $                   $                   $                   $                   $                   $                   $                   $                   $                   $                   $                   $                   $                   $                    %                   %                   (*                   (%                   0%                   8%                   @%                   H%                   P%                   X%                   `%                   h%                   p%                   x%                   %                   %                    %        !           %        "           %        #           %        $           %        %           %        &           %        '           %        (           %        +           %        .           %        /           %        0           %        1           %        2            &        3           &        4           &        5           &        6            &        8           (&        9           0&        :           8&        ;           @&        =           H&        ?           P&        @           X&        C           `&        D           h&        F           p&        G           x&        H           &        I           &        L           &        M           &        N           &        P           &        Q           &        S           &        T           &        U           &        V           &        W           &        X           &        Y           &        Z           &        [           &        ]            '        _           '        `           '        e           '        g            '        j           ('        k           0'        m           8'        o           @'        q           H'        r           P'        s           X'        t           `'        u           h'        w           p'        x           x'        z           '        {           '        |           '        }           '        ~           '                   '                   '                   '                   '                   '                   '                   '                   '                   '                   '                   '                    (                   (                   (                   (                    (                   ((                   0(                   8(                   @(                   H(                   P(                   X(                   `(                   h(                   p(                   x(                   (                   (                   (                   (                   (                   (                   (                   (                   (                   (                   (                   (                   (                   (                   (                   (                    )                   )                   )                   )                    )                   ()                   0)                   8)                   @)                   H)                   P)                   X)                   `)                   h)                   p)                   x)                   )                   )                   )                   )                   )                   )                   )                   )                   )                   )                   )                   )                   )                   )                   )                   )                    *                   *                   *                   H	  j
    H5 % % h    % h   % h   % h   % h   % h   % h   %z h   p%r h   `%j h	   P%b h
   @%Z h   0%R h    %J h   %B h    %: h   %2 h   %* h   %" h   % h   % h   %
 h   % h   % h   p% h   `% h   P% h   @% h   0% h    % h   % h    % h   % h    % h!   % h"   % h#   % h$   % h%   % h&   %z h'   p%r h(   `%j h)   P%b h*   @%Z h+   0%R h,    %J h-   %B h.    %: h/   %2 h0   %* h1   %" h2   % h3   % h4   %
 h5   % h6   % h7   p% h8   `% h9   P% h:   @% h;   0% h<    % h=   % h>    % h?   % h@   % hA   % hB   % hC   % hD   % hE   % hF   %z hG   p%r hH   `%j hI   P%b hJ   @%Z hK   0%R hL    %J hM   %B hN    %: hO   %2 hP   %* hQ   %" hR   % hS   % hT   %
 hU   % hV   % hW   p% hX   `% hY   P% hZ   @% h[   0% h\    % h]   % h^    % h_   % h`   % ha   % hb   % hc   % hd   % he   % hf   %z hg   p%r hh   `%j hi   P%b hj   @%Z hk   0%R hl    %J hm   %B hn    %: ho   %2 hp   %* hq   %" hr   % hs   % ht   %
 hu   % hv   % hw   p% hx   `% hy   P% hz   @% h{   0% h|    % h}   % h~    % h   % h   % h   % h   % h   % h   % h   % h   %z h   p%r h   `%j h   P%b h   @%Z h   0%R h    %J h   %B h    %: h   %2 h   %* h   %" h   % h   % h   %
 h   % h   % h   p% h   `% h   P% h   @% h   0% h    % h   HH HtHÐ=  UHu;H=#  tH= mHH Hw HHu ffffUH=W  HtH+ HtH=? IAÐH HHÐH11HPPH HHÐATISHH=  HWH5  HHULHjH=w  .H5k  HH,H=9  HHH5&  [A\HffffSHH=  HH5  H[fffffffffSHH=  HH5ޤ  H[fffffffffH\$Ld$HLl$Hl$H8HE1IH@HtJHPH9   HHA   H5ޤ  HH,$AHH;- uSEt)HLLH\$Hl$ Ld$(Ll$0H8fH1HLHHHH=  H}=Ht$HEHuHJHH$HH; tH{Ht$HfH\$Ld$E1Hl$H(HHHHHt[HQH9riHHHA   H5  HH,$AHH;-q u:Eu
H@Hfff@H\$Hl$Ld$ H(H=  H}/Ht$HEHuH;HH$HH; tH{Ht$HfffAWIAVAUATUSH  H$  T$HHLH$  HH;   HD$0HHD$HXHkH L5 H|$Hǃ       ǃ       ƃ    L`H@H@Hǃ       Hǃ       Hǃ       Hǃ       IT$HD$(ID$HD$@    HD$H    HT$ HT$(HD$P    HD$X    HD$`    HD$h    HT0Hi HPH@H$   IFHT$0HD$8L-' H-p HHt$D$x   IEHH$   HHD$8t$H|$[Ht$`H$  H   HD$PH9   H|$XH$  $H$  H$  H$  HH?HWHL|H$  HH9    H=Р  'H5Ġ  HL%H|$H  []A\A]A^A_H|$XH$  $H$  HH$  H$  HHHZHt$H$  HHPx<H{JH$  H5H{NH$  Hr9IH2H|$LHIHIffffH|$IIEHD$8HPHT$IFHHBH@HT$ Ld$0HHHT$(HT0H HHnLFH$  IHH; RH{<H$  H'IcH$  IHH9 H{H$  H5fffffffAWIAVAUATUHSH(H\$HHLDH\$HH;,   H=  H5ߝ  LHH HHH$HE Hp1HE HH8   E1   fffff	j  
fff    Jl  H$D$HHHH;Xw@~HHH$HP@    HXD$    HE IHL9(  pySHU J    tOY"   adH=
  H5  HHfffH8ffffH=  TH5  HHR_/   \H=  H5  HH)fffffH=9  H5-  HHH=^  H5R  HHHHU H=  H5  HHH=כ  zH5˛  HHxH=  WH5  HHUbHLeH=Λ  )H5  HL'H$HH9 u7H([]A\A]A^A_H{i3Ht$H!H{AHt$HHl$HHH;- uHAHH}Ht$HH,$HHH9- tH}Ht$HhHfffffffffHl$H\$HLd$H(HH@HPH9   HHHH5  HH$AHH;; uaEuHE HPHrH9roH)1HnH=C  H57  HHH\$Hl$Ld$ H(H=)  H{Ht$Hq{H=  H$HHH; uHHH{~Ht$HϐfffffffHl$H\$HLd$H(HH@HPH9   HHHdH5A  HuH$AHH; uaEuHE HPHrH9roH)1H.H=  RH5  HHPH\$Hl$Ld$ H(H=  pH{Ht$H1{H=Θ  @H$HHH;V uHH|H{>Ht$HϐfffffffAWAVIAUATUSH  H$  HT$H'HLH$  HH;Ѿ   HD$0HHD$HXHH L=4 H|$Hǃ       ǃ       ƃ    L`H@H@Hǃ       Hǃ       Hǃ       Hǃ       IT$HD$(ID$HD$@    HD$H    HT$ HT$(HD$P    HD$X    HD$`    HD$h    HT0H HPH@H$   IGHT$0HD$8EL-v H- HHt$D$x   IEHH$   HHD$8Ht$H|$Ht$`H$  H  HD$PH9   H|$XH$  $H$  H$  H$  HHH$  HH9 !  HLH$  HH9    H=  eH5  HLcH|$)H  []A\A]A^A_fffffH|$XH$  $H$  H0H$  H$  HHHSHt$H$  HHP5H{<CH$  H.H{6H$  H!H{H$  H~IH>H|$LIH$   IIEHD$8HH9-~ 	  HT$IGHHBH@HT$ Ld$0HHHT$(HT0H6 HHLbH$  IHH9 XH{BH$  H-H$  IHH;ͺ H{H$  HYHH$  IIHH}iH$  HIfffAWIAVAUATUSH  H$  HT$HGHLH$  HH;   HD$0HHD$HXHH L5T H|$Hǃ       ǃ       ƃ    L`H@H@Hǃ       Hǃ       Hǃ       Hǃ       IT$HD$(ID$HD$@    HD$H    HT$ HT$(HD$P    HD$X    HD$`    HD$h    HT0Hع HPH@H$   IFHT$0HD$8eL- H-߸ HHt$D$x   IEHH$   HHD$89Ht$H|$Ht$`H$  H6  HD$PH9   H|$XH$  $H$  H$  H$  HH$  HH96 N  HLH$  HH9    H=1  H5%  HLH|$LH  []A\A]A^A_H|$XH$  $HbH$  H$  H$  HH$  HH9 QH{{;H$  H&Ht$H$  HHPH{2H$  HH{H$  HH{H$  HtHH$  HH9 uH|$HHH{H$  HHfffffH|$HIEHD$8HPHT$IFHHBH@HT$ Ld$0HHHT$(HT0H HHIH!-HH$  HHH;ɵ .H{H$  HUH$  HHH9 H{vH$  HH$  HHH9; H{/kH$  HVH$  HHH9 OH{9H$  H$fffffffffffffffffffffffffffAWAVIAUATUSH  H$  T$HHL]H$  HH;B   HD$0HHD$HXH+Hl L= H|$Hǃ       ǃ       ƃ    L`H@H@Hǃ       Hǃ       Hǃ       Hǃ       IT$HD$(ID$HD$@    HD$H    HT$ HT$(HD$P    HD$X    HD$`    HD$h    HT0H) HPH@H$   IGHT$0HD$8L- H-0 HHt$D$x   IEHH$   HHD$8t$H|$lHt$`H$  H   HD$PH9   H|$XH$  $cH$  H$  H$  HH HHL=H$  HH9r    H=  H5  HLH|$H  []A\A]A^A_H|$XH$  $HH$  H$  H$  HH_HwZHt$H$  HHP9<H{JH$  H^5H{OH$  H3:HH$  HH9` uH|$HH|H{>H$  HHHHffffHIEL$   HD$8IL9-    HT$IGHHBH@PHT$ Ld$0HHHT$(HT0H HHHH$  HHH;} #H{qH$  H	I}FUH$  L@H8H$  HHH9 H{H$  HtffffffffffAWAVIAUATUSH  H$  HT$HHLH$  HH;q   HD$0HHD$HXHZH L=ԯ H|$Hǃ       ǃ       ƃ    L`H@H@Hǃ       Hǃ       Hǃ       Hǃ       IT$HD$(ID$HD$@    HD$H    HT$ HT$(HD$P    HD$X    HD$`    HD$h    HT0HX HPH@H$   IGHT$0HD$8L- H-_ HHt$D$x   IEHH$   HHD$8Ht$H|$:Ht$`H$  H   HD$PH9   H|$XH$  $H$  H$  H$  HH.HFHLkH$  HH9    H=  H5  HLH|$H  []A\A]A^A_H|$XH$  $HH$  H$  H$  HHHZHt$H$  HHPg<H{fHH$  H3H{LH$  H_7HH$  HH9 uH|$HHH{jH$  HHHHfHIEL$   HD$8IL9-    HT$IGHHBH@HT$ Ld$0HHHT$(HT0Hϫ HH#HH$  HHH; 'H{H$  H9I}vUH$  L@H8H$  HHH93 H{'H$  HxfffLd$H\$IHl$Ll$H(H9tpHtxH1L)HHHHLht>HLL,E    H] AD     LH\$Hl$Ld$Ll$ H(A$EffL-Q IH=Ă  wHt2HtHHH  %  H9t2HHH9tHtHfffH%   H=   fuHHÐffffH HBBGfffffffffffffffffffffffffff1ÐfffffffffWT   t
1ÐffffH٩  ÐfffHA H8Ht\fffffffHɩ H8Ht<fffffffH H8HtfffffffHɩ H8HtfffffffH= fffSHH@HD$<HT$ LL$,LD$0HD$HD$4HHD$HD$8H$H H0HȨ H8uD$0D$,CH@[ÐffffffSt[Á  uH= UHn H=W1HH= H=  H1H٨ H=H1H     H@    H@    qHB H=H1H     H@    H@    BH; H=dH1H     H@    H@    Hd HH=1H     H@    H@    [f     US0   HHHxH= Hl$] HwH;wtHtH.HFHGHD$H[]HT$HHHffffffffffH\$Ld$ILl$HIrHXLHHKHAE H$AELd$Ll$HffffffS   HH=ئ H     H@    H@    HD$HwH;wtHtHHFHGHD$H[HT$ffffffAVAUATUSH0L5 Hl$Ld$,Ll$ H5:  HILI>LnHHCtxD$,~
H|$ cH{HT$Ht$C    C    ~4Ht$1fffffHQX9S}SQ\QX9S}SH9uH0[]A\A]A^I>H5À  ILLHHCcI>H5~  ILLHHC>I>H5y~  ILLHHCI>H5|  ILLfHHCI>H5L~  ILLAHHCI>H5D~  ILLHCfHH- H0H@H)IIu1H1fffffHH98t	L9rI9wH=}  fffffffS(   H?H=@ HHƣ HT$B     B$    HHwH;wHBtHtHHFHGHD$H[HT$ATL%_ 1USI$IT$H)HH,H9} tH9r[]A\H}?H<    I<$IT$HwH9u H}Il$Ht![H]A\H)}֐fffffffH\$Ld$HHl$HHIHHHH|A$H H<$AD$HtH\$0Hl$8Ld$@HHH<$HHtHHH͢ L H@L)HHu1HLN11ffH9sIH98t	L9vH9fffwH=|  fHHm L H@L)HHu1HLN11ffH9sIHH9xt	L9vH9fwH={  fH\$Ld$ALl$Lt$8   H8IIHH¹   1HHT$HH=5 D"HZLjLrB0    HwH;wB4    t.HtHHFHGHD$H\$Ld$ Ll$(Lt$0H8HT$fffHɡ HH@H)HHu11HHH9xtH9r1ffffUI1SHH-~ HUH} HH)HHHL9CtH9rH[]H<HwH9uHmHH[]oH)fffH HH@H)HHu11HH98tH9r1ffffffH'HtHpH7 1H8HHfffH\$Hl$Ld$Ll$HHAEHt?HpH LD$$   A   11f\$fl$H8fDd$fDl$H\$(Hl$0Ld$8Ll$@HHfffffffffHl$Ld$ALl$Lt$AL|$H\$H   AE:HHtP   1H3$   HEIDd$(Dl$,   Dt$0D|$41HD$ H HuH8H$   H$   L$   L$   L$   L$   H   fffffffHl$Ld$ELl$Lt$AL|$H\$H8AAmHHt4H~ HP HpH;^HUHu(ED$$H;EDQH\$Hl$Ld$Ll$ Lt$(L|$0H8ffffffffffAWAVAUATUSH8T$$L$ IMHHuH8[]A\A]A^A_LaL|$4E1LCHD$5HD$HD$6HD$HD$7HD$fffL1fffL9fr~LL$LD$HL$DLL<$>|$4uD$7L$5T$6HA IvH;		HcL$$DD$ IVIv(H;DAtfffLAuD9JH8[]A\A]A^A_ÐfffffffHl$Ld$ELl$Lt$AL|$H\$HHAA}HHtDH HP HpH;nHUHu(ED$ Z  D$    ED$$H;DH\$Hl$ Ld$(Ll$0Lt$8L|$@HHffffffffffHl$Ld$ELl$Lt$AL|$H\$HHAAHHtDHޛ HP HpH;HUHu(ED$ Z  D$    ED$$H;DQH\$Hl$ Ld$(Ll$0Lt$8L|$@HHffffffffffHl$Ld$ELl$Lt$AL|$H\$H8AAHHt4H. HP HpH;HUHu(ED$$H;EDH\$Hl$Ld$Ll$ Lt$(L|$0H8ffffffffffH\$Hl$Ld$HAHHt	D	HcHB H$Hl$Ld$HfffHWHtHpHg H8HHffffH'HtHpH7 H8HHffffHl$H\$HHHt5H HpH;M4U0HuH;Hl$H\$HRfH\$Hl$HÐHl$H\$Ld$HHHt$HHt7L% H\$Ht$      II<$HuI<$HdH\$0Hl$8Ld$@HHHl$H\$Ld$HHHtHL`HXLHH LH;Hu(H;Hl$H$Ld$HH$Hl$Ld$HÐfffHl$Ld$ELl$Lt$AL|$H\$H   AAzHHt]H Hp(H;HuH;HHuDD$DH;DHuH;EHE(D}0EDu4DDH$   H$   L$   L$   L$   L$   H   ÐfffffffffATL%7 1USI$IT$H)HH,H9} tH9r[]A\H HuH8EH<    I<$IT$HwH9uIl$H[]A\IH)ffffffffffHH H0H@H)IIu1H1fffffHH98t	L9rI9wH=p  fffffffH\$Hl$HHhHHt$HH{HH\$Hl$HH\$Hl$1HÐfffffffH1HtPHfffH1HtPHfffHl$Ld$ILl$Lt$AL|$H\$HHAL$DD$DH蜾HIHt]H HU HuH8L*DHD|HMIUHu(\$\$L$$DD$DH H8H\$Hl$ Ld$(Ll$0Lt$8L|$@HHÐffffffAWAAVAUATUSHhLt$0H|$t$L	HD$LHpLоuH|$0HtHh[]A\A]A^A_HT$D$LB Dz$19D$~%D$T$Lf)LA9D$       AHD$(    T$(LT$$$;D$$   Dd$ 1HAL9   D9l$E9tHD$\HL$_LL$]LD$^t$$H$L|$\D$_T$^L$]uH    		HD$H;HcHpHD$EDH;HPHp˼GHD$(ALDLB8踿\$ )T$ H|$0HHtPHhffffffAWAVAUATUSHHhLt$0Ht$LHLLʼD$     u"H|$0HtD$ Hh[]A\A]A^A_LL
؃Hc\$ HDHHD$LHQHLHHD$HHȾHD$$   HD$(    HD|$(LD9   HcD$$1L$    ^HD$\HL$_LL$]LD$^DH$L4HD$T$\HL$^H0D$_	D$]		HcI4IDl$$LA9vHD$(Dl$$TL设H|$0HHtHffffffffffUHAWEAVEAUATASH  H\ H 3H8IHr HHH@EEH:HcHH   HD$(HD$    HB@D$   HD$B8$    D$HY H0HHH HŐ    H8@Hِ H11H8vAdHAAD  A,    E  A   0  H} y  H}H詼H   HuHH)H\$?HHŽHUH5k  HHxۺH  HUE1E1HNHL$    L]IIcHuLI<E脼H}HxH5}k  1vHtLHE    HHA~EtC.LHcH軼IIcAL$    {E~iHi 1H5i  H8HHN 1H5i  H8;HH3 Dt$L<$E1A    HHH8迼LHHI HH@H)H  HH5i  11HP1LHD$H$HHю H(i  HD$    Lh  Hh  H5h  HT$LHH H81THI艻MHE    tHUH5h  L11L蝼H6 HUHH8HO! |HHLዽpHH HHH8Hٍ DHH8HC(S0C4He[A\A]A^A_HH 0   Dp DpDx$HDxHi HH8zHrHK H5g     H8ǼH5g  Hú   H! H8詼HEHED$   E1A       H$H HHH8莺U4HHH 0   Dp DpDx$DxH HH8H蹹A,  :EH| H5Bf     H8H5[f  Hú   ,HM H5f     H8ɻH5Gf  Hú   H=e  詼HHfffffffAVIAUATUSHp  HT$8H-݋ L$         IH}    )H} H$  Hc   H   HHt1迹H$  H$  HD$ 
   D$   $    HD$(H$  A   A   HǄ$      HǄ$      HD$$  D$HX H} H0H} 11HID$觼ID$MH} H    HIt$H@   @   HH$   ԷH} H5=e  12H$P  HǄ$P      HǄ$X     It$D$   E1H$H} A    HH	It$H} L" 覺H H5d  Hߋ1H} 1H讹H} HHI  H$0  H} Ht$8      IcIt$H} HH$`  ʶH$m  LHǳI|$HʺH$`  HH;O    H\$@   1HmH} H5(d  1Ll$`D$@!   D$p    HD$hIHD$x    HǄ$       LID$H} 11HǄ$       HǄ$       H$   ԵHp  []A\A]A^fffH}    H?H{茹3H$o  H$H$`  HHH;Q uHHH{:H$n  HְfffSHH HHH; uH[H{Ht$H菰HfffH\$Hl$Ld$H((HHtYHpH H8轵H- HC    HHC    C     H{C$    HEH$ĸH$HH9uH\$Hl$Ld$ H(H{5Ht$HԯH$IHH9uL:IH{Ht$H薯fffHl$Ld$IH\$Ll$H(  HT$(HH   L- H$   Ht$      II} BHuI} HH$   誳H$   LH觰H}H諷H$   HH;0    M ~aU$~ZH\$   1H@D$   HEID$8    D$<       I} 1HD$0E D$@E$D$DHuڲH$  H$  L$  L$   H(  H{蔶ZH$   H,EH$   HHH;Y uH臶HfH{fff;H$   H׭ƐfffUHH]LeHLmLu(   L}H   ILuL(膯H{MM
   HLHŲAADM}
  L5 IFH E  }=E1H螵H HI9  DH]LeLmLuL}ÐH(H  0  H  H    H  H    H  H    H  H  i  H  (  H  B  H  \  H  v  H    H    H  f  H  ff  Ha  ff  H  ff  H  ff  Hk  ff  H  ff  H	  H  F  H   9  H  H    H    H  n  H  H    HQ  H    HS  H    HR  H    HT  H  Q	  HP  H  	  HW  H  E	  H HH8   };E2AD$IH11HH   HH)H\$HfHA9uIcLpHU    H5P_  L謫LeHUH5_  L蕫LL-# LL@LeIM9  LpIM9  LeHUHLHH]HUH5^  H1LHLH]HI9A  H]HI9X  A   LHIcH H{DMMHLHqAADMH=\  ҬH HH5y\  ̱PL0HUH5]  LmH@HUH5]  HSL- LHLH@HI9  H0HI9F  LPH LH`HUH5r]  HLHL蘫H`HI9  HPHI90  A   H=b[  ɫH HH5L[  ðGH=G[  被H HH51[  蜰 H=Z  {H HH5Z  uH=[  TH HH5Z  NH{諯9HuHG(H=Z  H HH5Z   H=Z  ߪH HH5Z  ٯ]H=Z  踪H HH5Z  貯6H=~Z  葪H HH5hZ  苯H=cZ  jH HH5MZ  dH=HZ  CH HH52Z  =H=Z  H HH5Z  H{sHuHH{KHuHfI|$!HuL轥I|$HuL蕥H=iY  TH HH5SY  NH=RY  -H HH5<Y  'H=;Y  H HH5%Y   H=[  ߨH HH5[  ٭]H=Y  踨H HH5X  貭6H=X  葨H HH5X  苭H=o[  jH HH5Y[  dH=X  CH HH5X  =H{蚬HuH6H{rHuHH{KiHuHXfH{"HuHA   踣yffH=X  tH HH5X  nH=zZ  MH HH5dZ  GH=X  &H HH5X   H=W  H HH5W  }H=W  ئH HH5W  ҫVH=Z  豦H HH5Y  諫/L`HIM9uuLPIM9uAL IM9uHHI|$ĪHuLdI|$裪HuLBfI|$tHuLcHkHL0IM9TI|$8=HuLԡ,L@HIM9tI|$HuL虡|fHffffH=?V  BH HH5)V  <<H=;V  H HH5%V  H= V  H HH5U  mHLVLeHIM9u;LpIM9tI|$HuL躠HffI|$fffHuL苠HLeIM9tI|$趨]HuLRfJBffff7ffffffff'LeHIM9tI|$\HuLq:fbfffffffAWAVAUATUSH  Hxw H8H=R  虡   H1L=.w HIL%  I?H5R  1衦Hw I?H5Q  H1膦Hv H=Q  H0I?L-v    H   HcAu HHTHv HJHv I?11H1rHv HH$  H;H$h  H5Q  11H$h  L%mv f: I$    tJ11H9~7HBH<H%  H9uI4$H@H$h  I$9HIIcE 1H   HHDPHu HAHu Hu Hu 8   Hu H5gu    Lcu 
H    HF    HF    HF    HF     Hcу?HF(    HHHF0    HF8    HF@    1HFH    HFP    HFX    HF`    HFh    HFp    HFx    H	1Ht I@'  I     8I?V~  Lt$ I?LD$ q    "    ffJ	      	fff  
  !}  fffH|$@萡HzT$\t$XHgHPt 8 jL%`t ID$I+$Ht1AI$ID$H)HH9!  HI?HHslH蔥AEHH9u1Il$D9t'I<$IT$HwH9tH)˞Il$D9uHs I?H2nI?趜H  []A\A]A^A_fffHis 1H|$@趡HIZ  L%r H$p  L#L軣H$  H5R  HH$  H$   H5P  HHHL藞H$  HH;lr 	  H$p  HH9Sr F  H$  A] H$  H5NP  H肜HLH$  HH9
r   H$  \$HH$  H5P  H9HL謚H$  HH9q `  H$  \$LH$  H5O  HHLcH$  HH9xq   H$  \$PH$  H5O  H觛HLH$  HH9/q x  H$  \$TH$  H5^O  H^HLљH$  HH9p   L H9q H$  LH&H$  HH]H9p   D$TIMIUIu(DL$LDD$HD$D$PDL$DD$$I?H|$@"HIL%7p H$  L菝L'H$  H5@P  HpH$   H$  H5	N  HQHHLH$   HH;o   H$  HH9o   H$  A] H$  H5M  HHLaH$  HH9vo @  LLݞ  D$pH$   H$	  H5M  H茙HLH$   HH9o F  \$pH$0  H$
  H5wM  H=HL谜H$0  HH9n   H$@  H$  H5@M  H1HLkH$@  HH9n   H$P  H$  H5N  H賘1HL&H$P  HH9;n   LuHn H$`  LH{H$`  HH]H9m H{jH$]  H臖UfLXFH|$@yHI0L%m H$p  LL~H$  H5L  HǗH$  H$  H5`K  H託HHLZH$  HH;/m   H$p  HH9m   H$  H$  H5K  HIH$  H$  H5K  H*HHLܘH$  HH9l #  H$  HH9l   H$  A] H$  H5J  HǖHL:H$  HH9Ol a  H$  \$`H$  H5VJ  H~HLH$  HH9l   H$  \$dH$  H5J  H5HL訔H$  HH9k o  H$  L/H$  H5J  HHLYH$  HH9nk   L訛Hk H$  LH讔H$  HH]H9.k H{"H$o  H躓fffH|$@趙HImL%j H$   L#L軛H$  H5\I  HH$  H$  H5H  HHHL藖H$  HH;lj   H$   HH9Sj   H$   H$  H5J  H膔H$0  H$  H5H  HgHHLH$0  HH9i   H$   HH9i   H$@  A] H$  H5G  HHLwH$@  HH9i N  H$P  \$`H$  H5G  H軓HL.H$P  HH9Ci   H$`  \$dH$  H5RG  HrHLH$`  HH9h \  H$p  LlH$  H5G  H#HL薑H$p  HH9h -  LHh H$  LHH$  HH]H9kh H{_H$  HfH|$@HI  L%h H$  LcLH$  H5F  HDH$  H$  H5E  H%HHLדH$  HH;g   H$  HH9g   H$  H$  H5H  HƑH$  H$   H5+F  H觑HHLYH$  HH9.g    H$  HH9g   H$  A] H$!  H5E  HDHL跏H$  HH9f ^  H$  \$`H$"  H5D  HHLnH$  HH9f   H$  \$dH$#  H5D  H貐HL%H$  HH9:f <  H$   L謎H$$  H5E  HcHL֎H$   HH9e M  L%H>f H$  LH+H$  HH]H9e 0H{蟖H$  H7fHt$@I?1ɺ   ̍H|$@HIL%2e H$  L芒L"H$/  H5CD  HkH$  H$0  H5C  HLHHLH$  HH;d %  H$  HH9d   H$   H$1  H5C  HH$  H$2  H5RC  HΎHHL耐H$  HH9Ud   H$   HH9<d   H$   A] H$3  H57B  HkHLތH$   HH9c 5  L-HFd H$0  LH3H$0  HH]H9c 8H{觔"H$  H?H|$@@HIL%Uc H$@  L譐LEH$4  H5fB  H莍H$P  H$5  H5'A  HoHHL!H$P  HH;b 8  H$@  HH9b   H$`  H$6  H5C  HH$p  H$7  H5uA  HHHL裎H$p  HH9xb Z  H$`  HH9_b   H$  A] H$8  H5Z@  H莌HLH$  HH9b   LPHib H$  LHVH$  HH]H9a [H{ʒEH$  Hb0LfffH|$@QHHH^b H H9D$HHa HH9T$XL%<a L$  L蔎L,H$9  H5M@  LuH$  H$:  H5?  HVLHLH$  HH;` t$  H$  HH9` $  L$  H$;  H5A  LH$  H$<  H5\?  H؊LHL芌H$  HH9_` %  H$  HH9F` ;$  ] H$  H$=  H5B>  HvHLH$  HH9_ !(  L8HQ` H$  LH>H$  HH]H9_ CH{貐-H$  HJfffH|$@HHI?HpH$   越$   $   HЍH|$@ьHHD$t  L% _ L$  LXLH$*  H5=  L9H$  H$+  H5<  HLHL̊H$  HH;^ &  H$  HH9^ %  L$  H$,  H5S?  L軈H$  H$-  H5 =  H蜈LHLNH$  HH9#^ g%  H$  HH9
^ %  ] H$  H$.  H5<  H:HL譆H$  HH9]    LH^ H$  LHH$  HH]H9] H{vH$  HL%:] L$   L蒊L*H$%  H5/<  LsH$0  H$&  H5;  HTLHLH$0  HH;\ 4  H$   HH9\ F  L$@  H$'  H5e=  LH$P  H$(  H5Z;  HֆLHL興H$P  HH9]\   H$@  HH9D\ ~  ] H$`  H$)  H5@:  HtHLH$`  HH9[ U  L6HO\ H$p  LH<H$p  HH]H9[ AH{谌+H$  HHffH{肌H$M  HH{WH$?  HH{,H$C  HăH{H$@  H虃H{֋H$K  HnH{請rH$I  HC]H{耋H$G  HH{UH$E  HuH{*H$S  HH{6H$P  H藂!fH{ҊH$O  HjfffH{袊H$  H:fffH{rH$m  H
fffH{B{H$k  HځffffH{H$i  H誁fffH{H$g  HztfffH{貉H$d  HJfffH{肉H$c  HfffH{R2H$`  HfffH{"H$_  H躀fffH{H$  H芀fffH{5H$  HZ fffH{蒈H$  H*fffH{bH$  HwfffH{2H$  HfffH{H$  HfffH{҇5H$  Hj fffH{袇H$  H:fffH{rH$  H
fffH{BH$q  H~fffH{H$[  H~fffH{XH$Y  Hz~CfffH{貆H$  HJ~fffH{肆<H$  H~'fffH{RH$  H}fffH{"^H$  H}IfffH{#H$W  H}fffH{H$U  HZ}fffH{蒅H$}  H*}yfffH{bH${  H| fffH{2H$y  H|fffH{#H$v  H|fffH{҄H$u  Hj|fffH{袄EH$r  H:|0fffH{rRH$  H
|=fffH{BH$  H{fffH{H$  H{{fffH{H$  Hz{fffH{貃H$  HJ{fffH=,  TH謃HH衃HHH$   HH9-NR tH}FH$w  HzHHHH$p  HH;-R tH} H$A  HznH$  HHH;-Q tH}H$>  H]zH*ffppHQ H=,        HF}HQ H=,        H!}H$  HHH9-)Q H}H$B  HyHH$  HHH9-P cH}΁MH$D  Hfy8H0H$  HHH9-P H}H$F  HyH$  HHH9-DP H}8H$H  HxHHH$  HHH9-O vH}`H$J  HyxKHH9-O H7H}袀!H$L  H:xHHH$  HH;-ZO H}NH$Q  HwH$   HHH;-O tH}H$N  HwH$  HHH9-N `H}JH$R  Hcw5H-Hff"ffffH$   HHH9-mN H}aH$T  HvHH$0  HHH9-N H}H$V  Hv|HtH$@  HHH9-M XH}~BH$X  H[v-H$P  HHH9-M H}|~H$Z  HvHHH9-DM HH}5~H$\  HuffH$  HHH;-L uLH$p  HH;-L aH}}KH$a  Hdu6H.H}}H$^  H5uHHH$  HH9-]L H}Q}H$e  HtH$  HHH9-L tH}}H$b  HtDffpHffffffHZH$  HHH9-K >H}|(H$f  HAtHH$  HHH9-fK H}Z|H$h  HsHH$  HHH9-K H}|H$j  HsuHmH$  HHH9-J QH}{;H$l  HTs&HH9-J HH}}{H$n  HsHH$   HH;-BJ H}6{H$s  HrH$  HHH;-I tH}zH$p  HrTffffffkffffffff7H$0  HHH9-I 6H}z H$t  H)rHH$  HH;-VI H}JzH$  HqH$  HHH;-I tH}zH$  HqHpffffffgHH$  HH9-H FH}y0H$  HIqHHH$  HH;-nH H}byH$  HpH$  HHH;-'H tH}yH$  HpHoffffffWffffffff|HffffffRHJH$  HHH9-G .H}xH$  H1pH$p  HHH9-^G    H$`  HH9-EG H}9xH$  HoH$@  HHH9-F H}wqH$x  Ho\H}w_H$  H_oJH)fHH+
HH$@  HH;-hF H}\wH$  HnH$`  HHH9-!F H}wH$  HnH$P  HHH;-E YH}vCH$  Hfn.H0H{vH$  H3nHH9-fE HH}WvH$  HmfffHffffffffffffffffffJffffffffffffffff(ffffff8ffffffff Hffffff2H$P  HHH9-D H}u H$z  HmH$`  HHH9-FD H}:uH$|  HlHH$p  HHH9-C H}tjH$~  HlUHH9-C HAH}t+H$  HDlfffffffffffffffffffffffffffffffffffffffffffffffffffffff-ffffffffffffffffHffffffrHjHH$   HH9-B NH}s8H$  HQk#fffffffffffff^ffffffff'ffffffffpH$  HHH9-=B H}1sH$  HjH$  HHH9-A H}rH$  HjffffffH$   HHH9-A &H}rH$  H)jHH9-aA HH}RrH$  Hi5ffffffffHffffffH$  HHH9-@ vH}q`H$  HyiKH{qH$  HNiHH9-@ HH}wqH$  Hi:fffHffffffHH$   HH;-@ H}qH$  HhvH$0  HHH;-? tH}pH$  HehcsH{pH$  H3hH{ppH$  HhHHH$@  HH9--? H}!pH$  HgH$P  HHH9-> tH}oH$  HzgH{olH$  HRgWMH{o#H$  H"gffffffffffffffffffffffPHffffffH$  HHH9-> H}oH$  HfkHcH$  HHH9-= GH}n1H$  HJfHH$   HHH9-o= H}cnH$  HeHH9-3= HH}$nH$  He~ffffffffffgffffffffffffffffH$  HHH;-<   H$  HH;-< H}mH$  H eH{]mvH$  HdaH{2mdH$  HdOH^H{ffflH$  HdH]HffRHH$  HH9-; 6H}l H$  H9dH$  HHH9-f; tH}^lH$  HcH{:lH$  HcBffffff@ffffffffPH}fk4H$  HcffffffHH9-: H.H}kH$  H1cwH$  HHH9-Y: H}MkmH$  HbXH$  HHH;-: y  H$  HH;-9 }H}jgH$  HbRHH9-9 H>H}j(H$  HAbHHH$  HH9-f9 H}ZjH$  HaH$  HHH9-9 tH}jH$  HaHffffffgH{fiIH$  Hsa4H{iH$  HHanH{iH$  HaH{ZiFH$  H`1]Hfff%H$  HHH9-8 H}h{H$  H`fH{hH$  Hi`H3HfffffH}hqH$  H `\.ffff봐Hl$HLd$Lt$H\$ILl$L|$H8HH;}It[HtHGHHWHGILL)HEHH)nbI$H\$Hl$Ld$Ll$ Lt$(L|$0H8fffffHH+E HHH9   H   tH H9   HH9   L<    LL`Hu IHH)HaLHtIHH]LrLLL)HaH} Ht+hILm HEKD= HEHH=b   f`Hl$HLd$Lt$H\$ILl$L|$H8HH;}It[HtHGHHWHGILL)HEHH)`I$H\$Hl$Ld$Ll$ Lt$(L|$0H8fffffHH+E HHH9   H   tH H9   HH9   L<    LLU_Hu IHH)H``LHtIHH]LrLLL)H9`H} HtfILm HEKD= HEHH=  d[_Hl$HLd$Lt$H\$ILl$L|$H8HH;}It[HtHGHHWHGILL)HEHH)_I$H\$Hl$Ld$Ll$ Lt$(L|$0H8fffffHH+E HHH9   H   tH H9   HH9   L<    LL]Hu IHH)H^LHtIHH]LrLLL)H^H} HtKeILm HEKD= HEHH=   c]Hl$HLd$Lt$H\$ILl$L|$H8HH;}It[HtHGHHWHGILL)HEHH)^I$H\$Hl$Ld$Ll$ Lt$(L|$0H8fffffHH+E HHH9   H   tH H9   HH9   L<    LLu\Hu IHH)H]LHtIHH]LrLLL)HY]H} HtcILm HEKD= HEHH=  a{\G$ G    G    G     ffffG$ÐfffffffGfffffffffGfffffffffHtHff  uH=8 ,ZHE1 H=   1HYf     fffH=8 cfffH    HG    HG    G$ G    G    G     ÐffffffffffH    HG    HG    G$ G    G    G     Ðffffffffff$ USHHl$ttDWA9vkG9vd)HDXG HIEBADHGA DHGtE []D_HB   E fffffffffU1HAWI1AVLAUM   ATSHHX  H8ZHHHPHH)H    Ld$ILZLGYH/ Aƅ    I^Iǅ       Aƅ    Iǅ       Iǅ       HHPH@Iǅ       Iǅ       HHHHHHBHHǅ    HHm/ HBHHB@HZHL_   LH?YH&  HL1Hx]   H/ I~HBHHB@IE H. HHXI~xZH. I~HHIFnWHHLHHHHǅ    HHj. HBIE \HHe[A\A]A^A_Hu̺   LWf}BMtTI~WH HLHxw \ffffHLHxw \1Ҿ
   L\HuȺ   LV1Ҿ   L[Iw   LVIw   LqV1Ҿ   L[Iw    LQVAW/AG#IwE AG HPHHcIH)H9   HH)I)wu1LR[AO   AG PH1tfffu+AW~?HQ  E11fHI7L|UAE9gAG$MH)HMLTPI7IWLH)=UH\, HI~HBHHB@IE HK, HHUI~x
XH+ I~HHIFTHHLHHHHǅ    HH+ HBIE IZHH\HH+ I~HHLUI~xsWdH\ffffHdHE11HHI7L$T   HLpYAE9gH[fff+[Hl$Lt$HL|$H\$ILd$Ll$HHHIH$H   H_HGH)H9   HH+7HHt$HH9  HD$H9ILHGL(HL9LGLTHu HIH)HUL$IAMtHff
HIuIH]L<$LL)LHTH} Ht\[ILe HEK,HEH\$Hl$ Ld$(Ll$0Lt$8L|$@HHfffIE/I)L9rTL)AHHXH<$LLL)H}H}UTLeL9tLLHHHD.H9uuHHH)HH)TH$HHELH)L)H)HSLH$I92LfffffD.HvH9uH=	  SX1ÐfffffffffHtHff  uH=/ QH5( H=   1HPf     fffH=/ YUHSH% HH% HtffHHHuH[ÐHYH  basic_string::_S_construct NULL not valid   :           [       {       \   "       \   /       \   b       \   f       \   n       \   r       \   t       \   \       "   ,       ]   ,       }   ,       basic_string::substr basic_string::erase vector::_M_insert_aux -*-*-*-*-*--13-*-*-*-*-*-*-* -*-*-*-*-*--12-*-*-*-*-*-*-* -*-*-*-*-*--14-*-*-*-*-*-*-* -*-*-*-*-*--*-*-*-*-*-*-*-* vector::_M_range_check _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_MENU _NET_WM_WINDOW_TYPE_DIALOG _NET_WM_WINDOW_TYPE_DOCK _NET_WM_ICON CARDINAL fontSet preeditAttributes clientWindow inputStyle statusAttributes filterEvents _XEMBED_INFO _NET_SYSTEM_TRAY_S%i _NET_SYSTEM_TRAY_OPCODE LANG Could not open display.
 WM_PROTOCOLS WM_DELETE_WINDOW Couldn't open input method queryInputStyle    -*-*-medium-*-*--13-*-*-*-*-*-*-*       -*-*-medium-*-*--12-*-*-*-*-*-*-*       -*-*-medium-*-*--14-*-*-*-*-*-*-*       
       E   S   C   A   P   E       F   1       F   2       F   3       F   4       F   5       F   6       F   7       F   8       F   9       F   1   0       F   1   1       F   1   2       P   R   I   N   T       P   A   U   S   E       B   R   E   A   K       T   A   B       R   E   T   U   R   N       D   E   L   E   T   E       L   E   F   T       R   I   G   H   T       U   P       D   O   W   N       H   O   M   E       E   N   D       K   E   Y       t   y   p   e       v   a   l   u   e       C   H   A   R       n   a   m   e       i   d       x       y       w   i   d   t   h       h   e   i   g   h   t       s   h   i   f   t       c   t   r   l       a   l   t       M   O   U   S   E       M   O   V   E       a   c   t   i   o   n       b   u   t   t   o   n       N   O   T   I   F   Y       W   I   N   D   O   W       A   C   T   I   V   E       S   C   R   O   L   L   O   C   K       B   A   C   K   S   P   A   C   E       C   A   P   S   L   O   C   K           S   H   I   F   T   L   O   C   K       R   E   P   A   I   N   T       K   E   Y   B   O   A   R   D           c   o   m   m   a   n   d       B   U   T   T   O   N   _   D   O   W   N       B   U   T   T   O   N   _   U   P       A   C   T   I   V   A   T   E           C   O   N   T   E   X   T   M   E   N   U       I   N   A   C   T   I   V   E           O   N   C   L   O   S   E       vector::_M_fill_insert  ;  a   pQ8  QP  Qh  Q   R  PR  R  S8  TX   Y  \  0^  p_  Pd@   jx  n  s  Pt  t   t  t0  tH   u`   ux  0u  Pu  pu  u  u  u  0v(  @wH  Pw  w  0x  x  @zP  z  {  {   |  |	  |P	  }x	  }	  @~	  ~	  ~	  @
  8
  `
   
  
  `
     P0  H  `           p  Ї(  0H  P`  px  P  `    В@  px      p  `  @`     h  (	   H   `  0x  @  P          0   h  @  P@  P  `                  zPLR x}!      $   0N             <   (N             T    N          $   l   p       JQ0       $      My       BDN             HN#       A            XN#       A      $      hN-    JQ@          $  pO    JL0 4   D  `PU  	  BEB B(A0A8G 4   |  T  Q  BEB B(A0D8D`        X5  R  JL0      @Y5  T  JL0 4     `Z  V  BBE B(A0A8G 4   ,  _    BEB B(A0A8G 4   d  d    BBE B(A0A8G 4     i  S  BBE B(A0A8G      `nY               n               n               n             4  n             L  n             d  n             |  n               n               n               n               n               ng       AGP         o      C         4  o          $   L  e      ERQ@  $   t  or     AAK0           pX       JL  $     e      ERQ@       0pg       AK    4     p      BBB A(A0D`          <  qU       D$   T  e      ERQ@     |  rp       AK    $     Xr       BJA          r   
  JLP       s^       D     hs^       D$     `e      ERQ@  $   <  s       JV@          d  t:          $   |  8tk       AFD            t8               t,       D$     t       JPP       $     (u       JMT $   $  u       JMQ@  4   L  HvE      BBB B(A0A8Fp  $     `w       JMQP  $     w       JMQP  $     px       JMQ@       xL       JK       y*       D   4  0y*       D   L  Hy_       N        l  yp       SP       y{       S   $     8z       JMT $     z       BJA          X{U       D   	  {U       P        4	  {       D   L	  {       D$   d	  {       JMQP  4   	  |  
  BEB B(A0A8D 4   	  ~    BBB B(A0A8G ,   	      ACBEGK     4   ,
      BEB A(A0G         d
  K     AD       
        S0  $   
      JT      ,   
      ACH[       4   
  H?  D  BBB B(A0A8G    4               L               d               |                 =       D                                   1               1                      EA $   ,        JMQP  ,   T  p\    AEBGIJ                           zPR x        $   x              <   p=    D       T                 l                   D }:       ;h     |#  . `                        5  ' [  z         7  F }C   )   7  F }C   )   $  / a    	 	      	   	           		 $  / a     	 
     	     
          	 

 
 #  . `               	         		 $  / a               	         		   _ X    'g {  "  3     )   B     (          +C F     g     &#S          V        	  	 	 
 
 
   z                    X     6  J 	J 	J 	K 
K 
L 
L L M N M N N   N ?  O O O Q P   Q Q Q Q R R S S   S T ?  U V T U U U V V W W W W   X X   Y Z 0  J Y Z I I Z I ` a e f e   ^ f   f g 0  ] ] ] ^ \ y  ^  ^ !r !r !q !r !  "s "s "  "s #t #?  $\ $[ $\ %h %h %j &h &j &  &k 'l '0  'b (a (b (a )a )_ )d )i *  *x *I +n  ,v ,v ,t -v -v -w .~ .~ .  .z .{ /  0} 0 0z 1| 1{ 1{ 2l 2l 2  3m 3m 3  4m 4m 4n 5o 5o 5p 6d 6a 6  6c 6c 7c 7J 7x 8J 8d 9d 9d 9y :g :O :O ;] ;h ;g <g <g <U =U =q >q >q >r ?s ?^ ?^ @\ @] A[ A^ AY B^ Bh Bh Ch Ch Di Di Di Ei Eq EI FI FI GJ Gd Gd Hd Hd Ha I  IK JK JK K*  LK LL ML MN NN OO OQ PQ PQ QQ RQ RR SS ST TU UV UV VV WV WW XW XX YZ Yz ZZ [h [\ \\ \^ ]^ ^^ _a _a `a `a ab bd bd cd cc ea ef fg fg hi ij jj kk kl ll lm mm nn no om om pq pq po qo rt rt st tt ux uv uv vv wx wx wv xx y y} z {I {| || |} |{ } }~ ~ ~~  Gd
 
 3	 	 
 8 	  	 	  		 
 |                                                                                                                                HL             x             X                            h      
                                  %                                       x=             9                   	              o    09      o           o    67      o                                                                                                                                                                   *                                                                                                                                                                                                             ("                     vL      L      L      L      L      L      L      L      L      M      M      &M      6M      FM      VM      fM      vM      M      M      M      M      M      M      M      M      N      N      &N      6N      FN      VN      fN      vN      N      N      N      N      N      N      N      N      O      O      &O      6O      FO      VO      fO      vO      O      O      O      O      O      O      O      O      P      P      &P      6P      FP      VP      fP      vP      P      P      P      P      P      P      P      P      Q      Q      &Q      6Q      FQ      VQ      fQ      vQ      Q      Q      Q      Q      Q      Q      Q      Q      R      R      &R      6R      FR      VR      fR      vR      R      R      R      R      R      R      R      R      S      S      &S      6S      FS      VS      fS      vS      S      S      S      S      S      S      S      S      T      T      &T      6T      FT      VT      fT      vT      T      T      T      T      T      T      T      T      U      U      &U      6U      FU      VU      fU      vU      U      U      U      U      U      U      U      U      V      V      &V      6V      FV      *     "              GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)  .shstrtab .hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .text .fini .rodata .eh_frame_hdr .eh_frame .gcc_except_table .ctors .dtors .jcr .dynamic .got .got.plt .data .bss .comment                                                                                 X      X                                              h      h                                                                                          !   o       67      67                                 .   o       09      09      p                            =             9      9                                 G             x=      x=               	                 Q             HL      HL                                    L             `L      `L      	                            W             PV      PV      (                             ]             x      x                                    c                                                      k                                                    y                                                                           4                                          !     !     (                                           "     "                                                 "      "                                                ("     ("                                             #     #                                              %     %                                              *     *                                                @*     0*                                                         0*     
                                                   :,                                                                                                                                                   installer.py                                                                                        0000644 0001750 0001750 00000000141 14446054645 012723  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 import sys

if __name__ == "__main__":
    import ui.installer
    ui.installer.fmain(sys.argv)                                                                                                                                                                                                                                                                                                                                                                                                                                 ipc.py                                                                                              0000644 0001750 0001750 00000302116 14367007727 011511  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-
'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''
import sys
import subprocess
import os
import struct
import time
import copy
import utils
import ctypes
import json
import string
import random
import mmap
import stat
import native
import importlib
import threading

_struct_IIcc=struct.Struct("!IIcc")
_struct_I=struct.Struct("!I")
_struct_BI=struct.Struct("!BI")
_struct_c=struct.Struct("!c")
_struct_cc=struct.Struct("!cc")
_struct_utmp = struct.Struct('hi32s4s32s256shhiii4i20s')

IPC_PATH="sharedmem"
MMP_NAME="/dwammp"
SEM_NAME="/dwasem"

_ipcmap={}
_ipcmap["libbaseloaded"] = False
_ipcmap["semaphore"] = threading.Condition()
_ipcmap["picklesemaphore"] = threading.Condition()
_ipcmap["pickleprocess"] = None
_ipcmap["childsharedobjsemaphore"] = threading.Condition()
_ipcmap["childsharedobj"] = []
_ipcmap["threadsharedobj"]={}
_ipcmap["list_names_lock"]=threading.RLock()
_ipcmap["list_names"]=[]

try:
    import _multiprocessing
    import multiprocessing.synchronize
    if utils.is_windows():
        if utils.is_py2():
            import multiprocessing.forking
            import _subprocess
        else:
            import _winapi
except:
    _ipcmap["libbaseloaded"] = True



class SEMAPHORE_DEF(ctypes.Structure):
    _fields_ = [("create",ctypes.c_int),
                ("mode",ctypes.c_int),
                ("fd",ctypes.c_int),
                ("semvalue",ctypes.c_int),
                ("sem",ctypes.c_void_p),
                ("name", ctypes.c_char_p)]

class SHAREDMEMORY_DEF(ctypes.Structure):
    _fields_ = [("create",ctypes.c_int),
                ("mode",ctypes.c_int),
                ("fd",ctypes.c_int),
                ("size",ctypes.c_int),
                ("name", ctypes.c_char_p)]

def _add_child_shared_obj(obj):
    _ipcmap["childsharedobjsemaphore"].acquire()    
    try:
        _ipcmap["childsharedobj"].append(obj)
    finally:
        _ipcmap["childsharedobjsemaphore"].release()

def _destroy_child_shared_obj():
    _ipcmap["childsharedobjsemaphore"].acquire()    
    try:
        for i in reversed(range(len(_ipcmap["childsharedobj"]))):
            try:
                obj=_ipcmap["childsharedobj"][i]
                obj._destroy()
            except:
                ex = utils.get_exception()
                print("_destroy_child_shared_obj  " + str(obj) + " - err: " + utils.exception_to_string(ex))
        _ipcmap["childsharedobj"]=None
    finally:
        _ipcmap["childsharedobjsemaphore"].release()

def _rndseq(cnt):
        ar=[]
        for x in range(cnt):
            if x==0:
                ar.append(random.choice(string.ascii_lowercase))
            else:
                ar.append(random.choice(string.ascii_lowercase + string.digits))            
        return ''.join(ar)

def _add_name(suffix):
        with _ipcmap["list_names_lock"]: 
            while True:
                spid=str(os.getpid())
                nm = suffix + "_" + spid + "_" + _rndseq(10)
                if nm not in _ipcmap["list_names"]:
                    _ipcmap["list_names"].append(nm)
                    if not utils.is_windows():
                        pth = process_manager._get_release_path("dwa_" + spid)
                        if not os.path.exists(pth):
                            with utils.file_open(pth, "w", encoding="utf-8") as f:
                                f.write("[]")
                            utils.path_change_permissions(pth, stat.S_IRUSR | stat.S_IWUSR)
                        with utils.file_open(pth, "w", encoding="utf-8") as f:
                            f.write(json.dumps(_ipcmap["list_names"])) 
                    return nm

def _rem_name(nm):
    with _ipcmap["list_names_lock"]:
        if nm in _ipcmap["list_names"]:
            _ipcmap["list_names"].remove(nm)
            if not utils.is_windows():
                spid=str(os.getpid())
                pth = process_manager._get_release_path("dwa_" + spid)
                with utils.file_open(pth, "w", encoding="utf-8") as f:
                    f.write(json.dumps(_ipcmap["list_names"]))

def _fix_perm_get_mode(fixperm):
    if fixperm is not None:
        jo = fixperm()
        if "mode" in jo:
            return jo["mode"]        
    return stat.S_IRUSR | stat.S_IWUSR 

def _fix_perm_path(fpath, fixperm):
    if utils.is_windows():
        None        
    else:
        utils.path_change_permissions(fpath, _fix_perm_get_mode(fixperm))

def initialize():
        try:
            if not utils.path_exists(IPC_PATH):
                utils.path_makedir(IPC_PATH)
            else:
                clear_path(True)
        except:
            e = utils.get_exception()
            print("ipc init_path error: " + utils.exception_to_string(e))        
        process_manager.start()

def terminate():
    process_manager.destory()
    process_manager.join(5)

def clear_path(checkpid=False):
    if utils.path_exists(IPC_PATH):
        lst=utils.path_list(IPC_PATH);
        for fname in lst:
            try:
                if fname.endswith(".mmp") or fname.endswith(".cfg"):
                    if utils.path_exists(IPC_PATH + utils.path_sep + fname):
                        utils.path_remove(IPC_PATH + utils.path_sep + fname)
            except:
                None
            try:
                if not utils.is_windows():
                    if fname.endswith(".rls"):
                        bdelfile=True                        
                        if is_load_libbase():                        
                            spid = fname[0:len(fname)-4].split("_")[1]
                            if checkpid==True:
                                try:
                                    if native.get_instance().is_task_running(int(spid)):
                                        bdelfile=False
                                except:
                                    bdelfile=False
                            if bdelfile:
                                applst=[]
                                try:
                                    with utils.file_open(IPC_PATH + utils.path_sep + fname, "rb") as f:
                                        applst=json.loads(f.read())
                                except:
                                    None
                                for n in applst:
                                    try:
                                        if n.startswith(SEM_NAME):
                                            _ipcmap["libbase"].semUnlink(str(n))
                                        elif n.startswith(MMP_NAME):
                                            _ipcmap["libbase"].shmUnlink(str(n))
                                    except:
                                        None                                
                        if bdelfile:
                            if utils.path_exists(IPC_PATH + utils.path_sep + fname):
                                utils.path_remove(IPC_PATH + utils.path_sep + fname)
            except:
                None

def _dump_obj(o, prc):    
    dtret=None
    _ipcmap["picklesemaphore"].acquire()
    oldprc = _ipcmap["pickleprocess"]
    try:
        _ipcmap["pickleprocess"] = prc
        sfile = utils.BytesIO()
        utils.Pickler(sfile, -1).dump(o)
        dtret = sfile.getvalue()
    finally:
        _ipcmap["pickleprocess"] = oldprc
        _ipcmap["picklesemaphore"].release()
    return dtret

def _load_obj(dt):
    if dt is None:
        return None    
    sfile = utils.BytesIO(dt)
    return utils.Unpickler(sfile).load()

def is_load_libbase():
    _ipcmap["semaphore"].acquire()
    try:
        if _ipcmap["libbaseloaded"]:
            return "libbase" in _ipcmap
        _ipcmap["libbaseloaded"]=True
        
        if utils.is_windows():
            _libbase = native.get_instance().get_library()
            if _libbase is not None:
                _ipcmap["libbase"]=_libbase
                return True
        else:
            try:
                _libbase = native.get_instance().get_library()
                if _libbase is not None:                    
                    _ipcmap["libbase"]=_libbase
                    return True                                
            except:
                None            
    finally:
        _ipcmap["semaphore"].release()
    return False


class SemIPC(object):

    def __init__(self, kind, value, maxvalue, fixperm=None):
        self._bdestroy=False
        self._bcreate=True
        self._countdup=0
        self._sem_name=None
        self._sem_def=None
        if is_load_libbase():
            self._libbase=_ipcmap["libbase"]
            if utils.is_windows():
                if utils.is_py2():
                    self._semlock = _multiprocessing.SemLock(kind, value, maxvalue)
                else:
                    self._semlock = _multiprocessing.SemLock(kind, value, maxvalue, "", True)
            else:
                cnttry=0
                while True:
                    sid=_add_name(SEM_NAME)
                    self._sem_name=sid
                    self._sem_def = SEMAPHORE_DEF()
                    self._sem_def.name=utils.str_to_bytes(self._sem_name)
                    self._sem_def.create=1
                    self._sem_def.mode=_fix_perm_get_mode(fixperm)
                    self._sem_def.semvalue=value
                    iret = self._libbase.semaphoreInitialize(ctypes.byref(self._sem_def))
                    if iret==0:
                        break
                    if sid is not None:
                        _rem_name(sid)
                        sid=None
                    cnttry+=1
                    if cnttry>=10 or iret!=-1:
                        raise Exception("Semaphore initialize failed.")
                    else:
                        time.sleep(0.2)
                
                if utils.is_py2():
                    self._semlock = _multiprocessing.SemLock._rebuild(*(self._sem_def.sem, kind, maxvalue))
                else:
                    self._semlock = _multiprocessing.SemLock._rebuild(*(self._sem_def.sem, kind, maxvalue, None))
            
            self._type=kind
            self._max=maxvalue
        else:
            raise Exception("Semaphore libabase load failed.")
            
                
    def __getstate__(self):
        prc = _ipcmap["pickleprocess"];
        if prc is None:
            raise Exception("No child process attached")
        sid=None        
        if utils.is_windows():
            if utils.is_py2():
                chandle = _multiprocessing.win32.OpenProcess(_multiprocessing.win32.PROCESS_ALL_ACCESS, False, prc.get_pid())
                sid = _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(), self._semlock.handle, chandle, 0, False, _subprocess.DUPLICATE_SAME_ACCESS).Detach()
                multiprocessing.forking.close(chandle)
            else:
                chandle = _winapi.OpenProcess(_winapi.PROCESS_ALL_ACCESS, False, prc.get_pid())
                sid = _winapi.DuplicateHandle(_winapi.GetCurrentProcess(), self._semlock.handle, chandle, 0, False, _winapi.DUPLICATE_SAME_ACCESS)
                _winapi.CloseHandle(chandle)
        else:
            sid = self._sem_name
        prc._add_shared_obj(self)
        self._countdup+=1        
        return (sid, self._type, self._max)

    def __setstate__(self, state):
        self._bdestroy=False
        self._bcreate=False
        self._countdup=0
        self._sem_def=None
        self._sem_name=None
        if is_load_libbase():
            self._libbase=_ipcmap["libbase"]
            if utils.is_windows():
                if utils.is_py2():
                    self._semlock = _multiprocessing.SemLock._rebuild(*state)
                else:
                    self._semlock = _multiprocessing.SemLock._rebuild(*(state[0],state[1],state[2],None))
            else: 
                self._sem_name=state[0]
                self._sem_def=SEMAPHORE_DEF()
                self._sem_def.name=utils.str_to_bytes(self._sem_name)
                self._sem_def.create=0
                iret = self._libbase.semaphoreInitialize(ctypes.byref(self._sem_def))                    
                if iret==0:
                    if utils.is_py2():
                        self._semlock=_multiprocessing.SemLock._rebuild(*(self._sem_def.sem,state[1],state[2]))
                    else:
                        self._semlock=_multiprocessing.SemLock._rebuild(*(self._sem_def.sem,state[1],state[2],None))
                else:
                    raise Exception("Semaphore initialize failed.")
            _add_child_shared_obj(self)
        else:
            raise Exception("Semaphore libbase load failed.")

       
    def acquire(self, blocking=True, timeout=None):
        if blocking and timeout is None:
            while not self._semlock.acquire(blocking,1):
                if self._bdestroy:
                    raise Exception("Semaphore destroyed.")
            return True
        else:
            return self._semlock.acquire(blocking,timeout)        
    
    def release(self):
        return self._semlock.release()

    def __enter__(self):
        return self.acquire()

    def __exit__(self, *args):
        return self.release()
    
    def get_value(self):
        return self._semlock._get_value()
    
    def __del__(self):
        try:
            self._destroy()            
        except:
            None
    
    def _destroy(self):
        if self._bdestroy==False:
            self._bdestroy=True
            if self._bcreate==True:
                if self._sem_name is not None:
                    _rem_name(self._sem_name)
                    self._sem_name=None
            if self._semlock is not None:
                if utils.is_windows():
                    self._libbase.closeHandle(self._semlock.handle)
                else:
                    self._libbase.semaphoreDestroy(ctypes.byref(self._sem_def))
                self._semlock=None
            

class SemTHC(object):

    def __init__(self, objthc):
        self._threadsharedobjid = None
        self._objthc=objthc
        self._make_methods()
    
    def __del__(self):
        try:
            if self._threadsharedobjid is not None and self._threadsharedobjid in _ipcmap["threadsharedobj"]:            
                del _ipcmap["threadsharedobj"][self._threadsharedobjid]
        except:
            None
    
    def __getstate__(self):
        if self._threadsharedobjid is None: 
            self._threadsharedobjid = id(self)
            _ipcmap["threadsharedobj"][self._threadsharedobjid]=self
        return self._threadsharedobjid
    
    def __setstate__(self, state):
        self._threadsharedobjid = None
        self._objthc=_ipcmap["threadsharedobj"][state]._objthc
        self._make_methods()
    
    def _make_methods(self):
        None
    
class LockIPC(SemIPC):

    def __init__(self, fixperm=None):
        SemIPC.__init__(self, multiprocessing.synchronize.SEMAPHORE, 1, 1, fixperm)

class LockTHC(SemTHC):
    
    def __init__(self):
        SemTHC.__init__(self, threading.Lock())
        
    def _make_methods(self):
        self.acquire = self._objthc.acquire
        self.release = self._objthc.release        

def Lock(fixperm=None):
    if is_load_libbase():
        return LockIPC(fixperm)
    else:
        return LockTHC()
   
class RLockIPC(SemIPC): 
    
    def __init__(self, fixperm=None):
        SemIPC.__init__(self, multiprocessing.synchronize.RECURSIVE_MUTEX, 1, 1, fixperm)

class RLockTHC(SemTHC): 
    
    def __init__(self):
        SemTHC.__init__(self, threading.RLock())
    
    def _make_methods(self):
        self.acquire = self._objthc.acquire
        self.release = self._objthc.release

def RLock(fixperm=None):
    if is_load_libbase():
        return RLockIPC(fixperm)
    else:
        return RLockTHC()

class SemaphoreIPC(SemIPC): 
    
    def __init__(self, value=1, fixperm=None):
        SemIPC.__init__(self, multiprocessing.synchronize.SEMAPHORE, value, _multiprocessing.SemLock.SEM_VALUE_MAX, fixperm)

class SemaphoreTHC(SemTHC): 
    
    def __init__(self, value=1):
        SemTHC.__init__(self, threading.Semaphore(value))
    
    def _make_methods(self):
        self.acquire = self._objthc.acquire
        self.release = self._objthc.release

def Semaphore(fixperm=None):
    if is_load_libbase():
        return SemaphoreIPC(fixperm)
    else:
        return SemaphoreTHC()
    
class BoundedSemaphoreIPC(SemaphoreIPC):

    def __init__(self, value=1, fixperm=None):
        SemIPC.__init__(self, multiprocessing.synchronize.SEMAPHORE, value, value, fixperm)


class BoundedSemaphoreTHC(SemTHC):

    def __init__(self, value=1):
        SemTHC.__init__(self, threading.BoundedSemaphore(value))
    
    def _make_methods(self):
        self.acquire = self._objthc.acquire
        self.release = self._objthc.release

def BoundedSemaphore(fixperm=None):
    if is_load_libbase():
        return BoundedSemaphoreIPC(fixperm)
    else:
        return BoundedSemaphoreTHC()

class ConditionIPC(object):
    
    def __init__(self, lock=None, fixperm=None):
        self._bdestroy=False
        self._lock = lock or RLockIPC(fixperm)
        self._sleeping_count = SemaphoreIPC(0,fixperm)
        self._woken_count = SemaphoreIPC(0,fixperm)
        self._wait_semaphore = SemaphoreIPC(0,fixperm)
        self._make_methods()
    
    def __del__(self):
        self._destroy()
    
    def _destroy(self):
        self._bdestroy=True
        self._wait_semaphore=None
        self._woken_count=None
        self._sleeping_count=None
        self._lock=None                    
    
    def __getstate__(self):
        prc = _ipcmap["pickleprocess"];
        if prc is None:
            raise Exception("No child process attached")
        prc._add_shared_obj(self)
        return (self._lock,self._sleeping_count,self._woken_count,self._wait_semaphore)
    
    def __setstate__(self, st):
        self._lock,self._sleeping_count,self._woken_count,self._wait_semaphore = st
        self._make_methods()
        _add_child_shared_obj(self)
    
    def __enter__(self):
        return self._lock.__enter__()

    def __exit__(self, *args):
        return self._lock.__exit__(*args)
        
    def _make_methods(self):        
        self.acquire = self._lock.acquire        
        self.release = self._lock.release        
    
    def wait(self, timeout=None):
        assert self._lock._semlock._is_mine(), 'must acquire() condition before using wait()'
        self._sleeping_count.release()
        count = self._lock._semlock._count()
        for i in utils.nrange(count):
            self._lock.release()
        try:
            self._wait_semaphore.acquire(True, timeout)
        finally:
            self._woken_count.release()
            for i in utils.nrange(count):
                self._lock.acquire()
        
    def notify(self):
        assert self._lock._semlock._is_mine(), 'lock is not owned'
        assert not self._wait_semaphore.acquire(False)
        while self._woken_count.acquire(False):
            res = self._sleeping_count.acquire(False)
            assert res

        if self._sleeping_count.acquire(False): 
            self._wait_semaphore.release()      
            self._woken_count.acquire()         
            self._wait_semaphore.acquire(False)        
    
    def notify_all(self):
        assert self._lock._semlock._is_mine(), 'lock is not owned'
        assert not self._wait_semaphore.acquire(False)
        while self._woken_count.acquire(False):
            res = self._sleeping_count.acquire(False)
            assert res
        sleepers = 0
        while self._sleeping_count.acquire(False):
            self._wait_semaphore.release()
            sleepers += 1

        if sleepers:
            for i in utils.nrange(sleepers):
                self._woken_count.acquire()
            while self._wait_semaphore.acquire(False):
                pass


class ConditionTHC(SemTHC):
    
    def __init__(self, lock=None):
        SemTHC.__init__(self, threading.Condition(lock))        
    
    def _make_methods(self):
        self.acquire = self._objthc.acquire
        self.release = self._objthc.release
        self.wait=self._objthc.wait
        self.notify=self._objthc.notify
        self.notify_all=self._objthc.notify_all

def Condition(lock=None,fixperm=None):
    if is_load_libbase():
        return ConditionIPC(lock=lock,fixperm=fixperm)
    else:
        return ConditionTHC(lock)

class EventIPC(object):

    def __init__(self, fixperm=None):
        self._cond = ConditionIPC(LockIPC(fixperm),fixperm)
        self._flag = SemaphoreIPC(0)

    def __del__(self):
        self._destroy()
    
    def _destroy(self):
        self._cond=None
        self._flag=None                    
    
    def __getstate__(self):
        prc = _ipcmap["pickleprocess"];
        if prc is None:
            raise Exception("No child process attached")
        prc._add_shared_obj(self)        
        return (self._cond,self._flag)
    
    def __setstate__(self, st):        
        self._cond, self._flag = st
        _add_child_shared_obj(self)
    
    def is_set(self):
        self._cond.acquire()
        try:
            if self._flag.acquire(False):
                self._flag.release()
                return True
            return False
        finally:
            self._cond.release()

    def set(self):
        self._cond.acquire()
        try:
            self._flag.acquire(False)
            self._flag.release()
            self._cond.notify_all()
        finally:
            self._cond.release()

    def clear(self):
        self._cond.acquire()
        try:
            self._flag.acquire(False)
        finally:
            self._cond.release()

    def wait(self, timeout=None):
        self._cond.acquire()
        try:
            if self._flag.acquire(False):
                self._flag.release()
            else:
                self._cond.wait(timeout)

            if self._flag.acquire(False):
                self._flag.release()
                return True
            return False
        finally:
            self._cond.release()

class EventTHC(SemTHC):

    def __init__(self):
        SemTHC.__init__(self, threading.Event())
        
    def _make_methods(self):
        self.is_set=self._objthc.is_set
        self.set=self._objthc.set
        self.clear=self._objthc.clear
        self.wait=self._objthc.wait

def Event(fixperm=None):
    if is_load_libbase():
        return EventIPC(fixperm)
    else:
        return EventTHC()


    
'''
STREAM FILES MAP:

04 bytes: position write side 1 (DATA1)
04 bytes: position read side 2 (DATA1)
01 bytes: State side 1 (C:Connected X:Close T:Terminate)
04 bytes: position write side 2 (DATA2)
04 bytes: position read side 1 (DATA2)
01 bytes: State side 2 (I:Initializing C:Connected X:Close T:Terminate)    
DATA1 - write for Side 1 and read for Side 2)
DATA2 - write for Side 2 and read for Side 1)
'''
class StreamIPC():
    
    def __init__(self,prop=None):
        self._bdestroy=False
        self._prop=prop
        self._side=0
        self._bclose=False        
        self._binit=False        
        self._mmap_state_size = 18
        self._size1 = 0
        self._size2 = 0
        self._read_start_pos=0
        self._write_start_pos=0
        self._write_size = 0
        self._read_size = 0
        self._mmap = None
        self._cond = None
        self._read_timeout_function=None
        self._mconf = None
        self._cprocess = None
        self._keepalive_counter = utils.Counter()
        self._semaphore = threading.Condition()
        #self._otherpid = None
    
    def __del__(self):
        try:
            self._destroy()
        except:
            None        
        
    def _destroy(self):
        if self._bdestroy==False:
            self._bdestroy=True
            try:
                if self._mmap is not None:
                    self._mmap.close()
            except:
                None        
            self._mmap=None
            self._cond = None
    
    def __getstate__(self):
        if self._cprocess is not None:
            raise Exception("Stream already attached to child process.")        
        self._cprocess = _ipcmap["pickleprocess"];
        self._create()
        self._cprocess._add_shared_obj(self)
        return (os.getpid(), self._mmap,self._cond,self._size1,self._size2)
    
    def __setstate__(self, st):
        self._bdestroy=False
        self.__init__()
        self._open(st)
        _add_child_shared_obj(self)
    
    def _is_init(self):
        return self._binit
    
    def _create(self):
        self._semaphore.acquire()
        try:                
            if self._binit==True:
                raise Exception("Stream already initialized.")
            fixperm=None
            if self._prop is not None and "fixperm" in self._prop:
                fixperm=self._prop["fixperm"]
            appsz = 1*1024*1024
            if self._prop is not None and "size" in self._prop:
                appsz=self._prop["size"] 
            self._size1 = int(appsz/2)
            if self._prop is not None and "size1" in self._prop:
                self._size1 = self._prop["size1"] 
            self._size2 = int(appsz/2)
            if self._prop is not None and "size2" in self._prop:
                self._size2 = self._prop["size2"]       
            
            self._mmap = MemMap(self._mmap_state_size + self._size1 + self._size2, fixperm)
            self._cond = Condition(fixperm=fixperm)
            #self._otherpid=self._cprocess.get_pid()
            self._initialize(1)
            self._binit=True            
        except:
            e = utils.get_exception()
            self._destroy()
            raise e
        finally:
            self._semaphore.release() 
        
    def _open(self, ostate):
        self._semaphore.acquire()
        try:
            if self._binit==True:
                raise Exception("Stream already initialized.")
            self._otherpid, self._mmap, self._cond, self._size1, self._size2 = ostate            
            self._initialize(2)
            self._binit=True
        except:
            e = utils.get_exception()
            self._destroy()
            raise e
        finally:
            self._semaphore.release() 
    
    def _initialize(self, side):
        self._side=side
        if self._side==1:
            self._write_size = self._size1
            self._read_size = self._size2
            self._write_pos=0
            self._read_pos=9
            self._state_pos=8
            self._state_pos_other=17
            self._write_start_pos=self._mmap_state_size
            self._read_start_pos=self._mmap_state_size + self._size1
            self._mmap.seek(0)
            self._mmap.write(_struct_IIcc.pack(self._write_start_pos,self._write_start_pos,b"C",b"K"))
            self._mmap.write(_struct_IIcc.pack(0,0,b"I",b"K"))
        elif self._side==2:
            self._write_size = self._size2
            self._read_size = self._size1
            self._write_pos=9
            self._read_pos=0
            self._state_pos=17
            self._state_pos_other=8
            self._write_start_pos=self._mmap_state_size + self._size1
            self._read_start_pos=self._mmap_state_size
            self._mmap.seek(self._write_pos)
            self._mmap.write(_struct_IIcc.pack(self._write_start_pos,self._write_start_pos,b"C",b"K"))                
     
    def _close_nosync(self):
        if not self._bclose:
            self._bclose=True
            self._mmap.seek(self._state_pos)
            self._mmap.write(_struct_c.pack(b"X"))
    
    def close(self):
        if self._binit==False or self._cond is None or self._mmap is None:
            return
        try:
            self._cond.acquire()
            try:
                self._close_nosync()
            finally:
                self._cond.release()
        except:
            self._close_nosync()
    
    def is_closed(self):
        return self._bclose
    
    def write(self, data):
        if self._bclose:
            raise Exception("Stream closed")
        self._cond.acquire()
        try:
            p=0
            sz=len(data)
            while not self._bclose and sz>0:
                self._mmap.seek(self._write_pos)
                pw, pr, st, ka = _struct_IIcc.unpack(self._mmap.read(10))
                self._mmap.seek(self._state_pos_other)
                st_other, ka_other = _struct_cc.unpack(self._mmap.read(2))
                #if st_other==b"X" or st_other==b"T":
                if st_other==b"X":
                    self._close_nosync()
                    break
                if pw>=pr:
                    szspace=self._write_size-(pw-pr)-1
                    szlimit=self._write_size-(pw-self._write_start_pos)
                    szremain=(pr-self._write_start_pos)-1
                    if szremain<=0:
                        szlimit-=1
                else: 
                    szspace=pr-pw-1
                    szlimit=szspace
                    szremain=0
                if szspace==0:
                    self._cond.wait(1)
                else:   
                    self._mmap.seek(pw)
                    if sz<=szlimit:
                        self._mmap.write(utils.buffer_new(data,p,len(data)-p))
                        pw+=sz
                        if pw-self._write_start_pos==self._write_size:
                            pw=self._write_start_pos
                        p+=sz
                        sz=0                                                    
                    else:
                        self._mmap.write(utils.buffer_new(data,p,szlimit))
                        pw+=szlimit
                        if pw-self._write_start_pos==self._write_size:
                            pw=self._write_start_pos
                        p+=szlimit
                        sz-=szlimit
                        if szremain>0:
                            ln = sz
                            if sz>szremain:
                                ln = szremain
                            self._mmap.seek(pw)
                            self._mmap.write(utils.buffer_new(data,p,ln))
                            pw+=ln
                            if pw-self._write_start_pos==self._write_size:
                                pw=self._write_start_pos
                            p+=ln
                            sz-=ln                            
                        
                    self._mmap.seek(self._write_pos)
                    self._mmap.write(_struct_I.pack(pw))
                    self._cond.notify_all()
        finally:
            self._cond.release()
        if self._bclose:
            raise Exception("Stream closed")
    
    def set_read_timeout_function(self,f):
        self._read_timeout_function=f    
    
    def read(self,numbytes=0):
        dt=None
        ardt=[]
        self._cond.acquire()
        try:
            while not self._bclose:
                self._mmap.seek(self._read_pos)
                pw, pr, st, ka = _struct_IIcc.unpack(self._mmap.read(10))
                if pw>pr:
                    sz=pw-pr
                elif pw<pr:
                    sz=self._read_size-(pr-self._read_start_pos)
                if pw==pr: # or (numbytes>0 and numbytes>sz):
                    #if st==b"X" or st==b"T":
                    if st==b"X":
                        self._close_nosync()
                        break
                    self._cond.wait(1)
                    if self._read_timeout_function is not None and self._read_timeout_function(self):
                        raise Exception("Read timeout")                    
                    if self._bdestroy:
                        raise Exception("Stream closed.")
                else: 
                    self._mmap.seek(pr)
                    if numbytes>0:
                        if sz>numbytes:
                            sz=numbytes                    
                        ardt.append(self._mmap.read(sz))
                        numbytes-=sz
                    else:
                        dt = self._mmap.read(sz)
                    pr+=sz
                    if pr-self._read_start_pos==self._read_size:
                        pr=self._read_start_pos
                    self._mmap.seek(self._read_pos+4)
                    self._mmap.write(_struct_I.pack(pr))
                    self._cond.notify_all()
                    if numbytes==0:
                        if dt is None:
                            dt=utils.bytes_join(ardt)
                        break
        finally:
            self._cond.release()
        return dt
    
    def write_int(self, i):
        self.write(_struct_I.pack(i))
    
    def read_int(self):
        bt = self.read(numbytes=4)
        if bt is None:
            return None
        return _struct_I.unpack(bt)[0]        
    
    def write_bytes(self, bts):
        self.write(_struct_I.pack(len(bts))+bts)
    
    def read_bytes(self):
        bt = self.read(numbytes=4)
        if bt is None:
            return None
        sz = _struct_I.unpack(bt)[0]
        if sz==0:
            return ""
        return self.read(numbytes=sz)
    
    def write_str(self, s, enc="utf8"):
        ba = bytearray(s,enc)
        self.write(_struct_BI.pack(len(enc),len(ba))+enc+ba)        
    
    def read_str(self):
        bt = self.read(numbytes=5)
        if bt is None:
            return None
        encsz, sz=_struct_BI.unpack(bt)
        enc = self.read(numbytes=encsz)
        if enc is None:
            return None
        if sz==0:
            return ""
        return self.read(numbytes=sz).decode(enc)
    
    def write_obj(self, o):
        bts = _dump_obj(o,self._cprocess)
        self.write(_struct_I.pack(len(bts))+bts)
    
    def read_obj(self):
        bt = self.read(numbytes=4)
        if bt is None:
            return None
        sz = _struct_I.unpack(bt)[0]
        return _load_obj(self.read(numbytes=sz))

class StreamTHC(StreamIPC):
    
    def __init__(self,prop=None):
        StreamIPC.__init__(self, prop)
        self._threadsharedobjid=None
    
    def __del__(self):
        try:
            if self._threadsharedobjid is not None and self._threadsharedobjid in _ipcmap["threadsharedobj"]:            
                del _ipcmap["threadsharedobj"][self._threadsharedobjid]
        except:
            None
    
    def __getstate__(self):
        if self._threadsharedobjid is None:
            self._create() 
            self._threadsharedobjid = id(self)
            _ipcmap["threadsharedobj"][self._threadsharedobjid]=self
        return self._threadsharedobjid
    
    def __setstate__(self, state):
        self.__init__()
        pobj=_ipcmap["threadsharedobj"][state]
        self._open((None, pobj._mmap,pobj._cond,pobj._size1,pobj._size2))
    

def Stream(prop=None):
    if is_load_libbase():
        return StreamIPC(prop)
    else:
        return StreamTHC(prop)

class MemMapIPC():
    
    def __init__(self,size,fixperm=None):
        self.shm_def = None
        self.file=None
        self.fixperm=fixperm
        self.mmap=None
        self.size=size
        self.bcreate=True
        self.bclose=False
        self.bdestroy=False
        self._create()
    
    def __del__(self):
        try: 
            self._destroy()        
        except:
            None
        
    def _destroy(self):
        if not self.bdestroy:
            self.bdestroy=True
            if self.bcreate:
                self.close()
                if self.ftype=="F":
                    if utils.path_exists(self.fpath):
                        try:
                            utils.path_remove(self.fpath)
                        except:
                            ex = utils.get_exception()
                            print("MemMap remove file error: " + utils.exception_to_string(ex))
                elif self.ftype=="M":
                    _rem_name(self.fname)
                    if not utils.is_windows():                        
                        iret = self._libbase.sharedMemoryDestroy(ctypes.byref(self.shm_def))
                        if iret!=0:
                            print("Shared memory destroy failed.")
            
    
    def __getstate__(self):
        if not self.bcreate:
            raise Exception("MemMap not initialized")
        prc = _ipcmap["pickleprocess"];
        if prc is None:
            raise Exception("No child process attached")
        prc._add_shared_obj(self)
        return {"type":self.ftype, "name":self.fname, "size":self.size}
    
    def __setstate__(self, st):
        self.file=None
        self.fixperm=None
        self.mmap=None
        self.size=None
        self.bcreate=False
        self.bclose=False
        self.bdestroy=False
        self._open(st)
        _add_child_shared_obj(self)
    
    def _create_mem(self, fixperm):
        if not utils.is_windows():
            if is_load_libbase():
                self._libbase=_ipcmap["libbase"]
                cnt=0
                while True:
                    self.fname = _add_name(MMP_NAME)
                    self.shm_def = SHAREDMEMORY_DEF()
                    self.shm_def.name=utils.str_to_bytes(self.fname)
                    self.shm_def.create=1
                    self.shm_def.size=self.size
                    self.shm_def.mode=_fix_perm_get_mode(fixperm)
                    iret = self._libbase.sharedMemoryInitialize(ctypes.byref(self.shm_def))
                    if iret==0:
                        self.ftype="M"
                        try:
                            self._prepare_map()
                            return
                        except:
                            ex = utils.get_exception()
                            self._libbase.sharedMemoryDestroy(ctypes.byref(self.shm_def))
                            _rem_name(self.fname)
                            raise ex
                    else:     
                        _rem_name(self.fname)               
                        cnt+=1
                        if cnt>=5 or iret!=-1:
                            raise Exception("SharedMemory initialize failed")
                        else:
                            time.sleep(0.2)            
            else:
                raise Exception("SharedMemory libbase load failed")
        else:
            self.fname = _add_name(MMP_NAME)
            self.ftype="M"
            try:
                self._prepare_map()
            except:
                _rem_name(self.fname)
                raise Exception(utils.get_exception())
            
    def _create_disk(self, fixperm):
        while True:
            spid=str(os.getpid())
            self.fname = MMP_NAME + "_" + spid + "_" + _rndseq(10)
            self.fpath=IPC_PATH + utils.path_sep + self.fname + ".mmp"
            if not utils.path_exists(self.fpath):
                with utils.file_open(self.fpath, "wb") as f:
                    f.write(" "*self.size)
                _fix_perm_path(self.fpath,fixperm)
                self.file=utils.file_open(self.fpath, "r+b")
                self.ftype="F"
                self._prepare_map()
                break
    
    def _create(self):
        try:
            self._create_mem(self.fixperm)
        except:
            self._create_disk(self.fixperm)

    def _open(self, mconf):
        self.ftype=mconf["type"]
        self.fname=mconf["name"]
        self.size=mconf["size"]
        if self.ftype=="F":
            self.fpath=process_manager._get_memmap_path(self.fname)
            if not utils.path_exists(self.fpath):
                raise Exception("Shared file not found.")
            self.file=utils.file_open(self.fpath, "r+b")
        elif self.ftype=="M":            
            if not utils.is_windows():
                if is_load_libbase():
                    self._libbase=_ipcmap["libbase"]
                    self.shm_def = SHAREDMEMORY_DEF()
                    self.shm_def.name=utils.str_to_bytes(self.fname)
                    self.shm_def.create=0
                    self.shm_def.size=self.size
                    iret = self._libbase.sharedMemoryInitialize(ctypes.byref(self.shm_def))
                    if iret!=0:
                        raise Exception("SharedMemory initialize failed")
                else:
                    raise Exception("SharedMemory libbase load failed")
        self._prepare_map()                
    
    def _prepare_map(self):
        try:
            if self.ftype=="F":
                self.mmap=mmap.mmap(self.file.fileno(), 0)                                
            elif self.ftype=="M":
                if not utils.is_windows():
                    self.mmap=mmap.mmap(self.shm_def.fd, self.size)
                else:
                    try:
                        self.mmap=mmap.mmap(0, self.size, "Global\\" + self.fname)
                    except:
                        e = utils.get_exception()
                        if self.mmap is None:
                            self.mmap=mmap.mmap(0, self.size, "Local\\" + self.fname)
                        else:
                            raise e
        except:
            ex = utils.get_exception()
            try:
                self.close()
            except:
                None
            raise ex
    
    def seek(self, p):
        self.mmap.seek(p)        
    
    def tell(self):
        return self.mmap.tell()     
    
    def write(self, dt):
        self.mmap.write(dt)
        
    def read(self, sz):
        return self.mmap.read(sz)        

    def close(self):
        if not self.bclose:            
            self.bclose=True
            self._mconf=None
            serr=""
            try:
                if self.mmap is not None:
                    self.mmap.close()
                    self.mmap=None                    
            except:
                e = utils.get_exception()
                serr+="Error map close: " + utils.exception_to_string(e) + "; ";
            
            if self.ftype=="F":
                if self.file is not None:  
                    self.file.close()
                    self.file=None
            elif self.ftype=="M":
                if not utils.is_windows():
                    if self.bcreate==False:
                        self._libbase.sharedMemoryDestroy(ctypes.byref(self.shm_def))            
            if serr!="":
                raise Exception(serr)
                        
    def get_size(self):
        return self.size


class MemMapTHC():
    
    def __init__(self,size,fixperm=None):
        self.fixperm=fixperm
        self.size=size
        self.pos=0
        self.data=bytearray(self.size)
        self.lck=threading.Lock()
        self._threadsharedobjid=None

    def __del__(self):
        try:
            if self._threadsharedobjid is not None and self._threadsharedobjid in _ipcmap["threadsharedobj"]:            
                del _ipcmap["threadsharedobj"][self._threadsharedobjid]
        except:
            None
    
    def __getstate__(self):
        if self._threadsharedobjid is None: 
            self._threadsharedobjid = id(self)
            _ipcmap["threadsharedobj"][self._threadsharedobjid]=self
        return self._threadsharedobjid
    
    def __setstate__(self, state):
        pobj=_ipcmap["threadsharedobj"][state]
        self.data=pobj.data
        self.size=pobj.size
        self.fixperm=pobj.fixperm
        self.lck=pobj.lck
        self.pos=0
        

    def seek(self, p):
        self.pos=p        
    
    def tell(self):
        return self.pos     
    
    def write(self, dt):
        if isinstance(dt,ctypes.Structure):
            dt=utils.convert_struct_to_bytes(dt)        
        with self.lck:
            sz=len(dt)
            self.data[self.pos:self.pos+sz]=dt
            self.pos+=sz
        
    def read(self, sz):
        with self.lck:
            sret = utils.bytes_new(self.data[self.pos:self.pos+sz])
            self.pos+=sz
            return sret

    def close(self):
        self.data=None
        self.lck=None
                        
    def get_size(self):
        return self.size


def MemMap(size,fixperm=None):
    if is_load_libbase():
        return MemMapIPC(size,fixperm)
    else:
        return MemMapTHC(size,fixperm)


class Property():
    
    def __init__(self):
        self._semaphore = threading.Condition()
        self._binit=False
        if utils.is_py2():
            self._mmap_write = lambda s: self._mmap.write(s.encode("utf8", errors="replace"))
            self._mmap_read = lambda n: self._mmap.read(n).decode("utf8", errors="replace")
        else:
            self._mmap_write = lambda s: self._mmap.write(bytes(s, "utf8"))
            self._mmap_read = lambda n: str(self._mmap.read(n), "utf8")
            
    
    def create(self, fname, fieldsdef, fixperm=None):
        self._semaphore.acquire()
        try:
            if self._binit:
                raise Exception("Already initialized.")
            self._path = process_manager._get_property_path(fname)
            if utils.path_exists(self._path):
                if fixperm is not None:
                    fixperm(self._path)
                self.open(fname)
                bok=True
                for f in fieldsdef:
                    if f["name"] in self._fields:
                        if f["size"]!=self._fields[f["name"]]["size"]:
                            bok=False
                            break
                    else:
                        bok=False
                        break
                if not bok:
                    self.close()
                    try:
                        utils.path_remove(self._path)
                    except:
                        raise Exception("Shared file is locked.")
                else:
                    self._binit=True
                    return
            self._fields={}
            szdata=0
            for f in fieldsdef:
                self._fields[f["name"]]={"pos":szdata,"size":f["size"]}
                szdata+=f["size"]
            shead=json.dumps(self._fields)
            self._len_def=len(shead)
            self._size=4+self._len_def+szdata
            with utils.file_open(self._path, "wb") as f:
                f.write(b" "*self._size)
            if fixperm is not None:
                fixperm(self._path)
            self._file=utils.file_open(self._path, "r+b")
            self._mmap = mmap.mmap(self._file.fileno(), 0)
            self._mmap.seek(0)
            self._mmap.write(struct.pack('!i', self._len_def))
            self._mmap.write(utils.str_to_bytes(shead))
            self._binit=True
        finally:
            self._semaphore.release()
    
    def exists(self, fname, bpath=None):
        return utils.path_exists(process_manager._get_property_path(fname, path=bpath))
    
    def open(self, fname, bpath=None):
        self._semaphore.acquire()
        try:
            if self._binit:
                raise Exception("Already initialized.")
            self._path = process_manager._get_property_path(fname, path=bpath)
            if not utils.path_exists(self._path):
                raise Exception("Shared file not found")
            self._file=utils.file_open(self._path, "r+b")
            self._mmap = mmap.mmap(self._file.fileno(), 0)
            self._mmap.seek(0)
            #Legge struttura
            self._len_def=struct.unpack('!i',self._mmap.read(4))[0]
            shead=utils.bytes_to_str(self._mmap.read(self._len_def),"utf8")
            self._fields = json.loads(shead)
            self._binit=True
        finally:
            self._semaphore.release()
    
    def close(self):
        self._semaphore.acquire()
        try:
            if self._binit:
                self._binit=False
                self._fields=None
                err=""
                try:
                    self._mmap.close()
                except:
                    e = utils.get_exception()
                    err+="Error map close:" + utils.exception_to_string(e) + "; "
                try:
                    self._file.close()
                except:
                    e = utils.get_exception()
                    err+="Error shared file close:" + utils.exception_to_string(e) + ";"
                if (err!=""):
                    raise Exception(err)
        finally:
            self._semaphore.release()
    
    def is_close(self):
        self._semaphore.acquire()
        try:
            return not self._binit;
        finally:
            self._semaphore.release()
    
    def set_property(self, name, val):
        self._semaphore.acquire()
        try:
            if self._binit:
                if name in self._fields:
                    f=self._fields[name]
                    if len(val)<=f["size"]:
                        self._mmap.seek(4+self._len_def+f["pos"])
                        appv=val + " "*(f["size"]-len(val)) 
                        self._mmap_write(appv)
                    else:
                        raise Exception("Invalid size for property " + name + ".")
                else:
                    raise Exception("Property " + name + " not found.")
            else:
                raise Exception("Not initialized.")
        finally:
            self._semaphore.release()
    
    def get_property(self, name):
        self._semaphore.acquire()
        try:
            if self._binit:
                if name in self._fields:
                    f=self._fields[name]
                    self._mmap.seek(4+self._len_def+f["pos"])
                    sret = self._mmap_read(f["size"])
                    return sret.strip() 
                else:
                    raise Exception("Property " + name + " not found.")
            else:
                raise Exception("Not initialized.")
        finally:
            self._semaphore.release()


class ProcessManager(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self,name="IPCProcessManager")
        self.daemon=True                
        self._lock=threading.RLock()
        #self._list_release_obj=[]
        self._list_process=[]
        self._bdestroy=False
            
    def _get_release_path(self,name,path=None):
        if path is None:
            return IPC_PATH + utils.path_sep + name + ".rls"
        else:
            return path + utils.path_sep + IPC_PATH + utils.path_sep + name + ".rls"
    
    def _get_config_path(self,name,path=None):
        if path is None:
            return IPC_PATH + utils.path_sep + name + ".cfg"
        else:
            return path + utils.path_sep + IPC_PATH + utils.path_sep + name + ".cfg"
    
    def _get_memmap_path(self,name,path=None):
        if path is None:
            return IPC_PATH + utils.path_sep + name + ".mmp"
        else:
            return path + utils.path_sep + IPC_PATH + utils.path_sep + name + ".mmp"
    
    def _get_property_path(self,name,path=None):
        if path is None:
            return IPC_PATH + utils.path_sep + name + ".shm"
        else:
            return path + utils.path_sep + IPC_PATH + utils.path_sep + name + ".shm"
    
    
    def _destroy_process_by_shared_obj(self, obj):
        tocloselist=[]
        with self._lock:
            for prc in self._list_process:
                if prc._contains_shared_object(obj):
                    tocloselist.append(prc)
        
        for prc in tocloselist:
            try:
                prc.close()                
            except:
                e = utils.get_exception()
                print("IPC manager _destroy_process_by_shared_obj error: " + utils.exception_to_string(e))
        
    def _add_process(self, prc):
        with self._lock:
            self._list_process.append(prc)
    
    def destory(self):
        self._bdestroy=True
            
    def run(self):
        try:
            while not self._bdestroy:
                time.sleep(1)
                if is_load_libbase():
                    #CHECK PROCESS
                    remlist=[]
                    lstprcs={}
                    with self._lock:
                        lstprcs=copy.copy(self._list_process)
                        
                    for prc in lstprcs:
                        try:
                            if prc._check_close():
                                remlist.append(prc)                        
                        except:
                            e = utils.get_exception()
                            print("IPC manager process check close error: " + utils.exception_to_string(e))
                            remlist.append(prc)
                    
                    #REMOVE PROCESS
                    with self._lock:
                        for prc in remlist:
                            self._list_process.remove(prc)
                            #print("PROCES REMOVED " + str(prc))                
                
        except:
            #ex = utils.get_exception()
            #print(utils.exception_to_string(ex))
            None #Sometime shutdown error (most likely raised during interpreter shutdown) errore: <type 'exceptions.TypeError'>: 'NoneType' object is not callable
        
process_manager=ProcessManager()
    
class ProcessConfig():
    
    def __init__(self):
        #STATUS: I=Init  O=OPEN  C=CLOSE
        self.POS_STATUS_PARENT=0
        self.POS_PID_PARENT=self.POS_STATUS_PARENT+1
        self.POS_STATUS_CHILD=self.POS_PID_PARENT+4
        self.POS_PID_CHILD=self.POS_STATUS_CHILD+1
        self.POS_ALIVE_TIME=self.POS_PID_CHILD+4
        self.POS_RUN_INFO=self.POS_ALIVE_TIME+8
        self._key=None   
        self._bclose=True             
    
    def create(self, prc, fixperm=None):        
        self._bcreate=True
        self._process=prc
        self._fixperm=fixperm
        _ipcmap["semaphore"].acquire()
        try:
            while True:
                spid=str(os.getpid())
                self._key = "dwa_" + spid + "_" + _rndseq(10)
                pth = process_manager._get_config_path(self._key)
                if not os.path.exists(pth):
                    break
            with utils.file_open(pth, "wb") as f:
                f.write(utils.bytes_new())
            _fix_perm_path(pth,fixperm)
        finally:
            _ipcmap["semaphore"].release()
        with utils.file_open(pth, "r+b") as f:
            f.write(struct.pack("!cIcIQI",b"I",os.getpid(),b"I",0,int(time.time()*1000),0))
        
        self._bclose=False
    
    def open(self, key):
        self._bcreate=False
        self._process=None
        self._key=key        
        pth = process_manager._get_config_path(self._key)
        if not os.path.exists(pth):
            self._key=None
            raise Exception("File config missing.")
        pth = process_manager._get_config_path(self._key)
        with utils.file_open(pth, "r+b") as f:
            f.seek(self.POS_PID_CHILD)
            f.write(struct.pack("!I",os.getpid()))
        self._bclose=False
        
    def set_status_parent(self, s):
        pth = process_manager._get_config_path(self._key)
        with utils.file_open(pth, "r+b") as f:
            f.seek(self.POS_STATUS_PARENT)
            f.write(s)
        
    def get_status_child(self):
        pth = process_manager._get_config_path(self._key)
        with utils.file_open(pth, "r+b") as f:
            f.seek(self.POS_STATUS_CHILD)
            return f.read(1)
    
    def set_status_child(self, s):
        pth = process_manager._get_config_path(self._key)
        with utils.file_open(pth, "r+b") as f:
            f.seek(self.POS_STATUS_CHILD)
            f.write(s)            
        
    def get_pid_child(self):
        pth = process_manager._get_config_path(self._key)
        with utils.file_open(pth, "r+b") as f:
            f.seek(self.POS_PID_CHILD)
            return struct.unpack("!I",f.read(4))[0]    
    
    def get_status_parent_and_alive_time(self):
        pth = process_manager._get_config_path(self._key)
        with utils.file_open(pth, "r+b") as f:
            f.seek(self.POS_STATUS_PARENT)
            s = f.read(1)
            f.seek(self.POS_ALIVE_TIME)
            t= struct.unpack("!Q",f.read(8))[0]
            return(s,t)
    
    def set_alive_time(self):
        pth = process_manager._get_config_path(self._key)
        with utils.file_open(pth, "r+b") as f:
            f.seek(self.POS_ALIVE_TIME)
            f.write(struct.pack("!Q",int(time.time()*1000)))
    
    def set_run_info(self, oconf):
        pth = process_manager._get_config_path(self._key)
        with utils.file_open(pth, "r+b") as f:
            f.seek(self.POS_RUN_INFO+4)
            apps = _dump_obj(oconf,self._process)
            f.write(apps)
            f.seek(self.POS_RUN_INFO)
            f.write(struct.pack("!I",len(apps)))
        self._process=None            
    
    def get_run_info(self):
        pth = process_manager._get_config_path(self._key)
        with utils.file_open(pth, "r+b") as f:
            f.seek(self.POS_RUN_INFO)
            ln = struct.unpack("!I",f.read(4))[0]
            if ln>0:
                oconf=_load_obj(f.read(ln))
                f.seek(self.POS_RUN_INFO)
                f.write(struct.pack("!I",0))
                f.write(b" "*ln)
                f.flush()
                return oconf
            else:
                return {}
    
    def is_close(self):
        return self._bclose
    
    def close(self):
        if not self._bclose:
            self._bclose=True
            if self._bcreate:
                pth = process_manager._get_config_path(self._key)
                if os.path.exists(pth):
                    if utils.path_exists(pth):
                        utils.path_remove(pth)
            self._key=None
            self._process=None
    
    def get_key(self):
        return self._key

class Process():
    
    def __init__(self, pkg, cls, args=None, fixperm=None,forcesubprocess=False):
        self._process=None
        self._ppid=None
        self._pkg=pkg
        self._cls=cls
        self._args=args
        if self._args is None:
            self._args=[]
        self._fixperm=fixperm
        self._forcesubprocess=forcesubprocess
        self._stream=None
        self._binit=False
        self._bclose=False
        self._tdclose=None
        self._config=None
        self._lock=threading.RLock()
        self._list_shared_obj=[]
        self._tdchild=None
        self._py_exe_path=None
        self._py_home_path=None        
    
    def __del__(self):
        self._stream=None
        self._process=None
        self._ppid=None
    
    def _add_shared_obj(self, obj):
        with self._lock:
            self._list_shared_obj.append(obj)
            
    def _contains_shared_object(self, obj):
        with self._lock:
            if self._list_shared_obj is not None:
                return obj in self._list_shared_obj
        return False
    
    def get_fixperm(self):
        return self._fixperm
    
    def get_pid(self):
        return self._ppid
    
    def _create_process(self, args):
        if utils.is_windows() and not self._forcesubprocess:
            appcmd=u"\"" + self._py_exe_path + u"\" -S -m agent " + utils.str_new(args[2]) + u" " + utils.str_new(args[3])            
            self._process=None
            self._ppid = native.get_instance().start_process(appcmd,self._py_home_path)
            if self._ppid==-1:
                self._ppid=None
                raise Exception("Start process error")
        elif utils.is_linux():
            libenv = os.environ
            if utils.path_exists("runtime"):
                libenv["LD_LIBRARY_PATH"]=utils.path_absname("runtime/lib")
            elif "LD_LIBRARY_PATH" in os.environ:
                libenv["LD_LIBRARY_PATH"]=os.environ["LD_LIBRARY_PATH"]
            self._process=subprocess.Popen(args, env=libenv)
            self._ppid=self._process.pid
        elif utils.is_mac():
            libenv = os.environ
            if utils.path_exists("runtime"):
                libenv["DYLD_LIBRARY_PATH"]=utils.path_absname("runtime/lib")
            elif "DYLD_LIBRARY_PATH" in os.environ:
                libenv["DYLD_LIBRARY_PATH"]=os.environ["DYLD_LIBRARY_PATH"]
            self._process=subprocess.Popen(args, env=libenv)
            self._ppid=self._process.pid
        else:
            self._process=subprocess.Popen(args)
            self._ppid=self._process.pid
    
    def _start_ipc(self):
        try:
            self._config=ProcessConfig()
            self._config.create(self, self._fixperm)
            #START CHILD PROCESS
            self._py_exe_path=utils.str_new(sys.executable) 
            if utils.is_windows():
                #sys.executable don't work well with unicode path
                self._py_home_path=u""
                appth="native\\service.properties"
                if (utils.path_exists(appth)):
                    f = utils.file_open(appth, 'r', encoding='utf-8')
                    sprop = f.read()
                    f.close()
                    lns = sprop.splitlines()
                    for line in lns:
                        if line.startswith("pythonPath="):
                            self._py_exe_path=utils.str_new(line[11:])
                        elif line.startswith("pythonHome="):
                            self._py_home_path=utils.str_new(line[11:])   
                                     
            self._create_process([self._py_exe_path, u"agent.py", u"app=ipc", self._config.get_key()])
            #WAIT CHILD PROCESS
            cnt=utils.Counter()
            cnt_timeout=15
            while True:
                if not self.is_running():
                    raise Exception("Process closed (child pid).")
                try:
                    apppid=self._config.get_pid_child()
                    if apppid!=0:
                        self._ppid=apppid
                        break
                except:
                    None
                if cnt.is_elapsed(cnt_timeout):
                    raise Exception("Start process timeout")
                time.sleep(0.5)                
            
            self._stream = Stream({"fixperm":self._fixperm})
            oconf={}
            oconf["package"]=self._pkg
            oconf["class"]=self._cls
            oconf["arguments"]=self._args
            oconf["stream"]=self._stream
            oconf["aliveTime"]=time.time()
            self._config.set_run_info(oconf)
            self._config.set_status_parent(b"O")
            while True:
                if not self.is_running():
                    raise Exception("Process closed (child status).")
                try:
                    stcl=self._config.get_status_child()
                    if stcl==b"O":
                        break
                    elif stcl==b"C":
                        raise Exception("Process closed (child status).")
                except:
                    None
                if cnt.is_elapsed(cnt_timeout):
                    raise Exception("Start process timeout")
                time.sleep(0.5)
            process_manager._add_process(self)
            #print("STARTED " + str(self._ppid) + " self._cls:" + self._cls)
        except:
            ex = utils.get_exception()
            try:
                self._config.set_status_parent(b"C")
                self._config.close()
            except:
                ex1 = utils.get_exception()
                print("_start_ipc close config file - err: " + str(ex1))
            self._kill()
            if self._stream is not None:
                self._stream.close()
                self._stream=None
            raise ex    
    
    def _start_thp(self):
        try:
            self._stream = Stream()
            pkn=self._pkg.rsplit('.',1)[0]
            if pkn==self._pkg:
                pkn=None                    
            cls = self._cls
            objlib = importlib.import_module(self._pkg,pkn)
            cls = getattr(objlib, cls, None)                    
            cstrm = _load_obj(_dump_obj(self._stream, None))
            self._tdchild = cls(cstrm,self._args)
            self._tdchild.start()
        except:
            ex = utils.get_exception()
            self._tdchild=None
            if self._stream is not None:
                self._stream.close()
                self._stream=None                
            raise ex
        
    
    def start(self):
        if self._binit:
            raise Exception("Process already initialized.")
        self._binit=True
        if is_load_libbase():
            self._start_ipc()
        else:
            self._start_thp()
        return self._stream

    def is_running(self):
        if is_load_libbase():
            try:
                if self._process!=None:
                    if self._process.poll() == None:
                        return True
                    else:
                        return False
            except:
                None
            if self._ppid!=None:
                if native.get_instance().is_task_running(self._ppid):
                    return True
        elif self._tdchild is not None:
            try:
                return self._tdchild.is_alive()
            except:
                None            
        return False

    def join(self, timeout=None):
        if is_load_libbase():
            cnt=utils.Counter() 
            while self.is_running():
                if timeout is not None and cnt.is_elapsed(timeout):
                    return
                time.sleep(0.5)
            self._stream=None
            self._process=None
            self._ppid=None
        elif self._tdchild is not None:
            self._tdchild.join(timeout)
            self._stream=None
            self._tdchild=None            
    
    def close(self):
        if not self._bclose:
            self._bclose=True
            if self.is_running():
                if is_load_libbase():
                    if self._tdclose is None:
                        try:
                            if self._config is not None:
                                self._config.set_status_parent(b"C")
                        except:
                            None
                        if self._stream is not None: 
                            self._stream.close()
                            self._stream=None
                        self._tdclose=threading.Thread(target=self._close_wait, name="IPCProcessClose")
                        self._tdclose.start()
                else:
                    if self._stream is not None: 
                        self._stream.close()
                        self._stream=None
                    self._tdchild.join(2)
                    self._tdchild=None
            else:
                if self._stream is not None: 
                    self._stream.close()
                    self._stream=None
                self._process=None
                self._ppid=None   
                self._tdchild=None
        
    def _close_wait(self):
        cnt=utils.Counter() 
        while self.is_running():
            if cnt.is_elapsed(5):
                break
            time.sleep(1)
        self._kill()
    
    def _check_close(self):
        if self._config is None:
            return True
        if self.is_running():
            self._config.set_alive_time()
        else:
            self._bclose=True
            stcl=self._config.get_status_child()
            try:
                self._config.close()
            except:
                ex = utils.get_exception()
                print("_check_close config file - err: " + utils.exception_to_string(ex))
            self._config=None
            if stcl==b"C":
                with self._lock:
                    self._list_shared_obj=None                                        
            else:
                #PROCESS TERMINATED ABNORMALLY
                lstshobj=None
                with self._lock:
                    lstshobj=self._list_shared_obj
                    self._list_shared_obj=None
                #CLOSE ALL PROCESS THAT USE SHARE OBJECT
                if lstshobj is not None:
                    for i in reversed(range(len(lstshobj))):
                        try:
                            obj=lstshobj[i]
                            process_manager._destroy_process_by_shared_obj(obj)
                        except:
                            ex = utils.get_exception()
                            print("_check_close close other process shared obj:  " + str(obj) + " - err: " + utils.exception_to_string(ex))
                    #DESTROY OBJECT (RELEASE LOCKS)
                    for i in reversed(range(len(lstshobj))):
                        try:
                            obj=lstshobj[i]
                            obj._destroy()
                        except:
                            ex = utils.get_exception()
                            print("_check_close destroy shared obj:  " + str(obj) + " - err: " + utils.exception_to_string(ex))                    
            self._stream=None
            self._process=None
            self._ppid=None            
            return True
        return False

    def _kill(self):
        if self.is_running():
            if self._stream is not None:
                self._stream.close()
                self._stream=None
            if self._process!=None:
                self._process.kill()
                self._process.poll()
                time.sleep(1)
            if self._ppid!=None:
                native.get_instance().task_kill(self._ppid)
        self._process=None
        self._ppid=None
        

class ProcessInActiveConsole(Process):
        def __init__(self, mdl, func, args=None, forcesubprocess=False):
            Process.__init__(self, mdl, func, args, self._process_fix_perm, forcesubprocess)
            self._forcesubprocess=forcesubprocess
            self._currentconsole=None
            self._currentconsolecounter=utils.Counter()
            
        
        def _process_fix_perm(self):
            jo={}
            appconsole = self._currentconsole
            if (utils.is_mac() or utils.is_linux()) and appconsole!=None and "uid" in appconsole and appconsole["uid"]!=os.getuid():
                jo["mode"]=stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH
            return jo
        
        def _get_linux_envirionment(self,uid,tty):
            bwaylanderr=False
            lstret={}
            
            #DETECT BY PROCESS
            if uid!=-1:       
                lst = native.get_instance().get_process_ids()
                try:
                    bok=False
                    cnt = utils.Counter()
                    while not bok and cnt.get_value()<=2:
                        for pid in lst:
                            if native.get_instance().get_process_uid(pid)==uid:
                                lstret={}
                                arenv = native.get_instance().get_process_environ(pid)
                                for apps in arenv:                        
                                    if apps=="XAUTHORITY" or apps=="DISPLAY" or apps.startswith("WAYLAND_") or apps.startswith("XDG_") or apps.startswith("LC_") or apps.startswith("LANG"):
                                        lstret[apps]=arenv[apps]
                                        #print("DETECT BY PROCESS- " + apps + ": " + lstret[apps])                                        
                                if ("DISPLAY" in lstret and "XAUTHORITY" in lstret):                                    
                                    bok=True
                                    break
                                lstret={}
                        time.sleep(0.5)
                except:
                    lstret={}
            
            #DETECT BY WHAT OF w COMMAND
            swhatcmd=None
            if uid!=-1:            
                try:
                    import pwd
                    pwinfo=pwd.getpwuid(uid)
                    if pwinfo is not None and pwinfo.pw_name is not None:
                        data = subprocess.Popen(["w"], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
                        so, se = data.communicate()
                        if so is not None and len(so)>0:
                            so=utils.bytes_to_str(so, "utf8")
                            ar = so.split("\n")
                            del ar[0]
                            bhead=True
                            pwhat=-1
                            for s in ar:
                                if bhead:
                                    #DETECT WHAT position
                                    bhead=False
                                    pwhat = s.upper().index("WHAT")                                
                                elif pwhat>=0 and s.split(" ")[0].rstrip(" ")==pwinfo.pw_name:
                                    swhatcmd = s[pwhat:].lstrip(" ").rstrip(" ")
                                    break
                except:
                    None
            if swhatcmd is not None:
                try:
                    lst = native.get_instance().get_process_ids()
                    for pid in lst:
                        sst = native.get_instance().get_process_stat(pid)
                        if native.get_instance().get_process_uid(pid)==uid:
                            bok=False
                            lret = native.get_instance().get_process_cmdline(pid)
                            lcmd=" ".join(lret).lstrip(" ").rstrip(" ")
                            if lcmd==swhatcmd:
                                arenv = native.get_instance().get_process_environ(pid)
                                for apps in arenv:                        
                                    if apps=="XAUTHORITY" or apps=="DISPLAY" or apps.startswith("WAYLAND_") or apps.startswith("XDG_") or apps.startswith("LC_") or apps.startswith("LANG"):
                                        lstret[apps]=arenv[apps]
                                        #print("DETECT BY WHAT OF w COMMAND - " + apps + ": " + lstret[apps])
                                break
                                                
                except:
                    None
            
            #DETECT DISPLAY BY w COMMAND
            if uid!=-1:
                try:
                    import pwd
                    pwinfo=pwd.getpwuid(uid)
                    if pwinfo is not None and pwinfo.pw_name is not None:
                        data = subprocess.Popen(["w"], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
                        so, se = data.communicate()
                        if so is not None and len(so)>0:
                            so=utils.bytes_to_str(so, "utf8")
                            ar = so.split("\n")
                            del ar[0]
                            bhead=True
                            ptty=-1
                            for s in ar:
                                if bhead:
                                    #DETECT WHAT position
                                    bhead=False
                                    ptty = s.upper().index("TTY")                                
                                elif ptty>=0 and s.split(" ")[0].rstrip(" ")==pwinfo.pw_name:
                                    sdisplay = s[ptty:]
                                    sdisplay=sdisplay[0:sdisplay.index(" ")]
                                    if len(sdisplay)==2:
                                        if sdisplay[0]==":" and sdisplay[1].isdigit():
                                            sdsp=sdisplay
                                    elif len(sdisplay)==4:
                                        if sdisplay[0]==":" and sdisplay[1].isdigit() and sdisplay[2]=="." and sdisplay[3].isdigit():
                                            sdsp=sdisplay
                                    if sdsp is not None:
                                        lstret["DISPLAY"] = sdsp
                                        #print("DETECT DISPLAY BY w COMMAND - DISPLAY: " + lstret["DISPLAY"])
                                        break
                except:
                    None
            
            #DETECT BY CMDLINE
            try:
                if tty is not None:
                    st = os.stat("/dev/" + tty)
                lst = native.get_instance().get_process_ids()
                for pid in lst:
                    sst = native.get_instance().get_process_stat(pid)
                    if (tty is None or sst["tty"]==st.st_rdev) and (uid==-1 or native.get_instance().get_process_uid(pid)==uid):
                        lret = native.get_instance().get_process_cmdline(pid)
                        bok=False
                        sxauth=None
                        sdsp=None
                        for i in range(len(lret)):
                            if i==0:
                                scmd = lret[i]
                                arcmd = scmd.split("/")
                                if len(arcmd)>0:
                                    scmd=arcmd[len(arcmd)-1]
                                    if scmd.upper()=="X" or "XORG" in scmd.upper():
                                        bok=True
                                    elif scmd.upper()=="XWAYLAND":
                                        bwaylanderr=True
                            if bok:
                                sitm = lret[i]
                                if i>0 and lret[i-1]=="-auth":
                                    sxauth=sitm
                                elif len(sitm)==2:
                                    if sitm[0]==":" and sitm[1].isdigit():
                                        sdsp=sitm
                                elif len(sitm)==4:
                                    if sitm[0]==":" and sitm[1].isdigit() and sitm[2]=="." and sitm[3].isdigit():
                                        sdsp=sitm
                        if sxauth is not None:
                            lstret["XAUTHORITY"] = sxauth                            
                            #print("DETECT BY CMDLINE - XAUTHORITY: " + lstret["XAUTHORITY"])                            
                        if sdsp is not None:
                            lstret["DISPLAY"] = sdsp
                            #print("DETECT BY CMDLINE - DISPLAY: " + lstret["DISPLAY"])
                        if bok:
                            bwaylanderr=False
                            break
                
            except:
                None
            
            if bwaylanderr or (("XDG_SESSION_TYPE" in lstret) and (lstret["XDG_SESSION_TYPE"].upper()=="WAYLAND")):
                raise Exception("XWayland is not supported.")                
            
            if "DISPLAY" not in lstret:
                lstret["DISPLAY"]=":0"
                
            if "XAUTHORITY" in lstret:
                sxauth = lstret["XAUTHORITY"]
                if not os.path.exists(sxauth):
                    try:
                        p = sxauth.rindex("/")
                        if p>=0:
                            sxauthdir = sxauth[0:p]
                            os.makedirs(sxauthdir, 0o700)
                            fd = os.open(sxauth,os.O_RDWR|os.O_CREAT, 0o600)
                            os.close(fd)                                                        
                    except:
                        None
            
            if "XAUTHORITY" not in lstret and (uid!=-1 or tty is not None): 
                return self._get_linux_envirionment(-1, None)
            
            '''
            if "DISPLAY" in lstret:
                print("DISPLAY: " + lstret["DISPLAY"])
            if "XAUTHORITY" in lstret:
                print("XAUTHORITY: " + lstret["XAUTHORITY"])
            '''
            
            return lstret
        
        def _load_linux_console_info(self,appconsole):
            if appconsole is not None:
                stty=appconsole["tty"]
                #print("\n\nTTY: " + stty)
                pwinfo=None
                try:
                    import pwd
                    if os.getuid()==0 and "cktype" in appconsole and appconsole["cktype"]!="":
                        if appconsole["cktype"]=="USER_NAME":
                            pwinfo=pwd.getpwnam(appconsole["ckvalue"])
                        elif appconsole["cktype"]=="USER_ID":
                            pwinfo=pwd.getpwuid(appconsole["ckvalue"])
                    else:
                        pwinfo=pwd.getpwuid(os.getuid())
                except:
                    None
                
                appuid=-1
                libenv={}
                if pwinfo is not None:
                    #print("uid: " + str(pwinfo.pw_uid))                                    
                    appconsole["user"] = pwinfo.pw_name
                    appconsole["uid"] = pwinfo.pw_uid
                    appconsole["gid"] = pwinfo.pw_gid
                    appconsole["home"] = pwinfo.pw_dir
                    appuid=pwinfo.pw_uid
                else:
                    libenv = os.environ
                
                lstret = self._get_linux_envirionment(appuid, stty)
                for k in lstret:
                    libenv[k]=lstret[k]
                if pwinfo is not None:
                    libenv['HOME'] = appconsole["home"]
                    libenv['LOGNAME'] = appconsole["user"]
                    libenv['USER'] = appconsole["user"]
                appconsole["env"]=libenv
        
        def _fix_linux_lang(self,libenv):
            bok=False            
            if "LANG" in libenv:
                ar = libenv["LANG"].split(".")
                if len(ar)>1 and (ar[1].upper()=="UTF8" or ar[1].upper()=="UTF-8"):
                    bok=True
            if not bok:
                if "LC_ALL" in libenv:
                    ar = libenv["LC_ALL"].split(".")
                    if len(ar)>1 and (ar[1].upper()=="UTF8" or ar[1].upper()=="UTF-8"):
                        libenv["LANG"]=libenv["LC_ALL"]
                        bok=True
            if not bok:
                if "LC_NAME" in libenv:
                    ar = libenv["LC_NAME"].split(".")
                    if len(ar)>1 and (ar[1].upper()=="UTF8" or ar[1].upper()=="UTF-8"):
                        libenv["LANG"]=libenv["LC_NAME"]
                        bok=True
            if not bok:
                dlng = native.get_instance().get_utf8_lang()
                if dlng is not None:
                    libenv["LANG"]=dlng
            #print("_fix_linux_lang: " + str(libenv))            
        
        def _load_mac_console_info(self,appconsole):
            if appconsole is not None:
                pwinfo=None            
                try:
                    import pwd
                    if os.getuid()==0:
                        pwinfo=pwd.getpwuid(appconsole["uid"])
                    else:
                        pwinfo=pwd.getpwuid(os.getuid())
                except:
                    None                
                libenv = os.environ                
                if pwinfo is not None:
                    try:
                        appconsole["user"] = pwinfo.pw_name
                        appconsole["gid"] = pwinfo.pw_gid
                        appconsole["home"] = pwinfo.pw_dir
                        libenv['HOME'] = appconsole["home"]
                        libenv['LOGNAME'] = appconsole["user"]
                        libenv['USER'] = appconsole["user"]
                    except:
                        None
                appconsole["env"]=libenv
        
        def _init_process_demote(self,user_uid, user_gid):
            def set_ids():
                os.setgid(user_gid)
                os.setuid(user_uid)
            return set_ids        

        def _is_old_windows(self):
            return (utils.is_windows() and (native.get_instance().is_win_xp()==1 or native.get_instance().is_win_2003_server()==1))
        
        def is_change_console(self):
            if self._currentconsole is not None and self._currentconsolecounter.is_elapsed(1):
                self._currentconsolecounter.reset()
                appc=self._detect_console()
                if appc is not None:
                    if utils.is_windows():
                        if self._is_old_windows() and appc["id"]>0:
                            native.get_instance().win_station_connect()
                            time.sleep(1)
                            return True
                        elif appc["id"]!=self._currentconsole["id"]:
                            return True
                    elif utils.is_mac():
                        if appc["uid"]!=self._currentconsole["uid"]:
                            return True
                    elif utils.is_linux():
                        if appc["tty"]!=self._currentconsole["tty"]:
                            if appc["cktype"]=="" or appc["cktype"]!=self._currentconsole["cktype"]:
                                return True
                            else:
                                return appc["ckvalue"]!=self._currentconsole["ckvalue"]
            return False
        
        def _detect_console(self):
            if utils.is_windows():
                return {"id": native.get_instance().get_active_console_id()}            
            elif utils.is_mac():
                return {"uid": native.get_instance().get_console_user_id()}            
            elif utils.is_linux():
                try:
                    ar={}
                    stty=native.get_instance().get_tty_active()
                    if stty is not None:
                        ar["tty"] = stty
                        ar["cktype"] = ""
                        ar["ckvalue"] = ""
                        try:
                            if os.getuid()==0:
                                sbuf = None
                                offset = 0                        
                                with open('/var/run/utmp', 'rb') as fd:
                                    sbuf = fd.read()
                                if sbuf is not None:
                                    while offset < len(sbuf):
                                        arutmp = _struct_utmp.unpack_from(sbuf, offset)
                                        stype=arutmp[0]
                                        if stype==7: #USER_PROCESS
                                            appstty=utils.bytes_to_str(arutmp[2].rstrip(b'\0'),"utf8")
                                            if appstty==stty:
                                                ar["cktype"]="USER_NAME"
                                                ar["ckvalue"]=utils.bytes_to_str(arutmp[4].rstrip(b'\0'),"utf8")
                                                break                                     
                                        offset += _struct_utmp.size
                        except:
                            None
                        if ar["cktype"]=="":
                            try:    
                                st = os.stat("/dev/" + stty)
                                ar["cktype"]="USER_ID"
                                ar["ckvalue"]=st.st_uid
                            except:
                                None
                        #print("_detect_console_:" + ar["cktype"] + " " + str(ar["ckvalue"]))
                        return ar
                except:
                    None 
                
            return None
                        
        def _create_process(self, args):        
            if utils.is_windows():
                if self._forcesubprocess:
                    self._currentconsole=None
                    self._process=subprocess.Popen(args)
                    self._ppid=self._process.pid
                else:
                    '''
                    runaselevatore=u"False"
                    if self._get_screen_module().DWAScreenCaptureIsUserInAdminGroup()==1:
                        if self._get_screen_module().DWAScreenCaptureIsRunAsAdmin()==1:
                            if self._get_screen_module().DWAScreenCaptureIsProcessElevated()==1:
                                runaselevatore=u"True"
                    '''            
                    appcmd=u"\"" + self._py_exe_path + u"\" -S -m agent " + utils.str_new(args[2]) + u" " + utils.str_new(args[3]) #+ u" " + TMP_str_new(str(self._agent_main._agent_debug_mode)) + u" windows " + runaselevatore            
                    self._process=None
                    self._ppid = native.get_instance().start_process_in_active_console(appcmd,self._py_home_path)
                    if self._ppid==-1:
                        self._ppid=None
                        self._currentconsole=None
                        raise Exception("Start process error")
            elif utils.is_linux():
                bfaultback=True
                if self._currentconsole!=None and "env" in self._currentconsole:
                    try:
                        libenv=self._currentconsole["env"]
                        if utils.path_exists("runtime"):
                            libenv["LD_LIBRARY_PATH"]=utils.path_absname("runtime/lib")
                        elif "LD_LIBRARY_PATH" in os.environ:
                            libenv["LD_LIBRARY_PATH"]=os.environ["LD_LIBRARY_PATH"]
                        self._fix_linux_lang(libenv)
                        self._process=subprocess.Popen(args, env=libenv, preexec_fn=self._init_process_demote(self._currentconsole["uid"], self._currentconsole["gid"]))                        
                        self._ppid=self._process.pid
                        bfaultback=False
                    except:
                        None
                if bfaultback:
                    libenv = os.environ
                    lstret = self._get_linux_envirionment(-1, None)
                    for k in lstret:
                        libenv[k]=lstret[k]
                    if utils.path_exists("runtime"):
                        libenv["LD_LIBRARY_PATH"]=utils.path_absname("runtime/lib")
                    elif "LD_LIBRARY_PATH" in os.environ:
                        libenv["LD_LIBRARY_PATH"]=os.environ["LD_LIBRARY_PATH"]
                    self._fix_linux_lang(libenv)
                    self._process=subprocess.Popen(args, env=libenv)
                    self._ppid=self._process.pid
                    
            elif utils.is_mac():
                bfaultback=True
                self._ppid=None
                if not self._forcesubprocess:
                    if not hasattr(native.get_instance(), "is_old_guilnc") or native.get_instance().is_old_guilnc():                
                        #GUI LAUNCHER OLD VERSION 03/11/2021 (DO NOT REMOVE)
                        if self._currentconsole!=None and "uid" in self._currentconsole:
                            self._ppid=native.get_instance().exec_guilnc(self._currentconsole["uid"],"ipc",[args[3]])
                    else:
                        if self._currentconsole!=None and "env" in self._currentconsole:
                            try:
                                libenv=self._currentconsole["env"]
                                if utils.path_exists("runtime"):
                                    libenv["DYLD_LIBRARY_PATH"]=utils.path_absname("runtime/lib")
                                elif "DYLD_LIBRARY_PATH" in os.environ:
                                    libenv["DYLD_LIBRARY_PATH"]=os.environ["DYLD_LIBRARY_PATH"]
                                self._process=subprocess.Popen(args, env=libenv, preexec_fn=self._init_process_demote(self._currentconsole["uid"], self._currentconsole["gid"]))                        
                                self._ppid=self._process.pid
                                bfaultback=False
                            except:
                                None
                                                
                if self._ppid is not None:
                    self._process = None
                    bfaultback=False                                    
                if bfaultback:
                    libenv = os.environ
                    if utils.path_exists("runtime"):
                        libenv["DYLD_LIBRARY_PATH"]=utils.path_absname("runtime/lib")
                    elif "DYLD_LIBRARY_PATH" in os.environ:
                        libenv["DYLD_LIBRARY_PATH"]=os.environ["DYLD_LIBRARY_PATH"]
                    self._process=subprocess.Popen(args, env=libenv)
                    self._ppid=self._process.pid
                    
                
        def _start_ipc(self):
            try:            
                self._currentconsole=self._detect_console()
                if utils.is_linux():                
                    self._load_linux_console_info(self._currentconsole)
                elif utils.is_mac():
                    self._load_mac_console_info(self._currentconsole)
                Process._start_ipc(self)
                self._currentconsolecounter.reset()
            except:
                ex = utils.get_exception()
                self._currentconsole=None
                raise ex

class ChildProcessThread(threading.Thread):
    
    def _get_thread_name(self):
        return type(self).__name__
    
    def _on_init(self):
        None
    
    def __init__(self, strm, args):
        threading.Thread.__init__(self,  name=self._get_thread_name())
        self._stream=strm
        self._args=args
        self._destroy=False
        self._on_init()
    
    def get_stream(self):
        return self._stream
    
    def get_arguments(self):
        return self._args
    
    def is_destroy(self):
        return self._destroy or self._stream.is_closed()
    
    def destroy(self):
        self._destroy=True
        self._stream.close()

def ctrlHandler(ctrlType):    
    return 1


def fmain(args): #SERVE PER MACOS APP
    if utils.is_windows():
        try:
            #Evita che si chiude durante il logoff
            HandlerRoutine = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_uint)(ctrlHandler)
            ctypes.windll.kernel32.SetConsoleCtrlHandler(HandlerRoutine, 1)
        except:
            None
    
    #fk = args[1]
    waittm=0.5
    parentAliveTime=None
    parentAliveCounter=utils.Counter()
    parentAliveTimeout=15    
    tdchild=None 
    #oconf={}
    conf=ProcessConfig()
    try:
        conf.open(args[1])
        while ((not parentAliveCounter.is_elapsed(parentAliveTimeout)) and (tdchild is None or tdchild.is_alive())):
            appst, apptm = conf.get_status_parent_and_alive_time()
            apptm = apptm*1000.0
            if parentAliveTime is None or parentAliveTime!=apptm:
                    parentAliveTime=apptm
                    parentAliveCounter.reset()
            if tdchild is None and appst==b"O":
                oconf=conf.get_run_info()            
                pkn = oconf["package"].rsplit('.',1)[0]
                if pkn == oconf["package"]:
                    pkn=None                    
                cls = oconf["class"]
                objlib = importlib.import_module(oconf["package"],pkn)
                cls = getattr(objlib, cls, None)                    
                cstrm = oconf["stream"]
                cargs = oconf["arguments"]
                if cls is not None:
                    tdchild = cls(cstrm,cargs)
                    tdchild.start()
                    conf.set_status_child(b"O")
                    waittm=1.0
                else:
                    break                    
            if appst==b"C":
                break            
            time.sleep(waittm)           
    except:
        ex = utils.get_exception()
        print(utils.exception_to_string(ex))
    if tdchild is not None:
        try:
            tdchild.destroy()
            tdchild.join(5)
        except:
            None
    _destroy_child_shared_obj()
    if not conf.is_close():
        conf.set_status_child(b"C")
    conf.close()
    
    
     
    
                                                                                                                                                                                                                                                                                                                                                                                                                                                  LICENSES/                                                                                           0000755 0001750 0001750 00000000000 14446054645 011565  5                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 LICENSES/ui                                                                                         0000644 0001750 0001750 00000041313 13422307023 012107  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 Mozilla Public License Version 2.0
==================================

1. Definitions
--------------

1.1. "Contributor"
    means each individual or legal entity that creates, contributes to
    the creation of, or owns Covered Software.

1.2. "Contributor Version"
    means the combination of the Contributions of others (if any) used
    by a Contributor and that particular Contributor's Contribution.

1.3. "Contribution"
    means Covered Software of a particular Contributor.

1.4. "Covered Software"
    means Source Code Form to which the initial Contributor has attached
    the notice in Exhibit A, the Executable Form of such Source Code
    Form, and Modifications of such Source Code Form, in each case
    including portions thereof.

1.5. "Incompatible With Secondary Licenses"
    means

    (a) that the initial Contributor has attached the notice described
        in Exhibit B to the Covered Software; or

    (b) that the Covered Software was made available under the terms of
        version 1.1 or earlier of the License, but not also under the
        terms of a Secondary License.

1.6. "Executable Form"
    means any form of the work other than Source Code Form.

1.7. "Larger Work"
    means a work that combines Covered Software with other material, in 
    a separate file or files, that is not Covered Software.

1.8. "License"
    means this document.

1.9. "Licensable"
    means having the right to grant, to the maximum extent possible,
    whether at the time of the initial grant or subsequently, any and
    all of the rights conveyed by this License.

1.10. "Modifications"
    means any of the following:

    (a) any file in Source Code Form that results from an addition to,
        deletion from, or modification of the contents of Covered
        Software; or

    (b) any new file in Source Code Form that contains any Covered
        Software.

1.11. "Patent Claims" of a Contributor
    means any patent claim(s), including without limitation, method,
    process, and apparatus claims, in any patent Licensable by such
    Contributor that would be infringed, but for the grant of the
    License, by the making, using, selling, offering for sale, having
    made, import, or transfer of either its Contributions or its
    Contributor Version.

1.12. "Secondary License"
    means either the GNU General Public License, Version 2.0, the GNU
    Lesser General Public License, Version 2.1, the GNU Affero General
    Public License, Version 3.0, or any later versions of those
    licenses.

1.13. "Source Code Form"
    means the form of the work preferred for making modifications.

1.14. "You" (or "Your")
    means an individual or a legal entity exercising rights under this
    License. For legal entities, "You" includes any entity that
    controls, is controlled by, or is under common control with You. For
    purposes of this definition, "control" means (a) the power, direct
    or indirect, to cause the direction or management of such entity,
    whether by contract or otherwise, or (b) ownership of more than
    fifty percent (50%) of the outstanding shares or beneficial
    ownership of such entity.

2. License Grants and Conditions
--------------------------------

2.1. Grants

Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:

(a) under intellectual property rights (other than patent or trademark)
    Licensable by such Contributor to use, reproduce, make available,
    modify, display, perform, distribute, and otherwise exploit its
    Contributions, either on an unmodified basis, with Modifications, or
    as part of a Larger Work; and

(b) under Patent Claims of such Contributor to make, use, sell, offer
    for sale, have made, import, and otherwise transfer either its
    Contributions or its Contributor Version.

2.2. Effective Date

The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.

2.3. Limitations on Grant Scope

The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:

(a) for any code that a Contributor has removed from Covered Software;
    or

(b) for infringements caused by: (i) Your and any other third party's
    modifications of Covered Software, or (ii) the combination of its
    Contributions with other software (except as part of its Contributor
    Version); or

(c) under Patent Claims infringed by Covered Software in the absence of
    its Contributions.

This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).

2.4. Subsequent Licenses

No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).

2.5. Representation

Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.

2.6. Fair Use

This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.

2.7. Conditions

Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.

3. Responsibilities
-------------------

3.1. Distribution of Source Form

All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.

3.2. Distribution of Executable Form

If You distribute Covered Software in Executable Form then:

(a) such Covered Software must also be made available in Source Code
    Form, as described in Section 3.1, and You must inform recipients of
    the Executable Form how they can obtain a copy of such Source Code
    Form by reasonable means in a timely manner, at a charge no more
    than the cost of distribution to the recipient; and

(b) You may distribute such Executable Form under the terms of this
    License, or sublicense it under different terms, provided that the
    license for the Executable Form does not attempt to limit or alter
    the recipients' rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).

3.4. Notices

You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.

4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------

If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.

5. Termination
--------------

5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.

5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.

************************************************************************
*                                                                      *
*  6. Disclaimer of Warranty                                           *
*  -------------------------                                           *
*                                                                      *
*  Covered Software is provided under this License on an "as is"       *
*  basis, without warranty of any kind, either expressed, implied, or  *
*  statutory, including, without limitation, warranties that the       *
*  Covered Software is free of defects, merchantable, fit for a        *
*  particular purpose or non-infringing. The entire risk as to the     *
*  quality and performance of the Covered Software is with You.        *
*  Should any Covered Software prove defective in any respect, You     *
*  (not any Contributor) assume the cost of any necessary servicing,   *
*  repair, or correction. This disclaimer of warranty constitutes an   *
*  essential part of this License. No use of any Covered Software is   *
*  authorized under this License except under this disclaimer.         *
*                                                                      *
************************************************************************

************************************************************************
*                                                                      *
*  7. Limitation of Liability                                          *
*  --------------------------                                          *
*                                                                      *
*  Under no circumstances and under no legal theory, whether tort      *
*  (including negligence), contract, or otherwise, shall any           *
*  Contributor, or anyone who distributes Covered Software as          *
*  permitted above, be liable to You for any direct, indirect,         *
*  special, incidental, or consequential damages of any character      *
*  including, without limitation, damages for lost profits, loss of    *
*  goodwill, work stoppage, computer failure or malfunction, or any    *
*  and all other commercial damages or losses, even if such party      *
*  shall have been informed of the possibility of such damages. This   *
*  limitation of liability shall not apply to liability for death or   *
*  personal injury resulting from such party's negligence to the       *
*  extent applicable law prohibits such limitation. Some               *
*  jurisdictions do not allow the exclusion or limitation of           *
*  incidental or consequential damages, so this exclusion and          *
*  limitation may not apply to You.                                    *
*                                                                      *
************************************************************************

8. Litigation
-------------

Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.

9. Miscellaneous
----------------

This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.

10. Versions of the License
---------------------------

10.1. New Versions

Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.

10.2. Effect of New Versions

You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.

10.3. Modified Versions

If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses

If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice
-------------------------------------------

  This Source Code Form is subject to the terms of the Mozilla Public
  License, v. 2.0. If a copy of the MPL was not distributed with this
  file, You can obtain one at http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------

  This Source Code Form is "Incompatible With Secondary Licenses", as
  defined by the Mozilla Public License, v. 2.0.
                                                                                                                                                                                                                                                                                                                     LICENSES/core                                                                                       0000644 0001750 0001750 00000041313 13422307023 012422  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 Mozilla Public License Version 2.0
==================================

1. Definitions
--------------

1.1. "Contributor"
    means each individual or legal entity that creates, contributes to
    the creation of, or owns Covered Software.

1.2. "Contributor Version"
    means the combination of the Contributions of others (if any) used
    by a Contributor and that particular Contributor's Contribution.

1.3. "Contribution"
    means Covered Software of a particular Contributor.

1.4. "Covered Software"
    means Source Code Form to which the initial Contributor has attached
    the notice in Exhibit A, the Executable Form of such Source Code
    Form, and Modifications of such Source Code Form, in each case
    including portions thereof.

1.5. "Incompatible With Secondary Licenses"
    means

    (a) that the initial Contributor has attached the notice described
        in Exhibit B to the Covered Software; or

    (b) that the Covered Software was made available under the terms of
        version 1.1 or earlier of the License, but not also under the
        terms of a Secondary License.

1.6. "Executable Form"
    means any form of the work other than Source Code Form.

1.7. "Larger Work"
    means a work that combines Covered Software with other material, in 
    a separate file or files, that is not Covered Software.

1.8. "License"
    means this document.

1.9. "Licensable"
    means having the right to grant, to the maximum extent possible,
    whether at the time of the initial grant or subsequently, any and
    all of the rights conveyed by this License.

1.10. "Modifications"
    means any of the following:

    (a) any file in Source Code Form that results from an addition to,
        deletion from, or modification of the contents of Covered
        Software; or

    (b) any new file in Source Code Form that contains any Covered
        Software.

1.11. "Patent Claims" of a Contributor
    means any patent claim(s), including without limitation, method,
    process, and apparatus claims, in any patent Licensable by such
    Contributor that would be infringed, but for the grant of the
    License, by the making, using, selling, offering for sale, having
    made, import, or transfer of either its Contributions or its
    Contributor Version.

1.12. "Secondary License"
    means either the GNU General Public License, Version 2.0, the GNU
    Lesser General Public License, Version 2.1, the GNU Affero General
    Public License, Version 3.0, or any later versions of those
    licenses.

1.13. "Source Code Form"
    means the form of the work preferred for making modifications.

1.14. "You" (or "Your")
    means an individual or a legal entity exercising rights under this
    License. For legal entities, "You" includes any entity that
    controls, is controlled by, or is under common control with You. For
    purposes of this definition, "control" means (a) the power, direct
    or indirect, to cause the direction or management of such entity,
    whether by contract or otherwise, or (b) ownership of more than
    fifty percent (50%) of the outstanding shares or beneficial
    ownership of such entity.

2. License Grants and Conditions
--------------------------------

2.1. Grants

Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:

(a) under intellectual property rights (other than patent or trademark)
    Licensable by such Contributor to use, reproduce, make available,
    modify, display, perform, distribute, and otherwise exploit its
    Contributions, either on an unmodified basis, with Modifications, or
    as part of a Larger Work; and

(b) under Patent Claims of such Contributor to make, use, sell, offer
    for sale, have made, import, and otherwise transfer either its
    Contributions or its Contributor Version.

2.2. Effective Date

The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.

2.3. Limitations on Grant Scope

The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:

(a) for any code that a Contributor has removed from Covered Software;
    or

(b) for infringements caused by: (i) Your and any other third party's
    modifications of Covered Software, or (ii) the combination of its
    Contributions with other software (except as part of its Contributor
    Version); or

(c) under Patent Claims infringed by Covered Software in the absence of
    its Contributions.

This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).

2.4. Subsequent Licenses

No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).

2.5. Representation

Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.

2.6. Fair Use

This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.

2.7. Conditions

Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.

3. Responsibilities
-------------------

3.1. Distribution of Source Form

All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.

3.2. Distribution of Executable Form

If You distribute Covered Software in Executable Form then:

(a) such Covered Software must also be made available in Source Code
    Form, as described in Section 3.1, and You must inform recipients of
    the Executable Form how they can obtain a copy of such Source Code
    Form by reasonable means in a timely manner, at a charge no more
    than the cost of distribution to the recipient; and

(b) You may distribute such Executable Form under the terms of this
    License, or sublicense it under different terms, provided that the
    license for the Executable Form does not attempt to limit or alter
    the recipients' rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).

3.4. Notices

You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.

4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------

If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.

5. Termination
--------------

5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.

5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.

************************************************************************
*                                                                      *
*  6. Disclaimer of Warranty                                           *
*  -------------------------                                           *
*                                                                      *
*  Covered Software is provided under this License on an "as is"       *
*  basis, without warranty of any kind, either expressed, implied, or  *
*  statutory, including, without limitation, warranties that the       *
*  Covered Software is free of defects, merchantable, fit for a        *
*  particular purpose or non-infringing. The entire risk as to the     *
*  quality and performance of the Covered Software is with You.        *
*  Should any Covered Software prove defective in any respect, You     *
*  (not any Contributor) assume the cost of any necessary servicing,   *
*  repair, or correction. This disclaimer of warranty constitutes an   *
*  essential part of this License. No use of any Covered Software is   *
*  authorized under this License except under this disclaimer.         *
*                                                                      *
************************************************************************

************************************************************************
*                                                                      *
*  7. Limitation of Liability                                          *
*  --------------------------                                          *
*                                                                      *
*  Under no circumstances and under no legal theory, whether tort      *
*  (including negligence), contract, or otherwise, shall any           *
*  Contributor, or anyone who distributes Covered Software as          *
*  permitted above, be liable to You for any direct, indirect,         *
*  special, incidental, or consequential damages of any character      *
*  including, without limitation, damages for lost profits, loss of    *
*  goodwill, work stoppage, computer failure or malfunction, or any    *
*  and all other commercial damages or losses, even if such party      *
*  shall have been informed of the possibility of such damages. This   *
*  limitation of liability shall not apply to liability for death or   *
*  personal injury resulting from such party's negligence to the       *
*  extent applicable law prohibits such limitation. Some               *
*  jurisdictions do not allow the exclusion or limitation of           *
*  incidental or consequential damages, so this exclusion and          *
*  limitation may not apply to You.                                    *
*                                                                      *
************************************************************************

8. Litigation
-------------

Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.

9. Miscellaneous
----------------

This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.

10. Versions of the License
---------------------------

10.1. New Versions

Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.

10.2. Effect of New Versions

You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.

10.3. Modified Versions

If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses

If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice
-------------------------------------------

  This Source Code Form is subject to the terms of the Mozilla Public
  License, v. 2.0. If a copy of the MPL was not distributed with this
  file, You can obtain one at http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------

  This Source Code Form is "Incompatible With Secondary Licenses", as
  defined by the Mozilla Public License, v. 2.0.
                                                                                                                                                                                                                                                                                                                     LICENSES/runtime                                                                                    0000644 0001750 0001750 00000113706 13410204240 013155  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 Most part of this software has been written in Python. 
To execute it you need the Python framework you can find in the runtime folder.
For information about Python visit https://www.python.org/.

This Python software is governed by the following license:
A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com).  In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property.  Zope Corporation is a sponsoring member of
the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016 Python Software Foundation; All Rights
Reserved" are retained in Python alone or in any derivative version prepared by
Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.


Additional Conditions for this Windows binary build
---------------------------------------------------

This program is linked with and uses Microsoft Distributable Code,
copyrighted by Microsoft Corporation. The Microsoft Distributable Code
includes the following files:

msvcr90.dll
msvcp90.dll
msvcm90.dll

If you further distribute programs that include the Microsoft
Distributable Code, you must comply with the restrictions on
distribution specified by Microsoft. In particular, you must require
distributors and external end users to agree to terms that protect the
Microsoft Distributable Code at least as much as Microsoft's own
requirements for the Distributable Code. See Microsoft's documentation
(included in its developer tools and on its website at microsoft.com)
for specific details.

Redistribution of the Windows binary build of the Python interpreter
complies with this agreement, provided that you do not:

- alter any copyright, trademark or patent notice in Microsoft's
Distributable Code;

- use Microsoft's trademarks in your programs' names or in a way that
suggests your programs come from or are endorsed by Microsoft;

- distribute Microsoft's Distributable Code to run on a platform other
than Microsoft operating systems, run-time technologies or application
platforms; or

- include Microsoft Distributable Code in malicious, deceptive or
unlawful programs.

These restrictions apply only to the Microsoft Distributable Code as
defined above, not to Python itself or any programs running on the
Python interpreter. The redistribution of the Python interpreter and
libraries is governed by the Python Software License included with this
file, or by other licenses as marked.


This copy of Python includes a copy of bzip2, which is licensed under the following terms:


--------------------------------------------------------------------------

This program, "bzip2", the associated library "libbzip2", and all
documentation, are copyright (C) 1996-2010 Julian R Seward.  All
rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. The origin of this software must not be misrepresented; you must 
   not claim that you wrote the original software.  If you use this 
   software in a product, an acknowledgment in the product 
   documentation would be appreciated but is not required.

3. Altered source versions must be plainly marked as such, and must
   not be misrepresented as being the original software.

4. The name of the author may not be used to endorse or promote 
   products derived from this software without specific prior written 
   permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Julian Seward, jseward@bzip.org
bzip2/libbzip2 version 1.0.6 of 6 September 2010

--------------------------------------------------------------------------

This copy of Python includes a copy of Berkeley DB, which is licensed under the following terms:

/*-
 * $Id: LICENSE,v 12.9 2008/02/07 17:12:17 mark Exp $
 */

The following is the license that applies to this copy of the Berkeley DB
software.  For a license to use the Berkeley DB software under conditions
other than those described here, or to purchase support for this software,
please contact Oracle at berkeleydb-info_us@oracle.com.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
/*
 * Copyright (c) 1990,2008 Oracle.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Redistributions in any form must be accompanied by information on
 *    how to obtain complete source code for the DB software and any
 *    accompanying software that uses the DB software.  The source code
 *    must either be included in the distribution or be available for no
 *    more than the cost of distribution plus a nominal fee, and must be
 *    freely redistributable under reasonable conditions.  For an
 *    executable file, complete source code means the source code for all
 *    modules it contains.  It does not include source code for modules or
 *    files that typically accompany the major components of the operating
 *    system on which the executable file runs.
 *
 * THIS SOFTWARE IS PROVIDED BY ORACLE ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
 * NON-INFRINGEMENT, ARE DISCLAIMED.  IN NO EVENT SHALL ORACLE BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/*
 * Copyright (c) 1990, 1993, 1994, 1995
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */
/*
 * Copyright (c) 1995, 1996
 *	The President and Fellows of Harvard University.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY HARVARD AND ITS CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL HARVARD OR ITS CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
/***
 * ASM: a very small and fast Java bytecode manipulation framework
 * Copyright (c) 2000-2005 INRIA, France Telecom
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the copyright holders nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

This copy of Python includes a copy of openssl, which is licensed under the following terms:


  LICENSE ISSUES
  ==============

  The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
  the OpenSSL License and the original SSLeay license apply to the toolkit.
  See below for the actual license texts. Actually both licenses are BSD-style
  Open Source licenses. In case of any license issues related to OpenSSL
  please contact openssl-core@openssl.org.

  OpenSSL License
  ---------------

/* ====================================================================
 * Copyright (c) 1998-2016 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

 Original SSLeay License
 -----------------------

/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */


This copy of Python includes a copy of Tcl, which is licensed under the following terms:

This software is copyrighted by the Regents of the University of
California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState
Corporation and other parties.  The following terms apply to all files
associated with the software unless explicitly disclaimed in
individual files.

The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided
that existing copyright notices are retained in all copies and that this
notice is included verbatim in any distributions. No written agreement,
license, or royalty fee is required for any of the authorized uses.
Modifications to this software may be copyrighted by their authors
and need not follow the licensing terms described here, provided that
the new terms are clearly indicated on the first page of each file where
they apply.

IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
MODIFICATIONS.

GOVERNMENT USE: If you are acquiring this software on behalf of the
U.S. government, the Government shall have only "Restricted Rights"
in the software and related documentation as defined in the Federal 
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2).  If you
are acquiring the software on behalf of the Department of Defense, the
software shall be classified as "Commercial Computer Software" and the
Government shall have only "Restricted Rights" as defined in Clause
252.227-7013 (b) (3) of DFARs.  Notwithstanding the foregoing, the
authors grant the U.S. Government and others acting in its behalf
permission to use and distribute the software in accordance with the
terms specified in this license. 

This copy of Python includes a copy of Tk, which is licensed under the following terms:

This software is copyrighted by the Regents of the University of
California, Sun Microsystems, Inc., and other parties.  The following
terms apply to all files associated with the software unless explicitly
disclaimed in individual files.

The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided
that existing copyright notices are retained in all copies and that this
notice is included verbatim in any distributions. No written agreement,
license, or royalty fee is required for any of the authorized uses.
Modifications to this software may be copyrighted by their authors
and need not follow the licensing terms described here, provided that
the new terms are clearly indicated on the first page of each file where
they apply.

IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
MODIFICATIONS.

GOVERNMENT USE: If you are acquiring this software on behalf of the
U.S. government, the Government shall have only "Restricted Rights"
in the software and related documentation as defined in the Federal
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2).  If you
are acquiring the software on behalf of the Department of Defense, the
software shall be classified as "Commercial Computer Software" and the
Government shall have only "Restricted Rights" as defined in Clause
252.227-7013 (b) (3) of DFARs.  Notwithstanding the foregoing, the
authors grant the U.S. Government and others acting in its behalf
permission to use and distribute the software in accordance with the
terms specified in this license.

This copy of Python includes a copy of Tix, which is licensed under the following terms:

Copyright (c) 1993-1999 Ioi Kim Lam.
Copyright (c) 2000-2001 Tix Project Group.
Copyright (c) 2004 ActiveState

This software is copyrighted by the above entities
and other parties.  The following terms apply to all files associated
with the software unless explicitly disclaimed in individual files.

The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided
that existing copyright notices are retained in all copies and that this
notice is included verbatim in any distributions. No written agreement,
license, or royalty fee is required for any of the authorized uses.
Modifications to this software may be copyrighted by their authors
and need not follow the licensing terms described here, provided that
the new terms are clearly indicated on the first page of each file where
they apply.

IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
MODIFICATIONS.

GOVERNMENT USE: If you are acquiring this software on behalf of the
U.S. government, the Government shall have only "Restricted Rights"
in the software and related documentation as defined in the Federal 
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2).  If you
are acquiring the software on behalf of the Department of Defense, the
software shall be classified as "Commercial Computer Software" and the
Government shall have only "Restricted Rights" as defined in Clause
252.227-7013 (c) (1) of DFARs.  Notwithstanding the foregoing, the
authors grant the U.S. Government and others acting in its behalf
permission to use and distribute the software in accordance with the
terms specified in this license. 

----------------------------------------------------------------------

Parts of this software are based on the Tcl/Tk software copyrighted by
the Regents of the University of California, Sun Microsystems, Inc.,
and other parties. The original license terms of the Tcl/Tk software
distribution is included in the file docs/license.tcltk.

Parts of this software are based on the HTML Library software
copyrighted by Sun Microsystems, Inc. The original license terms of
the HTML Library software distribution is included in the file
docs/license.html_lib.

                                                          LICENSES/README                                                                                     0000644 0001750 0001750 00000001271 13410204240 012420  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 License
-------
This software is free and open source.
It consists of one core component and several libraries and components defined "app" that could be governed by different licenses. The "LICENSES" folder contains all the licenses:

runtime: license of Python runtime.
core: license of core component.
ui: license of ui component.
app_<appname>: license of each app.
<libname>: license of each library.


Security
--------
To protect your privacy we guarantee that no information will be stored on our servers and communications are encrypted so third parties can't read them anyway.


Software updates
----------------
The updates of this software are automatic.





                                                                                                                                                                                                                                                                                                                                       listener.py                                                                                         0000644 0001750 0001750 00000035351 14312606771 012561  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''
import threading
import time
import ipc
import json
import os
import hashlib
import base64
import utils


##############################
######### IPCSERVER ##########
##############################
class IPCServer(threading.Thread):
    def __init__(self,agent):
        threading.Thread.__init__(self, name="ListenerIPCServer")
        self._agent=agent
        self._prop = None
        self._status = None
        self._config = None
    
    def start(self):
        self._prop = ipc.Property()
        fieldsdef=[]
        fieldsdef.append({"name":"counter","size":30})
        fieldsdef.append({"name":"state","size":5})
        fieldsdef.append({"name":"connections","size":20}) #TO REMOVE 2021-02-11
        fieldsdef.append({"name":"group","size":100*5})
        fieldsdef.append({"name":"name","size":100*5})        
        fieldsdef.append({"name":"request_pid","size":20})
        fieldsdef.append({"name":"request_data","size":1024*16})
        fieldsdef.append({"name":"response_data","size":1024*16})        
        fieldsdef.append({"name":"sessions_status","size":1024*512})
        def fix_perm(fn):
            self._agent.get_osmodule().set_file_permission_everyone(fn)            
        self._prop.create("status_config", fieldsdef, fix_perm)
        self._prop.set_property("response_data","")
        self._prop.set_property("request_data","")
        self._prop.set_property("request_pid","")
        
        self._status=IPCStatus(self._agent,self._prop)
        self._status.start();
        self._config=IPCConfig(self._agent,self._prop)
        self._config.start();
    
    def close(self):
        if self._config!=None:
            self._config.close();
            self._config.join(5000)
        if self._status!=None:
            self._status.close();
            self._status.join(5000)
        self._prop.close()

class IPCStatus(threading.Thread):
    def __init__(self,agent,prop):
        threading.Thread.__init__(self, name="ListenerIPCStatus")
        self.daemon=True
        self._agent=agent
        self._prop=prop
        self._bclose=False
        self._cnt=0

    def run(self):
        logwait=60*10
        while not self._bclose:
            if self._cnt==utils.sys_maxsize:
                self._cnt=0
            else:
                self._cnt+=1
            try:
                self._prop.set_property("counter", str(self._cnt))
                self._prop.set_property("state", str(self._agent.get_status()))
                
                self._prop.set_property("group", "") #TO REMOVE 2022-09-13
                
                sapp = self._agent.get_name()
                if sapp is None:
                    sapp=""
                if utils.is_py2():
                    sapp=sapp.encode("unicode-escape");
                self._prop.set_property("name", sapp)
                
                jo = self._agent.get_active_sessions_status()                
                self._prop.set_property("connections", str(len(jo))) #TO REMOVE 2021-02-11                
                self._prop.set_property("sessions_status", json.dumps(jo))
            except:
                e=utils.get_exception()
                if logwait>=60*10:
                    logwait=0
                    self._agent.write_except(e)                    
                logwait+=1
            time.sleep(1)
                
        self._bclose=True        
    
    def close(self):
        self._bclose=True
        

class IPCConfig(threading.Thread):
    
    def __init__(self,agent,prop):
        threading.Thread.__init__(self, name="ListenerIPCConfig")
        self.daemon=True
        self._agent=agent
        self._prop=prop
        self._bclose=False
        self._cnt=0
        
    
    def run(self):

        while not self._bclose:
            #VARIFICA NUOVE RICHIESTE DI CONFIGURAZIONE
            request_pid = self._prop.get_property("request_pid");
            if request_pid!="":
                try:
                    request_data = None
                    #Wait 2 seconds for request
                    for i in range(20):
                        request_data = self._prop.get_property("request_data");
                        if request_data!="":
                            break
                        time.sleep(0.1)
                    if request_data is not None:
                        self._prop.set_property("response_data",self._invoke_request(request_data))
                        #Wait 2 seconds for read response
                        for i in range(20):
                            if self._prop.get_property("request_data")=="":
                                break
                            time.sleep(0.1)
                except:
                    e=utils.get_exception()
                    self._agent.write_except(e);
                self._prop.set_property("response_data","")
                self._prop.set_property("request_data","")
                self._prop.set_property("request_pid","")
            time.sleep(0.1)
        self._bclose=True
    
    def _invoke_request(self, request_data):
        if request_data!=None:
            try:
                prms=json.loads(request_data)
                req = prms["_request"]
                func = getattr(self,  '_req_' + req)
                try:
                    return func(prms)
                except:
                    e=utils.get_exception()
                    return "ERROR:" + utils.exception_to_string(e)
            except:
                return "ERROR:INVALID_REQUEST"
        else:
            return "ERROR:INVALID_REQUEST"
    
    def _req_check_auth(self, prms):
        if "_user" in prms and "_password" in prms :
            usr=prms["_user"]
            pwd=prms["_password"]
            if self._agent.check_config_auth(usr, pwd):
                return "OK"
        return "ERROR:FORBIDDEN"
    
    #COMPATIBILITY OLD AGENT UI VERSION 25-05-2022
    def _req_change_pwd(self, prms):
        return self._req_change_config_pwd(prms)

    def _req_change_config_pwd(self, prms):
        if 'nopassword' in prms:
            nopwd = prms['nopassword']
            if nopwd=='true':
                self._agent.set_config_password("")
                return "OK"
            else:
                return "ERROR:INVALID_AUTHENTICATION"
        elif 'password' in prms:
            pwd = prms['password']
            self._agent.set_config_password(pwd)
            return "OK"
        else:
            return "ERROR:INVALID_AUTHENTICATION"
    
    def _req_change_session_pwd(self, prms):
        if 'nopassword' in prms:
            nopwd = prms['nopassword']
            if nopwd=='true':
                self._agent.set_session_password("")
                return "OK"
            else:
                return "ERROR:INVALID_AUTHENTICATION"
        elif 'password' in prms:
            pwd = prms['password']
            self._agent.set_session_password(pwd)
            return "OK"
        else:
            return "ERROR:INVALID_AUTHENTICATION"
    
    def _req_set_config(self, prms):
        if "key" in prms and "value" in prms:
            key=prms["key"]
            value=prms["value"]
            self._agent.set_config_str(key, value)
            return "OK"
        return "ERROR:INVALID_PARAMETERS."
    
    def _req_get_config(self, prms):
        if "key" in prms:
            key=prms["key"]
            return "OK:" + self._agent.get_config_str(key)
        return "ERROR:INVALID_PARAMETERS."
    
    def _req_remove_key(self, prms):
        self._agent.remove_key()
        return "OK"
    
    def _req_install_key(self, prms):
        if "code" in prms:
            code=prms["code"]
            self._agent.install_key(code)
            return "OK"
        return "ERROR:INVALID_PARAMETERS."
    
    def _req_install_new_agent(self, prms):
        #user, password, name, id
        if "user" in prms and "password" in prms and "name" in prms:
            user=prms["user"]
            password=prms["password"]
            name=prms["name"]
            self._agent.install_new_agent(user,password,name)
            return "OK"
        return "ERROR:INVALID_PARAMETERS."
    
    def _req_set_proxy(self, prms):
        ptype = None
        host = None
        port = None
        user = None
        password = None
        if 'type' in prms:
            ptype = prms['type']
        if 'host' in prms:
            host = prms['host']
        if 'port' in prms and prms['port'] is not None and prms['port'].strip()!="":
            port = int(prms['port'])
        if 'user' in prms:
            user = prms['user']
        if 'password' in prms:
            password = prms['password']
        self._agent.set_proxy(ptype,  host,  port,  user,  password)
        return "OK"

    def _req_accept_session(self, prms):
        if "id" in prms:
            sid=prms["id"]
            self._agent.accept_session(sid)
            return "OK"
        return "ERROR:INVALID_PARAMETERS."
    
    def _req_reject_session(self, prms):
        if "id" in prms:
            sid=prms["id"]
            self._agent.reject_session(sid)
            return "OK"
        return "ERROR:INVALID_PARAMETERS."
    
    def close(self):
        self._bclose=True

class IPCClient():
    
    def __init__(self,path=None):
        self._prop=ipc.Property()
        self._prop.open("status_config",bpath=path)
    
    def close(self):
        self._prop.close()
        self._prop=None
    
    def is_close(self):
        return self._prop is None or self._prop.is_close()

    def get_property(self,name):
        return self._prop.get_property(name)

    def send_request(self, usr, pwd, req, prms=None):
        sret=""
        try:
            spid=str(os.getpid())
            bok=False
            #Attende 40 secondi
            cnt=self._prop.get_property("counter")
            testcnt=0
            for i in range(400):
                bok=True
                if self._prop.get_property("request_pid")=="": #PRONTO AD ACCETTARE RICHIESTE
                    self._prop.set_property("request_pid",spid)
                    if prms is None:
                        prms={}
                    prms["_request"]=req
                    prms["_user"]=usr
                    #Hash password
                    encpwd=hashlib.sha256(utils.str_to_bytes(pwd,"utf8")).digest()
                    encpwd=base64.b64encode(encpwd)
                    prms["_password"]=utils.bytes_to_str(encpwd)
                    
                    self._prop.set_property("request_data",json.dumps(prms))
                    self._prop.set_property("response_data","")
                    break
                time.sleep(0.1)
                testcnt+=1
                if testcnt==20:
                    testcnt=0
                    appcnt=self._prop.get_property("counter")
                    if cnt==appcnt:
                        break
            if bok:
                #Attende 40 secondi
                cnt=self._prop.get_property("counter")
                testcnt=0
                for i in range(400):
                    sret=self._prop.get_property("response_data")
                    #Gestione concorrenza
                    if self._prop.get_property("request_pid")!=spid:
                        sret=""
                        break
                    if sret!="":
                        break
                    time.sleep(0.1)
                    testcnt+=1
                    if testcnt==20:
                        testcnt=0
                        appcnt=self._prop.get_property("counter")
                        if cnt==appcnt:
                            break
                if self._prop.get_property("request_pid")==spid:
                    self._prop.set_property("response_data","")
                    self._prop.set_property("request_data","")
                if sret=="":
                    sret = 'ERROR:REQUEST_TIMEOUT'
            else:
                sret = 'ERROR:REQUEST_TIMEOUT'
        except: 
            sret = 'ERROR:REQUEST_TIMEOUT'
        return sret



###############################
######### HTTPSERVER ##########
###############################
#CREATO PER USI FUTURI
class HttpServer(threading.Thread):
    
    def __init__(self, port,  agent):
        threading.Thread.__init__(self, name="HttpServer")
        self.daemon=True
        self._agent = agent
        self._port = port
        self._close=False
        self._httpd = None
    
    def run(self):        
        self._httpd = HttpConfigServer(self._port,  self._agent)
        self._close=False
        while not self._close:
            self._httpd.handle_request()

    def close(self):
        if  not self._close:
            self._close=True
            try:
                self._httpd.server_close()
            except:
                None
            self._httpd = None

'''
La versione attiva lascia la porta aperta in linux e mac
quella commentata da testare non vorrei che self._httpd.shutdown() blocca il thread principale
class HttpServer(threading.Thread):
    
    def __init__(self, port,  agent):
        threading.Thread.__init__(self, name="AgentListener")
        self.daemon=True
        self._agent = agent
        self._port = port
        self._close=False
        self._httpd = None
    
    def run(self):        
        self._httpd = HttpConfigServer(self._port,  self._agent)
        self._close=False
        self._httpd.serve_forever()
        self._httpd = None

    def close(self):
        if  not self._close:
            self._close=True
            self._httpd.shutdown() 
'''
class HttpConfigServer(utils.HTTPServer):
    
    def __init__(self, port, agent):
        server_address = ('127.0.0.1', port)
        utils.HTTPServer.__init__(self, server_address, HttpConfigHandler)
        self._agent = agent
    
    def get_agent(self):
        return self._agent


class HttpConfigHandler(utils.BaseHTTPRequestHandler):

    def do_GET(self):
        #Legge richiesta
        o = utils.url_parse(self.path)
        nm = o.path
        qs = utils.url_parse_qs(o.query)
        #Invia risposta
        resp={}
        resp['code']=404
        if 'code' in resp:
            self.send_response(resp['code'])
        else:
            self.send_response(200)
        if 'headers' in resp:
            hds = resp['headers']
            for k in hds.keys():
                self.send_header(k, hds[k])
            self.end_headers()
        if 'data' in resp:
            self.wfile.write(resp['data'])
        
    def do_HEAD(self):
        self.send_response(404)

    def do_POST(self):
        self.send_response(404)
    
    def log_message(self, format, *args):
        return



if __name__ == "__main__":
    ac = HttpServer(9000, None)
    ac.start()
    ac.join()
    
    
    
    
                                                                                                                                                                                                                                                                                       native/                                                                                             0000755 0001750 0001750 00000000000 14446054645 011646  5                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 native/dwagent.openrc                                                                               0000644 0001750 0001750 00000000362 14340126151 014471  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 #!/sbin/openrc-run

name="@NAME@"

depend() {
        use net
        use dns
}

start(){
        "@PATH_DWA@/native/dwagsvc" start
}

stop(){
        "@PATH_DWA@/native/dwagsvc" stop
}

status(){
        "@PATH_DWA@/native/dwagsvc" status
}
                                                                                                                                                                                                                                                                              native/dwagent.service                                                                              0000644 0001750 0001750 00000000402 13777623120 014651  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 [Unit]
Description=@NAME@
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/bin/sh -c '"@PATH_DWA@/native/dwagsvc" start_internal'
ExecStop=/bin/sh -c '"@PATH_DWA@/native/dwagsvc" stop_internal'

[Install]
WantedBy=multi-user.target





                                                                                                                                                                                                                                                              native/systray.desktop                                                                              0000644 0001750 0001750 00000000211 14000355257 014736  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 [Desktop Entry]
Encoding=UTF-8
Type=Application
Terminal=false
Icon=@PATH_LOGOOS@
Exec="@PATH_DWA@/native/systray"
Name=@NAME@ - Systray
                                                                                                                                                                                                                                                                                                                                                                                       native/dwagent.desktop                                                                              0000644 0001750 0001750 00000000300 14000354570 014645  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 [Desktop Entry]
Encoding=UTF-8
Version=1.0
Terminal=false
Icon=@PATH_LOGOOS@
Exec="@PATH_DWA@/native/@EXE_NAME@"
Categories=System;Application;
Type=Application
Name=@NAME@
GenericName=@NAME@
                                                                                                                                                                                                                                                                                                                                native/dwagsvc                                                                                      0000644 0001750 0001750 00000034267 14340126567 013237  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 #!/bin/sh
#
# chkconfig: 2345 80 30
# description: @NAME@ Service
#
### BEGIN INIT INFO
# Provides: @NAME@
# Required-Start:
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start and Stop @NAME@ Service
# Description: @NAME@ Service
### END INIT INFO
#This Source Code Form is subject to the terms of the Mozilla
#Public License, v. 2.0. If a copy of the MPL was not distributed
#with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

RETVAL=0
PATH_DWA="@PATH_DWA@"
PATH_DWA_NATIVE="$PATH_DWA/native"
PATH_DWA_RUNTIME="$PATH_DWA/runtime/bin"
PATH_DWA_RUNTIME_LIBRARY="$PATH_DWA/runtime/lib"
TIMEOUT_START_STOP=30
INST_VER=0
if [ -f "${PATH_DWA_NATIVE}/installer.ver" ]; then
	INST_VER=$(cat "${PATH_DWA_NATIVE}/installer.ver")
fi

install_systemctl(){
	if [ ! -f /etc/systemd/system/@EXE_NAME@.service ]; then
		cp "${PATH_DWA_NATIVE}/@EXE_NAME@.service" /etc/systemd/system/@EXE_NAME@.service
		if [ $? -eq 0 ]; then
			systemctl --system daemon-reload
			systemctl enable @EXE_NAME@.service
			if [ $? -eq 0 ]; then
				echo "systemctl" > "${PATH_DWA_NATIVE}/service.mng"
				echo "Installed"
			else
				echo "Error: Enable systemctl."
				RETVAL=11
			fi
		else
			echo "Error: Copy file service in systemd."
			RETVAL=12
		fi
	else
		echo "Error: Service already installed."
		RETVAL=1
	fi
}

install_chkconfig(){
	if [ ! -f /etc/init.d/@EXE_NAME@ ]; then
		ln -s "${PATH_DWA_NATIVE}/dwagsvc" /etc/init.d/@EXE_NAME@
		if [ $? -eq 0 ]; then
			chkconfig --add @EXE_NAME@
			if [ $? -eq 0 ]; then
				echo "chkconfig" > "${PATH_DWA_NATIVE}/service.mng"
				echo "Installed"
			else
				echo "Error: Add chkconfig."
				RETVAL=11
			fi
		else
			echo "Error: Create symbolic link."
			RETVAL=12
		fi
	else
		echo "Error: Service already installed."
		RETVAL=1
	fi
}

install_updatercd(){
	if [ ! -f /etc/init.d/@EXE_NAME@ ]; then
		ln -s "${PATH_DWA_NATIVE}/dwagsvc" /etc/init.d/@EXE_NAME@
		if [ $? -eq 0 ]; then
			#update-rc.d -f @EXE_NAME@ start 80 2 3 4 5 . stop 30 0 1 6 .
			update-rc.d -f @EXE_NAME@ defaults
			if [ $? -eq 0 ]; then
				echo "updatercd" > "${PATH_DWA_NATIVE}/service.mng"
				echo "Installed"
			else
				echo "Error: Add update-rc.d."
				RETVAL=11
			fi
		else
			echo "Error: Create symbolic link."
			RETVAL=12
		fi
	else
		echo "Error: Service already installed."
		RETVAL=1
	fi
}

install_openrc(){
	if [ ! -f /etc/init.d/@EXE_NAME@ ]; then
		cp "${PATH_DWA_NATIVE}/dwagent.openrc" /etc/init.d/@EXE_NAME@
		if [ $? -eq 0 ]; then
			rc-update add @EXE_NAME@
			if [ $? -eq 0 ]; then
				echo "openrc" > "${PATH_DWA_NATIVE}/service.mng"
				echo "Installed"
			else
				echo "Error: Add rc-update."
				RETVAL=11
			fi
		else
			echo "Error: Create symbolic link."
			RETVAL=12
		fi
	else
		echo "Error: Service already installed."
		RETVAL=1
	fi
}

install_rclocal(){
	if [ ! -f /etc/rc.d/rc.@EXE_NAME@ ]; then
		ln -s "${PATH_DWA_NATIVE}/dwagsvc" /etc/rc.d/rc.@EXE_NAME@
        if [ -f /etc/rc.d/rc.local ]; then
			sed -i '/\/etc\/rc.d\/rc.@EXE_NAME@ start/d' /etc/rc.d/rc.local
        fi
        echo "/etc/rc.d/rc.@EXE_NAME@ start" >> /etc/rc.d/rc.local
        if [ -f /etc/rc.d/rc.local_shutdown ]; then
        	sed -i '/\/etc\/rc.d\/rc.@EXE_NAME@ stop/d' /etc/rc.d/rc.local_shutdown
        fi
        echo "/etc/rc.d/rc.@EXE_NAME@ stop" >> /etc/rc.d/rc.local_shutdown
        chmod +x /etc/rc.d/rc.local_shutdown
        echo "rclocal" > "${PATH_DWA_NATIVE}/service.mng"
        echo "Installed"
	else
		echo "Error: Service already installed."
		RETVAL=1
	fi   
}

install(){
	if [ "$(which "systemctl" 2>/dev/null)" ] && [ "$(systemctl list-units -t service 2>/dev/null)" ]; then
    	install_systemctl
    elif [ "$(which "chkconfig" 2>/dev/null)" ]; then
    	install_chkconfig
	elif [ "$(which "update-rc.d" 2>/dev/null)" ]; then
        install_updatercd
	elif [ "$(which "rc-update" 2>/dev/null)" ]; then
        install_openrc
    elif [ -f /etc/rc.d/rc.local ]; then
    	install_rclocal
	else
		echo "Error: Missing systemctl or chkconfig or update-rc.d command."
		RETVAL=2
	fi
}

delete_systemctl(){
	if [ -f /etc/systemd/system/@EXE_NAME@.service ]; then
		systemctl disable @EXE_NAME@.service
		if [ $? -eq 0 ]; then
			rm /etc/systemd/system/@EXE_NAME@.service
			if [ $? -eq 0 ]; then
				systemctl --system daemon-reload
				if [ -f "${PATH_DWA_NATIVE}/service.mng" ]; then
					rm "${PATH_DWA_NATIVE}/service.mng"
				fi
				echo "Deleted"
			else
				echo "Error: Remove service file."
				RETVAL=11
			fi
		else
			echo "Error: Disable service in systemd."
			RETVAL=12
		fi
	else
		echo "Error: Service not installed."
		RETVAL=1
	fi
}

delete_chkconfig(){
	if [ -f /etc/init.d/@EXE_NAME@ ]; then
		chkconfig --del @EXE_NAME@
		if [ $? -eq 0 ]; then
			rm /etc/init.d/@EXE_NAME@
			if [ $? -eq 0 ]; then
				if [ -f "${PATH_DWA_NATIVE}/service.mng" ]; then
					rm "${PATH_DWA_NATIVE}/service.mng"
				fi
				echo "Deleted"
			else
				echo "Error: Remove symbolic link."
				RETVAL=12
			fi
		else
			echo "Error: Del chkconfig."
			RETVAL=11
		fi
	else
		chkconfig --del @EXE_NAME@ &>/dev/null
		echo "Error: Service not installed."
		RETVAL=1
	fi
}

delete_updatercd(){
	if [ -f /etc/init.d/@EXE_NAME@ ]; then
		update-rc.d -f @EXE_NAME@ remove
		if [ $? -eq 0 ]; then
			rm /etc/init.d/@EXE_NAME@
			if [ $? -eq 0 ]; then
				if [ -f "${PATH_DWA_NATIVE}/service.mng" ]; then
					rm "${PATH_DWA_NATIVE}/service.mng"
				fi
				echo "Deleted"
			else
				echo "Error: Remove symbolic link."
				RETVAL=12
			fi
		else
			echo "Error: Del update-rc.d."
			RETVAL=11
		fi
	else
		update-rc.d -f @EXE_NAME@ remove > /dev/null 2>&1
		echo "Error: Service not installed."
		RETVAL=1
	fi
}

delete_openrc(){
	if [ -f /etc/init.d/@EXE_NAME@ ]; then
		rc-update del @EXE_NAME@
		if [ $? -eq 0 ]; then
			rm /etc/init.d/@EXE_NAME@
			if [ $? -eq 0 ]; then
				if [ -f "${PATH_DWA_NATIVE}/service.mng" ]; then
					rm "${PATH_DWA_NATIVE}/service.mng"
				fi
				echo "Deleted"
			else
				echo "Error: Remove symbolic link."
				RETVAL=12
			fi
		else
			echo "Error: Del rc-update."
			RETVAL=11
		fi
	else
		rc-update del @EXE_NAME@ > /dev/null 2>&1
		echo "Error: Service not installed."
		RETVAL=1
	fi
}

delete_rclocal(){
	if [ -f /etc/rc.d/rc.@EXE_NAME@ ]; then
    	if [ -f /etc/rc.d/rc.local ]; then
			sed -i '/\/etc\/rc.d\/rc.@EXE_NAME@ start/d' /etc/rc.d/rc.local
        fi
        if [ -f /etc/rc.d/rc.local_shutdown ]; then
        	sed -i '/\/etc\/rc.d\/rc.@EXE_NAME@ stop/d' /etc/rc.d/rc.local_shutdown
        fi
        rm /etc/rc.d/rc.@EXE_NAME@
        if [ $? -eq 0 ]; then
			if [ -f "${PATH_DWA_NATIVE}/service.mng" ]; then
				rm "${PATH_DWA_NATIVE}/service.mng"
            fi
        	echo "Deleted"
        else
        	echo "Error: Remove symbolic link."
        	RETVAL=12
        fi
    else			
		echo "Error: Service not installed."
		RETVAL=1
	fi
}

delete(){
	if [ -f "${PATH_DWA_NATIVE}/service.mng" ]; then
		if [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "systemctl" ]; then
			delete_systemctl
		elif [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "chkconfig" ]; then
			delete_chkconfig
		elif [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "updatercd" ]; then
			delete_updatercd
		elif [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "openrc" ]; then
			delete_openrc
        elif [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "rclocal" ]; then
			delete_rclocal
		fi				
	else
		if [ "$(which "systemctl" 2>/dev/null)" ] && [ "$(systemctl list-units -t service 2>/dev/null)" ]; then
			delete_systemctl
		elif [ "$(which "chkconfig" 2>/dev/null)" ]; then
			delete_chkconfig
		elif [ "$(which "update-rc.d" 2>/dev/null)" ]; then
			delete_updatercd
		elif [ "$(which "rc-update" 2>/dev/null)" ]; then
			delete_openrc
        elif [ -f /etc/rc.d/rc.local ]; then
        	delete_rclocal
		else
			echo "Error: Missing chkconfig or update-rc.d command."
			RETVAL=2
		fi
	fi
}

rem_file() {
	if [ -f $1 ]; then
		rm -f $1
	fi
}

test_pid() {
	if [ -f dwagent.pid ]; then
		PIDDW=`cat dwagent.pid`
		kill -0 $PIDDW > /dev/null 2>&1
		if test $? -eq 0; then
			return 1
		else
			echo "Warning: @NAME@ is not running, but pid file exists "
			rem_file dwagent.pid
		fi
	fi
	return 0
}

run() {
	cd "${PATH_DWA}"
	test_pid
	if [ $? -eq 0 ]; then
		echo $$ > dwagent.pid
		while [ ! -f dwagent.stop ]
		do
			. "${PATH_DWA_NATIVE}/dwagupd"
			if check_update "${PATH_DWA}"; then
				cd "${PATH_DWA}"
				export LD_LIBRARY_PATH=${PATH_DWA_RUNTIME_LIBRARY}
				export PYTHONIOENCODING=utf-8
				"${PATH_DWA_RUNTIME}/@EXE_NAME@" agent.py -filelog
			fi
			for X in $(seq 5)
			do
				if [ ! -f dwagent.stop ]; then
					sleep 1
				fi
			done
		done
		rem_file dwagent.stop
		rem_file dwagent.pid
	else
		echo "Error: @NAME@ already run."
	fi
}

start_internal() {
	cd "${PATH_DWA}"
	test_pid
	if [ $? -eq 0 ]; then
		echo "Starting @NAME@ daemon"
		rem_file dwagent.stop
		rem_file dwagent.start
		export LD_LIBRARY_PATH=${PATH_DWA_RUNTIME_LIBRARY}
		export PYTHONIOENCODING=utf-8
		"${PATH_DWA_RUNTIME}/@EXE_NAME@" "${PATH_DWA}/daemon.py" "${PATH_DWA_NATIVE}/dwagsvc" run  > "${PATH_DWA_NATIVE}/service.log" 2>&1
		c=0
		while [ ! -f dwagent.start ]
		do
			sleep 1
			c=`expr $c + 1`
			if [ $c -ge $TIMEOUT_START_STOP ]; then
				echo "Warning: Starting timeout."
				RETVAL=11
				break
			fi
		done
		rem_file dwagent.start
	else
		echo "@NAME@ already stared."
		RETVAL=1
	fi
}

start() {
	if [ -f "${PATH_DWA_NATIVE}/service.mng" ]; then
		if [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "systemctl" ]; then
			if ! systemctl start @EXE_NAME@.service; then
				RETVAL=1
			fi
		elif [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "chkconfig" ]; then
			if [ "$(which "start-stop-daemon" 2>/dev/null)" ]; then
				if ! start-stop-daemon --start --quiet --oknodo --exec "${PATH_DWA_NATIVE}/dwagsvc" -- start_internal; then
					RETVAL=1
				fi
			else
				start_internal
			fi
		elif [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "updatercd" ]; then
			if [ "$(which "start-stop-daemon" 2>/dev/null)" ]; then
				if ! start-stop-daemon --start --quiet --oknodo --exec "${PATH_DWA_NATIVE}/dwagsvc" -- start_internal; then
					RETVAL=1
				fi
			else
				start_internal
			fi
		elif [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "openrc" ]; then
			if [ "$(which "start-stop-daemon" 2>/dev/null)" ]; then
				if ! start-stop-daemon --start --quiet --oknodo --exec "${PATH_DWA_NATIVE}/dwagsvc" -- start_internal; then
					RETVAL=1
				fi
			else
				start_internal
			fi
		else
			start_internal
		fi				
	else
		if [ "$(which "systemctl" 2>/dev/null)" ] && [ "$(systemctl list-units -t service 2>/dev/null)" ]; then
			if ! systemctl start @EXE_NAME@.service; then
				RETVAL=1
			fi
		elif [ "$(which "chkconfig" 2>/dev/null)" ]; then
			if [ "$(which "start-stop-daemon" 2>/dev/null)" ]; then
				if ! start-stop-daemon --start --quiet --oknodo --exec "${PATH_DWA_NATIVE}/dwagsvc" -- start_internal; then
					RETVAL=1
				fi
			else
				start_internal
			fi
		elif [ "$(which "update-rc.d" 2>/dev/null)" ]; then
			if [ "$(which "start-stop-daemon" 2>/dev/null)" ]; then
				if ! start-stop-daemon --start --quiet --oknodo --exec "${PATH_DWA_NATIVE}/dwagsvc" -- start_internal; then
					RETVAL=1
				fi
			else
				start_internal
			fi
		elif [ "$(which "rc-update" 2>/dev/null)" ]; then
			if [ "$(which "start-stop-daemon" 2>/dev/null)" ]; then
				if ! start-stop-daemon --start --quiet --oknodo --exec "${PATH_DWA_NATIVE}/dwagsvc" -- start_internal; then
					RETVAL=1
				fi
			else
				start_internal
			fi
		else
			start_internal
		fi
	fi
}

stop_internal() {
	cd "${PATH_DWA}"
	test_pid
	if [ $? -eq 1 ]; then
		echo "Stopping @NAME@ daemon"
		echo "" > dwagent.stop
		c=0
		while [ -f dwagent.stop ]
		do
			sleep 1
			c=`expr $c + 1`
			if [ $c -ge $TIMEOUT_START_STOP ]; then
				echo "Warning: Stopping timeout."
				PIDDW=`cat dwagent.pid`
				echo "Warning: Kill process $PIDDW."
				kill -9 $PIDDW
				break
			fi
		done
	else
		echo "@NAME@ already stopped."
		RETVAL=1
	fi
}

stop() {
	if [ -f "${PATH_DWA_NATIVE}/service.mng" ]; then
		if [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "systemctl" ]; then
			if ! systemctl stop @EXE_NAME@.service; then
				RETVAL=1
			fi
		elif [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "chkconfig" ]; then
			stop_internal
		elif [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "updatercd" ]; then
			stop_internal
		elif [ "$(cat "${PATH_DWA_NATIVE}/service.mng")" = "openrc" ]; then
			stop_internal
		else
			stop_internal
		fi				
	else
		if [ "$(which "systemctl" 2>/dev/null)" ] && [ "$(systemctl list-units -t service 2>/dev/null)" ]; then
			if ! systemctl stop @EXE_NAME@.service; then
				RETVAL=1
			fi
		elif [ "$(which "chkconfig" 2>/dev/null)" ]; then
			stop_internal
		elif [ "$(which "update-rc.d" 2>/dev/null)" ]; then
			stop_internal
		elif [ "$(which "rc-update" 2>/dev/null)" ]; then
			stop_internal
		else
			stop_internal
		fi
	fi
}

restart() {
	stop
	start
}

status() {
	cd "${PATH_DWA}"
	test_pid
	if [ ! $? -eq 1 ]; then
		echo "Not running."
		RETVAL=3
	else
		echo "Running."
	fi
}

install_bin(){
	ln -s '@PATH_DWA@/native/@EXE_NAME@' $1/@EXE_NAME@_monitor
	ln -s '@PATH_DWA@/native/configure' $1/@EXE_NAME@_configure
	ln -s '@PATH_DWA@/native/uninstall' $1/@EXE_NAME@_uninstall
}

uninstall_bin(){
	if [ -f $1/@EXE_NAME@_monitor ]; then
		rm $1/@EXE_NAME@_monitor
	fi
	if [ -f $1/@EXE_NAME@_configure ]; then
		rm $1/@EXE_NAME@_configure
	fi
	if [ -f $1/@EXE_NAME@_uninstall ]; then
		rm $1/@EXE_NAME@_uninstall
	fi
}

install_shortcuts(){
	if [ -d /usr/bin ]; then
		install_bin /usr/bin
	elif [ -d /bin ]; then
		install_bin /bin
	fi
	if [ "$(which "xdg-desktop-menu")" ]; then
		cd "${PATH_DWA_NATIVE}"
		xdg-desktop-menu install --noupdate --mode system --novendor @EXE_NAME@.desktop
		xdg-desktop-menu forceupdate
	else
		RETVAL=1
	fi
}

uninstall_shortcuts(){
	uninstall_bin /usr/bin
	uninstall_bin /bin
	if [ "$(which "xdg-desktop-menu")" ]; then
		cd "${PATH_DWA_NATIVE}"
		xdg-desktop-menu uninstall --mode system --novendor @EXE_NAME@.desktop
	else
		RETVAL=1
	fi
}

case "$1" in
start)
  start
;;
start_internal)
  start_internal
;;
stop_internal)
  stop_internal
;;
stop)
  stop
;;
restart)
  restart
;;
status)
  status
;;
run)
  run
;;
install)
  install
;;
delete)
  delete
;;
install_shortcuts)
  install_shortcuts
;;
uninstall_shortcuts)
  uninstall_shortcuts
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac

exit $RETVAL
                                                                                                                                                                                                                                                                                                                                         native/uninstall                                                                                    0000644 0001750 0001750 00000002116 14145713554 013577  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 #!/bin/sh
#This Source Code Form is subject to the terms of the Mozilla
#Public License, v. 2.0. If a copy of the MPL was not distributed
#with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

PATH_DWA="@PATH_DWA@"
PATH_DWA_RUNTIME="$PATH_DWA/runtime/bin"
PATH_DWA_RUNTIME_LIBRARY="$PATH_DWA/runtime/lib"
PATH_DWA_NATIVE="$PATH_DWA/native"

if [ "$(id -u)" != "0" ]; then
	echo "You must have root privileges to run this installer. Please try again, this time running the script using the root user." 
	exit 1
else
	cd "${PATH_DWA}"
	export LD_LIBRARY_PATH=${PATH_DWA_RUNTIME_LIBRARY}
	export PYTHONIOENCODING=utf-8
	"${PATH_DWA_RUNTIME}/@EXE_NAME@" installer.py uninstall $@
	if [ ! $? -eq 0 ]; then
		echo "Error starting gui, attempt to start console mode..."
		"${PATH_DWA_RUNTIME}/@EXE_NAME@" installer.py uninstall -console
	fi
	if [ -f "${PATH_DWA}/agent.uninstall" ]; then
		cd /tmp
		echo '#!/bin/sh' > @EXE_NAME@_remove
		echo 'sleep 2' >> @EXE_NAME@_remove
		echo 'rm -r -f "@PATH_DWA@"' >> @EXE_NAME@_remove
		chmod u+x @EXE_NAME@_remove
		./@EXE_NAME@_remove &
	fi
fi
exit 0
                                                                                                                                                                                                                                                                                                                                                                                                                                                  native/configure                                                                                    0000644 0001750 0001750 00000001215 14145713554 013546  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 #!/bin/sh
#This Source Code Form is subject to the terms of the Mozilla
#Public License, v. 2.0. If a copy of the MPL was not distributed
#with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

PATH_DWA="@PATH_DWA@"
PATH_DWA_RUNTIME="$PATH_DWA/runtime/bin"
PATH_DWA_RUNTIME_LIBRARY="$PATH_DWA/runtime/lib"
PATH_DWA_NATIVE="$PATH_DWA/native"

cd "${PATH_DWA}"
export LD_LIBRARY_PATH=${PATH_DWA_RUNTIME_LIBRARY}
export PYTHONIOENCODING=utf-8
"${PATH_DWA_RUNTIME}/@EXE_NAME@" configure.py $@
if [ ! $? -eq 0 ]; then
	echo "Error starting gui, attempt to start console mode..."
	"${PATH_DWA_RUNTIME}/@EXE_NAME@" configure.py -console
fi
exit 0
                                                                                                                                                                                                                                                                                                                                                                                   native/systray                                                                                      0000644 0001750 0001750 00000001002 14137773703 013300  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 #!/bin/sh
#This Source Code Form is subject to the terms of the Mozilla
#Public License, v. 2.0. If a copy of the MPL was not distributed
#with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

PATH_DWA="@PATH_DWA@"
PATH_DWA_RUNTIME="$PATH_DWA/runtime/bin"
PATH_DWA_RUNTIME_LIBRARY="$PATH_DWA/runtime/lib"
PATH_DWA_NATIVE="$PATH_DWA/native"

cd "${PATH_DWA}"
export LD_LIBRARY_PATH=${PATH_DWA_RUNTIME_LIBRARY}
export PYTHONIOENCODING=utf-8
"${PATH_DWA_RUNTIME}/@EXE_NAME@" monitor.py systray &
exit 0
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              native/dwagent                                                                                      0000644 0001750 0001750 00000001205 14145713554 013215  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 #!/bin/sh
#This Source Code Form is subject to the terms of the Mozilla
#Public License, v. 2.0. If a copy of the MPL was not distributed
#with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

PATH_DWA="@PATH_DWA@"
PATH_DWA_RUNTIME="$PATH_DWA/runtime/bin"
PATH_DWA_RUNTIME_LIBRARY="$PATH_DWA/runtime/lib"
PATH_DWA_NATIVE="$PATH_DWA/native"

cd "${PATH_DWA}"
export LD_LIBRARY_PATH=${PATH_DWA_RUNTIME_LIBRARY}
export PYTHONIOENCODING=utf-8
"${PATH_DWA_RUNTIME}/@EXE_NAME@" monitor.py $@
if [ ! $? -eq 0 ]; then
	echo "Error starting gui, attempt to start console mode..."
	"${PATH_DWA_RUNTIME}/@EXE_NAME@" monitor.py info
fi
exit 0
                                                                                                                                                                                                                                                                                                                                                                                           native.py                                                                                           0000755 0001750 0001750 00000063655 14407120157 012227  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

import ctypes
import utils
import os
import stat
import subprocess
import sys
import time
import ipc
import threading
import signal
import json

GUILNC_ARG_MAX=10 #COMPATIBILITA VERSIONI PRECEDENTI
GUILNC_ARG_SIZE=1024 #COMPATIBILITA VERSIONI PRECEDENTI

_nativemap={}
_nativemap["semaphore"] = threading.Condition()

def get_instance():
    oret=None
    _nativemap["semaphore"].acquire()
    try:
        if "instance" in _nativemap:
            oret=_nativemap["instance"]
        else:
            if utils.is_windows():
                oret = Windows()
            elif utils.is_linux():
                oret = Linux()
            elif utils.is_mac():
                oret = Mac()
            oret.load_library();
            _nativemap["instance"]=oret
    finally:
        _nativemap["semaphore"].release()
    return oret

def fmain(args):
    if utils.is_mac():
        if len(args)>1:
            a1=args[1]            
            if a1 is not None and a1.lower()=="guilnc": #GUI LAUNCHER OLD VERSION 03/11/2021 (DO NOT REMOVE) (DO NOT REMOVE)
                main = Mac()
                main.start_guilnc()
                sys.exit(0)

def get_suffix():
    if utils.is_windows():
        return "win"
    elif utils.is_linux():
        return "linux"
    elif utils.is_mac():
        return "mac"
    return None

def get_library_config(name):
    fn=None
    if utils.path_exists(".srcmode"):
        fn=".." + utils.path_sep + "lib_" + name + utils.path_sep + "config.json"        
    else:
        fn="native" + utils.path_sep + "lib_" + name + ".json"
    if utils.path_exists(fn):
        f = utils.file_open(fn)
        jsapp = json.loads(f.read())
        f.close()
        return jsapp
    else:
        return None

def _load_libraries_with_deps_list(ar,name):
    cnflib=get_library_config(name)
    if cnflib is not None:
        if "lib_dependencies" in cnflib:
            for ln in cnflib["lib_dependencies"]:
                _load_libraries_with_deps_list(ar,ln)
        if "filename_" + get_suffix() in cnflib:
            fn = cnflib["filename_" + get_suffix()]
            ar.insert(0,_load_lib_obj(fn))

def load_libraries_with_deps(name):
    lstlibs=[]
    _load_libraries_with_deps_list(lstlibs,name)
    return lstlibs

def unload_libraries(lstlibs):
    for i in range(len(lstlibs)):
        _unload_lib_obj(lstlibs[i])

def _load_lib_obj(name):
    retlib = None
    if utils.is_windows():
        if not utils.path_exists(".srcmode"):
            retlib = ctypes.CDLL("native\\" + name)
        else:
            retlib = ctypes.CDLL("..\\make\\native\\" + name)
        if retlib is None:
            raise Exception("Missing library " + name + ".")
    elif utils.is_linux():
        if not utils.path_exists(".srcmode"):
            retlib  = ctypes.CDLL("native/" + name, ctypes.RTLD_GLOBAL)
        else: 
            retlib = ctypes.CDLL("../make/native/" + name, ctypes.RTLD_GLOBAL)
        if retlib is None:
            raise Exception("Missing library " + name + ".")
    elif utils.is_mac():
        if not utils.path_exists(".srcmode"):
            retlib  = ctypes.CDLL("native/" + name, ctypes.RTLD_GLOBAL)
        else: 
            retlib = ctypes.CDLL("../make/native/" + name, ctypes.RTLD_GLOBAL)
        if retlib is None:
            raise Exception("Missing library " + name + ".")
    return retlib;
    

def _unload_lib_obj(olib):
    if olib is not None:
        try:
            if utils.is_windows():
                import _ctypes
                _ctypes.FreeLibrary(olib._handle)
                del olib
            elif utils.is_linux():
                import _ctypes
                _ctypes.dlclose(olib._handle)
                del olib
            elif utils.is_mac():
                import _ctypes
                _ctypes.dlclose(olib._handle)
                del olib
        except:
            None
'''
del olib
    olib.dlclose(olib._handle)
while isLoaded('./mylib.so'):
    dlclose(handle)

It's so unclean that I only checked it works using:

def isLoaded(lib):
   libp = utils.path_absname(lib)
   ret = os.system("lsof -p %d | grep %s > /dev/null" % (os.getpid(), libp))
   return (ret == 0)

def dlclose(handle)
   libdl = ctypes.CDLL("libdl.so")
   libdl.dlclose(handle)
'''

class Windows():
        
    def __init__(self):
        self._dwaglib=None

    def load_library(self):
        if self._dwaglib is None:
            self._dwaglib = _load_lib_obj("dwaglib.dll");
    
    def unload_library(self):
        _unload_lib_obj(self._dwaglib)
        self._dwaglib=None
    
    def get_library(self):
        return self._dwaglib

    def task_kill(self, pid) :
        bret = self._dwaglib.taskKill(pid)
        return bret==1
    
    def is_task_running(self, pid):
        bret=self._dwaglib.isTaskRunning(pid);
        return bret==1
    
    def set_file_permission_everyone(self,fl):
        if utils.is_py2():
            self._dwaglib.setFilePermissionEveryone(fl)
        else:
            self._dwaglib.setFilePermissionEveryone(fl.encode('utf-8'))
    
    def fix_file_permissions(self,operation,path,path_src=None):
        None
        
    def is_win_xp(self):
        return self._dwaglib.isWinXP()
        
    def is_win_2003_server(self):
        return self._dwaglib.isWin2003Server()
    
    def is_user_in_admin_group(self):
        return self._dwaglib.isUserInAdminGroup()
    
    def is_run_as_admin(self):
        return self._dwaglib.isRunAsAdmin()
        
    def is_process_elevated(self):
        return self._dwaglib.isProcessElevated()
    
    def get_active_console_id(self):
        return self._dwaglib.getActiveConsoleId();
    
    def start_process(self, scmd, spythonHome):
        return self._dwaglib.startProcess(scmd, spythonHome);
    
    def start_process_in_active_console(self, scmd, spythonHome):
        return self._dwaglib.startProcessInActiveConsole(scmd, spythonHome);
    
    def win_station_connect(self):
        self._dwaglib.winStationConnect()
    
    def is_gui(self):
        return True 
    
    def reboot(self):
        os.system("shutdown -r -f -t 0")

class Linux():
    
    def __init__(self):
        self._dwaglib=None
    
    def load_library(self):
        try:
            if self._dwaglib is None:
                self._dwaglib = _load_lib_obj("dwaglib.so")
        except:
            None
    
    def unload_library(self):
        _unload_lib_obj(self._dwaglib)
        self._dwaglib=None
    
    def get_library(self):
        return self._dwaglib 
    
    def task_kill(self, pid) :
        try:
            os.kill(pid, -9)
        except OSError:
            return False
        return True
    
    def is_task_running(self, pid):
        try:
            os.kill(pid, 0)
        except OSError:
            return False
        return True
    
    def set_file_permission_everyone(self,f):
        utils.path_change_permissions(f, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH)
    
        
    def fix_file_permissions(self,operation,path,path_template=None):
        apppath=path
        if apppath.endswith(utils.path_sep):
            apppath=apppath[0:len(apppath)-1]
        apppath_template=path_template
        if apppath_template is not None:
            if apppath_template.endswith(utils.path_sep):
                apppath_template=apppath_template[0:len(apppath_template)-1]
        
        if operation=="CREATE_DIRECTORY":
            apppath_template=utils.path_dirname(path)    
            stat_info = utils.path_stat(apppath_template)
            mode = stat.S_IMODE(stat_info.st_mode)
            utils.path_change_permissions(path,mode)
            utils.path_change_owner(path, stat_info.st_uid, stat_info.st_gid)
        elif operation=="CREATE_FILE":
            apppath_template=utils.path_dirname(path)    
            stat_info = utils.path_stat(apppath_template)
            mode = stat.S_IMODE(stat_info.st_mode)
            utils.path_change_permissions(path, ((mode & ~stat.S_IXUSR) & ~stat.S_IXGRP) & ~stat.S_IXOTH)
            utils.path_change_owner(path, stat_info.st_uid, stat_info.st_gid)
        elif operation=="COPY_DIRECTORY" or operation=="COPY_FILE":
            if apppath_template is not None:
                stat_info = utils.path_stat(apppath_template)
                mode = stat.S_IMODE(stat_info.st_mode)
                utils.path_change_permissions(path,mode)
                stat_info = utils.path_stat(utils.path_dirname(path)) #PRENDE IL GRUPPO E L'UTENTE DELLA CARTELLA PADRE 
                utils.path_change_owner(path, stat_info.st_uid, stat_info.st_gid)
        elif operation=="MOVE_DIRECTORY" or operation=="MOVE_FILE":
            if apppath_template is not None:
                stat_info = utils.path_stat(apppath_template)
                mode = stat.S_IMODE(stat_info.st_mode)
                utils.path_change_permissions(path,mode)
                utils.path_change_owner(path, stat_info.st_uid, stat_info.st_gid)
        
    def is_gui(self):
        try:
            import detectinfo
            appnsfx = detectinfo.get_native_suffix()
            if not appnsfx=="linux_generic":
                appout = subprocess.Popen("ps ax -ww | grep 'X.*-auth .*'", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 
                lines = appout[0].splitlines()
                for l in lines:
                    if 'X.*-auth .*' not in l:
                        return True
        except:
            None
        return False
    
    def reboot(self):
        os.system("reboot")
        
    def get_tty_active(self):
        scons=None
        try:
            sactive=None
            fn = "/sys/class/tty/console/active"
            if os.path.exists(fn):
                f = open(fn, "rb")
                try:
                    s = utils.bytes_to_str(f.read(),"utf8")    
                    if s is not None and len(s)>0:
                        s=s.strip("\n").strip("\r")
                        appar = s.split(" ")
                        for apps in appar:
                            if apps[3:].isdigit():
                                sactive = apps
                                break
                        
                finally:
                    f.close()
            if sactive is not None:
                fn = "/sys/class/tty/" + sactive+ "/active"
                if os.path.exists(fn):
                    f = open(fn , "rb")
                    try:
                        s = utils.bytes_to_str(f.read(),"utf8")
                        if s is not None and len(s)>0:
                            s=s.strip("\n").strip("\r")
                            scons = s.split(" ")[0]                        
                    finally:
                        f.close()
                else:
                    scons = None
            if scons is None:
                #Try fgconsole
                data = subprocess.Popen(["fgconsole"], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
                so, se = data.communicate()
                if so is not None and len(so)>0:
                    so=utils.bytes_to_str(so, "utf8")
                    scons="tty"+so.replace("\n","").replace("\r","")
                    if not os.path.exists("/sys/class/tty/" + scons):
                        scons=None                    
            if scons is None:
                scons = sactive
        except:
            None
        return scons
    
    def get_process_ids(self):
        lret=[]
        lst = os.listdir("/proc")
        for name in lst:
            if name.isdigit():
                lret.append(int(name))
        return lret
    
    def get_process_environ(self,pid):
        eret = {} 
        try:
            fn = "/proc/" + str(pid) + "/" + "environ"
            if os.path.exists(fn):
                f = open(fn , "rb")
                try:
                    s = utils.bytes_to_str(f.read(),"utf8")    
                    if s is not None and len(s)>0:
                        arenv = s.split("\0")
                        for apps in arenv:
                            p = apps.index("=")
                            if p>0:
                                eret[apps[:p]]=apps[p+1:]                            
                finally:
                    f.close()
        except:
            None
        return eret
    
    def get_process_stat(self,pid):
        sret = {} 
        try:
            fn = "/proc/" + str(pid) + "/" + "stat"
            if os.path.exists(fn):
                f = open(fn , "rb")
                try:
                    s = utils.bytes_to_str(f.read(),"utf8")
                    if s is not None and len(s)>0:
                        rpar = s.rfind(r')')
                        name = s[s.find(r'(') + 1:rpar]
                        fields = s[rpar + 2:].split()            
                        sret['name'] = name
                        sret['status'] = fields[0]
                        sret['ppid'] = int(fields[1])
                        sret['pgrp'] = int(fields[2])
                        sret['session'] = fields[3]
                        sret['tty'] = int(fields[4])
                        sret['tpgid'] = int(fields[5])             
                finally:
                    f.close()
        except:
            None
        return sret

    def get_process_uid(self,pid):
        sret = -1
        try:
            fn = "/proc/" + str(pid) + "/" + "status"
            if os.path.exists(fn):
                f = open(fn , "rb")
                try:
                    s = utils.bytes_to_str(f.read(),"utf8")
                    if s is not None and len(s)>0:
                        import re
                        reuids=re.compile(r'Uid:\t(\d+)\t(\d+)\t(\d+)')
                        ur, ue, us = reuids.findall(s)[0]
                        sret = int(ur)
                finally:
                    f.close()
        except:
            None
        return sret
    
    def get_process_gid(self, pid):
        sret = -1
        try:
            fn = "/proc/" + str(pid) + "/" + "status"
            if os.path.exists(fn):
                f = open(fn , "rb")
                try:
                    s = utils.bytes_to_str(f.read(),"utf8")
                    if s is not None and len(s)>0:
                        import re
                        reuids=re.compile(r'Gid:\t(\d+)\t(\d+)\t(\d+)')
                        gr, ge, gs = reuids.findall(s)[0]
                        sret = gr
                finally:
                    f.close()
        except:
            None
        return sret
    
    
    def get_process_cmdline(self, pid):
        lret = [] 
        try:
            fn = "/proc/" + str(pid) + "/" + "cmdline"
            if os.path.exists(fn):
                f = open(fn , "rb")
                try:
                    s = utils.bytes_to_str(f.read(),"utf8")
                    if s is not None and len(s)>0:
                        lret = s.split("\0")             
                finally:
                    f.close()
        except:
            None
        return lret
    
    def get_utf8_lang(self):
        altret=None
        try:
            p = subprocess.Popen("locale | grep LANG=", stdout=subprocess.PIPE, shell=True)
            (po, pe) = p.communicate()
            p.wait()
            if len(po) > 0:                
                po = utils.bytes_to_str(po, "utf8")                
                ar = po.split("\n")[0].split("=")[1].split(".")
                if ar[1].upper()=="UTF8" or ar[1].upper()=="UTF-8":
                    if ar[0].upper()=="C":
                        altret = ar[0] + "." + ar[1]
                    else:
                        return ar[0] + "." + ar[1]
        except:
            None        
        try:                
            p = subprocess.Popen("locale -a", stdout=subprocess.PIPE, shell=True)
            (po, pe) = p.communicate()
            p.wait()
            if len(po) > 0:
                po = utils.bytes_to_str(po, "utf8")
                arlines = po.split("\n")
                for r in arlines:
                    ar = r.split(".")
                    if len(ar)>1 and ar[0].upper()=="EN_US" and (ar[1].upper()=="UTF8" or ar[1].upper()=="UTF-8"):
                        if ar[0].upper()=="C":
                            altret = ar[0] + "." + ar[1]
                        else:
                            return ar[0] + "." + ar[1]
                #If not found get the first utf8
                for r in arlines:
                    ar = r.split(".")
                    if len(ar)>1 and (ar[1].upper()=="UTF8" or ar[1].upper()=="UTF-8"):
                        if ar[0].upper()=="C":
                            altret = ar[0] + "." + ar[1]
                        else:
                            return ar[0] + "." + ar[1]
        except:
            None
        return altret

class Mac():
        
    def __init__(self):
        self._dwaglib = None
        self._propguilnc = None #COMPATIBILITA VERSIONI PRECEDENTI
        self._propguilnc_semaphore = threading.Condition() #COMPATIBILITA VERSIONI PRECEDENTI
            
    def load_library(self):
        try:
            if self._dwaglib is None:
                lbn="dwaglib.dylib"
                #COMPATIBILITY BEFORE 14/11/2019
                if not utils.path_exists(".srcmode"):
                    if not utils.path_exists("native/"+lbn):
                        lbn="dwaglib.so"
                #COMPATIBILITY BEFORE 14/11/2019
                self._dwaglib = _load_lib_obj(lbn)
        except:
            None
    
    def unload_library(self):
        _unload_lib_obj(self._dwaglib)
        self._dwaglib=None
    
    def get_library(self):        
        return self._dwaglib
    
    def task_kill(self, pid) :
        try:
            os.kill(pid, -9)
        except OSError:
            return False
        return True
    
    def is_task_running(self, pid):
        try:
            os.kill(pid, 0)
        except OSError:
            return False
        return True
    
    def set_file_permission_everyone(self,f):
        utils.path_change_permissions(f, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH)
    
    def fix_file_permissions(self,operation,path,path_src=None):
        apppath=path
        if apppath.endswith(utils.path_sep):
            apppath=apppath[0:len(apppath)-1]
        apppath_src=path_src
        if apppath_src is not None:
            if apppath_src.endswith(utils.path_sep):
                apppath_src=apppath_src[0:len(apppath_src)-1]
        else:
            apppath_src=utils.path_dirname(path)    
        stat_info = utils.path_stat(apppath_src)
        mode = stat.S_IMODE(stat_info.st_mode)
        if operation=="CREATE_DIRECTORY":
            utils.path_change_permissions(path,mode)
            utils.path_change_owner(path, stat_info.st_uid, stat_info.st_gid)
        elif operation=="CREATE_FILE":
            utils.path_change_permissions(path, ((mode & ~stat.S_IXUSR) & ~stat.S_IXGRP) & ~stat.S_IXOTH)
            utils.path_change_owner(path, stat_info.st_uid, stat_info.st_gid)
        elif operation=="COPY_DIRECTORY" or operation=="COPY_FILE":
            utils.path_change_permissions(path,mode)
            stat_info = utils.path_stat(utils.path_dirname(path)) #PRENDE IL GRUPPO E L'UTENTE DELLA CARTELLA PADRE 
            utils.path_change_owner(path, stat_info.st_uid, stat_info.st_gid)
        elif operation=="MOVE_DIRECTORY" or operation=="MOVE_FILE":
            utils.path_change_permissions(path,mode)
            utils.path_change_owner(path, stat_info.st_uid, stat_info.st_gid)
    
    def is_gui(self):
        return True
    
    def get_console_user_id(self):
        return self._dwaglib.getConsoleUserId();
    
    #GUI LAUNCHER OLD VERSION 03/11/2021 (DO NOT REMOVE)
    def is_old_guilnc(self):
        #READ installer.ver
        bold=False
        try:
            sver="0"
            ptver="native" + os.sep + "installer.ver"
            if utils.path_exists(ptver):
                fver = utils.file_open(ptver, "rb")
                sver=utils.bytes_to_str(fver.read())
                fver.close()
            bold=(int(sver)==0)
        except:
            None
        return bold
    
    
    #GUI LAUNCHER OLD VERSION 03/11/2021 (DO NOT REMOVE)
    def _signal_handler(self, signal, frame):
        self._propguilnc_stop=True
    
    #GUI LAUNCHER OLD VERSION 03/11/2021 (DO NOT REMOVE)
    def start_guilnc(self):        
        self._propguilnc_stop=False
        signal.signal(signal.SIGTERM, self._signal_handler)
        bload=False
        suid=str(os.getuid())
        spid=str(os.getpid())
        lnc = ipc.Property()
        prcs = []
        try:
            while not self._propguilnc_stop and utils.path_exists("guilnc.run"):
                if not bload:
                    if lnc.exists("gui_launcher_" + suid):
                        try:
                            lnc.open("gui_launcher_" + suid)
                            lnc.set_property("pid", spid)
                            bload=True
                        except:
                            time.sleep(1)
                    else:
                        time.sleep(1)
                if bload:
                    if lnc.get_property("state")=="LNC":
                        popenar=[]
                        popenar.append(sys.executable)
                        popenar.append("agent.py")
                        popenar.append(u"app=" + lnc.get_property("app"))
                        for i in range(GUILNC_ARG_MAX):
                            a = lnc.get_property("arg" + str(i))
                            if a=="":
                                break;
                            popenar.append(a)
                        libenv = os.environ
                        libenv["LD_LIBRARY_PATH"]=utils.path_absname("runtime/lib")
                        #print("Popen: " + " , ".join(popenar))
                        try:
                            p = subprocess.Popen(popenar, env=libenv)
                            prcs.append(p)
                            #print("PID: " + str(p.pid))
                            if p.poll() is None:
                                lnc.set_property("state", str(p.pid))
                            else:
                                lnc.set_property("state", "ERR")
                        except:
                            lnc.set_property("state", "ERR")
                    time.sleep(0.2)
                #Pulisce processi
                prcs = [p for p in prcs if p.poll() is None]
        finally:
            if bload:
                lnc.close()
    
    #GUI LAUNCHER OLD VERSION 03/11/2021 (DO NOT REMOVE)
    def init_guilnc(self,ag):
        if self.is_old_guilnc():
            self._propguilnc_semaphore.acquire()
            try:
                #COMPATIBILITA VERSIONI PRECEDENTI
                if utils.path_exists("native/dwagguilnc"):
                    self._propguilnc = {}
                    if not utils.path_exists("guilnc.run"):
                        f = utils.file_open("guilnc.run","wb")
                        f.close()
            finally:
                self._propguilnc_semaphore.release()                        
    
    #GUI LAUNCHER OLD VERSION 03/11/2021 (DO NOT REMOVE)
    def term_guilnc(self):
        if self.is_old_guilnc():
            self._propguilnc_semaphore.acquire()
            try:
                if utils.path_exists("guilnc.run"):
                    utils.path_remove("guilnc.run")
                if self._propguilnc is not None:
                    for l in self._propguilnc:
                        self._propguilnc[l].close()
                    self._propguilnc=None
            finally:
                self._propguilnc_semaphore.release()            
    
    #GUI LAUNCHER OLD VERSION 03/11/2021 (DO NOT REMOVE)
    def exec_guilnc(self, uid, app, args):
        self._propguilnc_semaphore.acquire()
        try:
            if self._propguilnc is not None:
                suid=str(uid)
                lnc = None
                if suid not in self._propguilnc:
                    lnc = ipc.Property()
                    fieldsdef=[]
                    fieldsdef.append({"name":"pid","size":20})
                    fieldsdef.append({"name":"state","size":20}) # ""=NESSUNA OPERAZIONE; "LNC"="ESEGUI"; "NUM"=PID ESEGUITO 
                    fieldsdef.append({"name":"app","size":100})
                    for i in range(GUILNC_ARG_MAX):
                        fieldsdef.append({"name":"arg" + str(i),"size":GUILNC_ARG_SIZE})
                    def fix_perm(fn):
                        utils.path_change_owner(fn, uid, -1)
                        utils.path_change_permissions(fn, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP)
                    lnc.create("gui_launcher_" + suid, fieldsdef, fix_perm)
                    self._propguilnc[suid]=lnc
                else:
                    lnc=self._propguilnc[suid]
                
                cnt=20.0                
                #PULISCE
                lnc.set_property("state","")
                lnc.set_property("app","")
                for i in range(GUILNC_ARG_MAX):
                    lnc.set_property("arg" + str(i),"")
                #RICHIESTA                        
                lnc.set_property("app", app)
                for i in range(len(args)):
                    lnc.set_property("arg" + str(i), args[i])
                st="LNC" 
                lnc.set_property("state", st)
                while st=="LNC" and cnt>0.0:
                    st = lnc.get_property("state")
                    time.sleep(0.2)
                    cnt-=0.2                        
                if st=="LNC":
                    lnc.set_property("state", "")
                    raise Exception("GUI launcher timeout.")
                if st=="ERR":
                    raise Exception("GUI launcher error.")
                return int(st)          
        finally:
            self._propguilnc_semaphore.release() 
        return None
    
    def reboot(self):
        os.system("shutdown -r now")                                                                                   resources.py                                                                                        0000755 0001750 0001750 00000010212 14217125774 012741  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

import locale
import subprocess
import utils
import threading
import importlib

class ResText:
    
    def __init__(self, pkgnm):
        if utils.path_exists(".srcmode"):
            self._pkgnm = pkgnm.split(".")[1]
        else:
            self._pkgnm=pkgnm
        self._data_default = self._get_data("default")
        self._lang_current = None
        self._data_current = None
        self._semaphore=threading.Condition()

    def _get_data(self,lng):
        try:
            if lng is None or lng=="":
                return None
            arlng = lng.split("_")
            testlng=""
            for i in range(len(arlng)):
                if i==0:
                    arlng[i]=arlng[i].lower()
                    testlng=arlng[i]
                else:
                    arlng[i]=arlng[i].upper()
                    testlng+="_" + arlng[i]            
            objlib = importlib.import_module(self._pkgnm + "." + lng)
            if objlib is None:
                raise Exception("Not found.")
            return getattr(objlib, 'data', None)
        except:
            arlng = lng.split("_")
            if len(arlng)>1:
                testlng=""
                for i in range(len(arlng)-1):
                    if i>0:
                        testlng+="_"
                    testlng+=arlng[i]
                return self._get_data(testlng)
            else:
                return None

    def set_locale(self, lng):
        self._semaphore.acquire()
        try:
            self._set_locale(lng)
        finally:
            self._semaphore.release()
    
    def _set_locale(self, lng):
        appdt = self._get_data(lng)
        if appdt is not None:
            self._lang_current=lng
            self._data_current=appdt
        else:
            self._lang_current="default"
            self._data_current=self._data_default
            
    def get(self, key):
        try:
            self._semaphore.acquire()
            try:
                if self._lang_current is None:
                    applng=None
                    try:
                        if utils.is_windows():
                            import ctypes
                            windll = ctypes.windll.kernel32
                            windll.GetUserDefaultUILanguage()
                            wl = locale.windows_locale[windll.GetUserDefaultUILanguage()]
                            applng=wl.split("_")[0]
                        elif utils.is_mac():
                            p = subprocess.Popen(['defaults', 'read', '-g', 'AppleLocale'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                            sout, serr = p.communicate()
                            if sout is not None:
                                applng = sout.replace("\n","").replace(" ","_")[:10]
                    except:
                        None                    
                    try:
                        if applng is None:
                            l = locale.getdefaultlocale()
                            if l is not None:
                                applng=l[0]
                    except:
                        None
                    
                    self._set_locale(applng)
                    
            finally:
                self._semaphore.release()
            
            if key in self._data_current:
                return self._data_current[key]
            elif key in self._data_default:
                return self._data_default[key]
            else:
                return "RES_MISSING#" + key
        except:
            return "RES_ERROR#" + key
    
class ResImage:
    
    def __init__(self, pkgnm):
        if utils.path_exists(".srcmode"):
            self._pkgnm=pkgnm.split(".")[1]
        else:
            self._pkgnm=pkgnm        
        self._basepth=utils.str_new(self._pkgnm.replace(".",utils.path_sep))
        
    def get(self, nm):        
        return self._basepth + utils.path_sep + utils.str_new(nm)
        
                                                                                                                                                                                                                                                                                                                                                                                              ui/                                                                                                 0000755 0001750 0001750 00000000000 14446054645 010775  5                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 ui/images/                                                                                          0000755 0001750 0001750 00000000000 14446054645 012242  5                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 ui/images/logo.png                                                                                  0000644 0001750 0001750 00000014304 13422307023 013672  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 PNG

   IHDR   @   @   iq   bKGD      	pHYs        tIME
6CCH   tEXtComment Created with GIMPW  ,IDATxy|]u{sђ-Ymy`c3;q	mh@˃4yiM(M!/'!a
T`&6xƖ%ٖI{uu38GMy=3[kZ8/ןSWJ%Ak׭[[|ϙsG4hJc;lom9X}#ɽ?=BD (PJ#NDyH<رc?#'LtyqyY:.<Oy(PG<'o>?%Ӑ% x[O`ъN{srү}YrHǺ߽SyXEIiiH ǯ3U?N~[O`Ƣ7z`X9+ɐ/un#w]羧Pu=<Wa&c* q>x,A6#r)gw8u o|˗\vE2[,EA)R
k/;YtׇQ^ S
HiԎ-q=cuH\P,`x}CzlykwϞ)MV(@kVwۭߜz1JqM6X{B1gת*t
&Mv㖦Gz{{JcM6_}f)@7?ZA'F0P8D>WP(=z>eQZ'ߟ9d*Œo|uWwϞ;b!| wE&X,־	D5
D7YOB d2NHA2[l~pܕ#ݽ}¤ Z-4 PBQk@  8BAHH)I3ldd hG(/[b	;<01eW- " C
>4R
Vb1X~D wh;*+/9H0yBdiq@q>1ܖB"DJÎ h HsO= ׭Ckmd϶XҺ'JG=S)L!A.jq^!pUˀxsWR`H_}}[I蔼`ѽu?/)+y
d2֬]h_3XtisKkKK<0@j@i˂uq]  *SӠ3]?Hžwzot\!UU|n#qLӜܲs'aHrt%ԇ@ \ףv!G.[4()SWWK8dD#CE) 0ɐfsĶ\<v}{=ܴy˅ *P]cu]]Fv\b*qt	ђ*L+vNKN&SZ^J<l6@\.?D䑸:ET!<(&eyEtz6@
_s@۫  D7[8sv"1Yn?gZKS^B}ۘTk0mx̐E>Gk=Ti)߻o (_֚R|S5踠	}GLXwqҙs>b|@+q	MYXUHa &bLڴR'5jk'N=أxcH7iD׍_#0R5410|l055ē/Г)?fLO{D)(q+<1N>q8XpiPC4%Ue[S{j#?, DW_Y1g4OD&"0c4-c'EN'cSyVQO	ʪ]6p!f|߷<y>vK}}'D<Em3Wxw.cd+`+`Ϧ_jnn6Ο2y61LiIo_/uE_cS <d_Wm"6(BO<ץ&̞<X1c*z~xXq?泗}k>'ML4p8t Bd39^R|@E6opǭ߼e;-z=~ᅗOī	QVg9GuE	RC{Piak&T~.B8W\~"w=LXj~v>d+xюy/\P(Z/t5Myw0Py-8W97C"ByS@JHXpݬJj¬]?sY<Vg%R>|Z˸77* VOBeE%0i4=uS)/܊EBRn1iq>rPQSJxqi/Ѳrˠ-)'}W#~I2n\Ȗ_9|&4}j jk6LV=h?D%S1K|nY|eTZsլm#mI<nR]nP&1]Ň;<zE:"!ɜYU< 0bFL:S\9]t
KWn斛N,ΚucǍ՝H<3y^ȚU|sJ
1%
UUgYf͸q5"dYE"S֬~
bjC5U`R}Y-ddR2U|vF&Dy|ahD{2P.@h<a:9X?^I. CJ^|q޷-iW(
<,-_?'N<LRJ֮K|:e/әt~eAnYѰobq[G8*}%$0-±ؚ΄I!:sϝLBNB`.at~<m!ؾs7St(RyRFM\C
hS\}p{F$"SO%
HG.d)*SBí<}{933Lb@š:@hulv_XXVlky['zGwZr4EH]]`m{wf!8(1eQ"%Uq:Ep==4_SzD%:]RJ<	JDC-z }.W]5!5wŐ>4iAj+M6w-˥EPP#<<ez{-Nsx01x؎q=D&%%E(dN=)kJ\)hٛc
 l&W8oJ%d\EmuTmĘ04e%!Q n9C]`q88b4G
LjePB&X j-v\&\;K

ڸ䪓8fӁ]6;SM5@<Њʸ-ToD}S,ڣh}0>Li/-/:ݽTWWSZZJ$NYY)BhC&4@0$M"UဓVu#3&2!CpY%lwQAaa	519SJ0`>/kW^팾L"͑fdF__ ف{iEъX4VVQYя~4mggC
|ڶyǋ_ǲ.SbH
	"3'Fi05=6*Lv,W U-BijGg_L*ؙ*KLEͥgא+qͳ7mԓf|>vFk <WBl&f==/ٞK48qR8VS
"&D,%xCv4R@M=̨IeH
Qtf]KMiAQSE32#N&6uK]u]`>E	>?Cܾk׫7kE\yY,ݿ)g`h jI"aA8bskn `RL(*b1ӏzK+t
gW$X֜uoIR(:p_~\Y@OڰaݳqfyMѶ)<"[0M!ѨE4bѐdWNqNE4$$aA<,~BXȠ:Dgڡk%5)[sGn;6;wvupMMo~oyqSAZ3:ֽI&4N@iDA$l%)!IAؐ`@$B0HLNqJLcs-S{I$9=޺m[L֢BѹPZKZv]9Og_%D+$0$%l,$A𗀫	y
*9d
90gFHu?;]6=]կ~gGP_OGGuK}ɴ<o(.'E`{{3;m&;&I$j	 2aV7K2B sڒ.K>ϻTnw&Ac&B;h==19޳dd(}/p6HR/-el$R^J$j
,KbaGAI@NQ˺scLŌv7?K~+>>1 Һ$rGUN8gngy!%O	xư8B.hlGc0c ڻE,YZ!ZJ)x׿h,ZJGQ,ri1¾KOAmHpE^>`|rybP.cŲeO}nԏ.ۚwuM]w"{RJ:}ط̳ڱL0Iy?}=<4mneWH)Q]³IV ȣs|.2XK+cZP:$F83BTQ=h,eYCz Cl.?r<ޞdyEee(.T?Zs<#:4͇ JamMps@3-	TrYX$Xֺ=|n'Z5k7Oh4-˲U<xߑd&o/
Ѻ_-Ox6!`6m;q05\wɥo'o޴~݆k^vL ̘~֯6$vۭgqmm vG zH&;n<<9BI-[{GoVJs|E +/V>y['uv|3Y#"Cx!CX?/FV_/VG.R
9L@c4[( 2ll2c8.7{F+-jmݎBd_g&5=OY~Qzy8C6%+]K۶-Ԉ9jkk5=Q'忛j&ݻuQא8VwH$:sRc_xmŦ)r}?ذ;ѵ:>}y<32/(} rL/N=aviYP(.K]B@[yqlX}Lq]ݳ;AZ;ٱ޳#y
rodo}Qr FuW'MqpwoYvhY<Im0o]li];C.K{-_.z
 q<݉mDO%L&ֿ͛6fcXt;<cKviǵl&
H-8q&_={/<5`>8V">]?ܝ8p{u?:йxf$!Nw8HX,R,#T2-չ\E`!#0L/n ʀ#uu19bR3PQwv{X>s-սMkG*zhe{HQZ{;՗v|w	#    IENDB`                                                                                                                                                                                                                                                                                                                            ui/images/activities_transfers.bmp                                                                  0000644 0001750 0001750 00000002212 14011016041 017142  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 BM         |                                            BGRs                                                               33333333333333333333i!w3333 vb3333333&      *333dJs333333.2'@,G0M033dJs333332Gn;]Hp]*EW33dJs33333m,Jsd(   #|3dJs33333)B#}3Jsd3oJs3dJs33333/33Jsd32/3dJs33333333Jsd3/23dJs33/33333Jsd3Jso3dJs3#})B33333Jsd3#|   (dJs,m33333Jsd33Z%=\Hp>bCi233333Jsd3300M,G'@2.333333Jsd333*      &3333333b v3333!wi33333333333333333333                                                                                                                                                                                                                                                                                                                                                                                      ui/images/activities_shell.bmp                                                                      0000644 0001750 0001750 00000002212 14011014244 016245  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 BM         |                  }   }                       BGRs                                                               3333333333333333+Ci                                    Dj,=`                                          ?c                                                                                                                                                                                                                                                      +#}#~33m                           	4S+,9Z                                       ..+                                    	4S+,9Z                                    *#}                                 =`                                          >b+Bh                                    Bh+3333333333333333                                                                                                                                                                                                                                                                                                                                                                                      ui/images/activities_screencapture.bmp                                                              0000644 0001750 0001750 00000002212 14011004043 017775  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 BM         |                  }   }                       BGRs                                                               3333333333333333333.
                  
.333333310        013333(Af
6U
6U
6U
6U
  

6U
6U
6U
6UAf("8                  RQ}                  $;                     8X8X                        %''''''''''''%      13333333333331      13333333333331      13333333333331      13333333333331      13333333333331      13333333333331    5-111111111111-"8$ 5                                     5$3333333333333333                                                                                                                                                                                                                                                                                                                                                                                      ui/images/activities_logo.bmp                                                                       0000644 0001750 0001750 00000003312 14011005221 016073  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 BM         |               @  a  a                      BGRs                                                               651651651651651:96KKH651uutuut651IIF:96651651651651651651651651651fed?>;~~?>;fed651651651651651651651DC@~~DC@651651651651651DC@651~~651DC@651651651fed~kkjkkj~fed651:96Ǣ<;8KKHƕؔջKKH651?>;~Ƭs؟υӍ͂{Ȍ~?>;651uut~ީn|gňӦɖƐw޵~uut鶅ֺgJKtPjߒIR궋܅@܄@ہ?ہ?<aځ>Huut~ߏX݆Ox<m/n0Ȱgp4Ќa~uut651?>;~o8j4}KމZފZo{It;~?>;651KKHē{`1h9k=i9榇ۈ`yKKH:96ƃfnHmFϑu<;8651fed~kkjkkj~fed651651651DC@651~~651DC@651651651651651DC@~~DC@651651651651651651651edc?>;~~}~?>;edc651651651651651651651651651:96KKH651ttstts651IIF:96651651651651651                                                                                                                                                                                                                                                                                                                      ui/images/logo48x48.bmp                                                                             0000644 0001750 0001750 00000022212 14304066772 014416  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 BM$         |   0   0          $                          BGRs                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               SΝ❝❝ΝS                                                                                                                                        ;                                ;                                                                                                        o❝?                        :蝝                                                                                            J䝝ޝ                ڝ雛R                                                                                                                                                                        򝝝I    ĝ    E                                                                            杝ÝÝ杝                                                                                񝝝󞞞                                                            H                                H                                        Н^    񜜜    Mɝ                                    dԜZ0띝쟟0Zԝe                            򝝝Żɾ󢢢                        شѹþ                    Цݡ۝қ󙙙                $ԝɘؙӗǋϴ՜$                    wؚ͓ӘÊ캄                                -ʝlțċєݞޥק꺀黌±ћ3                                            ts~ȉՒݙю̓齗ٞrĻ                                        .Ý{Uݞo繌q{ѐُݔےؐ҉ÅΨ嵋ǫ்ˬě.                    띝~Sؗg崃dmϕ̈ˁґ٢}zǄǎmۚ_Ȯѽɠ띝        ֝th{Nԑ_|XhňiqxԦϝѡŎŒɠn        띝{XFvIӋWq]Шz{w븀ʠSgbLߗLܕP㴏ങȉb¼        jB-oAшTšЯWNߑIߑJKSrߑJyގFݎHHIؕbˇ]f9        읝gF7i>ٞwߐO݉A܅A܄A܄A܄Aۄ@vҷhڂ=ۃ@A?ؕdwMX/        םr`YuRuFޞru3|7w6x7y9x9y9豌뼜v5y9ۂ<{8זm`7E$¾        띝ywE%_5{d]ځJo3k.l0݇T竇譅l.m2y5i/ҒnN)B*띝                    -Ýn8"ȋkۈ\p6wBވXqr܂Oߌ]q;r>݊Zl-`*`-Ăb@dRě.                                        cWT;Ąi乢c2\%_+c.d0g5R夂o>zJكTKg>Z99                                            -˝F]@S/ٗtX)d6h:j=l>l>݉azPޓn~TjAהsЕ|?#q?1ѝ4                                wwrqsB0C%z]yWe?gAi@i@i@׀\qKsErqPr[L=                    $՝wpoo<,aHܛlNhHhGhEiE_uRnNiNǒ~ĔZM՜$                ~yxY6*|hНhPjQjOiOsYŅnoXt^xf󙙙                    f\YlaqjWmYo[oY|l[_Rws                        򝝝~vjgpZRrVMr]Vso󢢢                            dӜZ/띝쟟0Zӝd                                    Н^    󙙙    Mȝ                                        G                                G                                                            򝝝󞞞                                                                                朜杝                                                                            򝝝I    ŝ    E                                                                                                                                                                        J坝ޝ                ڝ雛R                                                                                            o❝?                        :蝝                                                                                                        ;                                ;                                                                                                                                        S͝❝❝͝S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      ui/images/logo32x32.bmp                                                                             0000644 0001750 0001750 00000010212 14010256004 014354  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 BM         |                    h  h                      BGRs                                                                                                                                                                                                                                                   7❝➞7                                                                                    w    QQ    w                                                            H坝|    aa    }霜P                                                    (.rr.)                                                    杝񝝝񝝝杝                                            )        >?        )                            M?    ˝    ?N                    蝝͝жѲǶ͝褤                xѱۯw                ͤܝיċļ                wǤɔ֘ک}                        .睝{鷍wʉؔƅ䰄ѡ}盛.                    8Qbs񝝝eDᭃcs؟υӍ͂{Ȍe罛䶖񝝝sbQ8        mCަyߚQ|gňӦɖƐwy׾°        h>ݢv鴃ֺgJKtPjߒILؐW{Q}        c?ߩ굊܅@܄@ہ?ہ?<aځ>A׋Uh?{        ᝝{>#mAߏX݆Ox<m/n0Ȱgp4}8΁VN)        7Paq񝝝P1%ăfo8j4}KމZފZo{It;](qN6񝝝raP7                    .睝}m"
uRuI`1h9k=i9榇ۈ`uIpLeIYM盛.                        wN:4Q9ȇkb?gBhAh?׃_sH͍qȕk`                ]OKR?םiNjMgKȂhoWu`                xyvfSLdWaOgTn^`T~pkw                蝝̝~|zx̝褤                    M>    ̝    >M                            (        >?        (                                            杝񝝝񝝝杝                                                    (.rr.)                                                    H坝|    bb    }霜P                                                            v    QQ    v                                                                                    6᝝᜜6                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ui/images/logo16x16.bmp                                                                             0000644 0001750 0001750 00000002212 13763160606 014401  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 BM         |                                          BGRs                                                                               ,44,                            HH                                        ]]    )åޱũ,ʢ2H{ѓܘˇ龗ϹH2nroƜnw̥m綖܄Dy9窂ۅKۊJu[2Hsg3vGߎeyIhAH2}iy^hGvUwZ)yoyn,    ]]                                        HH                            +44+                                                                                                                                                                                                                                                                                                                                                                                                      ui/images/__init__.py                                                                               0000644 0001750 0001750 00000000514 13422307023 014333  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''
import resources

resimage=resources.ResImage("ui.images")

def get_image(nm):
    return resimage.get(nm)                                                                                                                                                                                    ui/messages/                                                                                        0000755 0001750 0001750 00000000000 14446054645 012604  5                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 ui/messages/ca.py                                                                                   0000644 0001750 0001750 00000030711 14443646224 013540  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Accepto',
    'accessConfirm':u'Vol accedir al teu dispositiu.',
    'agentName':u'Nom de l\'agent',
    'alreadyInstalled':u'DWAgent ja instal·lat.\n\nL\'agent s\'actualitza automàticament a la darrera versió. Això vol dir que no cal instal·lar manualment les actualitzacions més recents.',
    'back':u'Enrere',
    'cancel':u'Cancel·lar',
    'cancelInstall':u'La instal·lació s\'ha cancel·lat.',
    'cancelUninstall':u'La desinstal·lació s\'ha cancel·lat.',
    'checkInstallCode':u'Comprovant el codi d\'activació...',
    'chooseProxyType':u'Quin tipus de proxy vols utilitzar?',
    'close':u'Tancar',
    'code':u'Codi',
    'commands':u'Ordres',
    'configureAgent':u'Configurar l\'agent',
    'configureAgentDisabled':u'Agent desactivat',
    'configureAgentEnabled':u'Agent habilitat',
    'configureChangeInstallKey':u'Canviar el codi d\'activació',
    'configureChooseMonitorTrayIconVisibility':u'Vols que es mostri el monitor d\'estat a la barra d\'estat?',
    'configureChooseOperation':u'Escull una opció, si us plau:',
    'configureDesktopNotification':u'Notificació d\'escriptori',
    'configureDesktopNotificationOK':u'Notificació d\'escriptori configurada correctament.',
    'configureDisableAgent':u'Desactivar l\'agent',
    'configureDisableAgentQuestion':u'Vols desactivar l\'agent?',
    'configureEnableAgent':u'Activar l\'agent',
    'configureEnableAgentQuestion':u'Vols activar l\'agent?',
    'configureEnd':u'S\'ha acabat la configuració.',
    'configureErrorConnection':u'Error de connexió. Si et plau, verifica que el servei DWAgent és engegat.',
    'configureExit':u'Tancar',
    'configureInsertPassword':u'Si et plau, escriu la paraula de pas de configuració:',
    'configureInstallAgent':u'Com vols configurar l\'agent?',
    'configureInstallCode':u'Introduïnt el codi d\'instal·lació',
    'configureInstallNewAgent':u'Creant un nou agent',
    'configureInstallPassword':u'Paraula de pas de la instal·lació',
    'configureInstallUser':u'Usuari',
    'configureInvalidPassword':u'Paraula de pas incorrecta',
    'configureKeyInstalled':u'Clau instal·lada correctament',
    'configureLater':u'Configurar més tard',
    'configureMonitor':u'Configurar el monitor',
    'configurePassword':u'Establir la paraula de pas',
    'configurePasswordErrNoMatch':u'Els passwords no són iguals.',
    'configurePasswordUpdated':u'Paraula de pas canviada.',
    'configureProxy':u'Configurar el servidor intermediari',
    'configureProxyEnd':u'Servidor intermediari configurat correctament',
    'configureRemovePassword':u'Esborrar la paraula de pas',
    'configureRemovePasswordQuestion':u'Vols esborrar la paraula de pas?',
    'configureSetPassword':u'Establir paraula de pas',
    'configureTitle':u'DWAgent - Configuració',
    'configureTrayIconOK':u'Configurada correctament la visibilitat de la icona a la barra de tasques.',
    'configureTrayIconVisibility':u'Visibilitat de la icona a la barra de tasques',
    'configureUninstallKeyQuestion':u'Desinstal·lar l\'actual codi d\'instal·lació?',
    'configureUninstallationKey':u'Desinstal·lació...',
    'confirmExit':u'Segur que vols sortir?',
    'confirmInstall':u'Vols instal·lar el DWAgent a \'{0}\'?',
    'confirmUninstall':u'Vols esborrar el DWAgent?',
    'copyFiles':u'Copiant arxius...',
    'createNewAgent':u'Creació de l\'agent en progrés...',
    'decline':u'No ho accepto',
    'desktopNotificationAutoHide':u'Amagar automàticament',
    'desktopNotificationNone':u'Cap',
    'desktopNotificationVisible':u'Visible',
    'downloadFile':u'Descarregant l\'arxiu \'{0}\'...',
    'endInstall':u'La instal·lació ha acabat.',
    'endInstallConfigLater':u'La instal·lació ha acabat.\nL\'agent no ha estat pas configurat. Pots continuar més tard amb la configuració.',
    'endUninstall':u'La desinstal·lació ha acabat.',
    'enter':u'Introdueix',
    'enterInstallCode':u'Escriu el codi d\'instal·lació',
    'enterInstallNewAgent':u'Escriu la informació per a crear el nou agent:',
    'enterRunCode':u'Escriu el codi de connexió',
    'error':u'Error',
    'errorAgentAlreadyExsists':u'L\'agent {0} ja existia',
    'errorAgentMax':u'Has excedit el nombre màxim d\'agents.',
    'errorAgentNameNotValid':u'El nom de l\'agent no és vàlid. No pots pas fer servir els caracters / \ | # @ : .',
    'errorConnectionConfig':u'Error de connexió. Si et plau, verifica que el servei DWAgent sigui engegat.',
    'errorConnectionQuestion':u'Error de connexió. Si et plau, verifica que la connexió a internet o el tallafocs.\nVols configurar un servidor intermediari (proxy)?',
    'errorInvalidCode':u'El codi que has introduït no és vàlid.',
    'errorInvalidUserPassword':u'Usuari o paraula de pas no correctes.',
    'fieldRequired':u'Es requereix el camp \'{0}\'.',
    'install':u'Instal·lar',
    'installMonitor':u'Instal·lant el monitor...',
    'installMonitorErr':u'Instal·lació del monitor fallida.',
    'installService':u'Instal·lant el servei...',
    'installServiceErr':u'Instal·lació del servei fallida.',
    'installShortcuts':u'Instal·lant dreceres...',
    'installShortcutsErr':u'Instal·lació de les dreceres fallida.',
    'installerNotSupported':u'Aquest instal·lador ja no és compatible. Si us plau, descarregueu la darrera versió.',
    'ipAddress':u'Adreça IP: {0}',
    'linuxRootPrivileges':u'Hauries de tindre privilegis de root per instal·lar el DWAgent.\nSi et plau, reinicia l\'script amb l\'usuari root.',
    'menuConfigure':u'Configurar',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Desinstal·lar',
    'missingInfoFile':u'Arxiu info.json no trobat.',
    'missingNative':u'Native no trobat.',
    'missingRuntime':u'Runtime no trobat.',
    'monitorActive':u'actiu',
    'monitorAgentDisabled':u'Agent desactivat.',
    'monitorAgentEnabled':u'Agent actiu.',
    'monitorConfigure':u'Configurar',
    'monitorConnections':u'Connexions',
    'monitorCurrentActivities':u'Activitats actuals',
    'monitorDisable':u'Desactivar',
    'monitorDisableAgentQuestion':u'Vols desactivar l\'agent?',
    'monitorDownload':u'Descàrrega',
    'monitorEnable':u'Activar',
    'monitorEnableAgentQuestion':u'Vols activar l\'agent?',
    'monitorEnterPassword':u'Escriu la paraula de pas:',
    'monitorErrorConnectionConfig':u'Error de connexió. Si et plau, verifica que el servei DWAgent és engegat.',
    'monitorHide':u'Amagar',
    'monitorInvalidPassword':u'Paraula de pas no vàlida.',
    'monitorNoActivities':u'Sense activitats',
    'monitorScreenCapture':u'Captura de pantalla',
    'monitorSession':u'Sessió',
    'monitorShellSession':u'Consola',
    'monitorShow':u'Veure',
    'monitorStatus':u'Estat',
    'monitorStatusDisabled':u'Desactivat',
    'monitorStatusNoService':u'Sense servei',
    'monitorStatusOffline':u'Fora de línia',
    'monitorStatusOnline':u'En línia',
    'monitorStatusUpdating':u'Actualitzant',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Desinstal·lar',
    'monitorUninstallNotRun':u'No pots desinstal·lar sense permisos de root.\nExecuta la comanda "dwaguninstall" des de la línia de comandes.',
    'monitorUpload':u'Pujar',
    'mustAccept':u'Per poder continuar, has d\'escollir la opció {0}',
    'mustSelectOptions':u'Has d\'escollir una opció.',
    'next':u'Següent',
    'no':u'No',
    'noTryAgain':u'No; prova-ho de nou',
    'notInstalled':u'El DWAgent no és instal·lat.',
    'ok':u'D\'acord',
    'option':u'Opció',
    'optionNotValid':u'L\'opció escollida no és vàlida.',
    'or':u'o',
    'password':u'Paraula de pas',
    'path':u'Ruta',
    'pathCreating':u'Creació del directori...',
    'pathNotCreate':u'No es pot crear el directori. Ruta incorrecta o permís denegat.',
    'pressEnter':u'Prem "enter" per continuar.',
    'privacyPolicy':u'Política de privacitat',
    'proxyAuthPassword':u'Paraula de pas',
    'proxyAuthUser':u'Usuari',
    'proxyHost':u'Host',
    'proxyHttp':u'HTTP',
    'proxyInfo':u'Escriu la informació del servidor intermediari.',
    'proxyNone':u'Cap',
    'proxyPort':u'Port',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Sistema',
    'reEnterCode':u'Torna a entrar el codi',
    'reEnterData':u'Torna a entrar la informació',
    'rePassword':u'Torna a escriure la paraula de pas',
    'reject':u'Rebutjar',
    'removeFile':u'Esborrant arxiu...',
    'runWithoutInstallation':u'Executar',
    'runWithoutInstallationClosing':u'Tancant la sessió...',
    'runWithoutInstallationConnecting':u'Obrint la sessió...',
    'runWithoutInstallationEnd':u'Sessió acabada.',
    'runWithoutInstallationOnlineBottom':u'COMPTE!!!\nNo donis pas aquesta informació a desconeguts, doncs tindrien accés a aquest agent. Si no tens clar el que ets fent, millor que tanquis aquesta aplicació.',
    'runWithoutInstallationOnlineBottomPutCode':u'COMPTE!\nAra l\'agent és a punt per acceptar connexions.',
    'runWithoutInstallationOnlinePassword':u'Paraula de pas: {0}',
    'runWithoutInstallationOnlineTop':u'La sessió és activa.\nPer connectar amb aquest agent, vés a https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'La sessió és activa.',
    'runWithoutInstallationOnlineUser':u'Usuari: {0}',
    'runWithoutInstallationStarting':u'Iniciant l\'agent...',
    'runWithoutInstallationUnexpectedError':u'Error inesperat.\nNo ha estat possible iniciar el DWAgent. Si el problema segueix, prova de descarregar-te la darrera versió del DWAgent, esborra el directori \'{0}\' i torna a iniciar el DWAgent.',
    'runWithoutInstallationUpdating':u'Actualització de l\'agent...',
    'runWithoutInstallationWait':u'Esperant per la nova connexió (intent {0})...',
    'selectPathInstall':u'Escull la ruta per la instal·lació:',
    'skipCertValidation':u'Compte: el certificat de seguretat no s\'ha pogut pas validar; si seguiu, la connexió pot ésser insegura.\nVerifiqueu la configuració de l\'enrutador/tallafocs/antivirus de la xarxa (o de l\'equip).\nDe tota manera, seguim endavant?',
    'startService':u'Iniciant el servei...',
    'startServiceErr':u'No s\'ha pogut iniciar el servei.',
    'termsAndConditions':u'Termes i condicions',
    'titleInstall':u'DWAgent - Instal·lació',
    'titleUninstall':u'DWAgent - Desinstal·lació',
    'toBack':u'anar enrere.',
    'toExit':u'sortir.',
    'unattendedAccess':u'Accés\nno atès',
    'unexpectedError':u'Error inesperat.\n{0}',
    'uninstallMonitor':u'Desinstal·lant el monitor...',
    'uninstallService':u'Desinstal·lant el servei...',
    'uninstallShortcuts':u'Desinstal·lant les dreceres...',
    'unknownUser':u'Usuari desconegut',
    'user':u'Usuari',
    'validInteger':u'El camp \'{0}\' ha d\'ésser un nombre enter.',
    'versionInstallNotValid':u'La versió de l\'instal·lador no és la correcta per al teu sistema operatiu.\nSi et plau, descarrega\'t la versió correcta. {0}',
    'waiting':u'Esperant...',
    'warningLoginLogout':u'Per tal que els canvis siguin efectius, l\'usuari ha de tancar i tornar a obrir sessió.',
    'warningRemovePath':u'Compte: el directori destí ja existeix; l\'esborrarem.',
    'warningSpyingTool':u'Tingues en compte que no has d\'accedir a un ordinador remot sense el consentiment de l\'usuari. Fent ús del DWService com a eina d\'espionatge pot estar infringint les lleis al teu país de residència.',
    'welcomeLicense':u'Llicència.\nAquest programari és lliure i de codi obert.\nTé un principal component i uns quants accessoris que poden contindre diferents llicències. En tot cas, consulteu més informació al respecte aquí: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Si instal·leu o feu anar aquest programari vol dir que sou acceptant els #TERMSANDCONDITIONS i la #PRIVACYPOLICY',
    'welcomeSecurity':u'Seguretat\nPer tal de protegir la teva privacitat, et garantim que no emmagatzemarem pas informació teva dins dels nostres servidors; a més que les comunicacions són xifrades i, per tant, les aplicacions de tercers no poden pas llegir-ne res.',
    'welcomeSoftwareUpdates':u'Actualitzacions del programari\nAquest programari s\'actualitza automàticament.',
    'windowsAdminPrivileges':u'Has de tindre privilegis d\'administrador per tal d\'instal·lar el DWAgent.\nSi et plau, inicia l\'executable amb la opció "executar com a administrador".',
    'yes':u'Si'
}
                                                       ui/messages/fr.py                                                                                   0000644 0001750 0001750 00000031743 14443646212 013567  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'J\'accepte',
    'accessConfirm':u'Souhaite accéder à votre appareil.',
    'agentName':u'Nom de l\'agent',
    'alreadyInstalled':u'DWAgent est déjà installé.\n\nL\'agent est automatiquement mis à jour vers la dernière version. Cela signifie que vous n\'avez pas besoin d\'installer manuellement les nouvelles mises à jour.',
    'back':u'Retour',
    'cancel':u'Annuler',
    'cancelInstall':u'L\'installation a été annulée.',
    'cancelUninstall':u'La désinstallation a été annulée.',
    'checkInstallCode':u'Vérification du code d\'installation...',
    'chooseProxyType':u'Quel type de proxy utilisez-vous ?',
    'close':u'Fermer',
    'code':u'Code',
    'commands':u'Commandes',
    'configureAgent':u'Configurer l\'agent',
    'configureAgentDisabled':u'Agent désactivé.',
    'configureAgentEnabled':u'Agent activé.',
    'configureChangeInstallKey':u'Changer le code d\'installation',
    'configureChooseMonitorTrayIconVisibility':u'Voulez-vous afficher l\'icône du moniteur dans la barre des tâches ?',
    'configureChooseOperation':u'Veuillez choisir une opération :',
    'configureDesktopNotification':u'Notification sur le bureau',
    'configureDesktopNotificationOK':u'Notification configurée avec succès.',
    'configureDisableAgent':u'Désactiver l\'agent',
    'configureDisableAgentQuestion':u'Voulez-vous désactiver l\'agent ?',
    'configureEnableAgent':u'Activer l\'agent',
    'configureEnableAgentQuestion':u'Voulez-vous activer l\'agent ?',
    'configureEnd':u'La configuration est terminée.',
    'configureErrorConnection':u'Erreur de connexion. Vérifiez que le service DWAgent est démarré.',
    'configureExit':u'Sortir',
    'configureInsertPassword':u'Veuillez taper le mot de passe de configuration :',
    'configureInstallAgent':u'Comment préférez vous paramétrer l\'agent ?',
    'configureInstallCode':u'Entrez le code d\'installation',
    'configureInstallNewAgent':u'Créer un nouvel agent',
    'configureInstallPassword':u'Mot de passe d\'installation',
    'configureInstallUser':u'Utilisateur',
    'configureInvalidPassword':u'Mot de passe invalide.',
    'configureKeyInstalled':u'La clé a été installée correctement.',
    'configureLater':u'Configurer plus tard',
    'configureMonitor':u'Configurer le moniteur',
    'configurePassword':u'Configurer le mot de passe',
    'configurePasswordErrNoMatch':u'Les mots de passe ne correspondent pas.',
    'configurePasswordUpdated':u'Mot de passe mis à jour.',
    'configureProxy':u'Configurer le mandataire (proxy)',
    'configureProxyEnd':u'Configuration du mandataire (proxy) réussie.',
    'configureRemovePassword':u'Supprimer le mot de passe',
    'configureRemovePasswordQuestion':u'Voulez-vous supprimer le mot de passe ?',
    'configureSetPassword':u'Définir le mot de passe',
    'configureTitle':u'DWAgent - Configuration',
    'configureTrayIconOK':u'La visibilité de l\'icône dans la barre des tâches a été configurée avec succès.',
    'configureTrayIconVisibility':u'Visibilité de l\'icône dans la barre des tâches',
    'configureUninstallKeyQuestion':u'Désinstaller le code actuel ?',
    'configureUninstallationKey':u'Désinstallation...',
    'confirmExit':u'Êtes-vous sûr de vouloir quitter ?',
    'confirmInstall':u'Voulez-vous installer DWAgent dans \'{0}\' ?',
    'confirmUninstall':u'Voulez-vous supprimer DWAgent ?',
    'copyFiles':u'Copie des fichiers ...',
    'createNewAgent':u'Création de l\'agent en cours...',
    'decline':u'Je refuse',
    'desktopNotificationAutoHide':u'Masquer automatiquement',
    'desktopNotificationNone':u'Aucune',
    'desktopNotificationVisible':u'Visible',
    'downloadFile':u'Téléchargement du fichier {0}...',
    'endInstall':u'L\'installation est terminée.',
    'endInstallConfigLater':u'L\'installation est terminée.\nL\'agent n\'a pas été configuré. Vous pouvez toujours effectuer la configuration plus tard.',
    'endUninstall':u'La désinstallation est terminée.',
    'enter':u'entrer',
    'enterInstallCode':u'Saisissez le code d\'installation',
    'enterInstallNewAgent':u'Saisissez les données pour créer un nouvel agent :',
    'enterRunCode':u'Entrez le code de connexion',
    'error':u'Erreur',
    'errorAgentAlreadyExsists':u'L\'agent {0} existe déjà.',
    'errorAgentMax':u'Le nombre maximum d\'agents est atteint.',
    'errorAgentNameNotValid':u'Le nom de l\'agent n\'est pas valide. Vous ne pouvez pas utiliser les caractères / \ | # @ : .',
    'errorConnectionConfig':u'Erreur de connexion. Veuillez vérifier que le service DWAgent est démarré.',
    'errorConnectionQuestion':u'Erreur de connexion. Veuillez vérifier votre connexion internet ou la configuration de votre pare-feu.\nVoulez-vous configurer un serveur mandataire (proxy) ?',
    'errorInvalidCode':u'Le code saisi est incorrect.',
    'errorInvalidUserPassword':u'Nom d\'utilisateur ou mot de passe incorrect.',
    'fieldRequired':u'Le champ \'{0}\' est obligatoire.',
    'install':u'Installer',
    'installMonitor':u'Installation du moniteur...',
    'installMonitorErr':u'L\'installation du moniteur a échoué.',
    'installService':u'Installation du service...',
    'installServiceErr':u'L\'installation du service a échoué.',
    'installShortcuts':u'Installation des raccourcis...',
    'installShortcutsErr':u'L\'installation des raccourcis a échoué.',
    'installerNotSupported':u'Ce programme d\'installation n\'est plus pris en charge. Veuillez télécharger la dernière version.',
    'ipAddress':u'Adresse IP : {0}',
    'linuxRootPrivileges':u'Vous devez avoir les droits administrateur pour installer DWAgent.\nVeuillez démarrer le script en tant qu\'administrateur.',
    'menuConfigure':u'Configurer',
    'menuMonitor':u'Moniteur',
    'menuUninstall':u'Désinstaller',
    'missingInfoFile':u'Le fichier info.json est introuvable.',
    'missingNative':u'Natif introuvable.',
    'missingRuntime':u'Runtime introuvable.',
    'monitorActive':u'actif',
    'monitorAgentDisabled':u'Agent désactivé',
    'monitorAgentEnabled':u'Agent activé',
    'monitorConfigure':u'Configurer',
    'monitorConnections':u'Connexions',
    'monitorCurrentActivities':u'Activités actuelles',
    'monitorDisable':u'Désactiver',
    'monitorDisableAgentQuestion':u'Voulez vous désactiver l\'agent ?',
    'monitorDownload':u'Téléchargement',
    'monitorEnable':u'Activer',
    'monitorEnableAgentQuestion':u'Voulez vous activer l\'agent ?',
    'monitorEnterPassword':u'Entrez le mot de passe :',
    'monitorErrorConnectionConfig':u'Erreur de connexion. Veuillez vérifier que le service DWAgent est démarré.',
    'monitorHide':u'Cacher',
    'monitorInvalidPassword':u'Mot de passe invalide',
    'monitorNoActivities':u'Aucune activité',
    'monitorScreenCapture':u'Capture d\'écran',
    'monitorSession':u'Session',
    'monitorShellSession':u'Interface système',
    'monitorShow':u'Afficher',
    'monitorStatus':u'État',
    'monitorStatusDisabled':u'Désactivé',
    'monitorStatusNoService':u'Aucun service',
    'monitorStatusOffline':u'Non connecté',
    'monitorStatusOnline':u'En ligne',
    'monitorStatusUpdating':u'Mise à jour',
    'monitorTitle':u'DWAgent - Moniteur',
    'monitorUninstall':u'Désinstaller',
    'monitorUninstallNotRun':u'Vous ne pouvez pas désinstaller sans les droits administrateur.\nexecuter la commande dwaguninstall dans l\'invite de commande.',
    'monitorUpload':u'Envoi',
    'mustAccept':u'Pour continuer, vous devez sélectionner l\'option {0}',
    'mustSelectOptions':u'Vous devez choisir une option',
    'next':u'Suivant',
    'no':u'Non',
    'noTryAgain':u'Non, essayez encore',
    'notInstalled':u'DWAgent n\'est pas installé.',
    'ok':u'Ok',
    'option':u'Option',
    'optionNotValid':u'L\'option sélectionnée est invalide.',
    'or':u'ou',
    'password':u'Mot de passe',
    'path':u'Chemin',
    'pathCreating':u'Création du dossier...',
    'pathNotCreate':u'Impossible de créer le dossier. Chemin invalide ou permission refusée.',
    'pressEnter':u'Appuyez sur Entrée pour continuer',
    'privacyPolicy':u'Politique de confidentialité',
    'proxyAuthPassword':u'Mot de passe',
    'proxyAuthUser':u'Utilisateur',
    'proxyHost':u'Hôte',
    'proxyHttp':u'http',
    'proxyInfo':u'Insérez les informations du serveur mandataire (proxy)',
    'proxyNone':u'Aucun',
    'proxyPort':u'Port',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Système',
    'reEnterCode':u'Veuillez ré-entrer le code',
    'reEnterData':u'Veuillez ré-entrer les données',
    'rePassword':u'Veuillez retaper le mot de passe',
    'reject':u'Refusé',
    'removeFile':u'Suppression du fichier...',
    'runWithoutInstallation':u'Exécuter',
    'runWithoutInstallationClosing':u'Fermeture de session...',
    'runWithoutInstallationConnecting':u'Ouverture de session...',
    'runWithoutInstallationEnd':u'Session terminée.',
    'runWithoutInstallationOnlineBottom':u'ATTENTION :\nNe divulguez pas ces informations à des personnes qui ne sont pas dignes de confiance. Si vous n\'êtes pas sûr de ce que vous faites, fermez cette application.',
    'runWithoutInstallationOnlineBottomPutCode':u'ATTENTION  :\nL\'agent est maintenant prêt pour accepter les connexions. Si vous n\'êtes pas sûr de ce que vous faites, merci de fermer cette application.',
    'runWithoutInstallationOnlinePassword':u'Mot de passe : {0}',
    'runWithoutInstallationOnlineTop':u'La session est active.\nPour connecter cet agent, rendez-vous sur le site https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'La session est active.',
    'runWithoutInstallationOnlineUser':u'Utilisateur : {0}',
    'runWithoutInstallationStarting':u'Démarrage de l\'agent...',
    'runWithoutInstallationUnexpectedError':u'Erreur inattendue.\nImpossible de démarrer DWAgent. Si le problème persiste, essayez de télécharger la dernière version de DWAgent, effacez le dossier \'{0}\' et relancez à nouveau l\'installation.',
    'runWithoutInstallationUpdating':u'Mise à jour de l\'agent...',
    'runWithoutInstallationWait':u'Attente d\'une nouvelle connexion en cours (attempt {0})...',
    'selectPathInstall':u'Choisissez le chemin d\'installation :',
    'skipCertValidation':u'Attention : Le certificat de sécurité ne peut pas être validé, si vous continuez la connexion risque de ne pas être sécurisée.\nVeuillez vérifier la configuration du routeur/pare-feu/antivirus du réseau ou local.\nContinuer malgré tout ?',
    'startService':u'Démarrage du service...',
    'startServiceErr':u'Échec de démarrage du service.',
    'termsAndConditions':u'Termes et conditions',
    'titleInstall':u'DWAgent - Installation',
    'titleUninstall':u'DWAgent - Désinstallation',
    'toBack':u'Retour',
    'toExit':u'Sortir',
    'unattendedAccess':u'Accès sans\nsurveillance',
    'unexpectedError':u'Erreur innatendue.\n{0}',
    'uninstallMonitor':u'Désinstallation du moniteur...',
    'uninstallService':u'Désinstallation du service...',
    'uninstallShortcuts':u'Désinstallation des raccourcis...',
    'unknownUser':u'Utilisateur inconnu',
    'user':u'Utilisateur',
    'validInteger':u'Le champ \'{0}\' doit être un entier.',
    'versionInstallNotValid':u'La version de l\'installeur n\'est pas compatible avec votre système d\'exploitation.\nVeuillez télécharger la bonne version. {0}',
    'waiting':u'Patientez...',
    'warningLoginLogout':u'Pour que cette modification prenne effet, l\'utilisateur doit se déconnecter et se reconnecter.',
    'warningRemovePath':u'Attention, le dossier de destination existe déjà, il sera supprimé.',
    'warningSpyingTool':u'Veuillez noter que vous ne pouvez pas accéder à un ordinateur distant sans le consentement de son utilisateur. En utilisant DWService comme outil d\'espionnage, vous enfreignez peut-être les lois de votre pays de résidence',
    'welcomeLicense':u'Licence\nCe logiciel est libre (gratuit) et open source.\nIl est constitué d\'un composant principal et de plusieurs composants accessoires "app" définis qui pourraient être sous licences différentes. Pour plus d\'informations visitez: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'En poursuivant l\'installation ou en exécutant ce logiciel, vous acceptez les #TERMSANDCONDITIONS et la #PRIVACYPOLICY',
    'welcomeSecurity':u'Sécurité\nPour protéger votre vie privée, nous garantissons qu\'aucune informations ne sera stockée sur nos serveurs et que les communications sont chiffrées afin que de tierces parties ne puissent y accéder.',
    'welcomeSoftwareUpdates':u'Mises à jour logiciel\nLes mises à jour de ce logiciel sont automatiques.',
    'windowsAdminPrivileges':u'Vous devez avoir les droits administrateur pour installer DWAgent.\nVeuillez démarrer l\'exécutable avec \'exécuter en tant qu\'administrateur\'.',
    'yes':u'Oui'
}
                             ui/messages/cs.py                                                                                   0000644 0001750 0001750 00000030334 14443646217 013565  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Souhlasím',
    'accessConfirm':u'chce získat přístup k Vašemu zařízení.',
    'agentName':u'Název agenta',
    'alreadyInstalled':u'DWAgent je už nainstalovaný.\n\nAgent se aktualizuje automaticky. To znamená, že ho není třeba aktualizovat ručně.',
    'back':u'Zpět',
    'cancel':u'Storno',
    'cancelInstall':u'Instalace byla zrušena.',
    'cancelUninstall':u'Odinstalace byla zrušena.',
    'checkInstallCode':u'Prověřování kódu instalace…',
    'chooseProxyType':u'Jaký typ proxy chcete použít?',
    'close':u'Zavřít',
    'code':u'Kód',
    'commands':u'Příkazy',
    'configureAgent':u'Nastavit agenta',
    'configureAgentDisabled':u'Agent vypnut.',
    'configureAgentEnabled':u'Agent zapnut.',
    'configureChangeInstallKey':u'Změnit kód instalace',
    'configureChooseMonitorTrayIconVisibility':u'Chcete zobrazovat ikonu monitoru v oznamovací oblasti systémového panelu?',
    'configureChooseOperation':u'Zvolte akci:',
    'configureDesktopNotification':u'Oznámení na ploše',
    'configureDesktopNotificationOK':u'Oznámení na ploše byla nastavena.',
    'configureDisableAgent':u'Vypnout agenta',
    'configureDisableAgentQuestion':u'Chcete agenta vypnout?',
    'configureEnableAgent':u'Zapnout agenta',
    'configureEnableAgentQuestion':u'Chcete agenta zapnout?',
    'configureEnd':u'Nastavení je dokončeno.',
    'configureErrorConnection':u'Chyba spojení. Ověřte zda je spuštěná služba DWAgent.',
    'configureExit':u'Ukončit',
    'configureInsertPassword':u'Zadejte heslo pro odemčení nastavení:',
    'configureInstallAgent':u'Jak chcete agenta nastavovat?',
    'configureInstallCode':u'Zadáním kódu instalace',
    'configureInstallNewAgent':u'Vytvořením nového agenta',
    'configureInstallPassword':u'Heslo pro instalaci',
    'configureInstallUser':u'Uživatel',
    'configureInvalidPassword':u'Neplatné heslo.',
    'configureKeyInstalled':u'Klíč byl úspěšně nainstalován.',
    'configureLater':u'Nastavit později',
    'configureMonitor':u'Nastavit monitor',
    'configurePassword':u'Nastavit heslo',
    'configurePasswordErrNoMatch':u'Zadaná hesla se neshodují.',
    'configurePasswordUpdated':u'Heslo bylo změněno.',
    'configureProxy':u'Nastavit proxy',
    'configureProxyEnd':u'Proxy úspěšně nastavena.',
    'configureRemovePassword':u'Odstranit heslo',
    'configureRemovePasswordQuestion':u'Opravdu odstranit heslo?',
    'configureSetPassword':u'Nastavit heslo',
    'configureTitle':u'Nastavení DWAgent',
    'configureTrayIconOK':u'Zobrazování ikony v oznamovací oblasti systémového panelu úspěšně nastaveno.',
    'configureTrayIconVisibility':u'Zobrazování ikony v oznamovací oblasti systémového panelu',
    'configureUninstallKeyQuestion':u'Odinstalovat stávající kód instalace?',
    'configureUninstallationKey':u'Odinstalace…',
    'confirmExit':u'Opravdu ukončit?',
    'confirmInstall':u'Opravdu chcete nainstalovat DWAgenta do „{0}“?',
    'confirmUninstall':u'Opravdu odstranit DWAgenta?',
    'copyFiles':u'Kopírování souborů…',
    'createNewAgent':u'Vytváření agenta…',
    'decline':u'Nesouhlasím',
    'desktopNotificationAutoHide':u'Automaticky skrýt',
    'desktopNotificationNone':u'Žádné',
    'desktopNotificationVisible':u'Viditelné',
    'downloadFile':u'Stahování souboru {0}…',
    'endInstall':u'Instalace je dokončena.',
    'endInstallConfigLater':u'Instalace dokončena.\nAgent není nastaven. Můžete ho ovšem nastavit později.',
    'endUninstall':u'Odinstalace je dokončena.',
    'enter':u'vstup',
    'enterInstallCode':u'Zadejte kód instalace',
    'enterInstallNewAgent':u'Zadejte údaje pro vytvoření nového agenta:',
    'enterRunCode':u'Zadejte kód spojení',
    'error':u'Chyba',
    'errorAgentAlreadyExsists':u'Agent {0} už existuje.',
    'errorAgentMax':u'Překročen nejvyšší možný počet agentů.',
    'errorAgentNameNotValid':u'Název agenta není platný. Nelze použít znaky / \ | # @ :',
    'errorConnectionConfig':u'Chyba spojení. Zkontrolujte zda je spuštěná služba DWAgent.',
    'errorConnectionQuestion':u'Chyba spojení. Zkontroluje připojení k Internetu nebo nastavení brány firewall.\nChcete nastavit proxy?',
    'errorInvalidCode':u'Zadaný kód není platný.',
    'errorInvalidUserPassword':u'Neplatné uživatelské jméno nebo heslo.',
    'fieldRequired':u'Je třeba, aby kolonka „{0}“ byla vyplněná.',
    'install':u'Instalace',
    'installMonitor':u'Instalace monitoru…',
    'installMonitorErr':u'Instalace monitoru se nezdařila.',
    'installService':u'Instalace služby…',
    'installServiceErr':u'Instalace služby se nezdařila.',
    'installShortcuts':u'Instalace zástupců…',
    'installShortcutsErr':u'Instalace zástupců se nezdařila.',
    'installerNotSupported':u'Tento instalátor již není podporován. Stáhněte si prosím nejnovější verzi.',
    'ipAddress':u'IP adresa: {0}',
    'linuxRootPrivileges':u'Pro instalaci DWAgenta jsou zapotřebí práva pro správu systému.\nSpusťte instalační skript jako superuživatel (např. pomocí sudo).',
    'menuConfigure':u'Nastavit',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Odinstalovat',
    'missingInfoFile':u'Soubor info.json nenalezen.',
    'missingNative':u'Nativní chyba.',
    'missingRuntime':u'Běhové prostředí nenalezeno.',
    'monitorActive':u'aktivní',
    'monitorAgentDisabled':u'Agent je vypnutý.',
    'monitorAgentEnabled':u'Agent je zapnutý.',
    'monitorConfigure':u'Nastavit',
    'monitorConnections':u'Spojení',
    'monitorCurrentActivities':u'Současné aktivity',
    'monitorDisable':u'Vypnout',
    'monitorDisableAgentQuestion':u'Vypnout spouštění agenta?',
    'monitorDownload':u'Stahování',
    'monitorEnable':u'Zapnout',
    'monitorEnableAgentQuestion':u'Chcete zapnout spouštění agenta?',
    'monitorEnterPassword':u'Zadejte heslo:',
    'monitorErrorConnectionConfig':u'Chyba spojení. Zkontrolujte zda je spuštěná služba DWAgent.',
    'monitorHide':u'Skrýt',
    'monitorInvalidPassword':u'Neplatné heslo.',
    'monitorNoActivities':u'Žádná aktivita',
    'monitorScreenCapture':u'Přístup k obrazovce',
    'monitorSession':u'Sezení',
    'monitorShellSession':u'Přístup k shellu',
    'monitorShow':u'Zobrazit',
    'monitorStatus':u'Stav',
    'monitorStatusDisabled':u'Vypnuto',
    'monitorStatusNoService':u'Žádná služba',
    'monitorStatusOffline':u'Offline',
    'monitorStatusOnline':u'Online',
    'monitorStatusUpdating':u'Aktualizace',
    'monitorTitle':u'DWAgent – Monitor',
    'monitorUninstall':u'Odinstalovat',
    'monitorUninstallNotRun':u'Pro odinstalaci jsou zapotřebí práva pro správu systému.\nSpusťte příkaz dwaguninstall v příkazovém řádku.',
    'monitorUpload':u'Nahrávání',
    'mustAccept':u'Aby bylo možné pokračovat, je třeba vybrat možnost {0}',
    'mustSelectOptions':u'Vyberte jednu z možností.',
    'next':u'Další',
    'no':u'Ne',
    'noTryAgain':u'Ne, zkusit znovu',
    'notInstalled':u'DWAgent není nainstalovaný.',
    'ok':u'Ok',
    'option':u'Volba',
    'optionNotValid':u'Vybraná volba není platná.',
    'or':u'nebo',
    'password':u'Heslo',
    'path':u'Cesta',
    'pathCreating':u'Vytváření složky…',
    'pathNotCreate':u'Složku se nepodařilo vytvořit. Neplatná cesta nebo nedostatečná oprávnění.',
    'pressEnter':u'Pokračujte stiskem klávesy Enter.',
    'privacyPolicy':u'Zásadami ochrany osobních údajů',
    'proxyAuthPassword':u'Heslo',
    'proxyAuthUser':u'Uživatel',
    'proxyHost':u'Stroj',
    'proxyHttp':u'HTTP',
    'proxyInfo':u'Zadejte informace o proxy.',
    'proxyNone':u'Nepoužívat',
    'proxyPort':u'Port',
    'proxySocks4':u'SOCKS4',
    'proxySocks4a':u'SOCKS4a',
    'proxySocks5':u'SOCKS5',
    'proxySystem':u'Převzít ze systému',
    'reEnterCode':u'Znovu zadejte kód.',
    'reEnterData':u'Znovu zadejte údaje',
    'rePassword':u'Zadejte heslo znovu',
    'reject':u'Odmítnout',
    'removeFile':u'Odstraňování souboru…',
    'runWithoutInstallation':u'Spustit',
    'runWithoutInstallationClosing':u'Ukončování relace…',
    'runWithoutInstallationConnecting':u'Otevírání relace…',
    'runWithoutInstallationEnd':u'Relace ukončena.',
    'runWithoutInstallationOnlineBottom':u'VAROVÁNÍ:\nTyto údaje poskytněte jen důvěryhodným osobám, protože jim tím dáváte přístup do tohoto počítače. Pokud si nejste jisti tím, co děláte, raději tuto aplikaci ukončete.',
    'runWithoutInstallationOnlineBottomPutCode':u'VAROVÁNÍ:\nAgent je nyní připraven přijímat připojení. Pokud si nejste jistí, co děláte, tuto aplikaci prosím zavřete.',
    'runWithoutInstallationOnlinePassword':u'Heslo: {0}',
    'runWithoutInstallationOnlineTop':u'Relace je aktivní.\nPro připojení k tomuto agentovi navštivte https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Relace je aktivní.',
    'runWithoutInstallationOnlineUser':u'Uživatel: {0}',
    'runWithoutInstallationStarting':u'Spouštění agenta…',
    'runWithoutInstallationUnexpectedError':u'Neočekávaná chyba.\nNepodařilo se spustit DWAgenta. Pokud problém přetrvává, zkuste si stáhnout nejnovější verzi DWAgenta, smažte složku „{0}“ a spusťte DWAgenta znovu.',
    'runWithoutInstallationUpdating':u'Aktualizace agenta…',
    'runWithoutInstallationWait':u'Čekejte, navazuje se nové spojení (pokus {0})…',
    'selectPathInstall':u'Vyberte cestu k instalaci:',
    'skipCertValidation':u'Pozor: bezpečnostní certifikát nelze ověřit. Pokud budete pokračovat, připojení nemusí být bezpečné.\nZkontrolujte prosím nastavení firewallu/antiviru a Vaší sítě (router/modem).\nPřesto pokračovat?',
    'startService':u'Spouštění služby…',
    'startServiceErr':u'Spuštění služby se nezdařilo.',
    'termsAndConditions':u'Smluvními podmínkami',
    'titleInstall':u'DWAgent - instalace',
    'titleUninstall':u'DWAgent - odinstalace',
    'toBack':u'pro návrat zpět.',
    'toExit':u'pro ukončení.',
    'unattendedAccess':u'Bezobslužný\npřístup',
    'unexpectedError':u'Neočekávaná chyba.\n{0}',
    'uninstallMonitor':u'Odstraňování monitoru…',
    'uninstallService':u'Odstraňování služby…',
    'uninstallShortcuts':u'Odstraňování zástupců…',
    'unknownUser':u'Neznámý uživatel',
    'user':u'Uživatel',
    'validInteger':u'Je třeba, aby kolonka „{0}“ bylo celé kladné číslo.',
    'versionInstallNotValid':u'Tato varianta instalátoru není určená pro váš operační sytém.\nStáhněte si správnou verzi. {0}',
    'waiting':u'Čekejte…',
    'warningLoginLogout':u'Aby se tato změna projevila, uživatel se musí odhlásit a znovu přihlásit.',
    'warningRemovePath':u'Varování: cílová složka už existuje – stávající obsah bude smazán.',
    'warningSpyingTool':u'Upozorňujeme, že ke vzdálenému počítači nelze přistupovat bez souhlasu jeho uživatele. Používáním služby DWService jako špionážního nástroje můžete porušovat zákony země, ve které žijete.',
    'welcomeLicense':u'Licence\nTento software je svobodný a opensource.\nSkládá se z jedné hlavní komponenty, vydané pod licencí MPLv2, a několika pomocných komponent, vydaných pod různými licencemi. Více informací naleznete na: https://www.dwservice.net/cs/licenses-sources.html',
    'welcomePrivacyTerms':u'Pokračováním v instalaci nebo spuštění tohoto software vyjadřujete souhlas se #TERMSANDCONDITIONS a #PRIVACYPOLICY',
    'welcomeSecurity':u'Zabezpečení\nAby bylo ochráněno Vaše soukromí, garantujeme že na našich serverech nejsou ukládány žádné údaje a komunikace je zašifrována tak, že je pro všechny ostatní nečitelná.',
    'welcomeSoftwareUpdates':u'Aktualizace software\nAktualizace tohoto software se děje automaticky.',
    'windowsAdminPrivileges':u'Pro instalaci DWAgenta jsou zapotřebí práva pro správu systému.\nKlikněte na instalační soubor pravým tlačítkem a z kontextové nabídky zvolte „Spustit jako správce“.',
    'yes':u'Ano'
}
                                                                                                                                                                                                                                                                                                    ui/messages/ro.py                                                                                   0000644 0001750 0001750 00000027577 14441141755 013612  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Accept',
    'accessConfirm':u'Doreste sa acceseze dispozitivul tau.',
    'agentName':u'Nume agent',
    'alreadyInstalled':u'DWAgent a fost instalat.\n\nAgentul isi va face update automat la ultima versiune. Inseamna ca nu este necesar ca dvs. sa instalati manual update-uri.',
    'back':u'Inapoi',
    'cancel':u'Anuleaza',
    'cancelInstall':u'Instalarea a fost anulata',
    'cancelUninstall':u'Dezinstalarea a fost anulată.',
    'checkInstallCode':u'Verific codul de instalare...',
    'chooseProxyType':u'Ce tip de proxy utilizaţi?',
    'close':u'Închide',
    'code':u'Cod',
    'commands':u'Comenzi',
    'configureAgent':u'Configurează agent',
    'configureAgentDisabled':u'Agent inactiv',
    'configureAgentEnabled':u'Agent activ',
    'configureChangeInstallKey':u'Schimbă codul de instalare',
    'configureChooseMonitorTrayIconVisibility':u'Doriți afișare în zona de notificare?',
    'configureChooseOperation':u'Alegeți operațiunea:',
    'configureDesktopNotification':u'Notificare desktop',
    'configureDesktopNotificationOK':u'Configurarea notificarii desktop a fost facuta cu succes.',
    'configureDisableAgent':u'Dezactivare agent',
    'configureDisableAgentQuestion':u'Doriți dezactivarea agentului?',
    'configureEnableAgent':u'Activează agent',
    'configureEnableAgentQuestion':u'Doriți activarea agentului?',
    'configureEnd':u'Configurare completă.',
    'configureErrorConnection':u'Eroare de conexiune. Verificați dacă procesul DWAgent este pornit.',
    'configureExit':u'Ieșire',
    'configureInsertPassword':u'Vă rog introduceți parola:',
    'configureInstallAgent':u'Cum doriți configurarea agentului?',
    'configureInstallCode':u'Introduceți codul de instalare',
    'configureInstallNewAgent':u'Creare agent nou',
    'configureInstallPassword':u'Parola de instalare',
    'configureInstallUser':u'Utilizator',
    'configureInvalidPassword':u'Parolă incorectă.',
    'configureKeyInstalled':u'Cheie instalată cu succes.',
    'configureLater':u'Configurează mai târziu',
    'configureMonitor':u'Setează monitor',
    'configurePassword':u'Stabilește parola',
    'configurePasswordErrNoMatch':u'Parola nu se potrivește.',
    'configurePasswordUpdated':u'Parolă actualizată.',
    'configureProxy':u'Setează proxy',
    'configureProxyEnd':u'Proxy setat cu succes.',
    'configureRemovePassword':u'Șterge parola',
    'configureRemovePasswordQuestion':u'Doriți ștergerea parolei?',
    'configureSetPassword':u'Stabilește parola.',
    'configureTitle':u'DWAgent - Configurare',
    'configureTrayIconOK':u'Vizibilitate în zona de notificare, realizată cu succes.',
    'configureTrayIconVisibility':u'Vizibilitate în zona de notificare',
    'configureUninstallKeyQuestion':u'Dezinstalare cod curent de instalare?',
    'configureUninstallationKey':u'Dezinstalare...',
    'confirmExit':u'Sigur doriți ieșirea?',
    'confirmInstall':u'Doriți instalare DWAgent pe \'{0}\'?',
    'confirmUninstall':u'Doriți ștergerea DWAgent?',
    'copyFiles':u'Copiere fișiere...',
    'createNewAgent':u'Se creează agentul...',
    'decline':u'Refuzare',
    'desktopNotificationAutoHide':u'Ascunde automat',
    'desktopNotificationNone':u'Niciunul(a)',
    'desktopNotificationVisible':u'Vizibil(a)',
    'downloadFile':u'Descărcare fișier {0}...',
    'endInstall':u'Instalarea s-a finalizat.',
    'endInstallConfigLater':u'Instalarea s-a finalizat cu succes.\nAgentul nu s-a configurat. Puteți să îl setați mai târziu.',
    'endUninstall':u'Dezinstalare finalizată cu succes.',
    'enter':u'accept',
    'enterInstallCode':u'Introduceți codul de instalare',
    'enterInstallNewAgent':u'Introduceți date pentru noul agent',
    'enterRunCode':u'Introduceti codul de conectare',
    'error':u'Eroare',
    'errorAgentAlreadyExsists':u'Agentul {0} există deja.',
    'errorAgentMax':u'S-a depășit numărul maxim de agenți posibili.',
    'errorAgentNameNotValid':u'Nume invalid. Nu se pot utiliza caracterele / \ | # @ : .',
    'errorConnectionConfig':u'Eroare de conexiune. Verificați starea procesului DWAgent.',
    'errorConnectionQuestion':u'Eroare de conexiune. Verificați conexiunea la internet sau firewall. \nDoriți sa configurați un proxy?',
    'errorInvalidCode':u'Codul este invalid.',
    'errorInvalidUserPassword':u'Utilizator sau parolă greșită.',
    'fieldRequired':u'Campul \'{0}\' este necesar',
    'install':u'Instalare',
    'installMonitor':u'Instalare monitor...',
    'installMonitorErr':u'Instalare monitor esuata',
    'installService':u'Instalare serviciu...',
    'installServiceErr':u'Instalare serviciu esuata',
    'installShortcuts':u'Instalare comenzi rapide...',
    'installShortcutsErr':u'Instalare comenzi rapide esuata.',
    'ipAddress':u'Adresa IP: {0}',
    'linuxRootPrivileges':u'Trebuie sa ai privilegii de root pentru a instala DWAgent.\nTe rog porneste scriptul folosind un utilizator root.',
    'menuConfigure':u'Configurare',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Dezinstalare',
    'missingInfoFile':u'Fișier info.json negăsit.',
    'missingNative':u'Nativ negasit.',
    'missingRuntime':u'Runtime nu a fost gasit',
    'monitorActive':u'activ(a)',
    'monitorAgentDisabled':u'Agent dezactivat.',
    'monitorAgentEnabled':u'Agent activ.',
    'monitorConfigure':u'Configurare',
    'monitorConnections':u'Conexiuni',
    'monitorCurrentActivities':u'Activitati curente',
    'monitorDisable':u'Dezactivare',
    'monitorDisableAgentQuestion':u'Vreti sa dezactivati agentul?',
    'monitorDownload':u'Download',
    'monitorEnable':u'Activat',
    'monitorEnableAgentQuestion':u'Vreti sa activati agentul?',
    'monitorEnterPassword':u'Introduceti parola:',
    'monitorErrorConnectionConfig':u'Eroare de conexiune. Verificati daca serviciul DWAgent este pornit.',
    'monitorHide':u'Ascunde',
    'monitorInvalidPassword':u'Parola invalida',
    'monitorNoActivities':u'Nicio activitate',
    'monitorScreenCapture':u'Acces la ecran',
    'monitorSession':u'Sesiune',
    'monitorShellSession':u'Acces la shell',
    'monitorShow':u'Arata',
    'monitorStatus':u'Stare',
    'monitorStatusDisabled':u'Dezactivat',
    'monitorStatusNoService':u'Fara serviciu',
    'monitorStatusOffline':u'Offline',
    'monitorStatusOnline':u'Online',
    'monitorStatusUpdating':u'Se actualizeaza',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Dezinstalare',
    'monitorUninstallNotRun':u'Nu puteti instala fara permisiuni root.\nExecutati comanda dwaguninstall in shell.',
    'monitorUpload':u'Incarca',
    'mustAccept':u'Pentru a continua, trebuie sa selectati optiunea {0}',
    'mustSelectOptions':u'Trebuie sa selectati o optiune.',
    'next':u'Urmator',
    'no':u'Nu',
    'noTryAgain':u'Nu, încearcă din nou',
    'notInstalled':u'DWAgent nu este instalat',
    'ok':u'Ok',
    'option':u'Opțiune',
    'optionNotValid':u'Optiunea selectata este invalida.',
    'or':u'sau',
    'password':u'Parola',
    'path':u'Cale',
    'pathCreating':u'Creare director...',
    'pathNotCreate':u'Directorul nu se poate crea. Cale invalida sau permisiune refuzata.',
    'pressEnter':u'Apasati enter pentru a continua.',
    'privacyPolicy':u'Politica de confidentialitate',
    'proxyAuthPassword':u'Parola',
    'proxyAuthUser':u'Utilizator',
    'proxyHost':u'Gazda',
    'proxyHttp':u'Http',
    'proxyInfo':u'Introdu informatii despre proxy.',
    'proxyNone':u'Nimic',
    'proxyPort':u'Port',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Sistem',
    'reEnterCode':u'Reintroduceti codul',
    'reEnterData':u'Reintroduceti datele',
    'rePassword':u'Reintroduceti Parola',
    'reject':u'Respinge',
    'removeFile':u'Indeparteaza fisier...',
    'runWithoutInstallation':u'Porneste',
    'runWithoutInstallationClosing':u'Inchidere sesiune...',
    'runWithoutInstallationConnecting':u'Deschidere sesiune...',
    'runWithoutInstallationEnd':u'Sesiune terminata.',
    'runWithoutInstallationOnlineBottom':u'ATENTIE:\nNu impartasiti aceasta informatie celor in care nu aveti incredere altfel le veti permite sa acceseze acet agent. Deci daca nu sunteti sigur ce faceti va rog inchideti aceasta aplicatie.',
    'runWithoutInstallationOnlineBottomPutCode':u'ATENTIE:\nAgentul este pregatit sa accepte conexiunea. Deci daca nu sunteti sigur pe ceea ce faceti, va rog inchideti aplicatia.',
    'runWithoutInstallationOnlinePassword':u'Parola: {0}',
    'runWithoutInstallationOnlineTop':u'Sesiunea este activa.\nPentru a va conecta la acest agent mergeti la https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Sesiunea este activa.',
    'runWithoutInstallationOnlineUser':u'Utilizator: {0}',
    'runWithoutInstallationStarting':u'Pornire agent...',
    'runWithoutInstallationUnexpectedError':u'Eroare neasteptata.\nnu a fost posibila pornirea DWAgent. Daca problema persista, incercati sa descarcati ultima revizie a DWAgent, stergeti dosarul \'{0}\' si rulati DWAgent din nou.',
    'runWithoutInstallationUpdating':u'Actualizare agent...',
    'runWithoutInstallationWait':u'Asteptare conexiune noua in curs (attempt {0})...',
    'selectPathInstall':u'Selecteaza calea de instalare:',
    'skipCertValidation':u'Atentie: Certificatul de securitate nu poate fi validat, daca continui, conexiunea poate sa fie nesecurizata.\nTe rog verifica configuratia ruter-ului/firewall-ului/antivirus-ului din retea sau local.\nDoresti sa continui oricum?',
    'startService':u'Porneste serviciu...',
    'startServiceErr':u'Pornire serviciu esuata.',
    'termsAndConditions':u'Termeni si conditii',
    'titleInstall':u'Instalare - DWAgent',
    'titleUninstall':u'Dezinstalare - DWAgent',
    'toBack':u'catre inapoi.',
    'toExit':u'catre iesire.',
    'unattendedAccess':u'Acces\nnesupravegheat',
    'unexpectedError':u'Eroare neasteptata.\n{0}',
    'uninstallMonitor':u'Dezinstalare monitor...',
    'uninstallService':u'Dezinstalare serviciu...',
    'uninstallShortcuts':u'Dezinstalare scurtatura...',
    'unknownUser':u'Utilizator necunoscut',
    'user':u'Utilizator',
    'validInteger':u'Campul \'{0}\' trebuie sa fie un intreg.',
    'versionInstallNotValid':u'Aceasa versiune de instalare nu este corecta pentru sistemul dvs. de operare.\nVa rugam descarcati versiunea corecta. {0}',
    'waiting':u'Asteptare...',
    'warningLoginLogout':u'Pentru ca aceasta schimbare sa aiba efect, utilizatorul trebuie sa se delogheze si sa se logheze din nou.',
    'warningRemovePath':u'Atentie: folderul-destinatie exista deja si va fi sters.',
    'warningSpyingTool':u'Va rugam sa fiti constienti ca nu puteti accesa un computer la distanta fara permisiunea utilizatorului sau. Daca folositi DWService ca unealta de spionare ati putea intra sub incidenta legilor din tara dvs. de resedinta.',
    'welcomeLicense':u'Licenta.\nAcest program este gratuit si sursa-deschisa.\nEste alcatuit dintr-o componenta principala lansata sub licenta MPLv2 si cateva componente aditionale care sunt guvernate de diferite licente. Pentru mai multe informatii, vizitati: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Continuind cu instalarea sau folosirea acestui program insemneaza ca sunteti de acord cu #TERMSANDCONDITIONS si cu #PRIVACYPOLICY',
    'welcomeSecurity':u'Securitate\nPentru a va proteja intimitatea, noi nu stocam informatii din agent pe serverele noastre. Comunicarile de date intre utilizatori, serverul nostru si agenti sunt criptate in asa fel incat terte parti nu au access la acestea.',
    'welcomeSoftwareUpdates':u'Actualizari program\nAcest program se actualizeaza in mod automat',
    'windowsAdminPrivileges':u'Trebuie sa aveti drepturi de administrator pentru a instala DWAgent.\nVa rog porniti executabilul cu \'ruleaza ca adminstrator\'.',
    'yes':u'Da'
}
                                                                                                                                 ui/messages/nl.py                                                                                   0000644 0001750 0001750 00000027545 14335754163 013603  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Accepteren',
    'accessConfirm':u'Wil toegang krijgen tot uw apparaat.',
    'agentName':u'Naam agent',
    'alreadyInstalled':u'DWAgent is al geïnstalleerd.\n\nDe agent wordt automatisch bijgewerkt naar de laatste versie. Dit betekent dat u nieuwe updates niet handmatig hoeft te installeren.',
    'back':u'Terug',
    'cancel':u'Annuleren',
    'cancelInstall':u'De installatie is geannuleerd.',
    'cancelUninstall':u'De verwijdering is geannuleerd.',
    'checkInstallCode':u'Installatiecode controleren...',
    'chooseProxyType':u'Welk type proxy wilt u gebruiken?',
    'close':u'Sluiten',
    'code':u'Code',
    'commands':u'Opdrachten',
    'configureAgent':u'Agent configureren',
    'configureAgentDisabled':u'Agent uitgeschakeld.',
    'configureAgentEnabled':u'Agent ingeschakeld.',
    'configureChangeInstallKey':u'Installatiecode wijzigen.',
    'configureChooseMonitorTrayIconVisibility':u'Wilt u het monitorpictogram in het systeemvak weergeven?',
    'configureChooseOperation':u'Kies een bewerking:',
    'configureDesktopNotification':u'Bureaubladmelding',
    'configureDesktopNotificationOK':u'Bureaubladmelding met succes geconfigureerd.',
    'configureDisableAgent':u'Agent uitschakelen',
    'configureDisableAgentQuestion':u'Wilt u de agent uitschakelen?',
    'configureEnableAgent':u'Agent inschakelen',
    'configureEnableAgentQuestion':u'Wilt u de agent inschakelen?',
    'configureEnd':u'De configuratie is voltooid.',
    'configureErrorConnection':u'Verbindingsfout. Controleer of de DWAgent-service draait.',
    'configureExit':u'Afsluiten',
    'configureInsertPassword':u'Voer het configuratiewachtwoord in:',
    'configureInstallAgent':u'Hoe wilt u de agent configureren?',
    'configureInstallCode':u'Voer de installatiecode in',
    'configureInstallNewAgent':u'Een nieuwe agent aanmaken',
    'configureInvalidPassword':u'Ongeldig wachtwoord.',
    'configureKeyInstalled':u'Sleutel met succes geïnstalleerd.',
    'configureLater':u'Later configureren',
    'configureMonitor':u'Monitor configureren',
    'configurePassword':u'Wachtwoord configureren',
    'configurePasswordErrNoMatch':u'De wachtwoorden komen niet overeen.',
    'configurePasswordUpdated':u'Wachtwoord bijgewerkt.',
    'configureProxy':u'Proxy configureren',
    'configureProxyEnd':u'Proxy met succes geconfigureerd.',
    'configureRemovePassword':u'Wachtwoord verwijderen',
    'configureRemovePasswordQuestion':u'Wilt u het wachtwoord verwijderen?',
    'configureSetPassword':u'Wachtwoord instellen',
    'configureTitle':u'DWAgent - Configuratie',
    'configureTrayIconOK':u'Systeemvakpictogram met succes geconfigureerd.',
    'configureTrayIconVisibility':u'Zichtbaarheid systeemvakpictogram',
    'configureUninstallKeyQuestion':u'De huidige installatiecode verwijderen?',
    'configureUninstallationKey':u'Verwijderen...',
    'confirmExit':u'Weet u zeker dat u wilt afsluiten?',
    'confirmInstall':u'Wilt u DWAgent installeren in \'{0}\'?',
    'confirmUninstall':u'Wilt u DWAgent verwijderen?',
    'copyFiles':u'Bestanden kopiëren...',
    'createNewAgent':u'Aanmaken van nieuwe agent in uitvoering...',
    'decline':u'Niet accepteren',
    'desktopNotificationAutoHide':u'Automatisch verbergen',
    'desktopNotificationNone':u'Geen',
    'desktopNotificationVisible':u'Zichtbaar',
    'downloadFile':u'Bestand {0} downloaden...',
    'dwsPassword':u'DWS-wachtwoord',
    'dwsUser':u'DWS-gebruiker',
    'endInstall':u'Installatie is voltooid.',
    'endInstallConfigLater':u'De installatie is voltooid.\nDe agent is niet geconfigureerd. U kunt de configuratie later nog aanmaken.',
    'endUninstall':u'Verwijdering is voltooid.',
    'enter':u'invoeren',
    'enterInstallCode':u'Voor de installatiecode in',
    'enterInstallNewAgent':u'Voer gegevens in om een nieuwe agent aan te maken:',
    'enterRunCode':u'Voer de verbindingscode in',
    'error':u'Fout',
    'errorAgentAlreadyExsists':u'Agent {0} bestaat al.',
    'errorAgentMax':u'Maximum aantal agents overschreden.',
    'errorAgentNameNotValid':u'De naam van de agent is ongeldig. U kunt geen gebruik maken van de tekens / \ | # @ : .',
    'errorConnectionConfig':u'Verbindingsfout. Controleer of de DWAgent-service draait.',
    'errorConnectionQuestion':u'Verbindingsfout. Controleer uw internetverbinding of firewall.\nWilt u een proxy configureren?',
    'errorInvalidCode':u'De ingevoerde code is ongeldig.',
    'errorInvalidUserPassword':u'Ongeldige gebruiker of wachtwoord.',
    'fieldRequired':u'Het veld \'{0}\' is vereist.',
    'install':u'Installeren',
    'installMonitor':u'Monitor installeren...',
    'installMonitorErr':u'Installatie van monitor mislukt.',
    'installService':u'Service installeren...',
    'installServiceErr':u'Installatie van service mislukt.',
    'installShortcuts':u'Snelkoppelingen installeren...',
    'installShortcutsErr':u'Installatie van snelkoppelingen mislukt.',
    'ipAddress':u'IP-adres: {0}',
    'linuxRootPrivileges':u'U moet root-rechten hebben om DWAgent te installeren.\nVoer het script uit met sudo of als root.',
    'menuConfigure':u'Configureren',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Verwijderen',
    'missingInfoFile':u'Bestand info.json niet gevonden.',
    'missingNative':u'Bron niet gevonden.',
    'missingRuntime':u'Uitvoerbestand niet gevonden.',
    'monitorActive':u'actief',
    'monitorAgentDisabled':u'Agent uitgeschakeld.',
    'monitorAgentEnabled':u'Agent ingeschakeld.',
    'monitorConfigure':u'Configureren',
    'monitorConnections':u'Verbindingen',
    'monitorCurrentActivities':u'Huidige activiteiten',
    'monitorDisable':u'Uitschakelen',
    'monitorDisableAgentQuestion':u'Wilt u de agent uitschakelen?',
    'monitorDownload':u'Downloaden',
    'monitorEnable':u'Inschakelen',
    'monitorEnableAgentQuestion':u'Wilt u de agent inschakelen?',
    'monitorEnterPassword':u'Wachtwoord invoeren:',
    'monitorErrorConnectionConfig':u'Verbindingsfout. Controleer of de DWAgent-service draait.',
    'monitorHide':u'Verbergen',
    'monitorInvalidPassword':u'Ongeldig wachtwoord.',
    'monitorNoActivities':u'Geen activiteiten',
    'monitorScreenCapture':u'Schermtoegang',
    'monitorSession':u'Sessie',
    'monitorShellSession':u'Shell-toegang',
    'monitorShow':u'Weergeven',
    'monitorStatus':u'Status',
    'monitorStatusDisabled':u'Uitgeschakeld',
    'monitorStatusNoService':u'Geen service',
    'monitorStatusOffline':u'Offline',
    'monitorStatusOnline':u'Online',
    'monitorStatusUpdating':u'Bijwerken',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Verwijderen',
    'monitorUninstallNotRun':u'U kunt de installatie niet ongedaan maken zonder root-rechten.\nVoer de opdracht dwaguninstall uit met sudo of als root.',
    'monitorUpload':u'Uploaden',
    'mustAccept':u'Om verder te gaan, moet u de optie {0} selecteren',
    'mustSelectOptions':u'U moet een optie kiezen.',
    'next':u'Volgende',
    'no':u'Nee',
    'noTryAgain':u'Nee, opnieuw proberen',
    'notInstalled':u'DWAgent is niet geïnstalleerd.',
    'ok':u'Ok',
    'option':u'Optie',
    'optionNotValid':u'Geselecteerde optie is ongeldig.',
    'or':u'of',
    'password':u'Wachtwoord',
    'path':u'Pad',
    'pathCreating':u'Map maken...',
    'pathNotCreate':u'Kon de map niet aanmaken. Ongeldig pad of geen toestemming.',
    'pressEnter':u'Druk op enter om verder te gaan.',
    'privacyPolicy':u'Privacybeleid',
    'proxyAuthPassword':u'Wachtwoord',
    'proxyAuthUser':u'Gebruiker',
    'proxyHost':u'Host',
    'proxyHttp':u'HTTP',
    'proxyInfo':u'Proxy-informatie invoeren.',
    'proxyNone':u'Geen',
    'proxyPort':u'Poort',
    'proxySocks4':u'SOCKS4',
    'proxySocks4a':u'SOCKS4a',
    'proxySocks5':u'SOCKS5',
    'proxySystem':u'Systeem',
    'reEnterCode':u'Code opnieuw invoeren',
    'reEnterData':u'Gegevens opnieuw invoeren',
    'rePassword':u'Wachtwoord opnieuw invoeren',
    'reject':u'Verwerpen',
    'removeFile':u'Bestand verwijderen...',
    'runWithoutInstallation':u'Uitvoeren',
    'runWithoutInstallationClosing':u'Sessie sluiten...',
    'runWithoutInstallationConnecting':u'Sessie openen...',
    'runWithoutInstallationEnd':u'Sessie afgelopen.',
    'runWithoutInstallationOnlineBottom':u'WAARSCHUWING:\nGeef deze informatie niet aan mensen die u niet vertrouwt. Het zal hen in staat stellen toegang te krijgen tot dit apparaat. Als u niet zeker weet wat u doet, sluit deze toepassing dan af.',
    'runWithoutInstallationOnlineBottomPutCode':u'WAARSCHUWING:\nDe agent is nu klaar om een verbinding te accepteren. Als u niet zeker weet wat u doet, sluit deze toepassing dan af.',
    'runWithoutInstallationOnlinePassword':u'Wachtwoord: {0}',
    'runWithoutInstallationOnlineTop':u'De sessie is actief.\nGa naar https://www.dwservice.net om met de agent te verbinden',
    'runWithoutInstallationOnlineTopPutCode':u'De sessie is actief.',
    'runWithoutInstallationOnlineUser':u'Gebruiker: {0}',
    'runWithoutInstallationStarting':u'Agent opstarten...',
    'runWithoutInstallationUnexpectedError':u'Onverwachte fout.\nDWAgent kon niet starten. Als het probleem zich blijft voordoen, download dan de laatste versie van DWAgent, verwijder de map \'{0}\' en start DWAgent opnieuw.',
    'runWithoutInstallationUpdating':u'Agent bijwerken...',
    'runWithoutInstallationWait':u'Wachten tot de nieuwe verbinding gemaakt is (poging {0})...',
    'selectPathInstall':u'Selecteer het installatiepad:',
    'startService':u'Service starten...',
    'startServiceErr':u'Service starten mislukt.',
    'termsAndConditions':u'Algemene voorwaarden',
    'titleInstall':u'DWAgent - Installatie',
    'titleUninstall':u'DWAgent - Verwijderen',
    'toBack':u'om terug te keren.',
    'toExit':u'om af te sluiten.',
    'unattendedAccess':u'Toegang\nzonder toezicht',
    'unexpectedError':u'Onverwachte fout.\n{0}',
    'uninstallMonitor':u'Monitor verwijderen...',
    'uninstallService':u'Service verwijderen...',
    'uninstallShortcuts':u'Snelkoppelingen verwijderen...',
    'unknownUser':u'Onbekende gebruiker',
    'user':u'Gebruiker',
    'validInteger':u'Het veld \'{0}\' moet een getal zijn.',
    'versionInstallNotValid':u'Deze versie van het installatieprogramma is niet correct voor uw besturingssysteem.\nDownload de juiste versie. {0}',
    'waiting':u'Wachten...',
    'warningLoginLogout':u'Om deze wijziging van kracht te laten worden, moet de gebruiker afmelden en opnieuw aanmelden.',
    'warningRemovePath':u'Waarschuwing: de doelmap bestaat al en zal worden verwijderd.',
    'warningSpyingTool':u'Hou er rekening mee dat u geen toegang mag krijgen tot een computer op afstand zonder de toestemming van de gebruiker. Door DWService als spionagemiddel te gebruiken overtreedt u mogelijk de wetten in het land waar u woont.',
    'welcomeLicense':u'Licentie\nDeze software is gratis en open source.\nHet bestaat uit één hoofdonderdeel dat is vrijgegeven onder de MPLv2-licentie en verscheidene bijkomende onderdelen die onder verschillende licenties vallen. Bezoek https://www.dwservice.net/en/licenses-sources.html voor meer informatie.',
    'welcomePrivacyTerms':u'Door verder te gaan met de installatie of het uitvoeren van deze software gaat u akkoord met de #TERMSANDCONDITIONS en het #PRIVACYPOLICY',
    'welcomeSecurity':u'Beveiliging\nOm uw privacy te beschermen slaan wij geen informatie van de agent op onze servers op. De communicatie tussen gebruikers, onze servers en agenten wordt versleuteld, zodat derden er geen toegang toe kunnen krijgen.',
    'welcomeSoftwareUpdates':u'Software-updates\nDeze software wordt automatisch bijgewerkt',
    'windowsAdminPrivileges':u'U moet beheerdersrechten hebben om DWAgent te installeren.\nKlik met de rechtermuisknop op het uitvoerbare bestand en klik op \'als administrator uitvoeren\' om het installatieprogramma te starten.',
    'yes':u'Ja'
}
                                                                                                                                                           ui/messages/de.py                                                                                   0000644 0001750 0001750 00000031255 14443646216 013552  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Akzeptieren',
    'accessConfirm':u'Möchten Sie auf Ihr Gerät zugreifen.',
    'agentName':u'Agentenname',
    'alreadyInstalled':u'DWAgent ist bereits installiert. \n\nDer Agent wird automatisch auf die neueste Version aktualisiert. Das heisst, es können keine manuellen Updates durchgeführt werden.',
    'back':u'Zurück',
    'cancel':u'Abbrechen',
    'cancelInstall':u'Die Installation wurde abgebrochen.',
    'cancelUninstall':u'Die Deinstallation wurde abgebrochen.',
    'checkInstallCode':u'Prüfe Installationscode...',
    'chooseProxyType':u'Welcher Proxy-Typ soll verwendet werden?',
    'close':u'Schliessen',
    'code':u'Code',
    'commands':u'Befehle',
    'configureAgent':u'Agent konfigurieren',
    'configureAgentDisabled':u'Agent deaktiviert',
    'configureAgentEnabled':u'Agent aktiviert',
    'configureChangeInstallKey':u'Installations-Code ändern',
    'configureChooseMonitorTrayIconVisibility':u'Monitor-Symbol in der Taskleiste anzeigen?',
    'configureChooseOperation':u'Bitte einen Vorgang auswählen:',
    'configureDesktopNotification':u'Desktopbenachrichtigung',
    'configureDesktopNotificationOK':u'Desktopbenachrichtigung erfolgreich konfiguriert.',
    'configureDisableAgent':u'Agent deaktivieren',
    'configureDisableAgentQuestion':u'Wollen Sie den Agenten deaktivieren?',
    'configureEnableAgent':u'Agent aktivieren',
    'configureEnableAgentQuestion':u'Wollen Sie den Agenten aktivieren?',
    'configureEnd':u'Die Konfiguration wurde fertiggestellt.',
    'configureErrorConnection':u'Verbindungsfehler. Bitte prüfen, ob der DWAgent-Dienst läuft.',
    'configureExit':u'Beenden',
    'configureInsertPassword':u'Bitte Konfigurations-Passwort eingeben:',
    'configureInstallAgent':u'Wie soll der Agent bevorzugt konfiguriert werden?',
    'configureInstallCode':u'Bitte Installations-Code eingeben',
    'configureInstallNewAgent':u'Erzeuge neuen Agenten',
    'configureInstallPassword':u'Installations Passwort',
    'configureInstallUser':u'Benutzer',
    'configureInvalidPassword':u'Ungültiges Passwort.',
    'configureKeyInstalled':u'Schlüssel erfolgreich installiert.',
    'configureLater':u'Später konfigurieren',
    'configureMonitor':u'Monitor konfigurieren',
    'configurePassword':u'Passwort konfigurieren',
    'configurePasswordErrNoMatch':u'Die Passwörter stimmen nicht überein.',
    'configurePasswordUpdated':u'Passwort aktualisiert.',
    'configureProxy':u'Proxy konfigurieren',
    'configureProxyEnd':u'Proxy erfolgreich konfiguriert.',
    'configureRemovePassword':u'Passwort entfernen',
    'configureRemovePasswordQuestion':u'Möchten Sie das Passwort entfernen?',
    'configureSetPassword':u'Passwort festlegen',
    'configureTitle':u'DWAgent - Konfiguration',
    'configureTrayIconOK':u'Taskleistensymbol erfolgreich konfiguriert.',
    'configureTrayIconVisibility':u'Sichtbarkeit des Taskleistensymbols',
    'configureUninstallKeyQuestion':u'Aktuellen Installations-Code entfernen?',
    'configureUninstallationKey':u'Deinstallation...',
    'confirmExit':u'Sind Sie sicher, dass das Programm beendet werden soll?',
    'confirmInstall':u'Den DWAgent in \'{0}\' installieren?',
    'confirmUninstall':u'Wollen Sie den DWAgent entfernen?',
    'copyFiles':u'Kopiere Dateien...',
    'createNewAgent':u'Agent wird erzeugt...',
    'decline':u'Ich lehne ab',
    'desktopNotificationAutoHide':u'Automatisch ausblenden',
    'desktopNotificationNone':u'Keine',
    'desktopNotificationVisible':u'Sichtbar',
    'downloadFile':u'Lade Datei {0} herunter...',
    'endInstall':u'Installation abgeschlossen.',
    'endInstallConfigLater':u'Installation abgeschlossen.\nDer Agent wurde nicht konfiguriert. Die Konfiguration kann aber später erstellt werden.',
    'endUninstall':u'Deinstallation abgeschlossen.',
    'enter':u'Eingabe',
    'enterInstallCode':u'Installationscode eingeben',
    'enterInstallNewAgent':u'Daten für neuen Agenten eingeben:',
    'enterRunCode':u'Geben Sie den Verbindungscode ein',
    'error':u'Fehler',
    'errorAgentAlreadyExsists':u'Der Agent {0} existiert bereits.',
    'errorAgentMax':u'Maximale Anzahl an Agenten überschritten.',
    'errorAgentNameNotValid':u'Der Agentenname ist ungültig. Die Zeichen / \ | # @ : . können nicht verwendet werden.',
    'errorConnectionConfig':u'Verbindungsfehler. Bitte prüfen, ob der DWAgent-Dienst läuft.',
    'errorConnectionQuestion':u'Verbindungsfehler. Bitte Internetverbindung oder Firewalleinstellungen prüfen.\nWollen Sie den Proxy konfigurieren?',
    'errorInvalidCode':u'Der eingegebene Code ist ungültig.',
    'errorInvalidUserPassword':u'Benutzername oder Passwort ungültig.',
    'fieldRequired':u'Das Feld \'{0}\' ist erforderlich.',
    'install':u'Installieren',
    'installMonitor':u'Installiere Monitor...',
    'installMonitorErr':u'Installation des Monitors fehlgeschlagen.',
    'installService':u'Installiere Dienst...',
    'installServiceErr':u'Installation des Dienstes fehlgeschlagen.',
    'installShortcuts':u'Installiere Verknüpfungen...',
    'installShortcutsErr':u'Installation der Verknüpfungen fehlgeschlagen.',
    'installerNotSupported':u'Dieses Installationsprogramm wird nicht mehr unterstützt. Bitte laden Sie die neueste Version herunter.',
    'ipAddress':u'IP-Adresse: {0}',
    'linuxRootPrivileges':u'Für die Installation des DWAgent sind root-Rechte erforderlich.\nSkript bitte als root-Benutzer starten.',
    'menuConfigure':u'Konfigurieren',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Deinstallieren',
    'missingInfoFile':u'Datei info.json nicht gefunden.',
    'missingNative':u'Native nicht gefunden.',
    'missingRuntime':u'Laufzeitumgebung nicht gefunden.',
    'monitorActive':u'aktiv',
    'monitorAgentDisabled':u'Agent deaktiviert.',
    'monitorAgentEnabled':u'Agent aktiviert.',
    'monitorConfigure':u'Konfigurieren',
    'monitorConnections':u'Verbindungen',
    'monitorCurrentActivities':u'Momentane Aktivitäten',
    'monitorDisable':u'Deaktivieren',
    'monitorDisableAgentQuestion':u'Den Agenten deaktivieren?',
    'monitorDownload':u'Download',
    'monitorEnable':u'Aktivieren',
    'monitorEnableAgentQuestion':u'Den Agenten aktivieren?',
    'monitorEnterPassword':u'Passwort eingeben:',
    'monitorErrorConnectionConfig':u'Verbindungsfehler. Bitte prüfen, ob der DWAgent-Dienst läuft.',
    'monitorHide':u'Ausblenden',
    'monitorInvalidPassword':u'Ungültiges Passwort.',
    'monitorNoActivities':u'Keine Aktivitäten',
    'monitorScreenCapture':u'Bildschirmzugriff',
    'monitorSession':u'Sitzung',
    'monitorShellSession':u'Shell-Zugriff',
    'monitorShow':u'Einblenden',
    'monitorStatus':u'Status',
    'monitorStatusDisabled':u'Deaktiviert',
    'monitorStatusNoService':u'Kein Dienst',
    'monitorStatusOffline':u'Offline',
    'monitorStatusOnline':u'Online',
    'monitorStatusUpdating':u'Aktualisiere',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Deinstallieren',
    'monitorUninstallNotRun':u'Für die Deinstallation sind root-Rechte erforderlich.\nBefehl dwaguninstall in der Shell mit root-Rechte ausführen.',
    'monitorUpload':u'Upload',
    'mustAccept':u'Zum Fortsetzen {0} auswählen',
    'mustSelectOptions':u'Auswahl einer Option erforderlcih.',
    'next':u'Weiter',
    'no':u'Nein',
    'noTryAgain':u'Nein, erneut versuchen',
    'notInstalled':u'DWAgent nicht installiert.',
    'ok':u'Ok',
    'option':u'Option',
    'optionNotValid':u'Gewählte Option ungültig.',
    'or':u'oder',
    'password':u'Passwort',
    'path':u'Pfad',
    'pathCreating':u'Ordner wird erstellt...',
    'pathNotCreate':u'Ordner konnte nicht erstellt werden. Ungültiger Pfad oder fehlende Berechtigungen.',
    'pressEnter':u'Zum Fortsetzen die Enter-Taste drücken.',
    'privacyPolicy':u'Datenschutzbestimmungen',
    'proxyAuthPassword':u'Proxy-Passwort',
    'proxyAuthUser':u'Proxy-Benutzer',
    'proxyHost':u'Proxy-Host',
    'proxyHttp':u'Proxy-URL',
    'proxyInfo':u'Proxy-Informationen eingeben.',
    'proxyNone':u'Keiner',
    'proxyPort':u'Port',
    'proxySocks4':u'SOCKS4',
    'proxySocks4a':u'SOCKS4a',
    'proxySocks5':u'SOCKS5',
    'proxySystem':u'System',
    'reEnterCode':u'Code erneut eingeben',
    'reEnterData':u'Daten erneut eingeben',
    'rePassword':u'Passwort erneut eingeben',
    'reject':u'Ablehnen',
    'removeFile':u'Datei wird gelöscht...',
    'runWithoutInstallation':u'Ausführen',
    'runWithoutInstallationClosing':u'Schliesse Sitzung...',
    'runWithoutInstallationConnecting':u'Öffne Sitzung...',
    'runWithoutInstallationEnd':u'Sitzung beendet.',
    'runWithoutInstallationOnlineBottom':u'WARNUNG:\nGeben Sie diese Informationen nicht Dritten, denen Sie nicht vertrauen. Sonst können sich diese mit diesem Agenten vebinden. Im Zweifelsfall schliessen Sie dieses Programm.',
    'runWithoutInstallationOnlineBottomPutCode':u'WARNUNG:\nDer Agent kann nun Verbindungen annehmen. Wenn Sie sich nicht sicher sind, was Sie tun, schliessen Sie bitte diese Anwendung.',
    'runWithoutInstallationOnlinePassword':u'Passwort: {0}',
    'runWithoutInstallationOnlineTop':u'Die Sitzung ist aktiv.\nUm sich nun mit diesem Computer zu verbinden, müssen in einem Browser die Webadresse https://www.dwservice.net aufgerufen und bei "Login" die folgenden Angaben eingegeben werden:',
    'runWithoutInstallationOnlineTopPutCode':u'Die Sitzung ist aktiv.',
    'runWithoutInstallationOnlineUser':u'Benutzer: {0}',
    'runWithoutInstallationStarting':u'Agent startet...',
    'runWithoutInstallationUnexpectedError':u'Unerwarteter Fehler.\nDWAgent konnte nicht gestartet werden. Wenn das Problem bestehen bleibt, bitte die neueste Version von DWAgent herunterladen, den Ordner \'{0}\' löschen und DWAgent erneut ausführen.',
    'runWithoutInstallationUpdating':u'Aktualisiere Agenten...',
    'runWithoutInstallationWait':u'Warte auf neue Verbindung ({0}. Versuch)...',
    'selectPathInstall':u'Installationsverzeichnis auswählen:',
    'skipCertValidation':u'Warnung: Das Sicherheitszertifikat kann nicht validiert werden, wenn Sie fortfahren, ist die Verbindung möglicherweise nicht sicher.\nBitte überprüfen Sie die Router-/Firewall-/Antivirenkonfiguration des Netzwerks oder des Standorts an dem Sie gerade arbeiten.\nTrotzdem fortfahren?',
    'startService':u'Dienst wird gestartet...',
    'startServiceErr':u'Dienst konnte nicht gestartet werden.',
    'termsAndConditions':u'Konditionen und Bedingungen',
    'titleInstall':u'DWAgent - Installation',
    'titleUninstall':u'DWAgent - Deinstallation',
    'toBack':u'um zurückzukehren.',
    'toExit':u'um zu beenden.',
    'unattendedAccess':u'Unbeaufsichtigter\nZugriff',
    'unexpectedError':u'Unerwarteter Fehler.\n{0}',
    'uninstallMonitor':u'Deinstalliere Monitor...',
    'uninstallService':u'Deinstalliere Dienst...',
    'uninstallShortcuts':u'Deinstalliere Verknüpfungen...',
    'unknownUser':u'Unbekannter Benutzer',
    'user':u'Benutzer',
    'validInteger':u'Das Feld \'{0}\' muss ganzzahlig sein.',
    'versionInstallNotValid':u'Diese Version des Installationsprogrammes passt nicht zu ihrem Betriebssystem.\nBitte die richtige Version herunterladen. {0}',
    'waiting':u'Warte...',
    'warningLoginLogout':u'Um die Änderungen anzuwenden, muss der Benutzer sich erneut anmelden.',
    'warningRemovePath':u'Warnung: Der Zielordner ist bereits vorhanden und wird gelöscht.',
    'warningSpyingTool':u'Seien Sie sich bewusst, dass Sie auf einen Remotecomputer nicht ohne die Zustimmung des Benutzers zugreifen dürfen. Wenn Sie DWService als Spionagewerkzeug verwenden, machen Sie sich möglicherweise in der Rechtsprechung Ihres Landes strafbar.',
    'welcomeLicense':u'Lizenz:\nDiese Software ist frei und Open Source. \nDer Hauptbestandteil der Software ist der MPLv2-Lizenz unterstellt, einige zusätzliche Softwarekomponenten sind anderen Lizenzen unterstellt. Für mehr Informationen siehe: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Indem Sie mit der Installation fortfahren oder diese Software ausführen, erklären Sie sich mit den #TERMSANDCONDITIONS und der #PRIVACYPOLICY einverstanden',
    'welcomeSecurity':u'Sicherheit:\nUm den Datenschutz zu gewährleisten, garantieren wir, dass keine Informationen auf unseren Servern gespeichert werden und die Kommunikation verschlüsselt ist, sodass Dritte keinen Zugriff darauf haben.',
    'welcomeSoftwareUpdates':u'Software-Aktualisierungen:\nDiese Software wird automatisch aktualisiert',
    'windowsAdminPrivileges':u'Zur Installation von DWAgent sind Administratorenrechte erforderlich.\nBitte die Installation "Als Administrator ausführen".',
    'yes':u'Ja'
}
                                                                                                                                                                                                                                                                                                                                                   ui/messages/it.py                                                                                   0000644 0001750 0001750 00000031215 14406631452 013565  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'titleInstall': u'DWAgent - Installazione', 
    'titleUninstall': u'DWAgent - Disinstallazione', 
    'welcomeLicense': u'Licenza\nQuesto software è libero e open source.\nConsiste di una componente principale e diverse componenti accessorie definite "app" che potrebbero essere regolate da licenze differenti. Per maggiorni informazioni visita: https://www.dwservice.net/it/licenses-sources.html',
    'welcomeSecurity': u'Sicurezza\nA tutela della vostra privacy garantiamo che nessuna informazione verrà memorizzata sui nostri server e le comunicazioni sono criptate in modo che terze parti non possono leggerle.',
    'welcomeSoftwareUpdates': u'Aggiornamenti software\nGli aggiornamenti di questo software avvengono in modo automatico.',
    'welcomePrivacyTerms':u'Procedendo con l\'installazione o l\'esecuzione di questo software accetti i #TERMSANDCONDITIONS e la #PRIVACYPOLICY',
    'termsAndConditions': u'Termini e Condizioni',
    'privacyPolicy': u'Informativa sulla Privacy',
    'confirmUninstall': u'Vuoi eliminare DWAgent?',
    'mustAccept': u'Per poter continuare devi selezionare l\'opzione {0}',
    'or' : u'o',
    'accept': u'Accetta',
    'decline': u'Non accetta', 
    'next': u'Successivo', 
    'back': u'Indietro', 
    'yes': u'Sì', 
    'no': u'No', 
    'ok': u'Ok',
    'cancel': u'Annulla', 
    'close': u'Chiudi', 
    'waiting': u'Attendere...', 
    'alreadyInstalled': u'DWAgent già installato.\n\nL\'agente si aggiorna automaticamente all\'ultima versione. Ciò significa che non è necessario installare manualmente gli aggiornamenti più recenti.', 
    'notInstalled': u'DWAgent non installato.', 
    'fieldRequired': u'Il campo \'{0}\' è obbligatorio.', 
    'selectPathInstall': u'Selezionare il percorso di installazione:', 
    'path': u'Percorso', 
    'mustSelectOptions': u'Devi selezionare un opzione.', 
    'confirmInstall': u'Vuoi installare DWAgent in \'{0}\'?', 
    'warningRemovePath': u'Attenzione la cartella di destinazione già esiste quindi verrà eliminata.', 
    'pathNotCreate': u'Impossibile creare la cartella. Percorso invalido o accesso negato.', 
    'pathCreating': u'Creazione cartella...', 
    'unexpectedError': u'Errore inaspettato.\n{0}', 
    'downloadFile': u'Scaricamento file {0}...',
    'copyFiles': u'Copia file...', 
    'installService': u'Installazione servizio...', 
    'installServiceErr': u'Installazione servizio fallita.', 
    'uninstallService': u'Disinstallazione servizio...', 
    'startService': u'Avvio servizio...', 
    'startServiceErr': u'Avvio servizio fallito.', 
    'installMonitor': u'Installazione monitor...', 
    'uninstallMonitor': u'Disinstallazione monitor...', 
    'installMonitorErr': u'Installazione monitor fallita.',
    'monitorStatus': u'Stato',
    'monitorConnections': u'Connessioni', 
    'monitorStatusOffline': u'Offline', 
    'monitorStatusOnline': u'Online', 
    'monitorStatusDisabled': u'Disabilitato', 
    'monitorStatusUpdating': u'Aggiornamento', 
    'monitorStatusNoService': u'Nessun servizio', 
    'monitorShow': u'Mostra', 
    'monitorHide': u'Nascondi',
    'monitorUninstall': u'Disinstalla', 
    'monitorConfigure': u'Configura', 
    'monitorEnable': u'Abilita', 
    'monitorDisable': u'Disabilita', 
    'monitorErrorConnectionConfig': u'Errore di connessione. Verificare se il servizio DWAgent è attivo.', 
    'monitorDisableAgentQuestion': u'Vuoi disabilitare l\'agente', 
    'monitorEnableAgentQuestion': u'Vuoi abilitare l\'agente?', 
    'monitorEnterPassword': u'Inserire password:', 
    'monitorInvalidPassword': u'Password invalida.', 
    'monitorAgentDisabled': u'Agente disabilitato.', 
    'monitorAgentEnabled': u'Agente abilitato.',
    'monitorUninstallNotRun': u'Non è possibile eseguire la disinstallazione senza i permessi di root.\nEseguire il comand dwaguninstall da console.',
    'monitorTitle': u'DWAgent - Monitor', 
    'configureTitle':u'DWAgent - Configurazione', 
    'configureChooseOperation':u'Scegliere un operazione:', 
    'configureAgent':u'Configurare agente',
    'configureProxy':u'Configurare proxy', 
    'configureMonitor':u'Configurare monitor',
    'configurePassword':u'Configurare password',
    'configureSetPassword':u'Imposta password', 
    'configureRemovePassword':u'Rimuovi password',  
    'configureRemovePasswordQuestion':u'Vuoi rimuovere la password?', 
    'configureExit':u'Esci', 
    'configureEnd':u'Configurazione completata.', 
    'configureChangeInstallKey':u'Modifica codice di installazione', 
    'configureEnableAgent': u'Abilita agente', 
    'configureAgentEnabled': u'Agente abilitato.', 
    'configureEnableAgentQuestion': u'Vuoi abilitare l\'agente?', 
    'configureDisableAgent': u'Disabilita agente',     
    'configureAgentDisabled': u'Agente disabilitato.', 
    'configureDisableAgentQuestion': u'Vuoi disabilitare l\'agente?', 
    'configureErrorConnection': u'Errore di connessione. Verificare se il servizio DWAgent è avviato.', 
    'configureUninstallKeyQuestion':u'Disinstallare il codice di installazione corrente?', 
    'configureUninstallationKey':u'Disinstallazione...', 
    'configureKeyInstalled':u'Chiave installata correttamente.', 
    'configureProxyEnd':u'Proxy configurato correttamente.', 
    'configureTrayIconVisibility':u'Visibilità icona nella barra di sistema', 
    'configureChooseMonitorTrayIconVisibility':u'Vuoi visualizzare l\'icona nel monitor nella barra di sistema?', 
    'configureTrayIconOK':u'Visibilità icona nella barra di sistema, configurata correttamente.', 
    'configurePasswordErrNoMatch':u'Le password non coincidono.', 
    'configurePasswordUpdated':u'Password aggioranta.', 
    'configureInsertPassword':u'Inserire la password di configurazione:', 
    'configureInvalidPassword':u'Password invalida.', 
    'installShortcuts':u'Installazione collegamenti...', 
    'installShortcutsErr': u'Installazione collegamenti fallita.', 
    'uninstallShortcuts':u'Disinstallazione collegamenti...', 
    'enterInstallCode': u'Inserire il codice di installazione:', 
    'code': u'Codice', 
    'checkInstallCode': u'Verifica codice di installazione...', 
    'errorConnectionConfig': u'Errore di connessione. Verificare se il servizio DWAgent è avviato.', 
    'errorInvalidCode': u'Il codice inserito non è valido.', 
    'reEnterCode': u'Reinserisci il codice', 
    'endInstall': u'Installazione completata correttamente.', 
    'cancelInstall': u'L\'installazione è stata annullata.', 
    'cancelUninstall': u'La disinstallazione è stata annullata.', 
    'endInstallConfigLater': u'Installazione completata correttamente.\nL\'agente non è stato configurato. Si può comunque procedere con la configurazione successivamente.', 
    'errorConnectionQuestion': u'Errore di connessione. Verificare la connessione ad internet o verificare la configurazione del firewall.\nVuoi configurare un proxy?', 
    'noTryAgain': u'No, Riprova', 
    'configureLater': u'Configura più tardi', 
    'chooseProxyType': u'Che tipo di proxy vuoi usare?', 
    'proxySystem': u'Sistema', 
    'proxyHttp': u'Http', 
    'proxySocks4': u'Socks4', 
    'proxySocks4a': u'Socks4a',
    'proxySocks5': u'Socks5', 
    'proxyNone': u'Nessuno', 
    'proxyInfo': u'Inserire informazioni proxy.', 
    'proxyHost': u'Host', 
    'proxyPort': u'Porta', 
    'proxyAuthUser': u'Utente', 
    'proxyAuthPassword': u'Password', 
    'validInteger':u'Il campo \'{0}\' deve essere un numero intero.', 
    'endUninstall': u'Disinstallazione completata.', 
    'removeFile': u'Rimozione file...', 
    'menuUninstall': u'Disinstalla', 
    'menuConfigure': u'Configura', 
    'menuMonitor': u'Monitor', 
    'missingRuntime':u'Runtime non trovati.',
    'missingNative':u'Native non trovati.',  
    'missingInfoFile':u'File info.json non trovato.',  
    'versionInstallNotValid':u'La versione dell\'installatore non è corretta per il tuo sistema operativo.\nSi prega di scaricare la versione corretta. {0}',
    'user':u'Utente',     
    'password':u'Password', 
    'rePassword':u'Ripeti Password', 
    'confirmExit':u'Sicuro di voler Uscire?', 
    'linuxRootPrivileges':u'È necessario disporre dei privilegi di root per installare DWAgent.\nSi prega di avviare lo script usando l\'utente root.',
    'windowsAdminPrivileges':u'È necessario disporre dei privilegi di amministratore per installare DWAgent.\nSi prega di avviare l\'eseguibile con \'Esegui come amministratore\'.', 
    'pressEnter':u'Premi invio per continuare.', 
    'error':u'Errore', 
    'option':u'Opzione', 
    'optionNotValid':u'Opzione selezionata non valida.', 
    'enter':u'invio', 
    'commands':u'Comandi', 
    'toBack':u'per andare indietro.', 
    'toExit':u'per uscire.',
    'install':u'Installa',
    'runWithoutInstallation':u'Esegui',
    'runWithoutInstallationStarting':u'Avvio agente...',
    'runWithoutInstallationUpdating':u'Aggiornamento agente...',
    'runWithoutInstallationConnecting':u'Apertura sessione...',
    'runWithoutInstallationOnlineTop':u'La sessione è attiva.\nPer collegarsi a questo agente vai su https://www.dwservice.net',
    'runWithoutInstallationOnlineUser':u'Utente: {0}',
    'runWithoutInstallationOnlinePassword':u'Password: {0}',
    'runWithoutInstallationOnlineBottom':u'ATTENZIONE:\nNon comunicare queste informazioni a persone non fidate altrimenti consenti loro l\'accesso a questo agente. Quindi se non sei sicuro di quello che stai facendo, chiudi questa applicazione.',
    'runWithoutInstallationWait':u'Attendere nuova connessione in corso (tentativo {0})...',
    'runWithoutInstallationClosing':u'Chiusura sessione...',
    'runWithoutInstallationEnd':u'Sessione terminata.',
    'runWithoutInstallationUnexpectedError':u'Errore inaspettato.\nNon è stato possibile avviare DWAgent. Se il problema persiste, provare a scaricare l\'ultima versione di DWAgent, ad eliminare la cartella \'{0}\' ed eseguire nuovamente DWAgent.',
    'configureInstallAgent':u'Come preferisci configurare l\'agente?',
    'configureInstallNewAgent':u'Creando un nuovo agente',
    'configureInstallCode':u'Digitando il codice di installazione',
    'createNewAgent':u'Creazione dell\'agente in corso...',
    'agentName':u'Nome agente',
    'enterInstallNewAgent':u'Inserire i dati per creare un nuovo agente:',
    'configureInstallUser':u'Utente',
    'configureInstallPassword':u'Password di installazione',    
    'reEnterData':u'Reinserire i dati',
    'errorInvalidUserPassword':u'l\'utente o la password non sono validi.',
    'errorAgentNameNotValid':u'Il nome dell\'agente non è valido. Non puoi usare i caratteri / \\ | # @ : .',
    'errorAgentAlreadyExsists':u'L\'agente {0} già esiste.',
    'errorAgentMax':u'Superato numero massimo agenti.',
    'enterRunCode': u'Inserire il codice di connessione',
    'runWithoutInstallationOnlineTopPutCode':u'La sessione è attiva.' ,
    'runWithoutInstallationOnlineBottomPutCode':u'ATTENZIONE:\nL\'agente è pronto ad accettare connessioni. Quindi se non sei sicuro di quello che stai facendo, chiudi questa applicazione.',
    'monitorCurrentActivities': u'Attività correnti',
    'monitorNoActivities': u'Nessuna attività',
    'monitorSession': u'Sessione',
    'monitorScreenCapture': u'Accesso allo schermo',
    'monitorShellSession': u'Accesso al terminale',
    'monitorDownload': u'Download',
    'monitorUpload': u'Upload',
    'monitorActive': u'attivo',
    'configureDesktopNotification': u'Notifica desktop',
    'configureDesktopNotificationOK': u'Notifica desktop configurata correttamente.',
    'desktopNotificationVisible': u'Visibile',
    'desktopNotificationAutoHide': u'Nascondi automaticamente',
    'desktopNotificationNone': u'Nessuna',
    'warningSpyingTool': u'Sii consapevole che non puoi accedere a un computer remoto senza il consenso dell\'utente. Utilizzando DWService come strumento di spionaggio potresti violare le leggi del tuo paese di residenza.',
    'warningLoginLogout': u'Affinché questa modifica abbia effetto, l\'utente deve disconnettersi e accedere nuovamente.',
    'reject': u'Rifiuta',
    'ipAddress': u'Indirizzo IP: {0}',
    'accessConfirm': u'Desidera accedere al tuo dispositivo.',
    'unattendedAccess': u'Accesso\nnon presidiato',
    'unknownUser': u'Utente sconosciuto',
    'skipCertValidation':u'Attenzione: Il certificato di sicurezza non può essere convalidato, se si procede la connessione potrebbe non essere sicura.\nSi prega di verificare la configurazione del router/firewall/antivirus di rete o locale.\nProcedere comunque?',
    'installerNotSupported': u'Questo programma di installazione non è più supportato. Si prega di scaricare l\'ultima versione.'
}
                                                                                                                                                                                                                                                                                                                                                                                   ui/messages/pt_BR.py                                                                                0000644 0001750 0001750 00000030327 14443646241 014165  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Eu aceito',
    'accessConfirm':u'Gostaria de acessar seu dispositivo.',
    'agentName':u'Nome do agente',
    'alreadyInstalled':u'DWAgent já instalado.\n\nO agente atualiza automaticamente para a última versão. Isso significa que você não precisa instalar manualmente as novas atualizações.',
    'back':u'Voltar',
    'cancel':u'Cancelar',
    'cancelInstall':u'A instalação foi cancelada.',
    'cancelUninstall':u'Eu aceito',
    'checkInstallCode':u'Verificando código de instalação...',
    'chooseProxyType':u'Qual tipo de proxy deseja usar?',
    'close':u'Fechar',
    'code':u'Código',
    'commands':u'Comandos',
    'configureAgent':u'Configurar agente',
    'configureAgentDisabled':u'Agente desativado.',
    'configureAgentEnabled':u'Agente ativado.',
    'configureChangeInstallKey':u'Alterar código de instalação',
    'configureChooseMonitorTrayIconVisibility':u'Deseja exibir o monitor na barra de notificações?',
    'configureChooseOperation':u'Escolha uma operação:',
    'configureDesktopNotification':u'Notificação na área de trabalho',
    'configureDesktopNotificationOK':u'Notificação na área de trabalho configurada com sucesso.',
    'configureDisableAgent':u'Desativar agente',
    'configureDisableAgentQuestion':u'Deseja desativar o agente?',
    'configureEnableAgent':u'Ativar agente',
    'configureEnableAgentQuestion':u'Deseja ativar o agente?',
    'configureEnd':u'Configuração completada',
    'configureErrorConnection':u'Erro de conexão. Verifique se o serviço DWAgent está iniciado.',
    'configureExit':u'Sair',
    'configureInsertPassword':u'Insira senha de configuração:',
    'configureInstallAgent':u'Configurar o agente?',
    'configureInstallCode':u'Insira o código de instalação',
    'configureInstallNewAgent':u'Criar um novo agente',
    'configureInstallPassword':u'Senha de instalação',
    'configureInstallUser':u'Usuário',
    'configureInvalidPassword':u'Senha inválida.',
    'configureKeyInstalled':u'Chave instalada com sucesso.',
    'configureLater':u'Configurar depois',
    'configureMonitor':u'Configurar monitor',
    'configurePassword':u'Configurar senha',
    'configurePasswordErrNoMatch':u'Senha não confere.',
    'configurePasswordUpdated':u'Senha atualizada.',
    'configureProxy':u'Configurar proxy',
    'configureProxyEnd':u'Proxy configurado com sucesso.',
    'configureRemovePassword':u'Remover senha',
    'configureRemovePasswordQuestion':u'Deseja remover a senha?',
    'configureSetPassword':u'Definir senha',
    'configureTitle':u'DWAgent - Configuração',
    'configureTrayIconOK':u'Visibilidade do ícone da área de notificação configurado com sucesso.',
    'configureTrayIconVisibility':u'Visibilidade do ícone da área de notificação.',
    'configureUninstallKeyQuestion':u'Desinstalar o código de instalação atual?',
    'configureUninstallationKey':u'Desinstalação...',
    'confirmExit':u'Você tem certeza que deseja sair?',
    'confirmInstall':u'Você deseja instalar o DWAgent em \'{0}\'?',
    'confirmUninstall':u'Você deseja remover o DWAgent?',
    'copyFiles':u'Copiando arquivos...',
    'createNewAgent':u'Criação do agente em progresso...',
    'decline':u'Eu não aceito',
    'desktopNotificationAutoHide':u'Ocultar automaticamente',
    'desktopNotificationNone':u'Nenhum',
    'desktopNotificationVisible':u'Visível',
    'downloadFile':u'Baixando arquivo {0}...',
    'endInstall':u'Instalação concluída com sucesso.',
    'endInstallConfigLater':u'Instalação concluída com sucesso.\nO agente não foi configurado. Você poderá configurá-lo depois.',
    'endUninstall':u'Desinstalação concluída com sucesso.',
    'enter':u'entrar',
    'enterInstallCode':u'Inserir o código de instalação',
    'enterInstallNewAgent':u'Insira os dados para criar um novo agente:',
    'enterRunCode':u'Insira o código de conexão',
    'error':u'Erro',
    'errorAgentAlreadyExsists':u'O agente {0} já existe.',
    'errorAgentMax':u'Número máximo de agentes atingido.',
    'errorAgentNameNotValid':u'O nome do agente não é válido. Você não pode usar os caracteres / \ | # @ : .',
    'errorConnectionConfig':u'Erro de conexão. Por favor verifique se o serviço DWAgent está iniciado.',
    'errorConnectionQuestion':u'Erro de conexão. Por favor verifique sua conexão a internet ou configuração de firewall.\nVocê deseja configurar proxy?',
    'errorInvalidCode':u'O código inserido é inválido.',
    'errorInvalidUserPassword':u'Usuário ou senha inválidos.',
    'fieldRequired':u'O campo \'{0}\' é obrigatório.',
    'install':u'Instalar',
    'installMonitor':u'Instalando monitor...',
    'installMonitorErr':u'Instalação do monitor falhou.',
    'installService':u'Instalando serviço',
    'installServiceErr':u'Instalação do serviço falhou.',
    'installShortcuts':u'Instalando atalhos',
    'installShortcutsErr':u'Instalação dos atalhos falharam.',
    'installerNotSupported':u'Este instalador não é mais suportado. Por favor, faça o download da versão mais recente.',
    'ipAddress':u'Endereço IP: {0}',
    'linuxRootPrivileges':u'Você necessita ter privilégios de root para instalar o DWAgent.\nPor favor inicie o script usando um usuário root.',
    'menuConfigure':u'Configurar',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Desinstalar',
    'missingInfoFile':u'Arquivo info.json não encontrado.',
    'missingNative':u'Native não encontrado.',
    'missingRuntime':u'Runtime não encontrado.',
    'monitorActive':u'ativo',
    'monitorAgentDisabled':u'Agente desativado.',
    'monitorAgentEnabled':u'Agente ativado.',
    'monitorConfigure':u'Configurar',
    'monitorConnections':u'Conexões',
    'monitorCurrentActivities':u'Atividades atuais',
    'monitorDisable':u'Desativar',
    'monitorDisableAgentQuestion':u'Você deseja desativar o agente?',
    'monitorDownload':u'Download',
    'monitorEnable':u'Ativar',
    'monitorEnableAgentQuestion':u'Você deseja ativar o agente?',
    'monitorEnterPassword':u'Insira a senha:',
    'monitorErrorConnectionConfig':u'Erro de conexão. Por favor verifique se o serviço DWAgent está iniciado.',
    'monitorHide':u'Esconder',
    'monitorInvalidPassword':u'Senha inválida.',
    'monitorNoActivities':u'Sem atividades',
    'monitorScreenCapture':u'Capturar tela',
    'monitorSession':u'Sessão',
    'monitorShellSession':u'Shell',
    'monitorShow':u'Mostrar',
    'monitorStatus':u'Estado',
    'monitorStatusDisabled':u'Desabilitado',
    'monitorStatusNoService':u'Sem serviço',
    'monitorStatusOffline':u'Offiline',
    'monitorStatusOnline':u'Online',
    'monitorStatusUpdating':u'Atualizando',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Desinstalar',
    'monitorUninstallNotRun':u'Você não pode desinstalar sem permissões de root.\nExecute o comando dwaguninstall no shell.',
    'monitorUpload':u'Upload',
    'mustAccept':u'Para continuar, você deve selecionar a opção {0}',
    'mustSelectOptions':u'Você deve selecionar uma opção.',
    'next':u'Próximo',
    'no':u'Não',
    'noTryAgain':u'Não, tente novamente',
    'notInstalled':u'DWAgent não instalado.',
    'ok':u'Ok',
    'option':u'Opção',
    'optionNotValid':u'Opção selecionada é inválida.',
    'or':u'ou',
    'password':u'Senha',
    'path':u'Caminho',
    'pathCreating':u'Criação de pasta...',
    'pathNotCreate':u'Não pode criar a pasta. Caminho inválido ou permissão negada.',
    'pressEnter':u'Pressione enter para continuar.',
    'privacyPolicy':u'Política de privacidade',
    'proxyAuthPassword':u'Senha',
    'proxyAuthUser':u'Usuário',
    'proxyHost':u'Host',
    'proxyHttp':u'Http',
    'proxyInfo':u'Insira as informações de proxy.',
    'proxyNone':u'Nenhum',
    'proxyPort':u'Porta',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Sistema',
    'reEnterCode':u'Reinsira o código',
    'reEnterData':u'Reinsira os dados',
    'rePassword':u'Redigite a senha',
    'reject':u'Rejeitar',
    'removeFile':u'Removendo arquivo...',
    'runWithoutInstallation':u'Executar',
    'runWithoutInstallationClosing':u'Fechando sessão',
    'runWithoutInstallationConnecting':u'Abrindo sessão:',
    'runWithoutInstallationEnd':u'Sessão finalizada.',
    'runWithoutInstallationOnlineBottom':u'ATENÇÃO:\nNão divulgue essas informações a pessoas que não são confiáveis, pois de outra forma você permitirá que elas acessem a este agente. Então, se você não tem certeza do que está fazendo, feche esta aplicação.',
    'runWithoutInstallationOnlineBottomPutCode':u'AVISO:\nAgora o agente está pronto para aceitar a conexão. Então, se você não tem certeza do que está fazendo, por favor, feche esta aplicação.',
    'runWithoutInstallationOnlinePassword':u'Senha: {0}',
    'runWithoutInstallationOnlineTop':u'A sessão está ativa.\nPara se conectar a este agente vá para https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'A sessão está ativa.',
    'runWithoutInstallationOnlineUser':u'Usuário: {0}',
    'runWithoutInstallationStarting':u'Iniciando agente...',
    'runWithoutInstallationUnexpectedError':u'Erro inesperado.\nNão foi possível iniciar o DWAgent. Se o problema persistir, tente baixar a última versão do DWAgent, apague a pasta \'{0}\' e execute o DWAgent novamente.',
    'runWithoutInstallationUpdating':u'Atualizando agente...',
    'runWithoutInstallationWait':u'Aguarde pela nova conexão em progresso (tentativa {0})...',
    'selectPathInstall':u'Selecione o caminho de instalação:',
    'skipCertValidation':u'Aviso: O certificado de segurança não pode ser validado, se você continuar, a conexão pode não ser segura.\nPor favor, verifique a configuração do roteador/firewall/antivírus da rede ou do local.\nContinuar mesmo assim?',
    'startService':u'Iniciando serviço...',
    'startServiceErr':u'Inicialização do serviço falhou.',
    'termsAndConditions':u'Termos e Condições',
    'titleInstall':u'DWAgent - Instalação',
    'titleUninstall':u'DWAgent - Desinstalação',
    'toBack':u'para voltar.',
    'toExit':u'para sair.',
    'unattendedAccess':u'Acesso\nautônomo',
    'unexpectedError':u'Erro inesperado.\n{0}',
    'uninstallMonitor':u'Desinstalando monitor...',
    'uninstallService':u'Desinstalando serviço...',
    'uninstallShortcuts':u'Desinstalando atalhos...',
    'unknownUser':u'Usuário desconhecido',
    'user':u'Usuário',
    'validInteger':u'O campo \'{0}\' precisa ser um inteiro.',
    'versionInstallNotValid':u'A versão do instalador não é a correta para o seu sistema operacional.\nPor favor baixe a versão correta. {0}',
    'waiting':u'Aguardando...',
    'warningLoginLogout':u'Para que essa alteração tenha efeito, o usuário deve fazer logout e login novamente.',
    'warningRemovePath':u'Aviso: a pasta de destino já existe então ela será apagada.',
    'warningSpyingTool':u'Esteja ciente de que você não pode acessar um computador remoto sem o consentimento de seu usuário. Ao usar o DWService como uma ferramenta de espionagem, você pode estar infringindo as leis de seu país de residência.',
    'welcomeLicense':u'Licença\nEste software é gratuito e open source.\nEle consiste de um componente principal e vários componentes acessórios definidos "app" que podem ser regidos por diferentes licenças. Para mais informações visite: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Ao prosseguir com a instalação ou executar este software, você concorda com os #TERMSANDCONDITIONS e com a #PRIVACYPOLICY',
    'welcomeSecurity':u'Segurança\nPara proteger sua privacidade nós garantimos que nenhuma informação será armazenada nos nossos servidores e as comunicações são criptografadas para que terceiros não possam acessá-las.',
    'welcomeSoftwareUpdates':u'Atualizações de software\nAs atualizações deste software são automáticas.',
    'windowsAdminPrivileges':u'Você deve ter privilégios de administrador para instalar o DWAgent.\nPor favor inicie o executável com \'Executar como administrador\'.',
    'yes':u'Sim'
}
                                                                                                                                                                                                                                                                                                         ui/messages/zh.py                                                                                   0000644 0001750 0001750 00000025341 14443646221 013576  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'我接受',
    'accessConfirm':u'想要访问您的设备.',
    'agentName':u'代理名称',
    'alreadyInstalled':u'已经安装了DWAgent.\n\nDWAgent会自动更新到最新版本. 代表您不需要手动安装新的更新.',
    'back':u'返回',
    'cancel':u'取消',
    'cancelInstall':u'安裝程序已被取消.',
    'cancelUninstall':u'移除程序已被取消.',
    'checkInstallCode':u'正在检查安装代码...',
    'chooseProxyType':u'你需要哪种类型的伺服服务器?',
    'close':u'关闭',
    'code':u'代码',
    'commands':u'指令',
    'configureAgent':u'设置代理',
    'configureAgentDisabled':u'代理已被停用.',
    'configureAgentEnabled':u'代理已启用.',
    'configureChangeInstallKey':u'改变安装程式码',
    'configureChooseMonitorTrayIconVisibility':u'是否要在托盘图标中显示监视器?',
    'configureChooseOperation':u'请选择作业项目:',
    'configureDesktopNotification':u'桌面通知',
    'configureDesktopNotificationOK':u'桌面通知已成功配置.',
    'configureDisableAgent':u'停用代理',
    'configureDisableAgentQuestion':u'要禁用代理吗?',
    'configureEnableAgent':u'启用代理',
    'configureEnableAgentQuestion':u'请确认启用代理?',
    'configureEnd':u'设置已完成.',
    'configureErrorConnection':u'连线错误. 请检察 DWAgent 服务使否启用',
    'configureExit':u'退出',
    'configureInsertPassword':u'请输入设置时需要的密码:',
    'configureInstallAgent':u'要如何设置此代理的服务?',
    'configureInstallCode':u'输入安装代码',
    'configureInstallNewAgent':u'创建一个新代理',
    'configureInstallPassword':u'安装密码',
    'configureInstallUser':u'用户',
    'configureInvalidPassword':u'密码错误.',
    'configureKeyInstalled':u'密钥已成功安装.',
    'configureLater':u'稍后设置',
    'configureMonitor':u'设置监视器',
    'configurePassword':u'设置密码',
    'configurePasswordErrNoMatch':u'密码不合.',
    'configurePasswordUpdated':u'密码已更新.',
    'configureProxy':u'配置伺服服务器',
    'configureProxyEnd':u'伺服服务器设置成功.',
    'configureRemovePassword':u'移除密码',
    'configureRemovePasswordQuestion':u'确认要移除密码?',
    'configureSetPassword':u'设定密码',
    'configureTitle':u'DWAgent - 设置',
    'configureTrayIconOK':u'成功设置在系统区显示图示.',
    'configureTrayIconVisibility':u'系统区显示图示',
    'configureUninstallKeyQuestion':u'卸载目前安装的程式码?',
    'configureUninstallationKey':u'卸载程式中...',
    'confirmExit':u'确定退出?',
    'confirmInstall':u'确认安装 DWAgent 到\'{0}\'吗?',
    'confirmUninstall':u'确认删除 DWAgent?',
    'copyFiles':u'复制文件中...',
    'createNewAgent':u'正在新建代理中...',
    'decline':u'我不接受',
    'desktopNotificationAutoHide':u'自动隐藏',
    'desktopNotificationNone':u'没有',
    'desktopNotificationVisible':u'可见的',
    'downloadFile':u'正在下载档案 {0}...',
    'endInstall':u'完成安裝.',
    'endInstallConfigLater':u'完成安装.\n尚未设置代理, 你仍可以继续, 稍后再设置.',
    'endUninstall':u'完成卸载.',
    'enter':u'输入',
    'enterInstallCode':u'输入安装程式码',
    'enterInstallNewAgent':u'输入建立新代理的资料:',
    'enterRunCode':u'输入连接代码',
    'error':u'错误',
    'errorAgentAlreadyExsists':u'此代理{0}已经存在.',
    'errorAgentMax':u'超过最大的代理数量.',
    'errorAgentNameNotValid':u'代理名称无效. 你不能使用字符 / \ |',
    'errorConnectionConfig':u'连线错误. 请检察代理是否已启动.',
    'errorConnectionQuestion':u'连线错误. 请检察对外连线或防火墙的设置.\n是否有使用代理服务器?',
    'errorInvalidCode':u'输入的程式码错误.',
    'errorInvalidUserPassword':u'密码或是帐号错误.',
    'fieldRequired':u'\'{0}\' 栏位必填.',
    'install':u'安裝',
    'installMonitor':u'安裝监视器...',
    'installMonitorErr':u'错误, 无法安装监视器.',
    'installService':u'安装服务...',
    'installServiceErr':u'安装服务错误.',
    'installShortcuts':u'安装捷径...',
    'installShortcutsErr':u'安装捷径错误.',
    'installerNotSupported':u'不再支持此安裝程序.  請下載最新版本.',
    'ipAddress':u'IP 地址: {0}',
    'linuxRootPrivileges':u'您必须具有root权限才能安装DWAgent.\n请使用root用户启动脚本.',
    'menuConfigure':u'设置',
    'menuMonitor':u'监视器',
    'menuUninstall':u'卸载',
    'missingInfoFile':u'找不到 info.json 档案.',
    'missingNative':u'找不到 Native 程序.',
    'missingRuntime':u'找不到  Runtime 程序.',
    'monitorActive':u'活跃',
    'monitorAgentDisabled':u'代理已停用.',
    'monitorAgentEnabled':u'代理已启动.',
    'monitorConfigure':u'设置',
    'monitorConnections':u'连线',
    'monitorCurrentActivities':u'当前活动',
    'monitorDisable':u'停用',
    'monitorDisableAgentQuestion':u'确认停用此代理?',
    'monitorDownload':u'下载',
    'monitorEnable':u'啟用',
    'monitorEnableAgentQuestion':u'確認啟用此代理?',
    'monitorEnterPassword':u'輸入密碼:',
    'monitorErrorConnectionConfig':u'連線錯誤. 請檢察 DWAgent 服務使否啟用.',
    'monitorHide':u'隱藏',
    'monitorInvalidPassword':u'密碼錯誤.',
    'monitorNoActivities':u'没有活动',
    'monitorScreenCapture':u'屏幕截图',
    'monitorSession':u'会话',
    'monitorShellSession':u'Shell',
    'monitorShow':u'顯示',
    'monitorStatus':u'狀態',
    'monitorStatusDisabled':u'禁用',
    'monitorStatusNoService':u'無服務',
    'monitorStatusOffline':u'離線',
    'monitorStatusOnline':u'上線',
    'monitorStatusUpdating':u'更新中',
    'monitorTitle':u'DWAgent - 監視器',
    'monitorUninstall':u'卸載',
    'monitorUninstallNotRun':u'没有root权限就无法卸载.\n请在指令介面中执行dwaguninstall命令.',
    'monitorUpload':u'上传',
    'mustAccept':u'要繼續, 必須選擇 {0}',
    'mustSelectOptions':u'必須選擇作業選項.',
    'next':u'下一步',
    'no':u'否',
    'noTryAgain':u'不, 請再試一次',
    'notInstalled':u'DWAgent 未安裝.',
    'ok':u'好',
    'option':u'選項',
    'optionNotValid':u'選擇的選項無效.',
    'or':u'或是',
    'password':u'密碼',
    'path':u'路徑',
    'pathCreating':u'建立資料夾...',
    'pathNotCreate':u'無法建立資料夾. 路徑無效或無權限.',
    'pressEnter':u'請按 Enter 來繼續.',
    'privacyPolicy':u'隐私政策',
    'proxyAuthPassword':u'密碼',
    'proxyAuthUser':u'用户',
    'proxyHost':u'服務主機',
    'proxyHttp':u'Http',
    'proxyInfo':u'插入伺服器訊息.',
    'proxyNone':u'無',
    'proxyPort':u'連接埠',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'系統',
    'reEnterCode':u'請重新輸入代碼',
    'reEnterData':u'請重新輸入資料',
    'rePassword':u'請重新輸入密碼',
    'reject':u'拒绝',
    'removeFile':u'移除檔案...',
    'runWithoutInstallation':u'執行',
    'runWithoutInstallationClosing':u'關閉連線會期...',
    'runWithoutInstallationConnecting':u'啟動連線會期...',
    'runWithoutInstallationEnd':u'連線會期結束.',
    'runWithoutInstallationOnlineBottom':u'警告:\n不要將此信息透露給不信任的人, 否則將會允許他們存取此設備的代理. 所以如果你不確定, 請關閉這個應用程式.',
    'runWithoutInstallationOnlineBottomPutCode':u'警告:\n現在代理已準備好接受連接.  因此, 如果您不確定自己在做什麼, 請關閉此應用程序.',
    'runWithoutInstallationOnlinePassword':u'密碼: {0}',
    'runWithoutInstallationOnlineTop':u'此連線會期已啟用.\n要連線此代理, 請連接到 https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'會話處於活動狀態.',
    'runWithoutInstallationOnlineUser':u'用戶: {0}',
    'runWithoutInstallationStarting':u'啟動代理 ...',
    'runWithoutInstallationUnexpectedError':u'意外錯誤.\n無法啟動 DWAgent. 如果問題仍然存在, 請嘗試下載最新版本的 DWAgent, 刪除資料夾 \'{0}\' 並再次執行 DWAgent.',
    'runWithoutInstallationUpdating':u'更新代理 ...',
    'runWithoutInstallationWait':u'正等待新的連線中(嘗試次數 {0})...',
    'selectPathInstall':u'選擇此安裝的路徑:',
    'skipCertValidation':u'警告: 无法验证安全证书, 如果继续, 连接可能不安全.\n请检查网络或本地的路由器/防火墙/防病毒配置 of the network or local.\n仍要继续?',
    'startService':u'啟動服務...',
    'startServiceErr':u'啟動服務錯誤.',
    'termsAndConditions':u'条款和条件',
    'titleInstall':u'DWAgent - 安裝',
    'titleUninstall':u'DWAgent - 卸載',
    'toBack':u'返回.',
    'toExit':u'離開.',
    'unattendedAccess':u'无人值守\n使用权',
    'unexpectedError':u'意外錯誤.\n{0}',
    'uninstallMonitor':u'卸載監控...',
    'uninstallService':u'卸載服務...',
    'uninstallShortcuts':u'卸載快捷方式...',
    'unknownUser':u'未知用户',
    'user':u'用戶',
    'validInteger':u'字段 \'{0}\' 必須是整數.',
    'versionInstallNotValid':u'安裝程序的版本不適用於您的操作系統.\n請下載正確的版本. {0}',
    'waiting':u'請等候...',
    'warningLoginLogout':u'为了使此更改生效，用户必须注销并再次登录.',
    'warningRemovePath':u'警告目標文件夾已經存在, 它將被刪除.',
    'warningSpyingTool':u'请注意, 未经用户的同意, 您不得访问远程计算机. 通过将DWService用作间谍工具, 您可能违反了居住国家/地区的法律.',
    'welcomeLicense':u'許可證\n該軟件是免費和開源的.\n它由一個主要組件和幾個定義為 "app" 的附件組件組成, 可以由不同的許可證管理. 有關更多信息, 請訪問: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'通过继续安装或运行此软件, 您同意#TERMSANDCONDITIONS和#PRIVACYPOLICY',
    'welcomeSecurity':u'安全性\n為了保護您的隱私, 我們保證不會在我們的服務器上存儲任何信息, 並且通信也會被加密, 因此無論如何第三方都無法讀取它們.',
    'welcomeSoftwareUpdates':u'軟件更新\n此軟件的更新是自動的.',
    'windowsAdminPrivileges':u'您必須具有管理員權限才能安裝DWAgent.\n請以 \'以管理員身份運行\' 啟動可執行文件.',
    'yes':u'是'
}
                                                                                                                                                                                                                                                                                               ui/messages/bg.py                                                                                   0000644 0001750 0001750 00000042661 14443646223 013553  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Приемам',
    'accessConfirm':u'Искам достъп до вашето устройство.',
    'agentName':u'Име на агента',
    'alreadyInstalled':u'DWAgent е вече инсталиран.\n\nАгентът автоматично се актуализира до последната версия. Това означава, че не е нужно да инсталирате ръчно новите актуализации.',
    'back':u'Назад',
    'cancel':u'Отказ',
    'cancelInstall':u'Инсталирането е отменено.',
    'cancelUninstall':u'Деинсталирането е отменено.',
    'checkInstallCode':u'Проверка на инсталационния ключ...',
    'chooseProxyType':u'Какъв тип прокси искате да използвате?',
    'close':u'Затвори',
    'code':u'Код',
    'commands':u'Команди',
    'configureAgent':u'Конфигурация на агента',
    'configureAgentDisabled':u'Агентът е забранен.',
    'configureAgentEnabled':u'Агентът е разрешен.',
    'configureChangeInstallKey':u'Смени инсталационния ключ',
    'configureChooseMonitorTrayIconVisibility':u'Желаете ли икона в панела за известия?',
    'configureChooseOperation':u'Моля, изберете действие:',
    'configureDesktopNotification':u'Известие на работния плот',
    'configureDesktopNotificationOK':u'Известието на работния плот е конфигурирано успешно.',
    'configureDisableAgent':u'Забрани агента',
    'configureDisableAgentQuestion':u'Желаете ли да забраните агента?',
    'configureEnableAgent':u'Разреши агента',
    'configureEnableAgentQuestion':u'Желаете ли за разрешите агента?',
    'configureEnd':u'Настройката приключи.',
    'configureErrorConnection':u'Грешка при свързване. Моля, проверете дали услугата DWAgent е стартирана.',
    'configureExit':u'Изход',
    'configureInsertPassword':u'Моля, въведете парола за настройки:',
    'configureInstallAgent':u'Как желаете да настроите агента?',
    'configureInstallCode':u'Въвеждане на инсталационния ключ',
    'configureInstallNewAgent':u'Създаване на нов агент',
    'configureInstallPassword':u'Парола за инсталиране',
    'configureInstallUser':u'Потребител',
    'configureInvalidPassword':u'Грешна парола.',
    'configureKeyInstalled':u'Ключа е инсталиран успешно.',
    'configureLater':u'Настрой по-късно',
    'configureMonitor':u'Настройки на монитора',
    'configurePassword':u'Настрой парола',
    'configurePasswordErrNoMatch':u'Паролата не съвпада.',
    'configurePasswordUpdated':u'Паролата бе актуализирана.',
    'configureProxy':u'Конфигуриране на прокси сървър',
    'configureProxyEnd':u'Прокси сървър конфигуриран успешно.',
    'configureRemovePassword':u'Премахване на паролата',
    'configureRemovePasswordQuestion':u'Искате ли да премахнете паролата?',
    'configureSetPassword':u'Задайте парола',
    'configureTitle':u'DWAgent - Конфигурация',
    'configureTrayIconOK':u'Видимостта на иконата в областта за уведомление е конфигурирана успешно.',
    'configureTrayIconVisibility':u'Видимост на иконата в областта за уведомление',
    'configureUninstallKeyQuestion':u'Деинсталиране на текущия код за инсталиране?',
    'configureUninstallationKey':u'Деинсталиране ...',
    'confirmExit':u'Сигурни ли сте, че искате да излезете?',
    'confirmInstall':u'Искате ли да инсталирате DWAgent на \'{0}\'?',
    'confirmUninstall':u'Искате ли да премахнете DWAgent?',
    'copyFiles':u'Копиране на файлове...',
    'createNewAgent':u'Създаване на агент...',
    'decline':u'Не приемам',
    'desktopNotificationAutoHide':u'Автоматично скриване',
    'desktopNotificationNone':u'Нищо',
    'desktopNotificationVisible':u'Видим',
    'downloadFile':u'Изтегляне на файла {0}...',
    'endInstall':u'Инсталацията е завършена.',
    'endInstallConfigLater':u'Инсталацията е завършена.\nАгентът не е конфигуриран. Все пак можете да продължите с конфигурацията по-късно.',
    'endUninstall':u'Деинсталацията е завършена.',
    'enter':u'въведете',
    'enterInstallCode':u'Въведете инсталационния код',
    'enterInstallNewAgent':u'Въведете данни, за да създадете нов агент:',
    'enterRunCode':u'Въведете кода на връзката',
    'error':u'Грешка',
    'errorAgentAlreadyExsists':u'Агентът {0} вече съществува.',
    'errorAgentMax':u'Превишен е максималният брой агенти.',
    'errorAgentNameNotValid':u'Името на агента не е валидно. Не можете да използвате символите / \ | # @:',
    'errorConnectionConfig':u'Грешка при свързването. Моля, проверете дали услугата DWAgent е стартирана.',
    'errorConnectionQuestion':u'Грешка при свързването. Моля, проверете връзката си с интернет или конфигурацията на защитната стена.\nИскате ли да конфигурирате прокси сървър?',
    'errorInvalidCode':u'Въведеният код е невалиден.',
    'errorInvalidUserPassword':u'Невалиден потребител или парола.',
    'fieldRequired':u'Полето "{0}" е задължително.',
    'install':u'Инсталирай',
    'installMonitor':u'Инсталиране на монитора ...',
    'installMonitorErr':u'Инсталирането на монитор е неуспешно.',
    'installService':u'инсталиране на услуга...',
    'installServiceErr':u'Инсталирането на услугата е неуспешно...',
    'installShortcuts':u'Инсталиране на преки пътища (икони)...',
    'installShortcutsErr':u'Инсталирането на преки пътища (икони) е неуспешно.',
    'installerNotSupported':u'Този инсталатор вече не се поддържа. Моля, изтеглете най-новата версия.',
    'ipAddress':u'IP адрес: {0}',
    'linuxRootPrivileges':u'Трябва да имате администраторски права, за да инсталирате DWAgent.\nМоля, стартирайте скрипта, като администратор.',
    'menuConfigure':u'Конфигурация',
    'menuMonitor':u'Монитор',
    'menuUninstall':u'Деинсталиране',
    'missingInfoFile':u'Файлът info.json не е намерен.',
    'missingNative':u'Настоящ не е намерен.',
    'missingRuntime':u'Времето за изпълнение не е намерено.',
    'monitorActive':u'активен',
    'monitorAgentDisabled':u'Агентът е изключен.',
    'monitorAgentEnabled':u'Агентът е включен.',
    'monitorConfigure':u'Конфигуриране',
    'monitorConnections':u'Връзки',
    'monitorCurrentActivities':u'Текущи дейности',
    'monitorDisable':u'Изключен',
    'monitorDisableAgentQuestion':u'Искате ли да деактивирате агента?',
    'monitorDownload':u'Сваляне',
    'monitorEnable':u'Включи',
    'monitorEnableAgentQuestion':u'Искате ли да активирате агента?',
    'monitorEnterPassword':u'Въведете парола:',
    'monitorErrorConnectionConfig':u'Грешка при свързването. Моля, проверете дали услугата DWAgent е стартирана.',
    'monitorHide':u'Скрий',
    'monitorInvalidPassword':u'Невалидна парола.',
    'monitorNoActivities':u'Няма дейности',
    'monitorScreenCapture':u'Заснемане на екрана',
    'monitorSession':u'Сесия',
    'monitorShellSession':u'Обвивка',
    'monitorShow':u'Покажи',
    'monitorStatus':u'Статус',
    'monitorStatusDisabled':u'Изключен',
    'monitorStatusNoService':u'Няма услуга',
    'monitorStatusOffline':u'Офлайн',
    'monitorStatusOnline':u'Онлайн',
    'monitorStatusUpdating':u'Обновяване',
    'monitorTitle':u'DWAgent - Монитор',
    'monitorUninstall':u'Деинсталирай',
    'monitorUninstallNotRun':u'Не можете да деинсталирате без разрешение на администратора.\nСтартирайте командата dwaguninstall в системната обвивка.',
    'monitorUpload':u'Качване',
    'mustAccept':u'За да продължите, трябва да изберете опцията {0}',
    'mustSelectOptions':u'Трябва да изберете опция.',
    'next':u'Следващ',
    'no':u'Не',
    'noTryAgain':u'Не, опитай пак.',
    'notInstalled':u'DWAgent не е инсталиран.',
    'ok':u'Ок',
    'option':u'Опция',
    'optionNotValid':u'Избраната опция е невалидна.',
    'or':u'или',
    'password':u'Парола',
    'path':u'Път',
    'pathCreating':u'Създаване на директория...',
    'pathNotCreate':u'Директорията не можа да бъде създадена. Невалиден път или отказан достъп.',
    'pressEnter':u'Натиснете "Enter", за да продължите.',
    'privacyPolicy':u'Политика за поверителност',
    'proxyAuthPassword':u'Парола',
    'proxyAuthUser':u'Потребител',
    'proxyHost':u'Хост',
    'proxyHttp':u'Http',
    'proxyInfo':u'Въведете информация за прокси сървъра.',
    'proxyNone':u'Нищо',
    'proxyPort':u'Порт',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Система',
    'reEnterCode':u'Въведете отново кода.',
    'reEnterData':u'Въведете отново данните.',
    'rePassword':u'Повторете паролата',
    'reject':u'Отхвърляне',
    'removeFile':u'Премахване на файла...',
    'runWithoutInstallation':u'Стартирай',
    'runWithoutInstallationClosing':u'Затваряне на сесията...',
    'runWithoutInstallationConnecting':u'Отваряне на сесията...',
    'runWithoutInstallationEnd':u'Сесията завърши.',
    'runWithoutInstallationOnlineBottom':u'ВНИМАНИЕ:\nНе разкривайте тази информация на хора, на които нямате доверие, иначе ще им позволите достъп до този агент. Така че, ако не сте сигурни какво правите, моля, затворете приложението.',
    'runWithoutInstallationOnlineBottomPutCode':u'ВНИМАНИЕ:\nСега агентът е готов да приеме връзка. Така че, ако не сте сигурни какво правите, моля, затворете това приложение.',
    'runWithoutInstallationOnlinePassword':u'Парола: {0}',
    'runWithoutInstallationOnlineTop':u'Сесията е активна.\nЗа да се свържете с този агент, посетете https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Сесията е активна.',
    'runWithoutInstallationOnlineUser':u'Потребител: {0}',
    'runWithoutInstallationStarting':u'Стартиране на агента...',
    'runWithoutInstallationUnexpectedError':u'Неочаквана грешка.\nDWAgent не можа да се стартира. Ако проблемът продължава, опитайте да изтеглите последната версия на DWAgent, да изтриете папката \'{0}\' и отново да стартирате DWAgent.',
    'runWithoutInstallationUpdating':u'Агентът се обновява...',
    'runWithoutInstallationWait':u'Изчакайте, в ход е нова връзка (опит {0}) ...',
    'selectPathInstall':u'Изберете къде да се инсталира:',
    'skipCertValidation':u'Предупреждение: Сертификатът за сигурност не може да бъде валидиран, ако продължите, връзката може да не е защитена.\nМоля, проверете конфигурацията на рутера/защитната стена/антивирусната мрежа или локално.\nПродължи въпреки това?',
    'startService':u'Стартиране на услуга...',
    'startServiceErr':u'Стартирането на услугата пропадна.',
    'termsAndConditions':u'Правила и условия',
    'titleInstall':u'DWAgent - Инсталация',
    'titleUninstall':u'DWAgent - Деинсталация',
    'toBack':u'се завръща',
    'toExit':u'излиза.',
    'unattendedAccess':u'Достъп\nбез надзор',
    'unexpectedError':u'Неочаквана грешка.\n{0}',
    'uninstallMonitor':u'Деинсталиране на монитор...',
    'uninstallService':u'Деинсталиране на услуга...',
    'uninstallShortcuts':u'Деинсталиране на преки пътища...',
    'unknownUser':u'Неизвестен потребител',
    'user':u'Потребител',
    'validInteger':u'Полето "{0}" трябва да е цяло число.',
    'versionInstallNotValid':u'Версията на инсталатора не е подходяща за вашата операционна система.\nМоля, изтеглете правилната версия. {0}',
    'waiting':u'Моля изчакайте...',
    'warningLoginLogout':u'За да влезе в сила тази промяна, потребителят трябва да излезе и да влезе отново.',
    'warningRemovePath':u'Предупреждение, че ако папката за местоназначение вече съществува, то тя ще бъде изтрита.',
    'warningSpyingTool':u'Моля, имайте предвид, че нямате достъп до отдалечен компютър без съгласието на неговия потребител. Използвайки DWService като шпионски инструмент, може да нарушите законите във вашата държава.',
    'welcomeLicense':u'Лиценз\nТози софтуер е безплатен и с отворен код.\nСъстои се от един основен компонент и няколко допълнителни компонента, дефинирани като "приложение", които могат да бъдат управлявани от различни лицензи. За повече информация посетете https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Продължавайки инсталацията или стартирането на този софтуер, вие се съгласявате с #TERMSANDCONDITIONS и #PRIVACYPOLICY',
    'welcomeSecurity':u'Сигурност\nВ защита на вашата поверителност ние гарантираме, че на нашите сървъри няма да се съхранява информация и комуникациите са кодирани, така че трети страни да не могат да ги прочетат.',
    'welcomeSoftwareUpdates':u'Актуализации на софтуера.\nАктуализациите на този софтуер са автоматични.',
    'windowsAdminPrivileges':u'Трябва да имате администраторски права, за да инсталирате DWAgent.\nМоля стартирайте изпълнимия файл, като администратор. (\'run as administrator\' или \'изпълни като администратор\').',
    'yes':u'Да'
}
                                                                               ui/messages/zh_TW.py                                                                                0000644 0001750 0001750 00000026363 14443646244 014222  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'我接受',
    'accessConfirm':u'想要存取您的裝置。',
    'agentName':u'代理器名稱',
    'alreadyInstalled':u'DWAgent 已經安裝。\n\n代理器會自動更新到最新版本，亦即您不需要手動安裝更新。',
    'back':u'上一步',
    'cancel':u'取消',
    'cancelInstall':u'已取消安裝。',
    'cancelUninstall':u'已取消解除安裝。',
    'checkInstallCode':u'檢查安裝碼…',
    'chooseProxyType':u'您要使用何種代理伺服器類型？',
    'close':u'關閉',
    'code':u'安裝碼',
    'commands':u'命令',
    'configureAgent':u'組配代理器',
    'configureAgentDisabled':u'已停用代理器。',
    'configureAgentEnabled':u'已啟用代理器。',
    'configureChangeInstallKey':u'變更安裝碼',
    'configureChooseMonitorTrayIconVisibility':u'您想要在系統匣中顯示監控圖示嗎？',
    'configureChooseOperation':u'請選擇一項操作：',
    'configureDesktopNotification':u'桌面通知',
    'configureDesktopNotificationOK':u'已成功組配桌面通知。',
    'configureDisableAgent':u'停用代理器',
    'configureDisableAgentQuestion':u'您想要停用代理器嗎？',
    'configureEnableAgent':u'啟用代理器',
    'configureEnableAgentQuestion':u'您想要啟用代理器嗎？',
    'configureEnd':u'組態已經完成。',
    'configureErrorConnection':u'連線錯誤。請檢查是否偵測得到 DWAgent 服務。',
    'configureExit':u'退出',
    'configureInsertPassword':u'請輸入組配密碼：',
    'configureInstallAgent':u'您想要如何組配代理器？',
    'configureInstallCode':u'輸入安裝碼',
    'configureInstallNewAgent':u'建立新的代理器',
    'configureInstallPassword':u'安裝密碼',
    'configureInstallUser':u'使用者',
    'configureInvalidPassword':u'無效的密碼。',
    'configureKeyInstalled':u'已成功安裝金鑰。',
    'configureLater':u'稍後進行組配',
    'configureMonitor':u'組配監控器',
    'configurePassword':u'配置密碼',
    'configurePasswordErrNoMatch':u'密碼不符合。',
    'configurePasswordUpdated':u'已更新密碼。',
    'configureProxy':u'組配代理伺服器',
    'configureProxyEnd':u'已成功組配代理伺服器。',
    'configureRemovePassword':u'移除密碼',
    'configureRemovePasswordQuestion':u'您想要移除密碼嗎？',
    'configureSetPassword':u'設定密碼',
    'configureTitle':u'DWAgent - 組態',
    'configureTrayIconOK':u'已成功組配系統匣圖示。',
    'configureTrayIconVisibility':u'系統匣圖示可視性',
    'configureUninstallKeyQuestion':u'解除安裝目前的安裝碼？',
    'configureUninstallationKey':u'解除安裝…',
    'confirmExit':u'確定要退出？',
    'confirmInstall':u'您想要安裝 DWAgent 到「{0}」？',
    'confirmUninstall':u'您想要移除 DWAgent 嗎？',
    'copyFiles':u'拷貝檔案…',
    'createNewAgent':u'正在建立代理器…',
    'decline':u'不接受',
    'desktopNotificationAutoHide':u'自動隱藏',
    'desktopNotificationNone':u'沒有',
    'desktopNotificationVisible':u'可見',
    'downloadFile':u'下載檔案 {0}…',
    'endInstall':u'已完成安裝。',
    'endInstallConfigLater':u'已完成安裝。\n尚未組配代理器。您仍然能夠稍後建立組態。',
    'endUninstall':u'已完成解除安裝。',
    'enter':u'輸入',
    'enterInstallCode':u'輸入安裝碼',
    'enterInstallNewAgent':u'輸入資料以建立新的代理器：',
    'enterRunCode':u'輸入連線碼',
    'error':u'錯誤',
    'errorAgentAlreadyExsists':u'已經存在代理器 {0}。',
    'errorAgentMax':u'超出代理器的最大數量。',
    'errorAgentNameNotValid':u'代理器名稱無效。您不可以使用字元 / \ | # @ : 。',
    'errorConnectionConfig':u'連線錯誤。請檢查是否偵測得到 DWAgent 服務。',
    'errorConnectionQuestion':u'連線錯誤。請檢查您的網際網路連線或防火牆。\n您要組配代理伺服器嗎？',
    'errorInvalidCode':u'輸入的碼無效。',
    'errorInvalidUserPassword':u'無效的使用者或密碼。',
    'fieldRequired':u'欄位「{0}」是必要項目。',
    'install':u'安裝',
    'installMonitor':u'安裝監控器…',
    'installMonitorErr':u'安裝監控器失敗。',
    'installService':u'安裝服務…',
    'installServiceErr':u'安裝服務失敗。',
    'installShortcuts':u'安裝快捷鍵…',
    'installShortcutsErr':u'安裝快捷鍵失敗。',
    'installerNotSupported':u'已不再支援這個安裝程式。請下載最新版本。',
    'ipAddress':u'IP 位址：{0}',
    'linuxRootPrivileges':u'您必須有管理員權力才能安裝 DWAgent。\n請配合 sudo 或以 root 身分運行命令稿。',
    'menuConfigure':u'組配',
    'menuMonitor':u'監控器',
    'menuUninstall':u'解除安裝',
    'missingInfoFile':u'找不到檔案 info.json。',
    'missingNative':u'找不到原生架構程式。',
    'missingRuntime':u'找不到執行階段函式庫。',
    'monitorActive':u'作用中',
    'monitorAgentDisabled':u'已停用代理器。',
    'monitorAgentEnabled':u'已啟用代理器。',
    'monitorConfigure':u'組配',
    'monitorConnections':u'連線',
    'monitorCurrentActivities':u'目前活動',
    'monitorDisable':u'停用',
    'monitorDisableAgentQuestion':u'您想要停用代理器嗎？',
    'monitorDownload':u'下載',
    'monitorEnable':u'啟用',
    'monitorEnableAgentQuestion':u'您想要啟用代理器嗎？',
    'monitorEnterPassword':u'輸入密碼：',
    'monitorErrorConnectionConfig':u'連線錯誤。請檢查是否偵測得到 DWAgent 服務。',
    'monitorHide':u'隱藏',
    'monitorInvalidPassword':u'無效的密碼。',
    'monitorNoActivities':u'沒有活動',
    'monitorScreenCapture':u'畫面存取',
    'monitorSession':u'作業階段',
    'monitorShellSession':u'命令殼存取',
    'monitorShow':u'顯示',
    'monitorStatus':u'狀態',
    'monitorStatusDisabled':u'已停用',
    'monitorStatusNoService':u'沒有服務',
    'monitorStatusOffline':u'離線',
    'monitorStatusOnline':u'上線',
    'monitorStatusUpdating':u'更新中',
    'monitorTitle':u'DWAgent - 監控器',
    'monitorUninstall':u'解除安裝',
    'monitorUninstallNotRun':u'您無法不具管理員許可就進行解除安裝。\n配合 sudo 或以 root 身分運行命令 dwaguninstall。',
    'monitorUpload':u'上傳',
    'mustAccept':u'為了要繼續進行，您必須選取選項 {0}',
    'mustSelectOptions':u'您必須選取選項。',
    'next':u'下一步',
    'no':u'否',
    'noTryAgain':u'否，再試一次',
    'notInstalled':u'DWAgent 未安裝。',
    'ok':u'確定',
    'option':u'選項',
    'optionNotValid':u'所選項目無效。',
    'or':u'或',
    'password':u'密碼',
    'path':u'路徑',
    'pathCreating':u'建立資料夾…',
    'pathNotCreate':u'無法建立資料夾。無效的路徑或未獲許可。',
    'pressEnter':u'按下輸入以繼續。',
    'privacyPolicy':u'隱私政策',
    'proxyAuthPassword':u'密碼',
    'proxyAuthUser':u'使用者',
    'proxyHost':u'主機',
    'proxyHttp':u'HTTP',
    'proxyInfo':u'加入代理伺服器資訊。',
    'proxyNone':u'無',
    'proxyPort':u'通訊埠',
    'proxySocks4':u'SOCKS4',
    'proxySocks4a':u'SOCKS4a',
    'proxySocks5':u'SOCKS5',
    'proxySystem':u'系統',
    'reEnterCode':u'重新輸入安裝碼',
    'reEnterData':u'重新輸入資料',
    'rePassword':u'重打密碼',
    'reject':u'拒絕',
    'removeFile':u'移除檔案…',
    'runWithoutInstallation':u'運行',
    'runWithoutInstallationClosing':u'關閉作業階段…',
    'runWithoutInstallationConnecting':u'開啟作業階段…',
    'runWithoutInstallationEnd':u'作業階段結束。',
    'runWithoutInstallationOnlineBottom':u'警告：\n不要透露這個資訊給您不信賴的人，它將允許他們存取這個裝置。如果您不確定在做什麼，請關閉這個應用程式。',
    'runWithoutInstallationOnlineBottomPutCode':u'警告：\n代理器現在已準備好接受連線。如果您不確定在做什麼，請關閉這個應用程式。',
    'runWithoutInstallationOnlinePassword':u'密碼：{0}',
    'runWithoutInstallationOnlineTop':u'作業階段正在運作。\n要連線這個代理器請前往 https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'作業階段正在運作。',
    'runWithoutInstallationOnlineUser':u'使用者：{0}',
    'runWithoutInstallationStarting':u'啟動代理器…',
    'runWithoutInstallationUnexpectedError':u'非預期錯誤。\nDWAgent 無法啟動。如果問題持續，請下載最近的 DWAgent 釋出版本，刪除資料夾「{0}」並再次運行 DWAgent。',
    'runWithoutInstallationUpdating':u'更新代理器…',
    'runWithoutInstallationWait':u'等待新的連線 (嘗試 {0})…',
    'selectPathInstall':u'選取安裝路徑：',
    'skipCertValidation':u'警告：無法驗證安全憑證，若是您繼續連線可能會不安全。\n請檢查網路或本地的路由器╱防火牆╱防毒組態。\n還要繼續嗎？',
    'startService':u'啟動服務…',
    'startServiceErr':u'啟動服務時失敗。',
    'termsAndConditions':u'條款與細則',
    'titleInstall':u'DWAgent - 安裝',
    'titleUninstall':u'DWAgent - 解除安裝',
    'toBack':u'將要返回。',
    'toExit':u'將要退出。',
    'unattendedAccess':u'無人值守的\n存取',
    'unexpectedError':u'非預期錯誤。\n{0}',
    'uninstallMonitor':u'解除安裝監控器…',
    'uninstallService':u'解除安裝服務…',
    'uninstallShortcuts':u'解除安裝快捷鍵…',
    'unknownUser':u'不明使用者',
    'user':u'使用者',
    'validInteger':u'欄位「{0}」必須是整數。',
    'versionInstallNotValid':u'這個版本的安裝程式不適用於您的作業系統。\n請下載正確版本。{0}',
    'waiting':u'等待…',
    'warningLoginLogout':u'為了讓變更生效，使用者必須登出再登入。',
    'warningRemovePath':u'警告：目的資料夾已經存在，並且將被刪除。',
    'warningSpyingTool':u'請注意您如果沒有得到其使用者的允許，將無法存取遠端電腦。利用 DWService 做為間諜工具，可能違反您所在國家的法律。',
    'welcomeLicense':u'授權\n這個軟體是自由軟體與開放原始碼。\n它由一個基於 MPLv2 授權的主要成分所組成，加上多個由不同授權所規範的額外成分。想要獲得更多資訊，請造訪：https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'繼續安裝或執行這個軟體表示您同意 #TERMSANDCONDITIONS 與 #PRIVACYPOLICY',
    'welcomeSecurity':u'安全\n為了保護您的隱私，我們不會在我們的伺服器上儲存來自代理器的資訊。通訊是介於使用者之間，我們的伺服器與代理器之間有加密，因而第三方無法存取它們。',
    'welcomeSoftwareUpdates':u'軟體更新\n這個軟體會自動更新',
    'windowsAdminPrivileges':u'您必須有管理者權力才能安裝 DWAgent。\n請按一下右鍵以執行檔案，並按一下「以管理者身分運行」來啟始安裝程式。',
    'yes':u'是'
}
                                                                                                                                                                                                                                                                             ui/messages/sk.py                                                                                   0000644 0001750 0001750 00000030424 14443646227 013576  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Súhlasím',
    'accessConfirm':u'Žiada o prístup k zariadeniu',
    'agentName':u'Názov agenta',
    'alreadyInstalled':u'DWAgent je už nainštalovaný.\n\nAplikácia agenta sa automaticky aktualizuje na najnovšiu verziu. To znamená, že nemusíte manuálne inštalovať novšiu verziu.',
    'back':u'Späť',
    'cancel':u'Zrušiť',
    'cancelInstall':u'Zdieľania od užívateľov',
    'cancelUninstall':u'Odinštalácia bola prerušená.',
    'checkInstallCode':u'Kontrolujem inštalačný kód...',
    'chooseProxyType':u'Aký typ proxy chcete použiť?',
    'close':u'Zatvoriť',
    'code':u'Kód',
    'commands':u'Príkazy',
    'configureAgent':u'Nakonfiguruj agenta',
    'configureAgentDisabled':u'Agent vypnutý.',
    'configureAgentEnabled':u'Agent zapnutý.',
    'configureChangeInstallKey':u'Zmena inštalačného kódu',
    'configureChooseMonitorTrayIconVisibility':u'Chcete zobrazovať ikonku monitora v panely?',
    'configureChooseOperation':u'Vyberte prosím operáciu',
    'configureDesktopNotification':u'Upozornenie na pracovnej ploche',
    'configureDesktopNotificationOK':u'Upozornenie na pracovnej ploche bolo úspešne nastavené.',
    'configureDisableAgent':u'Vypnúť agenta',
    'configureDisableAgentQuestion':u'Želáte si vypnúť agenta?',
    'configureEnableAgent':u'Zapnúť agenta',
    'configureEnableAgentQuestion':u'Želáte si zapnúť agenta?',
    'configureEnd':u'Konfigurácia bola ukončená.',
    'configureErrorConnection':u'Problém pripojenia. Skontrolujte, či je DWAgent služba spustená.',
    'configureExit':u'Koniec',
    'configureInsertPassword':u'Vložte heslo konfigurácie:',
    'configureInstallAgent':u'Ako uprednostňujete konfiguráciu agenta?',
    'configureInstallCode':u'Vložte inštalačný kód',
    'configureInstallNewAgent':u'Vytvoriť nového agenta',
    'configureInstallPassword':u'Inštalačné heslo',
    'configureInstallUser':u'Užívateľ',
    'configureInvalidPassword':u'Nesprávne heslo.',
    'configureKeyInstalled':u'Kľúč bol úspešne nainštalovaný.',
    'configureLater':u'Konfigurovať neskôr',
    'configureMonitor':u'Konfigurácia monitoru',
    'configurePassword':u'Konfigurácia hesla',
    'configurePasswordErrNoMatch':u'Heslo sa nezhoduje.',
    'configurePasswordUpdated':u'Heslo bolo aktualizované.',
    'configureProxy':u'Konfigurácia proxy',
    'configureProxyEnd':u'Konfigurácia Proxy bola úspešná.',
    'configureRemovePassword':u'Odstrániť heslo',
    'configureRemovePasswordQuestion':u'Chcete odstrániť heslo?',
    'configureSetPassword':u'Nastaviť heslo',
    'configureTitle':u'DWAgent - Konfigurácia',
    'configureTrayIconOK':u'Zobrazenie ikony na paneli, konfigurácia úspešná.',
    'configureTrayIconVisibility':u'Zobrazenie ikony na paneli.',
    'configureUninstallKeyQuestion':u'Odinštalovať aktuálny inštalačný kód?',
    'configureUninstallationKey':u'Odinštalovanie',
    'confirmExit':u'Ste si istý, že chcete skončiť?',
    'confirmInstall':u'Chcete nainštalovať DWAgent na \'{0}\'?',
    'confirmUninstall':u'Chcete odstrániť DWAgenta?',
    'copyFiles':u'Kopírovanie súborov...',
    'createNewAgent':u'Vytváranie agenta',
    'decline':u'Nesúhlasím',
    'desktopNotificationAutoHide':u'Skryť automaticky',
    'desktopNotificationNone':u'Žiadna',
    'desktopNotificationVisible':u'Viditeľná',
    'downloadFile':u'Sťahovanie súboru {0}...',
    'endInstall':u'Inštalácia je kompletná',
    'endInstallConfigLater':u'Inštalácia je kompletná.\nAgent  nie je nakonfigurovaný. Konfiguráciu môžete urobiť neskôr.',
    'endUninstall':u'Odinštalovanie bolo ukončené.',
    'enter':u'vložiť',
    'enterInstallCode':u'Vložte inštalačný kód',
    'enterInstallNewAgent':u'Vložte údaje na vytvorenie nového agenta.',
    'enterRunCode':u'Zadajte kód pripojenia',
    'error':u'Chyba',
    'errorAgentAlreadyExsists':u'Agent {0} už existuje.',
    'errorAgentMax':u'Maximálny počet agentov je prekročený.',
    'errorAgentNameNotValid':u'Názov agenta nie je platný. Nemôžete použiť znaky / \ | # @:.',
    'errorConnectionConfig':u'Chyba spojenia. Skontrolujte, či je služba DWAgent spustená.',
    'errorConnectionQuestion':u'Chyba spojenia. Skontrolujte pripojenie k internetu alebo konfiguráciu brány firewall.\nChcete konfigurovať proxy?',
    'errorInvalidCode':u'Chybný vložený kód.',
    'errorInvalidUserPassword':u'Nesprávný užívateľ alebo heslo',
    'fieldRequired':u'Pole \'{0}\' je potrebné.',
    'install':u'Inštalácia',
    'installMonitor':u'Inštaluje sa monitor',
    'installMonitorErr':u'Inštalácia monitoru bola neuúspešná.',
    'installService':u'Inštalácia služby',
    'installServiceErr':u'Inštalácia služby bola neúspešná.',
    'installShortcuts':u'Inštalácia odkazu ...',
    'installShortcutsErr':u'Inštalácia odkazu bola neúspešná',
    'installerNotSupported':u'Tento inštalačný súbor už nie je podporovaný. Prosím stiahnite si najnovšiu verziu.',
    'ipAddress':u'IP adresa: {0}',
    'linuxRootPrivileges':u'Na inštaláciu DWAgent musíte mať oprávnenia správcu (root.)\nSpustite skript pomocou používateľa správcu (root.)',
    'menuConfigure':u'Konfigurácia',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Odinštalácia',
    'missingInfoFile':u'Súbor info.json sa nenašiel.',
    'missingNative':u'Native sa nenašiel',
    'missingRuntime':u'Runtime sa nenašiel.',
    'monitorActive':u'aktívny',
    'monitorAgentDisabled':u'Agent vypnutý.',
    'monitorAgentEnabled':u'Agent zapnutý.',
    'monitorConfigure':u'Konfigurovať',
    'monitorConnections':u'Pripojenia',
    'monitorCurrentActivities':u'Práve prebiehajúce aktivity',
    'monitorDisable':u'Zakázať',
    'monitorDisableAgentQuestion':u'Chcete zakázať službu agenta ?',
    'monitorDownload':u'Stiahnuť',
    'monitorEnable':u'Povoliť',
    'monitorEnableAgentQuestion':u'Chcete povoliť službu agenta ?',
    'monitorEnterPassword':u'Vložte heslo:',
    'monitorErrorConnectionConfig':u'Chyba spojenia. Skontrolujte, či je služba DWAgent spustená.',
    'monitorHide':u'Skryť',
    'monitorInvalidPassword':u'Chybné heslo.',
    'monitorNoActivities':u'Žiadne aktivity',
    'monitorScreenCapture':u'Prístup k obrazovke',
    'monitorSession':u'Relácia',
    'monitorShellSession':u'Prístup k Shell',
    'monitorShow':u'Ukáž',
    'monitorStatus':u'Stav',
    'monitorStatusDisabled':u'Vypnuté',
    'monitorStatusNoService':u'Žiadna služba',
    'monitorStatusOffline':u'Offline',
    'monitorStatusOnline':u'Online',
    'monitorStatusUpdating':u'Aktualizácia',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Odinštalovanie',
    'monitorUninstallNotRun':u'Nie je možné odinštalovať bez oprávnení používateľa root.\nSpustite príkaz dwaguninstall v prostredí shell.',
    'monitorUpload':u'Nahrať',
    'mustAccept':u'Ak chcete pokračovať, musíte vybrať možnosť {0}',
    'mustSelectOptions':u'Musíte vybrať jednu z možností.',
    'next':u'Nasledujúci',
    'no':u'Nie',
    'noTryAgain':u'Nie, skúste znova',
    'notInstalled':u'DWAgent nie je inštalovaný.',
    'ok':u'Dobre',
    'option':u'Voľba',
    'optionNotValid':u'Chybný výber voľby.',
    'or':u'alebo',
    'password':u'Heslo',
    'path':u'Cesta',
    'pathCreating':u'Vytváranie priečinka',
    'pathNotCreate':u'Priečinok sa nepodarilo vytvoriť. Neplatná cesta alebo nedostatočné oprávnenie.',
    'pressEnter':u'Pokračujte stlačením Enter.',
    'privacyPolicy':u'Zásady ochrany osobných údajov',
    'proxyAuthPassword':u'Heslo',
    'proxyAuthUser':u'Užívateľ',
    'proxyHost':u'Počítač',
    'proxyHttp':u'Http',
    'proxyInfo':u'Vložte informáciu o proxy.',
    'proxyNone':u'žiadny',
    'proxyPort':u'Port',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Systém',
    'reEnterCode':u'Zopakujte kód',
    'reEnterData':u'Zopakujte dáta',
    'rePassword':u'Zopakujte heslo',
    'reject':u'Odmietnuť',
    'removeFile':u'Odstrániť súbor...',
    'runWithoutInstallation':u'Spustiť',
    'runWithoutInstallationClosing':u'Relácia sa uzatvára...',
    'runWithoutInstallationConnecting':u'Relácia sa otvára...',
    'runWithoutInstallationEnd':u'Relácia je ukončená.',
    'runWithoutInstallationOnlineBottom':u'UPOZORNENIE:\nNezverejňujte tieto informácie nedôveryhodným osobám, inak im umožňujete prístup k tomuto agentovi. Takže ak si nie ste istí, čo robíte, zavrite túto aplikáciu.',
    'runWithoutInstallationOnlineBottomPutCode':u'UPOZORNENIE:\nAgent je teraz pripravený prijímať pripojenia. V prípade že si nie ste istý čo robíte, prosím zatvorte túto aplikáciu.',
    'runWithoutInstallationOnlinePassword':u'Heslo: {0}',
    'runWithoutInstallationOnlineTop':u'Relácia je aktívna.\nPre spojenie s týmto agentom navštívte https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Relácia je aktívna.',
    'runWithoutInstallationOnlineUser':u'Užívateľ: {0}',
    'runWithoutInstallationStarting':u'Agent sa spúšťa...',
    'runWithoutInstallationUnexpectedError':u'Neočakávaná chyba.\nnebolo možné spustiť DWAgent. Ak problém naďalej pretrváva, skúste prevziať najnovšie vydanie DWAgent, odstránte priečinok \'{0}\' a znova spustite DWAgent.',
    'runWithoutInstallationUpdating':u'Agent sa aktualizuje...',
    'runWithoutInstallationWait':u'Čakajte na nové prebiehajúce pripojenie (pokus {0}) ...',
    'selectPathInstall':u'Vyberte inštalačnú cestu:',
    'skipCertValidation':u'Upozornenie: Bezpečnostný certifikát nie je možné overiť, ak budete pokračovať, pripojenie nemusí byť bezpečné.\nSkontrolujte nastavenie smerovača/brány firewall/antivírusu v sieti alebo v počítači.\nChcete napriek tomu pokračovať?',
    'startService':u'Spúšťam službu...',
    'startServiceErr':u'Spustenie služby sa nepodarilo.',
    'termsAndConditions':u'Podmienky',
    'titleInstall':u'DWAgent - Inštalácia',
    'titleUninstall':u'DWAgent - Odinštalácia',
    'toBack':u'návrat.',
    'toExit':u'ukončiť.',
    'unattendedAccess':u'Bezobslužný\nprístup',
    'unexpectedError':u'Neočakávaná chyba.\n{0}',
    'uninstallMonitor':u'Odinštalovanie monitora ...',
    'uninstallService':u'Odinštalovanie služby...',
    'uninstallShortcuts':u'Odinštalovanie zástupcu ...',
    'unknownUser':u'Neznámy používateľ',
    'user':u'Užívateľ',
    'validInteger':u'Pole \'{0}\' musí byť celé číslo.',
    'versionInstallNotValid':u'Verzia inštalačného programu nie je správna pre váš operačný systém.\nStiahnite si správnu verziu. {0}',
    'waiting':u'Čakajte...',
    'warningLoginLogout':u'Pre aplikovanie tejto zmeny je potrebné odhlásenie a opätovné prihlásenie.',
    'warningRemovePath':u'Upozornenie, cieľová zložka už existuje, potom sa odstráni.',
    'warningSpyingTool':u'Prosím berte na vedomie že nesmiete pristupovat na vzdialený počítač bez súhlasu jeho používateľa. V prípade využívania služby DWService ako nástroja na sledovanie môžete porušovať zákony Vašej krajiny.',
    'welcomeLicense':u'Licencia\nTento softvér je bezplatný a open source.\nSkladá sa z jednej hlavnej zložky a niekoľkých príslušných komponentov definovaných ako "aplikácie" ("app"), ktoré by mohli byť riadené rôznymi licenciami. Ďalšie informácie nájdete na stránke https://www.dwservice.net/sk/licenses-sources.html',
    'welcomePrivacyTerms':u'S pokračovaním inštalácie alebo používaním toho softvéru súhlasíte s #TERMSANDCONDITIONS a s #PRIVACYPOLICY',
    'welcomeSecurity':u'Zabezpečenie\nAby sme chránili vaše súkromie, zaručujeme, že na našich serveroch nebudú uložené žiadne informácie a komunikácia je šifrovaná, takže tretie strany ich nemôžu čítať.',
    'welcomeSoftwareUpdates':u'Aktualizácie softvéru\nAktualizácie tohto softvéru sú automatické.',
    'windowsAdminPrivileges':u'Na inštaláciu DWAgent musíte mať oprávnenia správcu.\nSpustite spustiteľný súbor "Spustiť ako správca".',
    'yes':u'Áno'
}
                                                                                                                                                                                                                                            ui/messages/hu.py                                                                                   0000644 0001750 0001750 00000032416 14443646231 013573  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Elfogadom',
    'accessConfirm':u'Szeretne hozzáférni a készülékéhez.',
    'agentName':u'Ügynök neve',
    'alreadyInstalled':u'A DWÜgynök már telepítve van.\n\nAz ügynök automatikusan frissül a legutóbbi verzióra. Ez azt jelenti, hogy nem kell manuálisan telepítenie az újabb frissítéseket.',
    'back':u'Vissza',
    'cancel':u'Mégse',
    'cancelInstall':u'A telepítés megszakadt.',
    'cancelUninstall':u'Az eltávolítás megszakadt.',
    'checkInstallCode':u'A telepítési kód ellenőrzése...',
    'chooseProxyType':u'Milyen proxy típust szeretne használni?',
    'close':u'Bezárás',
    'code':u'Kód',
    'commands':u'Parancsok',
    'configureAgent':u'Ügynök konfigurálása',
    'configureAgentDisabled':u'Ügynök letiltva.',
    'configureAgentEnabled':u'Ügynök engedélyezve.',
    'configureChangeInstallKey':u'Telepítési kód módosítása',
    'configureChooseMonitorTrayIconVisibility':u'Szeretné, hogy a figyelő ikonja megjelenjen a tálcán?',
    'configureChooseOperation':u'Kérjük, válasszon egy műveletet:',
    'configureDesktopNotification':u'Asztali értesítés',
    'configureDesktopNotificationOK':u'Az asztali értesítés sikeresen konfigurálva.',
    'configureDisableAgent':u'Ügynök letiltása',
    'configureDisableAgentQuestion':u'Szeretné letiltani az ügynököt?',
    'configureEnableAgent':u'Ügynök engedélyezése',
    'configureEnableAgentQuestion':u'Szeretné engedélyezni az ügynököt?',
    'configureEnd':u'A konfigurálás befejeződött.',
    'configureErrorConnection':u'Csatlakozási hiba. Kérjük, ellenőrizze, hogy fut-e a DWAgent szolgáltatás.',
    'configureExit':u'Kilépés',
    'configureInsertPassword':u'Kérjük, adja meg a konfigurációs jelszót:',
    'configureInstallAgent':u'Hogyan szeretné konfigurálni az ügynököt?',
    'configureInstallCode':u'Adja meg a telepítési kódot',
    'configureInstallNewAgent':u'Új ügynök létrehozása',
    'configureInstallPassword':u'Telepítési jelszó',
    'configureInstallUser':u'Felhasználó',
    'configureInvalidPassword':u'Érvénytelen jelszó.',
    'configureKeyInstalled':u'Kulcs sikeresen telepítve.',
    'configureLater':u'Konfigurálás később',
    'configureMonitor':u'Figyelő konfigurálása',
    'configurePassword':u'Jelszó konfigurálása',
    'configurePasswordErrNoMatch':u'A jelszavak nem egyeznek.',
    'configurePasswordUpdated':u'Jelszó frissítve.',
    'configureProxy':u'Proxy konfigurálása',
    'configureProxyEnd':u'A proxy konfigurálása sikeresen megtörtént.',
    'configureRemovePassword':u'Jelszó eltávolítása',
    'configureRemovePasswordQuestion':u'El szeretné távolítani a jelszót?',
    'configureSetPassword':u'Jelszó beállítása',
    'configureTitle':u'DWÜgynök - Konfigurálás',
    'configureTrayIconOK':u'Tálca ikon konfigurálása sikeresen megtörtént.',
    'configureTrayIconVisibility':u'Tálca ikon láthatósága',
    'configureUninstallKeyQuestion':u'Eltávolítja a jelenlegi telepítési kódot?',
    'configureUninstallationKey':u'Eltávolítás...',
    'confirmExit':u'Biztosan ki szeretne lépni?',
    'confirmInstall':u'Szeretné telepíteni a DWÜgynököt a következő helyre: \'{0}\'?',
    'confirmUninstall':u'El szeretné távolítani a DWÜgynök programot?',
    'copyFiles':u'Fájlok másolása...',
    'createNewAgent':u'Az ügynök létrehozása folyamatban...',
    'decline':u'Nem fogadom el',
    'desktopNotificationAutoHide':u'Automatikus elrejtés',
    'desktopNotificationNone':u'Nincs',
    'desktopNotificationVisible':u'Látható',
    'downloadFile':u'{0} fájl letöltése...',
    'endInstall':u'A telepítés befejeződött.',
    'endInstallConfigLater':u'A telepítés befejeződött.\nAz ügynök nem lett konfigurálva. A konfigurációt később is létrehozhatja.',
    'endUninstall':u'Az eltávolítás befejeződött.',
    'enter':u'enter',
    'enterInstallCode':u'Adja meg a telepítési kódot',
    'enterInstallNewAgent':u'Adja meg az adatokat egy új ügynök létrehozásához:',
    'enterRunCode':u'Írja be a csatlakozási kódot',
    'error':u'Hiba',
    'errorAgentAlreadyExsists':u'Az ügynök már létezik: \'{0}\'.',
    'errorAgentMax':u'Túllépte az ügynökök maximális számát.',
    'errorAgentNameNotValid':u'Az ügynök neve érvénytelen. Nem használhatja a következő karaktereket: / \ | # @ : .',
    'errorConnectionConfig':u'Csatlakozási hiba. Kérjük, ellenőrizze, hogy fut-e a DWAgent szolgáltatás.',
    'errorConnectionQuestion':u'Csatlakozási hiba. Kérjük, ellenőrizze internetkapcsolatát vagy tűzfalát.\nSzeretne proxy-t beállítani?',
    'errorInvalidCode':u'A megadott kód érvénytelen.',
    'errorInvalidUserPassword':u'Érvénytelen felhasználónév vagy jelszó.',
    'fieldRequired':u'A \'{0}\' mező kitöltése kötelező.',
    'install':u'Telepítés',
    'installMonitor':u'Figyelő telepítése...',
    'installMonitorErr':u'Figyelő telepítése sikertelen.',
    'installService':u'Szolgáltatás telepítése...',
    'installServiceErr':u'Szolgáltatás telepítése sikertelen.',
    'installShortcuts':u'Parancsikonok telepítése...',
    'installShortcutsErr':u'A parancsikon telepítése sikertelen.',
    'installerNotSupported':u'Ez a telepítő már nem támogatott. Kérjük, töltse le a legújabb verziót.',
    'ipAddress':u'IP-cím: {0}',
    'linuxRootPrivileges':u'A DWÜgynök telepítéséhez root jogosultságokkal kell rendelkeznie.\nKérjük, futtassa a szkriptet sudo-val vagy root-ként.',
    'menuConfigure':u'Konfigurálás',
    'menuMonitor':u'Figyelő',
    'menuUninstall':u'Eltávolítás',
    'missingInfoFile':u'Az info.json fájl nem található.',
    'missingNative':u'Natív nem található.',
    'missingRuntime':u'A futtatókörnyezet nem taláható.',
    'monitorActive':u'aktív',
    'monitorAgentDisabled':u'Ügynök letiltva.',
    'monitorAgentEnabled':u'Ügynök engedélyezve.',
    'monitorConfigure':u'Konfigurálás',
    'monitorConnections':u'Kapcsolatok',
    'monitorCurrentActivities':u'Jelenlegi tevékenységek',
    'monitorDisable':u'Letiltás',
    'monitorDisableAgentQuestion':u'Szeretné letiltani az ügynököt?',
    'monitorDownload':u'Letöltés',
    'monitorEnable':u'Engedélyezés',
    'monitorEnableAgentQuestion':u'Szeretné engedélyezni az ügynököt?',
    'monitorEnterPassword':u'Adja meg a jelszót:',
    'monitorErrorConnectionConfig':u'Csatlakozási hiba. Kérjük, ellenőrizze, hogy fut-e a DWAgent szolgáltatás.',
    'monitorHide':u'Elrejtés',
    'monitorInvalidPassword':u'Érvénytelen jelszó.',
    'monitorNoActivities':u'Nincs tevékenység',
    'monitorScreenCapture':u'Képernyő-hozzáférés',
    'monitorSession':u'Munkamenet',
    'monitorShellSession':u'Shell hozzáférés',
    'monitorShow':u'Megjelenítés',
    'monitorStatus':u'Állapot',
    'monitorStatusDisabled':u'Letiltva',
    'monitorStatusNoService':u'Nincs szolgáltatás',
    'monitorStatusOffline':u'Offline',
    'monitorStatusOnline':u'Online',
    'monitorStatusUpdating':u'Frissítés',
    'monitorTitle':u'DWÜgynök - Figyelő',
    'monitorUninstall':u'Eltávolítás',
    'monitorUninstallNotRun':u'Root jogosultságok nélkül nem lehet eltávolítani.\nFuttassa a dwaguninstall parancsot sudo-val vagy root-ként.',
    'monitorUpload':u'Feltöltés',
    'mustAccept':u'A folytatáshoz ki kell választania a(z) {0} lehetőséget',
    'mustSelectOptions':u'Ki kell választania egy lehetőséget.',
    'next':u'Tovább',
    'no':u'Nem',
    'noTryAgain':u'Nem, próbálja újra',
    'notInstalled':u'A DWÜgynök nincs telepítve.',
    'ok':u'OK',
    'option':u'Beállítás',
    'optionNotValid':u'A kiválasztott lehetőség érvénytelen.',
    'or':u'vagy',
    'password':u'Jelszó',
    'path':u'Elérési útvonal',
    'pathCreating':u'Mappa létrehozása...',
    'pathNotCreate':u'Nem sikerült létrehozni a mappát. Érvénytelen elérési útvonal vagy az engedély megtagadva.',
    'pressEnter':u'A folytatáshoz nyomja meg az Enter billentyűt.',
    'privacyPolicy':u'Adatvédelmi szabályzat',
    'proxyAuthPassword':u'Jelszó',
    'proxyAuthUser':u'Felhasználó',
    'proxyHost':u'Cím',
    'proxyHttp':u'HTTP',
    'proxyInfo':u'Proxy-információ beillesztése.',
    'proxyNone':u'Nincs',
    'proxyPort':u'Port',
    'proxySocks4':u'SOCKS4',
    'proxySocks4a':u'SOCKS4a',
    'proxySocks5':u'SOCKS5',
    'proxySystem':u'Rendszer',
    'reEnterCode':u'Adja meg újra a kódot',
    'reEnterData':u'Adja meg újra az adatot',
    'rePassword':u'Jelszó ismételt megadása',
    'reject':u'Elutasítom',
    'removeFile':u'Fájl eltávolítása...',
    'runWithoutInstallation':u'Futtatás',
    'runWithoutInstallationClosing':u'Munkamenet bezárása...',
    'runWithoutInstallationConnecting':u'Munkamenet megnyitása...',
    'runWithoutInstallationEnd':u'A munkamenet véget ért.',
    'runWithoutInstallationOnlineBottom':u'FIGYELMEZTETÉS:\nNe adja ki ezeket az információkat olyan embereknek, akikben nem bízik. Ez lehetővé teszi számukra, hogy hozzáférjenek ehhez az eszközhöz. Ha nem biztos benne, hogy mit csinál, kérjük, zárja be ezt az alkalmazást.',
    'runWithoutInstallationOnlineBottomPutCode':u'FIGYELMEZTETÉS:\nAz ügynök készen áll a csatlakozás elfogadására. Ha nem biztos benne, hogy mit csinál, kérjük, zárja be ezt az alkalmazást.',
    'runWithoutInstallationOnlinePassword':u'Jelszó: {0}',
    'runWithoutInstallationOnlineTop':u'A munkamenet aktív.\nAz ügynökhöz való csatlakozáshoz lépjen a https://www.dwservice.net webhelyre.',
    'runWithoutInstallationOnlineTopPutCode':u'A munkamenet aktív.',
    'runWithoutInstallationOnlineUser':u'Felhasználó: {0}',
    'runWithoutInstallationStarting':u'Ügynök indítása...',
    'runWithoutInstallationUnexpectedError':u'Váratlan hiba.\nA DWÜgynök nem tudott elindulni. Ha a probléma továbbra is fennáll, kérjük, töltse le a DWÜgynök legújabb verzióját, törölje a \'{0}\' mappát, és futtassa újra a DWÜgynököt.',
    'runWithoutInstallationUpdating':u'Ügynök frissítése...',
    'runWithoutInstallationWait':u'Várjon a folyamatban lévő új kapcsolatra (kísérlet {0})...',
    'selectPathInstall':u'Válassza ki a telepítési útvonalat:',
    'skipCertValidation':u'Figyelmeztetés: A biztonsági tanúsítványt nem lehet érvényesíteni. Ha folytatja, a kapcsolat lehet, hogy nem biztonságos.\nKérjük, ellenőrizze a hálózati vagy helyi router/tűzfal/vírusírtó konfigurációját.\nMindenképpen folytatja?',
    'startService':u'Szolgáltatás indítása...',
    'startServiceErr':u'Nem sikerült elindítani a szolgáltatást.',
    'termsAndConditions':u'Felhasználási feltételek',
    'titleInstall':u'DWÜgynök - Telepítés',
    'titleUninstall':u'DWÜgynök - Eltávolítás',
    'toBack':u'visszalépni.',
    'toExit':u'kilépni.',
    'unattendedAccess':u'Felügyelet nélküli\nhozzáférés',
    'unexpectedError':u'Váratlan hiba.\n{0}',
    'uninstallMonitor':u'Figyelő eltávolítása...',
    'uninstallService':u'Szolgáltatás eltávolítása...',
    'uninstallShortcuts':u'Parancsikonok eltávolítása...',
    'unknownUser':u'Ismeretlen felhasználó',
    'user':u'Felhasználó',
    'validInteger':u'A \'{0}\' mezőnek egész számnak kell lennie.',
    'versionInstallNotValid':u'A telepítőnek ez a verziója nem megfelelő az Ön operációs rendszeréhez.\nKérjük, töltse le a megfelelő verziót. {0}',
    'waiting':u'Várakozás...',
    'warningLoginLogout':u'A módosítás érvénybe lépéséhez a felhasználónak ki kell jelentkeznie, majd újra be kell jelentkeznie.',
    'warningRemovePath':u'Figyelem: a célmappa már létezik, és törlésre kerül.',
    'warningSpyingTool':u'Felhívjuk figyelmét, hogy a távoli számítógéphez nem férhet hozzá a felhasználó beleegyezése nélkül. A DWService kémkedési eszközként való használatával megsértheti a lakóhelye szerinti ország törvényeit.',
    'welcomeLicense':u'Licenc\nEz a szoftver ingyenes és nyílt forráskódú.\nEgy fő komponensből áll, amelyet az MPLv2 licenc alatt adtak ki, és több további komponensből, amelyek különböző licencek alá tartoznak. További információért látogasson el a következő weboldalra: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'A telepítés folytatásával vagy a szoftver futtatásával Ön elfogadja a következőket: #TERMSANDCONDITIONS és #PRIVACYPOLICY',
    'welcomeSecurity':u'Biztonság\nAz Ön adatainak védelme érdekében az ügynöktől származó információkat nem tároljuk a szervereinken. A felhasználók, szervereink és az ügynökök közötti kommunikáció titkosított, így harmadik felek nem férhetnek hozzá.',
    'welcomeSoftwareUpdates':u'Szoftverfrissítések\nEz a szoftver automatikusan frissül',
    'windowsAdminPrivileges':u'A DWÜgynök telepítéséhez rendszergazdai jogosultságokkal kell rendelkeznie.\nKérjük, a telepítő indításához kattintson a jobb gombbal a végrehajtható fájlra, és kattintson a "Futtatás rendszergazdaként" parancsra.',
    'yes':u'Igen'
}
                                                                                                                                                                                                                                                  ui/messages/es.py                                                                                   0000644 0001750 0001750 00000030710 14443646211 013557  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Aceptar',
    'accessConfirm':u'Me gustaría acceder a su dispositivo.',
    'agentName':u'Nombre del agente',
    'alreadyInstalled':u'DWAgente ya instalado.\n\nEl agente se actualiza automáticamente a la última versión. Esto significa que no es necesario instalar manualmente las actualizaciones más recientes.',
    'back':u'Volver',
    'cancel':u'Cancelar',
    'cancelInstall':u'La instalación ha sido cancelada.',
    'cancelUninstall':u'La desinstalación ha sido cancelada.',
    'checkInstallCode':u'Verificando código de instalación...',
    'chooseProxyType':u'¿Qué tipo de proxy desea usar?',
    'close':u'Cerrar',
    'code':u'Código',
    'commands':u'Comandos',
    'configureAgent':u'Configurar agente',
    'configureAgentDisabled':u'Agente deshabilitado.',
    'configureAgentEnabled':u'Agente habilitado.',
    'configureChangeInstallKey':u'Cambiar el código de instalación',
    'configureChooseMonitorTrayIconVisibility':u'¿Mostrar icono de la aplicación en la bandeja de iconos?',
    'configureChooseOperation':u'Por favor, elija una operación:',
    'configureDesktopNotification':u'Notificación de escritorio',
    'configureDesktopNotificationOK':u'Notificación de escritorio configurada correctamente.',
    'configureDisableAgent':u'Deshabilitar agente',
    'configureDisableAgentQuestion':u'¿Desea deshabilitar el agente?',
    'configureEnableAgent':u'Habilitar el agente',
    'configureEnableAgentQuestion':u'¿Desea activar el agente?',
    'configureEnd':u'La configuración ha sido completada',
    'configureErrorConnection':u'Error de conexión. Compruebe que el servicio DWAgent esté iniciado.',
    'configureExit':u'Salir',
    'configureInsertPassword':u'Por favor introduzca la contraseña:',
    'configureInstallAgent':u'¿Cómo prefiere configurar el agente?',
    'configureInstallCode':u'Ingrese el código de instalación',
    'configureInstallNewAgent':u'Crear un nuevo agente',
    'configureInstallPassword':u'Contraseña de instalación',
    'configureInstallUser':u'Usuario',
    'configureInvalidPassword':u'Contraseña inválida.',
    'configureKeyInstalled':u'Clave instalada correctamente.',
    'configureLater':u'Configurar después',
    'configureMonitor':u'Configurar monitor',
    'configurePassword':u'Configurar contraseña',
    'configurePasswordErrNoMatch':u'Las contraseñas no coinciden.',
    'configurePasswordUpdated':u'Contraseña actualizada.',
    'configureProxy':u'Configurar proxy',
    'configureProxyEnd':u'Proxy configurado correctamente.',
    'configureRemovePassword':u'Eliminar contraseña',
    'configureRemovePasswordQuestion':u'¿Desea eliminar la contraseña?',
    'configureSetPassword':u'Establecer contraseña',
    'configureTitle':u'Configuración DWAgent',
    'configureTrayIconOK':u'Visibilidad del icono en la bandeja configurada correctamente.',
    'configureTrayIconVisibility':u'Visibilidad del icono en la bandeja de sistema',
    'configureUninstallKeyQuestion':u'¿Desinstalar el código de instalación actual?',
    'configureUninstallationKey':u'Desintalación...',
    'confirmExit':u'¿Seguro que desea salir?',
    'confirmInstall':u'¿Desea instalar DWAgent en \'{0}\'?',
    'confirmUninstall':u'¿Desea eliminar DWAgent?',
    'copyFiles':u'Copiando archivos...',
    'createNewAgent':u'Creación del agente en progreso...',
    'decline':u'No acepto',
    'desktopNotificationAutoHide':u'Ocultar automáticamente',
    'desktopNotificationNone':u'Ninguna/o',
    'desktopNotificationVisible':u'Visible',
    'downloadFile':u'Descargando archivo {0}...',
    'endInstall':u'La instalación ha sido completada.',
    'endInstallConfigLater':u'La instalación se ha completado.\nEl agente no ha sido configurado. Puede proceder con la configuración después.',
    'endUninstall':u'Las desinstalación ha sido completada.',
    'enter':u'ingresar',
    'enterInstallCode':u'Ingresar el código de instalación',
    'enterInstallNewAgent':u'Ingresar datos para crear un nuevo agente:',
    'enterRunCode':u'Introduce el código de conexión',
    'error':u'Error',
    'errorAgentAlreadyExsists':u'El agente {0} ya existe.',
    'errorAgentMax':u'Se ha sobrepasado el número máximo de agentes.',
    'errorAgentNameNotValid':u'El nombre de agente es inválido. No puede usar los caracteres / \ | # @ : .',
    'errorConnectionConfig':u'Error en la conexión. Comprueba que el servicio DWAgent esté iniciado.',
    'errorConnectionQuestion':u'Error de conexión. Compruebe su conexión a internet o la configuración de su cortafuegos.\n¿Desea configurar un proxy?',
    'errorInvalidCode':u'El código introducido es inválido.',
    'errorInvalidUserPassword':u'Usuario inválido o contraseña incorrecta',
    'fieldRequired':u'Se requiere el campo \'{0}\'',
    'install':u'Instalar',
    'installMonitor':u'Instalando monitor...',
    'installMonitorErr':u'Falló la instalación del monitor',
    'installService':u'Instalando servicio...',
    'installServiceErr':u'Falló la instalación del servicio...',
    'installShortcuts':u'Creando accesos directos...',
    'installShortcutsErr':u'Falló la instalación de los accesos directos.',
    'installerNotSupported':u'Este instalador ya no es compatible. Descargue la última versión.',
    'ipAddress':u'Dirección IP: {0}',
    'linuxRootPrivileges':u'Debe tener privilegios de administrador para instalar DWAgent.\nPor favor inicie el script usando un usuario administrador.',
    'menuConfigure':u'Configurar',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Desinstalar',
    'missingInfoFile':u'No se encuentra el archivo info.json.',
    'missingNative':u'Nativo no encontrado.',
    'missingRuntime':u'Tiempo de ejecución no encontrado.',
    'monitorActive':u'activa/o',
    'monitorAgentDisabled':u'Agente deshabilitado.',
    'monitorAgentEnabled':u'Agente habilitado.',
    'monitorConfigure':u'Configurar',
    'monitorConnections':u'Conexiones',
    'monitorCurrentActivities':u'Actividades actuales',
    'monitorDisable':u'Deshabilitar',
    'monitorDisableAgentQuestion':u'¿Deshabilitar el agente?',
    'monitorDownload':u'Descargar',
    'monitorEnable':u'Habilitar',
    'monitorEnableAgentQuestion':u'¿Habilitar el agente?',
    'monitorEnterPassword':u'Ingresar contraseña:',
    'monitorErrorConnectionConfig':u'Error en la conexión. Por favor compruebe que el servicio DWAgent esté iniciado.',
    'monitorHide':u'Ocultar',
    'monitorInvalidPassword':u'Contraseña inválida.',
    'monitorNoActivities':u'Sin actividades',
    'monitorScreenCapture':u'Acceso a la pantalla',
    'monitorSession':u'Sesión',
    'monitorShellSession':u'Acceso a Shell',
    'monitorShow':u'Mostrar',
    'monitorStatus':u'Estado',
    'monitorStatusDisabled':u'Deshabilitado',
    'monitorStatusNoService':u'Sin servicio',
    'monitorStatusOffline':u'Fuera de línea',
    'monitorStatusOnline':u'En línea',
    'monitorStatusUpdating':u'Actualizando',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Desinstalar',
    'monitorUninstallNotRun':u'No se puede desinstalar sin permisos de administrador.\nEjecute el comando dwaguninstall desde la línea de comandos.',
    'monitorUpload':u'Subir',
    'mustAccept':u'Para continuar, debe seleccionar la opción {0}',
    'mustSelectOptions':u'Debe seleccionar una opción.',
    'next':u'Siguiente',
    'no':u'No',
    'noTryAgain':u'No, intentar de nuevo',
    'notInstalled':u'No se ha instalado DWAgent.',
    'ok':u'Ok',
    'option':u'Opción',
    'optionNotValid':u'La opción seleccionada es inválida.',
    'or':u'o',
    'password':u'Contraseña',
    'path':u'Ruta',
    'pathCreating':u'Crear carpeta...',
    'pathNotCreate':u'No se pudo crear la carpeta. Ruta incorrecta o permiso denegado.',
    'pressEnter':u'Presione Enter para continuar.',
    'privacyPolicy':u'Política de privacidad',
    'proxyAuthPassword':u'Contraseña',
    'proxyAuthUser':u'Usuario',
    'proxyHost':u'Host',
    'proxyHttp':u'Http',
    'proxyInfo':u'Ingrese información del proxy.',
    'proxyNone':u'Ninguno',
    'proxyPort':u'Puerto',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Sistema',
    'reEnterCode':u'Reingrese el código',
    'reEnterData':u'Reingrese los datos',
    'rePassword':u'Reescriba la contraseña',
    'reject':u'Rechazar',
    'removeFile':u'Borrando archivo...',
    'runWithoutInstallation':u'Ejecutar',
    'runWithoutInstallationClosing':u'Cerrando sesión...',
    'runWithoutInstallationConnecting':u'Abriendo sesión...',
    'runWithoutInstallationEnd':u'Sesión finalizada.',
    'runWithoutInstallationOnlineBottom':u'ADVERTENCIA:\nNo revelar esta información a personas que no son de confianza, de otro modo, les permitirá acceder a este agente. Por lo tanto, si no está seguro de lo que está haciendo, cierre esta aplicación.',
    'runWithoutInstallationOnlineBottomPutCode':u'ADVERTENCIA:\nAhora el agente está listo para aceptar la conexión. Si no está seguro de lo que está haciendo, cierre esta aplicación.',
    'runWithoutInstallationOnlinePassword':u'Password: {0}',
    'runWithoutInstallationOnlineTop':u'La sesión está activa.\nPara conectarse a este agente, vaya a https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'La sesión está activa',
    'runWithoutInstallationOnlineUser':u'User: {0}',
    'runWithoutInstallationStarting':u'Iniciando agente...',
    'runWithoutInstallationUnexpectedError':u'Error inesperado.\nNo se pudo iniciar DWAgent. Si el problema persiste, intenta descargar la ultima versión de DWAgent, elimine la carpeta \'{0}\' y ejecute DWAgent de nuevo.',
    'runWithoutInstallationUpdating':u'Actualizar Agente...',
    'runWithoutInstallationWait':u'Esperando por una nueva conexión en progreso (intento {0})...',
    'selectPathInstall':u'Seleccione la ruta de instalación:',
    'skipCertValidation':u'Advertencia: el certificado de seguridad no se puede validar, si continúa, es posible que la conexión no sea segura.\nVerifique la configuración del enrutador/cortafuegos/antivirus de la red o local.\n¿Acceder de todas maneras?',
    'startService':u'Iniciando servicio...',
    'startServiceErr':u'Falló iniciar el servicio.',
    'termsAndConditions':u'Términos y condiciones',
    'titleInstall':u'Instalación de DWAgent',
    'titleUninstall':u'Desinstalación de DWAgent',
    'toBack':u'volver.',
    'toExit':u'salir.',
    'unattendedAccess':u'Acceso\ndesantendido',
    'unexpectedError':u'Error inesperado.\n{0}',
    'uninstallMonitor':u'Desinstalando monitor...',
    'uninstallService':u'Desinstalando servicio...',
    'uninstallShortcuts':u'Eliminando accesos directos',
    'unknownUser':u'Usuario desconocido',
    'user':u'Usuario',
    'validInteger':u'El campo \'{0}\' debe ser un entero.',
    'versionInstallNotValid':u'La versión del instalador no corresponde con su sistema operativo.\nDescargue la versión correcta. {0}',
    'waiting':u'Esperando...',
    'warningLoginLogout':u'Para que este cambio surta efecto, el usuario debe cerrar la sesión y volver a iniciar sesión.',
    'warningRemovePath':u'Advertencia: la carpeta de destino ya existe y será eliminada.',
    'warningSpyingTool':u'Tenga en cuenta que no puede acceder a una computadora remota sin el consentimiento de su usuario. Al utilizar DWService como herramienta de espionaje, puede estar infringiendo las leyes de su país de residencia.',
    'welcomeLicense':u'Licencia\nEste software es gratuito y de código abierto.\nestá constituido de un componente principal y varios componentes accesorios llamados "app" que podrían regirse por diferentes licencias. Para obtener más información, visite: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Al continuar con la instalación o ejecutar este software, usted acepta los #TERMSANDCONDITIONS y la #PRIVACYPOLICY',
    'welcomeSecurity':u'Seguridad\nPara proteger su privacidad garantizamos que no se almacenará información en nuestros servidores y las comunicaciones se cifrarán para que terceros no puedan leerlas de ningún modo.',
    'welcomeSoftwareUpdates':u'Actualizaciones\nLas actualizaciones de este software son automáticas.',
    'windowsAdminPrivileges':u'Desbe tener privilegios de administrador para instalar DWAgent.\nPor favor inicie el instalador con \'Ejecutar como Administrador\'.',
    'yes':u'Si'
}
                                                        ui/messages/lt.py                                                                                   0000644 0001750 0001750 00000027072 14036550607 013577  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Aš sutinku',
    'agentName':u'Agento pavadinimas',
    'alreadyInstalled':u'DWAgent jau instaliuotas. \n\nAgentas automatiškai atsinaujina. Jums nereikia atnaujinti patiems.',
    'back':u'Atgal',
    'cancel':u'Atšaukti',
    'cancelInstall':u'Diegimas nutrauktas',
    'cancelUninstall':u'Diegimas nutrauktas',
    'checkInstallCode':u'Diegimo kodo tikrinimas',
    'chooseProxyType':u'Kokį tarpinį serverį norite naudoti ?',
    'close':u'Uždaryti',
    'code':u'Kodas',
    'commands':u'Komandos',
    'configureAgent':u'Konfigūruoti agentą',
    'configureAgentDisabled':u'Agentas išjungtas',
    'configureAgentEnabled':u'Agentas įjungtas',
    'configureChangeInstallKey':u'Pakeisti diegimo kodą',
    'configureChooseMonitorTrayIconVisibility':u'Ar norite rodyti piktogramą užduočių juostoje?',
    'configureChooseOperation':u'Pasirinkite operaciją:',
    'configureDesktopNotification':u'Pranešimas darbalaukyje',
    'configureDesktopNotificationOK':u'Darbalaukio pranešimas sėkmingai sukonfigūruotas.',
    'configureDisableAgent':u'Išjungti agentą',
    'configureDisableAgentQuestion':u'Ar norite išjungti agentą ?',
    'configureEnableAgent':u'Įjungti agentą',
    'configureEnableAgentQuestion':u'Ar norite įjungti agentą ?',
    'configureEnd':u'Konfigūravimas baigtas',
    'configureErrorConnection':u'Prijungimo klaida. Patikrinkite ar DWAgent servisas yra įjungtas.',
    'configureExit':u'Išeiti',
    'configureInsertPassword':u'Įrašykite konfigūravimo slaptažodį',
    'configureInstallAgent':u'Kaip Jūs norite konfigūruoti agentą ?',
    'configureInstallCode':u'Įveskite diegimo kodą',
    'configureInstallNewAgent':u'Sukurti naują agentą',
    'configureInvalidPassword':u'Neteisingas slaptažodis',
    'configureKeyInstalled':u'Raktas įdiegtas sėkmingai',
    'configureLater':u'Konfigūruoti vėliau',
    'configureMonitor':u'Konfigūruoti monitorių',
    'configurePassword':u'Konfigūruoti slaptažodį',
    'configurePasswordErrNoMatch':u'Slaptažodis neatitinka',
    'configurePasswordUpdated':u'Slaptažodis atjaujintas',
    'configureProxy':u'Konfigūruoti tarpinį serverį',
    'configureProxyEnd':u'Tarpinis serveris sėkmingai sukonfigūruotas',
    'configureRemovePassword':u'Pašalinti slaptažodį',
    'configureRemovePasswordQuestion':u'Ar norite pašalinti slaptažodį?',
    'configureSetPassword':u'Nustatyti slaptažodį',
    'configureTitle':u'DWAgent konfigūracija',
    'configureTrayIconOK':u'Piktogramos matomumas sėkmingai sukonfigūruotas.',
    'configureTrayIconVisibility':u'Piktogramos matomumas',
    'configureUninstallKeyQuestion':u'Pašalinti dabartinį diegimo kodą?',
    'configureUninstallationKey':u'Pašalinama...',
    'confirmExit':u'Ar tikrai kad norite išeiti?',
    'confirmInstall':u'Ar norite įdiegti DWAgent į „{0}“?',
    'confirmUninstall':u'Ar norite pašalinti DWAgent?',
    'copyFiles':u'Failai kopijuojami...',
    'createNewAgent':u'Kuriamas agentas...',
    'decline':u'Nesutinku',
    'desktopNotificationAutoHide':u'Automatiškai slėpti',
    'desktopNotificationNone':u'Nė vienas',
    'desktopNotificationVisible':u'Matomas',
    'downloadFile':u'Atsisiunčiamas failas{0}...',
    'dwsPassword':u'DWS slaptažodis',
    'dwsUser':u'DWS vartotojas',
    'endInstall':u'Diegimas baigtas.',
    'endInstallConfigLater':u'Diegimas baigtas.\nAgentas nebuvo sukonfigūruotas. Vėliau galėsite tęsti konfigūraciją.',
    'endUninstall':u'Pašalinimas baigtas.',
    'enter':u'įeiti',
    'enterInstallCode':u'Įveskite diegimo kodą',
    'enterInstallNewAgent':u'Įveskite duomenis, kad sukurtumėte naują agentą:',
    'enterRunCode':u'Įveskite ryšio kodą',
    'error':u'Klaida',
    'errorAgentAlreadyExsists':u'Agentas {0} jau egzistuoja.',
    'errorAgentMax':u'Viršytas maksimalus agentų skaičius.',
    'errorAgentNameNotValid':u'Agento vardas negalioja. Negalite naudoti ženklų / \ | # @:.',
    'errorConnectionConfig':u'Ryšio klaida. Patikrinkite, ar DWAgent servisas paleistas.',
    'errorConnectionQuestion':u'Ryšio klaida. Patikrinkite savo interneto ryšį arba ugniasienės konfigūraciją.\nAr norite sukonfigūruoti tarpinį serverį?',
    'errorInvalidCode':u'Įvestas kodas neteisingas.',
    'errorInvalidUserPassword':u'Netinkamas vartotojas arba slaptažodis.',
    'fieldRequired':u'Laukas „{0}“ yra būtinas.',
    'install':u'Laukia instaliacijos',
    'installMonitor':u'Diegiamas monitorius...',
    'installMonitorErr':u'Nepavyko įdiegti monitoriaus.',
    'installService':u'Diegiamas servisas...',
    'installServiceErr':u'Nepavyko įdiegti serviso.',
    'installShortcuts':u'Diegiamos nuorodos...',
    'installShortcutsErr':u'Nepavyko įdiegti nuorodų.',
    'linuxRootPrivileges':u'Norėdami įdiegti DWAgent, turite turėti Administratoriaus teises.\nPradėkite scenarijų naudodami administratoriaus teisėmis.',
    'menuConfigure':u'Konfigūruoti',
    'menuMonitor':u'Monitorius',
    'menuUninstall':u'Išinstaliuoti',
    'missingInfoFile':u'Failas info.json nerastas.',
    'missingNative':u'Native nerasta.',
    'missingRuntime':u'Klaidos nerasta.',
    'monitorActive':u'aktyvus',
    'monitorAgentDisabled':u'Agentas išjungtas.',
    'monitorAgentEnabled':u'Agentas įjungtas.',
    'monitorConfigure':u'Konfigūruoti',
    'monitorConnections':u'Ryšiai',
    'monitorCurrentActivities':u'Dabartinė veikla',
    'monitorDisable':u'Išjungti',
    'monitorDisableAgentQuestion':u'Ar norite išjungti agentą?',
    'monitorDownload':u'Atsisiųsti',
    'monitorEnable':u'Įgalinti',
    'monitorEnableAgentQuestion':u'Ar norite įjungti agentą?',
    'monitorEnterPassword':u'Įvesti slaptažodį:',
    'monitorErrorConnectionConfig':u'Ryšio klaida. Patikrinkite, ar DWAgent servisas paleistas.',
    'monitorHide':u'Slėpti',
    'monitorInvalidPassword':u'Netinkamas slaptažodis',
    'monitorNoActivities':u'Nėra jokios veiklos',
    'monitorScreenCapture':u'Ekrano prieiga',
    'monitorSession':u'Sesija',
    'monitorShellSession':u'Shell prieiga',
    'monitorShow':u'Rodyti',
    'monitorStatus':u'Statusas',
    'monitorStatusDisabled':u'Išungta',
    'monitorStatusNoService':u'Nėra ryšio su servisu',
    'monitorStatusOffline':u'Atsijungęs',
    'monitorStatusOnline':u'Prisijungęs',
    'monitorStatusUpdating':u'Atnaujinama',
    'monitorTitle':u'DWAgent - Monitorius',
    'monitorUninstall':u'Pašalinti',
    'monitorUninstallNotRun':u'Neįmanoma pašalinti be administratoriaus teisių.\nVykdykite komandą dwaguninstall administratoriaus teisėmis.',
    'monitorUpload':u'Įkelti',
    'mustAccept':u'Norėdami tęsti, turite pasirinkti {0}',
    'mustSelectOptions':u'Turite pasirinkti parinktį.',
    'next':u'Kitas',
    'no':u'Ne',
    'noTryAgain':u'Bandykite dar kartą',
    'notInstalled':u'„DWAgent“ neįdiegta.',
    'ok':u'Gerai',
    'option':u'Parinktis',
    'optionNotValid':u'Pasirinkta parinktis netinkama.',
    'or':u'arba',
    'password':u'Slaptažodis',
    'path':u'kelias',
    'pathCreating':u'Aplanko kūrimas...',
    'pathNotCreate':u'Nepavyko sukurti aplanko. Netinkamas kelias arba leidimas nesuteiktas.',
    'pressEnter':u'Norėdami tęsti, paspauskite „Enter“.',
    'privacyPolicy':u'Privatumo politika',
    'proxyAuthPassword':u'Slaptažodis',
    'proxyAuthUser':u'Naudotojas',
    'proxyHost':u'Host',
    'proxyHttp':u'Http',
    'proxyInfo':u'Įterpkite tarpinio serverio informaciją.',
    'proxyNone':u'Joks',
    'proxyPort':u'Prievadas',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Sistema',
    'reEnterCode':u'Iš naujo įveskite kodą',
    'reEnterData':u'Iš naujo įveskite duomenis',
    'rePassword':u'Pakartokite slaptažodį',
    'removeFile':u'Failas šalinama...',
    'runWithoutInstallation':u'Paleisti',
    'runWithoutInstallationClosing':u'Uždaroma sesija ...',
    'runWithoutInstallationConnecting':u'Atidaroma sesija ...',
    'runWithoutInstallationEnd':u'Sesija baigėsi.',
    'runWithoutInstallationOnlineBottom':u'ĮSPĖJIMAS:\nNeatskleiskite šios informacijos žmonėms, kuriems nepasitikite. Jei ne, leidžia jiems susisiekti su šiuo agentu. Taigi, jei nesate tikri, ką darote, uždarykite šią programą.',
    'runWithoutInstallationOnlineBottomPutCode':u'ĮSPĖJIMAS:\nDabar agentas yra pasirengęs priimti ryšį. Taigi, jei nesate tikri, ką darote, uždarykite šią programą.',
    'runWithoutInstallationOnlinePassword':u'Slaptažodis: {0}',
    'runWithoutInstallationOnlineTop':u'Sesija aktyvi.\nNorėdami prisijungti prie šio agento, eikite į https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Sesija aktyvi.',
    'runWithoutInstallationOnlineUser':u'Vartotojas: {0}',
    'runWithoutInstallationStarting':u'Agentas paleidžiamas ...',
    'runWithoutInstallationUnexpectedError':u'Netikėta klaida.\nNepavyko paleisti DWAgent. Jei problema išlieka, pabandykite atsisiųsti naujausią „DWAgent“ versiją, ištrinkite aplanką „{0}“ ir paleiskite „DWAgent“ dar kartą.',
    'runWithoutInstallationUpdating':u'Agentų atnaujinimas ...',
    'runWithoutInstallationWait':u'Palaukite, kol vyksta naujas susijungimas (bandymas {0}) ...',
    'selectPathInstall':u'Pasirinkite diegimo kelią:',
    'startService':u'Paleidžiamas servisas...',
    'startServiceErr':u'Nepavyko paleisti serviso.',
    'termsAndConditions':u'Terminai ir sąlygos',
    'titleInstall':u'DWAgent - diegimas',
    'titleUninstall':u'DWAgent - pašalinimas',
    'toBack':u'grįžti atgal.',
    'toExit':u'išeiti.',
    'unexpectedError':u'Netikėta klaida.\n{0}',
    'uninstallMonitor':u'Pašalinamas monitorius ...',
    'uninstallService':u'Pašalinama servisas ...',
    'uninstallShortcuts':u'Pašalinamos nuorodos ...',
    'user':u'Vartotojas',
    'validInteger':u'Laukas „{0}“ turi būti sveikasis skaičius.',
    'versionInstallNotValid':u'Diegimo programos versija netinkama jūsų operacinei sistemai.\nAtsisiųskite tinkamą versiją. {0}',
    'waiting':u'Laukiama...',
    'warningLoginLogout':u'Kad šis pakeitimas įsigaliotų, vartotojas turi atsijungti ir prisijungti dar kartą.',
    'warningRemovePath':u'Įspėjimas paskirties aplankas jau yra, tada jis bus ištrintas.',
    'warningSpyingTool':u'Atminkite, kad negalite pasiekti nuotolinio kompiuterio be jo vartotojo sutikimo. Naudodami „DWService“ kaip šnipinėjimo įrankį galite pažeisti savo gyvenamosios šalies įstatymus.',
    'welcomeLicense':u'Licencija\nŠi programinė įranga yra nemokama ir atvira.\nJį sudaro vienas pagrindinis komponentas ir keli pagalbiniai komponentai, apibrėžti „programa“, kurią gali valdyti skirtingos licencijos. Norėdami gauti daugiau informacijos, apsilankykite https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Tęsdami diegimą arba vykdydami šią programinę įrangą sutinkate su #TERMSANDCONDITIONS ir #PRIVACYPOLICY',
    'welcomeSecurity':u'Saugumas\nNorėdami apsaugoti jūsų privatumą, mes garantuojame, kad jokia informacija nebus saugoma mūsų serveriuose, o ryšiai yra šifruojami, kad trečiosios šalys jų niekaip negalėtų skaityti.',
    'welcomeSoftwareUpdates':u'Programinės įrangos atnaujinimai\nŠios programinės įrangos atnaujinimai yra automatiniai.',
    'windowsAdminPrivileges':u'Norėdami įdiegti DWAgent, turite turėti administratoriaus teises.\nPradėkite vykdomąjį failą „vykdyti kaip administratorių“.',
    'yes':u'Taip'
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                      ui/messages/pt.py                                                                                   0000644 0001750 0001750 00000030300 14443646214 013571  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Eu aceito',
    'accessConfirm':u'Deseja aceder ao seu dispositivo.',
    'agentName':u'Nome do agente',
    'alreadyInstalled':u'DWAgent já instalado.\n\nO agente atualiza automaticamente para a última versão. Isso significa que não necessita de instalar manualmente as novas atualizações.',
    'back':u'Voltar',
    'cancel':u'Cancelar',
    'cancelInstall':u'A instalação foi cancelada.',
    'cancelUninstall':u'A desinstalação foi cancelada.',
    'checkInstallCode':u'A verificar o código de instalação...',
    'chooseProxyType':u'Qual o tipo de proxy que deseja usar?',
    'close':u'Fechar',
    'code':u'Código',
    'commands':u'Comandos',
    'configureAgent':u'Configurar agente',
    'configureAgentDisabled':u'Agente desativado.',
    'configureAgentEnabled':u'Agente ativado.',
    'configureChangeInstallKey':u'Alterar código de instalação',
    'configureChooseMonitorTrayIconVisibility':u'Deseja exibir o monitor na barra de notificações?',
    'configureChooseOperation':u'Escolha uma operação:',
    'configureDesktopNotification':u'Notificação na área de trabalho',
    'configureDesktopNotificationOK':u'Notificação na área de trabalho configurada com sucesso.',
    'configureDisableAgent':u'Desativar agente',
    'configureDisableAgentQuestion':u'Deseja desativar o agente?',
    'configureEnableAgent':u'Ativar agente',
    'configureEnableAgentQuestion':u'Deseja ativar o agente?',
    'configureEnd':u'Configuração completada',
    'configureErrorConnection':u'Erro de ligação. Verifique se o serviço DWAgent está iniciado.',
    'configureExit':u'Sair',
    'configureInsertPassword':u'Insira senha de configuração:',
    'configureInstallAgent':u'Configurar o agente?',
    'configureInstallCode':u'Insira o código de instalação',
    'configureInstallNewAgent':u'Criando um novo agente',
    'configureInstallPassword':u'Senha de instalação',
    'configureInstallUser':u'Utilizador',
    'configureInvalidPassword':u'Senha inválida.',
    'configureKeyInstalled':u'Chave instalada com sucesso.',
    'configureLater':u'Configurar mais tarde',
    'configureMonitor':u'Configurar monitor',
    'configurePassword':u'Configurar senha',
    'configurePasswordErrNoMatch':u'Senha não confere.',
    'configurePasswordUpdated':u'Senha atualizada.',
    'configureProxy':u'Configurar proxy',
    'configureProxyEnd':u'Proxy configurado com sucesso.',
    'configureRemovePassword':u'Remover senha',
    'configureRemovePasswordQuestion':u'Deseja remover a senha?',
    'configureSetPassword':u'Definir senha',
    'configureTitle':u'DWAgent - Configuração',
    'configureTrayIconOK':u'Visibilidade do ícone da área de notificação configurado com sucesso.',
    'configureTrayIconVisibility':u'Visibilidade do ícone da área de notificação.',
    'configureUninstallKeyQuestion':u'Desinstalar o código de instalação atual?',
    'configureUninstallationKey':u'Desinstalação...',
    'confirmExit':u'Tem a certeza que deseja sair?',
    'confirmInstall':u'Deseja instalar o DWAgent em \'{0}\'?',
    'confirmUninstall':u'Deseja remover o DWAgent?',
    'copyFiles':u'Copiando ficheiros...',
    'createNewAgent':u'Criação do agente em progresso...',
    'decline':u'Eu não aceito',
    'desktopNotificationAutoHide':u'Ocultar automáticamente',
    'desktopNotificationNone':u'Nenhum',
    'desktopNotificationVisible':u'Visível',
    'downloadFile':u'A efectuar download do ficheiro {0}...',
    'endInstall':u'Instalação concluída com sucesso.',
    'endInstallConfigLater':u'Instalação concluída com sucesso.\nO agente não foi configurado. Poderá configurá-lo depois.',
    'endUninstall':u'Desinstalação concluída com sucesso.',
    'enter':u'entrar',
    'enterInstallCode':u'Inserir o código de instalação',
    'enterInstallNewAgent':u'Insira os dados para criar um novo agente:',
    'enterRunCode':u'Insira o código da ligação',
    'error':u'Erro',
    'errorAgentAlreadyExsists':u'O agente {0} já existe.',
    'errorAgentMax':u'Número máximo de agentes atingido.',
    'errorAgentNameNotValid':u'O nome do agente não é válido. Não pode usar os caracteres / \ | # @ : .',
    'errorConnectionConfig':u'Erro de ligação. Por favor verifique se o serviço DWAgent está iniciado.',
    'errorConnectionQuestion':u'Erro de ligação. Por favor verifique sua ligação à internet ou a configuração da firewall.\nDeseja configurar proxy?',
    'errorInvalidCode':u'O código inserido é inválido.',
    'errorInvalidUserPassword':u'Utilizador ou senha inválidos.',
    'fieldRequired':u'O campo \'{0}\' é obrigatório.',
    'install':u'Instalar',
    'installMonitor':u'A instalar monitor...',
    'installMonitorErr':u'Instalação do monitor falhou.',
    'installService':u'A instalar serviço',
    'installServiceErr':u'Instalação do serviço falhou.',
    'installShortcuts':u'A instalar atalhos',
    'installShortcutsErr':u'Instalação dos atalhos falharam.',
    'installerNotSupported':u'Este instalador já não é compativel.. Faça o download da versão mais recente.',
    'ipAddress':u'Endereço IP: {0}',
    'linuxRootPrivileges':u'Necessita de ter privilégios de root para instalar o DWAgent.\nPor favor inicie o script usando um utilizador root.',
    'menuConfigure':u'Configurar',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Desinstalar',
    'missingInfoFile':u'Ficheiro info.json não encontrado.',
    'missingNative':u'Native não encontrado.',
    'missingRuntime':u'Runtime não encontrado.',
    'monitorActive':u'ativo',
    'monitorAgentDisabled':u'Agente desativado.',
    'monitorAgentEnabled':u'Agente ativado.',
    'monitorConfigure':u'Configurar',
    'monitorConnections':u'Ligações',
    'monitorCurrentActivities':u'Actividades Actuais',
    'monitorDisable':u'Desativar',
    'monitorDisableAgentQuestion':u'Deseja desativar o agente?',
    'monitorDownload':u'Download',
    'monitorEnable':u'Ativar',
    'monitorEnableAgentQuestion':u'Deseja ativar o agente?',
    'monitorEnterPassword':u'Insira a senha:',
    'monitorErrorConnectionConfig':u'Erro de ligação. Por favor verifique se o serviço DWAgent está iniciado.',
    'monitorHide':u'Esconder',
    'monitorInvalidPassword':u'Senha inválida.',
    'monitorNoActivities':u'Sem actividades',
    'monitorScreenCapture':u'Captura de ecrâ',
    'monitorSession':u'Sessão',
    'monitorShellSession':u'Shell',
    'monitorShow':u'Mostrar',
    'monitorStatus':u'Estado',
    'monitorStatusDisabled':u'Desativado',
    'monitorStatusNoService':u'Sem serviço',
    'monitorStatusOffline':u'Offline',
    'monitorStatusOnline':u'Online',
    'monitorStatusUpdating':u'A atualizar',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Desinstalar',
    'monitorUninstallNotRun':u'Não pode desinstalar sem permissões de root.\nExecute o comando dwaguninstall na shell.',
    'monitorUpload':u'Upload',
    'mustAccept':u'Para continuar, deve selecionar a opção {0}',
    'mustSelectOptions':u'Deve selecionar uma opção.',
    'next':u'Seguinte',
    'no':u'Não',
    'noTryAgain':u'Não, tente novamente',
    'notInstalled':u'DWAgent não instalado.',
    'ok':u'Ok',
    'option':u'Opção',
    'optionNotValid':u'Opção selecionada é inválida.',
    'or':u'ou',
    'password':u'Senha',
    'path':u'Caminho',
    'pathCreating':u'Criação de pasta...',
    'pathNotCreate':u'Não foi possível criar a pasta. Caminho inválido ou permissão negada.',
    'pressEnter':u'Pressione enter para continuar.',
    'privacyPolicy':u'Política de Privacidade',
    'proxyAuthPassword':u'Senha',
    'proxyAuthUser':u'Utilizador',
    'proxyHost':u'Host',
    'proxyHttp':u'Http',
    'proxyInfo':u'Insira as informações de proxy.',
    'proxyNone':u'Nenhum',
    'proxyPort':u'Porta',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Sistema',
    'reEnterCode':u'Reinsira o código',
    'reEnterData':u'Reinsira os dados',
    'rePassword':u'Redigite a senha',
    'reject':u'Rejeitar',
    'removeFile':u'Removendo ficheiro...',
    'runWithoutInstallation':u'Executar',
    'runWithoutInstallationClosing':u'Fechando sessão',
    'runWithoutInstallationConnecting':u'Abrindo sessão:',
    'runWithoutInstallationEnd':u'Sessão finalizada.',
    'runWithoutInstallationOnlineBottom':u'ATENÇÃO:\nNão divulgue essas informações a pessoas que não são confiáveis, pois de outra forma irá permitir que elas acedam a este agente. Então, se não tem certeza do que está a fazer, feche esta aplicação.',
    'runWithoutInstallationOnlineBottomPutCode':u'AVISO:\nAgora o agente está pronto para receber a ligação. Se não tem a certeza do que está a fazer, por favor feche esta aplicação.',
    'runWithoutInstallationOnlinePassword':u'Senha: {0}',
    'runWithoutInstallationOnlineTop':u'A sessão está ativa.\nPara se conectar a este agente vá para https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'A sessão está ativa.',
    'runWithoutInstallationOnlineUser':u'Utilizador: {0}',
    'runWithoutInstallationStarting':u'Iniciando agente...',
    'runWithoutInstallationUnexpectedError':u'Erro inesperado.\nNão foi possível iniciar o DWAgent. Se o problema persistir, tente efetuar o download da última versão do DWAgent, apague a pasta \'{0}\' e execute o DWAgent novamente.',
    'runWithoutInstallationUpdating':u'Atualizando agente...',
    'runWithoutInstallationWait':u'Aguarde pela nova ligação em progresso (tentativa {0})...',
    'selectPathInstall':u'Selecione o caminho de instalação:',
    'skipCertValidation':u'Aviso: O certificado de segurança não pode ser validado, se continuar a conexão pode não ser segura.\nVerifique a configuração do router/firewall/antivírus da rede ou local.\nContinuar mesmo assim?',
    'startService':u'Iniciando serviço...',
    'startServiceErr':u'Inicialização do serviço falhou.',
    'termsAndConditions':u'Termos e Condições',
    'titleInstall':u'DWAgent - Instalação',
    'titleUninstall':u'DWAgent - Desinstalação',
    'toBack':u'para voltar.',
    'toExit':u'para sair.',
    'unattendedAccess':u'Acesso\nsem supervisão',
    'unexpectedError':u'Erro inesperado.\n{0}',
    'uninstallMonitor':u'Desinstalando monitor...',
    'uninstallService':u'Desinstalando serviço...',
    'uninstallShortcuts':u'Desinstalando atalhos...',
    'unknownUser':u'Utilizador desconhecido',
    'user':u'Utilizador',
    'validInteger':u'O campo \'{0}\' precisa ser um inteiro.',
    'versionInstallNotValid':u'A versão do instalador não é a correta para o seu sistema operativo.\nPor favor efetue o download da versão correta. {0}',
    'waiting':u'Aguardando...',
    'warningLoginLogout':u'Para que esta alteração tenha efeito, o utilizador deve fazer logout e login novamente.',
    'warningRemovePath':u'Aviso: a pasta de destino já existe então ela será apagada.',
    'warningSpyingTool':u'Esteja ciente de que não pode aceder a um computador remoto sem o consentimento de seu utilizador. Ao usar o DWService como uma ferramenta de espionagem, poderá estar a infringir as leis do seu país.',
    'welcomeLicense':u'Licença\nEste software é gratuito e open source.\nEle consiste de um componente principal e vários componentes acessórios definidos "app" que podem ser regidos por diferentes licenças. Para mais informações visite: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Ao prosseguir com a instalação ou executar este software, estará a concordar com os #TERMSANDCONDITIONS e com a #PRIVACYPOLICY',
    'welcomeSecurity':u'Segurança\nPara proteger sua privacidade nós garantimos que nenhuma informação será armazenada nos nossos servidores e as comunicações são criptografadas para que terceiros não possam acessá-las.',
    'welcomeSoftwareUpdates':u'Atualizações de software\nAs atualizações deste software são automáticas.',
    'windowsAdminPrivileges':u'Deve ter privilégios de administrador para instalar o DWAgent.\nPor favor inicie o executável com \'Executar como administrador\'.',
    'yes':u'Sim'
}
                                                                                                                                                                                                                                                                                                                                ui/messages/sv.py                                                                                   0000644 0001750 0001750 00000027576 14443646234 013625  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Jag accepterar',
    'accessConfirm':u'Vill komma åt din enhet.',
    'agentName':u'Agentnamn',
    'alreadyInstalled':u'DWAgent redan installerat.\n\nAgenten uppdaterar automatiskt till den senaste versionen. Det betyder att du inte behöver installera nyare uppdateringar manuellt.',
    'back':u'Tillbaka',
    'cancel':u'Avbryt',
    'cancelInstall':u'Installationen avbröts.',
    'cancelUninstall':u'Jag accepterar',
    'checkInstallCode':u'Kontrollerar installationskod...',
    'chooseProxyType':u'Vilken proxytyp vill du använda?',
    'close':u'Stäng',
    'code':u'Kod',
    'commands':u'Kommandon',
    'configureAgent':u'Konfigurera agenten',
    'configureAgentDisabled':u'Agenten inaktiverad.',
    'configureAgentEnabled':u'Agenten aktiverad.',
    'configureChangeInstallKey':u'Byt installationskod',
    'configureChooseMonitorTrayIconVisibility':u'Vill du visa monitor i aktivitetsfältet?',
    'configureChooseOperation':u'Välj en operation:',
    'configureDesktopNotification':u'Skrivbordsavisering',
    'configureDesktopNotificationOK':u'Skrivbordsavisering framgångsrikt konfigurerad.',
    'configureDisableAgent':u'Inaktivera agenten',
    'configureDisableAgentQuestion':u'Vill du avaktivera agenten?',
    'configureEnableAgent':u'Aktivera agenten',
    'configureEnableAgentQuestion':u'Vill du aktivera agenten?',
    'configureEnd':u'Konfigurationen har slutförts.',
    'configureErrorConnection':u'Anslutningsfel. Kontrollera om DWAgent-tjänsten är igång.',
    'configureExit':u'Avsluta',
    'configureInsertPassword':u'Ange konfigurationslösenord:',
    'configureInstallAgent':u'Hur föredrar du att konfigurera agenten?',
    'configureInstallCode':u'Lägga in installationskod',
    'configureInstallNewAgent':u'Skapa en ny agent',
    'configureInstallPassword':u'Installationslösenord',
    'configureInstallUser':u'Användare',
    'configureInvalidPassword':u'Felaktigt lösenord.',
    'configureKeyInstalled':u'Nyckeln korrekt installerad.',
    'configureLater':u'Konfigurera senare',
    'configureMonitor':u'Konfigurera monitor',
    'configurePassword':u'Konfigurera lösenord',
    'configurePasswordErrNoMatch':u'Lösenorden är olika.',
    'configurePasswordUpdated':u'Lösenurdet uppdaterat.',
    'configureProxy':u'Konfigurera proxy',
    'configureProxyEnd':u'Proxy konfigurerad.',
    'configureRemovePassword':u'Ta bort lösenord',
    'configureRemovePasswordQuestion':u'Vill du ta bort lösenordet?',
    'configureSetPassword':u'Välj lösenord',
    'configureTitle':u'DWAgent - Konfiguration',
    'configureTrayIconOK':u'Aktivitetsfältsikons synlighet konfigurerad.',
    'configureTrayIconVisibility':u'Aktivitetsfältsikons synlighet',
    'configureUninstallKeyQuestion':u'Avinstallera nuvarande installationskod?',
    'configureUninstallationKey':u'Avinstallerar...',
    'confirmExit':u'Är du säker på att du vill avsluta?',
    'confirmInstall':u'Vill du installera DWAgent på \'{0}\'?',
    'confirmUninstall':u'Vill du ta bort DWAgent?',
    'copyFiles':u'Kopierar filer...',
    'createNewAgent':u'Skapa agent pågår...',
    'decline':u'Jag accepterar inte',
    'desktopNotificationAutoHide':u'Göm automatiskt',
    'desktopNotificationNone':u'Ingen',
    'desktopNotificationVisible':u'Synlig',
    'downloadFile':u'Laddar ned fil {0}...',
    'endInstall':u'Installation har slutförts.',
    'endInstallConfigLater':u'Installation har slutförts.\nAgenten har inte konfigurerats. Du kan fortfarande fortsätta med konfigurationen senare.',
    'endUninstall':u'Avinstallationen är klar.',
    'enter':u'enter',
    'enterInstallCode':u'Skriv in installationskod',
    'enterInstallNewAgent':u'Ange data för att skapa en ny agent:',
    'enterRunCode':u'Ange anslutningskoden',
    'error':u'Fel',
    'errorAgentAlreadyExsists':u'Agenten {0} existerar redan.',
    'errorAgentMax':u'Maximalt antal agenter har överskridits.',
    'errorAgentNameNotValid':u'Agentnamnet är inte giltigt. Du kan inte använda tecknen / \ | # @ : .',
    'errorConnectionConfig':u'Anslutningsfel. Kontrollera om DWAgent-tjänsten är igång.',
    'errorConnectionQuestion':u'Anslutningsfel. Kontrollera din internetanslutning eller brandväggs-konfiguration.\nVill du konfigurera proxy?',
    'errorInvalidCode':u'Inskriven kod är felaktig.',
    'errorInvalidUserPassword':u'Ogiltig användare eller lösenord.',
    'fieldRequired':u'Fältet \'{0}\' är obligatoriskt.',
    'install':u'Installera',
    'installMonitor':u'Installerar monitor...',
    'installMonitorErr':u'Installation av monitor misslyckades.',
    'installService':u'Installerar tjänst...',
    'installServiceErr':u'Installation av tjänsten misslyckades.',
    'installShortcuts':u'Installerar genvägar...',
    'installShortcutsErr':u'Installationen av genvägar misslyckades.',
    'installerNotSupported':u'Det här installationsprogrammet stöds inte längre. Ladda ner den senaste versionen.',
    'ipAddress':u'IP Adress: {0}',
    'linuxRootPrivileges':u'Du måste ha root privilegier för att installera DWAgent.\nStarta skriptet som root-användaren.',
    'menuConfigure':u'Konfigurera',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Avinstallera',
    'missingInfoFile':u'Filen info.json ej hittad.',
    'missingNative':u'Native ej hittad.',
    'missingRuntime':u'Runtime ej hittad.',
    'monitorActive':u'aktiv',
    'monitorAgentDisabled':u'Agenten inaktiverad.',
    'monitorAgentEnabled':u'Agenten aktiverad.',
    'monitorConfigure':u'Konfigurera',
    'monitorConnections':u'Anslutningar',
    'monitorCurrentActivities':u'Aktuella aktiviteter',
    'monitorDisable':u'Inaktivera',
    'monitorDisableAgentQuestion':u'Vill du inaktivera agenten?',
    'monitorDownload':u'Ladda ned',
    'monitorEnable':u'Aktivera',
    'monitorEnableAgentQuestion':u'Vill du aktivera agenten?',
    'monitorEnterPassword':u'Skriv in lösenord:',
    'monitorErrorConnectionConfig':u'Anslutningsfel. Kontrollera om DWAgent-tjänsten är igång.',
    'monitorHide':u'Göm',
    'monitorInvalidPassword':u'Felaktigt lösenord.',
    'monitorNoActivities':u'Inga aktiviteter',
    'monitorScreenCapture':u'Skärminspelning',
    'monitorSession':u'Session',
    'monitorShellSession':u'Skal',
    'monitorShow':u'Visa',
    'monitorStatus':u'Status',
    'monitorStatusDisabled':u'Inaktiverad',
    'monitorStatusNoService':u'Ingen service',
    'monitorStatusOffline':u'Ej tillgänglig',
    'monitorStatusOnline':u'Tillgänglig',
    'monitorStatusUpdating':u'Uppdaterar',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Avinstallera',
    'monitorUninstallNotRun':u'Du kan inte avinstallera utan root-behörigheter.\nKör kommandot dwaguninstall i terminalsessionen.',
    'monitorUpload':u'Ladda upp',
    'mustAccept':u'För att fortsätta måste du välja alternativet {0}',
    'mustSelectOptions':u'Du måste välja ett alternativ.',
    'next':u'Nästa',
    'no':u'Nej',
    'noTryAgain':u'Nej, försök igen.',
    'notInstalled':u'DWAgent ej installerad.',
    'ok':u'Ok',
    'option':u'Alternativ',
    'optionNotValid':u'Det valda alternativet är ogiltigt.',
    'or':u'eller',
    'password':u'Lösenord',
    'path':u'Sökväg',
    'pathCreating':u'Mapp skapande...',
    'pathNotCreate':u'Mappen kunde ej skapas. Ogiltig sökväg eller behörighet nekad.',
    'pressEnter':u'Tryck på enter för att fortsätta.',
    'privacyPolicy':u'Integritetspolicy',
    'proxyAuthPassword':u'Lösenord',
    'proxyAuthUser':u'Användare',
    'proxyHost':u'Värd',
    'proxyHttp':u'Http',
    'proxyInfo':u'Skriv in proxy info.',
    'proxyNone':u'Ingen',
    'proxyPort':u'Port',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'System',
    'reEnterCode':u'Skriv in koden igen',
    'reEnterData':u'Ange data igen',
    'rePassword':u'Skriv lösenord igen',
    'reject':u'Avvisa',
    'removeFile':u'Raderar fil...',
    'runWithoutInstallation':u'Kör',
    'runWithoutInstallationClosing':u'Stanger session...',
    'runWithoutInstallationConnecting':u'Öppnar session...',
    'runWithoutInstallationEnd':u'Session avslutad.',
    'runWithoutInstallationOnlineBottom':u'VARNING:\nOffentliggör inte denna information till personer som inte är betrodda, eftersom de då kan ansluta till den här agenten. Så om du är osäker på vad gör du, vänligen avsluta denna ansökan.',
    'runWithoutInstallationOnlineBottomPutCode':u'VARNING:\nNu är agenten redo att acceptera anslutningar. Så om du är osäker på vad gör du, vänligen stäng denna applikation.',
    'runWithoutInstallationOnlinePassword':u'Lösenord: {0}',
    'runWithoutInstallationOnlineTop':u'Sessionen är aktiv.\nFör att ansluta till den här agenten, gå till https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Sessionen är aktiv.',
    'runWithoutInstallationOnlineUser':u'Användare: {0}',
    'runWithoutInstallationStarting':u'Startar agent...',
    'runWithoutInstallationUnexpectedError':u'Oväntat fel.\nDet var inte möjligt att starta DWAgent. Om problemet kvarstår, försök ladda ner den senaste versionen av DWAgent, ta bort mappen "{0}" och kör DWAgent igen.',
    'runWithoutInstallationUpdating':u'Uppdaterar agent...',
    'runWithoutInstallationWait':u'Vänta på den nya anslutningen (försök {0})...',
    'selectPathInstall':u'Välj sökväg till installationen:',
    'skipCertValidation':u'Varning: Säkerhetscertifikatet kan inte valideras, om du fortsätter kanske anslutningen inte är säker.\nKontrollera nätverkets router/brandvägg/antiviruskonfiguration.\nFortsätt ändå?',
    'startService':u'Startar tjänsten...',
    'startServiceErr':u'Start av tjänsten misslyckades.',
    'termsAndConditions':u'Villkor',
    'titleInstall':u'DWAgent - Installation',
    'titleUninstall':u'DWAgent - Avinstallation',
    'toBack':u'för att gå tillbaka.',
    'toExit':u'för att avsluta.',
    'unattendedAccess':u'Obevakad\nåtkomst',
    'unexpectedError':u'Oväntat fel.\n{0}',
    'uninstallMonitor':u'Avinstallerar monitor...',
    'uninstallService':u'Avinstallerar tjänst...',
    'uninstallShortcuts':u'Avinstallerar genvägar...',
    'unknownUser':u'Okänd användare',
    'user':u'Användare',
    'validInteger':u'Fältet \'{0}\' måste vara ett heltal.',
    'versionInstallNotValid':u'Versionen av installationsprogrammet är inte korrekt för ditt operativsystem.\nVar god ladda ner rätt version. {0}',
    'waiting':u'Väntar...',
    'warningLoginLogout':u'För att denna ändring ska träda i kraft måste användaren logga ut och logga in igen.',
    'warningRemovePath':u'Varning: om destinationsmappen redan finns kommer den att tas bort.',
    'warningSpyingTool':u'Tänk på att du inte får ansluta till en fjärrdator utan fjärrdatorns användares medgivande. Genom att använda DWService som ett spioneringsverktyg kan du bryta mot lagar i ditt hemland.',
    'welcomeLicense':u'Licens\nDenna programvara är fri och öppen källkod.\nDen består av en huvudkomponent och flera tillbehörskomponenter definierade som "app", som kan styras av olika licenser. För mer information besök: https://www.dwservice.net/sv/licenses-sources.html',
    'welcomePrivacyTerms':u'Genom att fortsätta med installationen eller köra denna programvara godkänner du #TERMSANDCONDITIONS och #PRIVACYPOLICY',
    'welcomeSecurity':u'Säkerhet\nFör att skydda din integritet garanterar vi att ingen information lagras på våra servrar, och kommunikationen är krypterad så att tredje part inte kan läsa dem.',
    'welcomeSoftwareUpdates':u'Mjukvaruuppdateringar\nUppdatering av denna programvara sker automatiskt.',
    'windowsAdminPrivileges':u'Du måste ha administratörsbehörigheter för att installera DWAgent.\nStarta programmet med \'Kör som administratör\'.',
    'yes':u'Ja'
}
                                                                                                                                  ui/messages/da.py                                                                                   0000644 0001750 0001750 00000027770 14443646232 013553  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Jeg accepterer',
    'accessConfirm':u'Vil gerne have adgang til din enhed.',
    'agentName':u'Agentnavn',
    'alreadyInstalled':u'DWAgent er allerede installeret.\n\nAgent opdaterer automatisk til den sidste version. Det betyder, at du ikke behøver manuelt at installere nyere opdateringer.',
    'back':u'Tilbage',
    'cancel':u'Annuller',
    'cancelInstall':u'Installationen blev annulleret.',
    'cancelUninstall':u'Afinstallationen blev annulleret.',
    'checkInstallCode':u'Kontrollerer installationskode...',
    'chooseProxyType':u'Hvilken type proxy vil du benytte?',
    'close':u'Luk',
    'code':u'Kode',
    'commands':u'Kommandoer',
    'configureAgent':u'Konfigurer agent',
    'configureAgentDisabled':u'Agent deaktiveret.',
    'configureAgentEnabled':u'Agent aktiveret.',
    'configureChangeInstallKey':u'Ændre installationskode',
    'configureChooseMonitorTrayIconVisibility':u'Vil du have agenten vist som bakkeikon?',
    'configureChooseOperation':u'Vælg venligst en handling:',
    'configureDesktopNotification':u'Skrivebordsnotifikation',
    'configureDesktopNotificationOK':u'Skrivebordsnotifikationer er konfigureret med succes.',
    'configureDisableAgent':u'Deaktiver agent',
    'configureDisableAgentQuestion':u'Er du sikker på at du vil deaktivere agenten?',
    'configureEnableAgent':u'Aktiver agent',
    'configureEnableAgentQuestion':u'Vil du aktivere agenten?',
    'configureEnd':u'Opsætningen er fuldført',
    'configureErrorConnection':u'Forbindelsesfejl. Tjek venligst at DWAgent servicen er startet.',
    'configureExit':u'Afslut',
    'configureInsertPassword':u'Indsæt venligst konfigurationskodeordet:',
    'configureInstallAgent':u'Hvordan foretrækker du at konfigurere agenten?',
    'configureInstallCode':u'Indtastning af installationskoden',
    'configureInstallNewAgent':u'Opretter en ny agent',
    'configureInstallPassword':u'Installationskodeord',
    'configureInstallUser':u'Bruger',
    'configureInvalidPassword':u'Forkert kodeord.',
    'configureKeyInstalled':u'Nøgle installeret med succes.',
    'configureLater':u'Konfigurer senere',
    'configureMonitor':u'Konfigurer monitor',
    'configurePassword':u'Konfigurer kodeord',
    'configurePasswordErrNoMatch':u'Adgangskoderne stemmer ikke overens.',
    'configurePasswordUpdated':u'Kodeord opdateret.',
    'configureProxy':u'Konfigurer proxy',
    'configureProxyEnd':u'Proxy konfigureret med succes.',
    'configureRemovePassword':u'Fjern kodeord',
    'configureRemovePasswordQuestion':u'Vil Du fjerne kodeordet?',
    'configureSetPassword':u'Indstil kodeord',
    'configureTitle':u'DWAgent - Konfiguration',
    'configureTrayIconOK':u'Synlighed af bakkeikon, konfigureret med succes.',
    'configureTrayIconVisibility':u'Synlighed af bakkeikon',
    'configureUninstallKeyQuestion':u'Afinstaller nuværende installations kode?',
    'configureUninstallationKey':u'Afinstallation...',
    'confirmExit':u'Er du sikker på du vil afslutte',
    'confirmInstall':u'Vil du også installere DWAgent I mappen \'{0}\'?',
    'confirmUninstall':u'Vil du afinstallere DWAgent?',
    'copyFiles':u'Kopierer filer...',
    'createNewAgent':u'Agentoprettelse i gang...',
    'decline':u'Jeg accepterer ikke',
    'desktopNotificationAutoHide':u'Skjul automatisk',
    'desktopNotificationNone':u'Ingen',
    'desktopNotificationVisible':u'Synlig',
    'downloadFile':u'Downloader fil {0}...',
    'endInstall':u'Installationen er fuldført.',
    'endInstallConfigLater':u'Installationen er fuldført.\nAgenten er ikke konfigureret. Du kan ændre dette senere.',
    'endUninstall':u'Afinstallation fuldført.',
    'enter':u'indtast',
    'enterInstallCode':u'Indtast installationskode',
    'enterInstallNewAgent':u'Indtast data for at oprette en ny agent:',
    'enterRunCode':u'Indtast forbindelselskoden',
    'error':u'Fejl',
    'errorAgentAlreadyExsists':u'Agent {0} eksisterer allerede.',
    'errorAgentMax':u'Maksimalt antal agenter er overskredet .',
    'errorAgentNameNotValid':u'Agent navnet er ikke gyldigt. Du kan ikke bruge tegnene / \ # @ : .',
    'errorConnectionConfig':u'Forbindelsesfejl. Kontroller, om DWAgent-tjenesten er startet.',
    'errorConnectionQuestion':u'Forbindelsesfejl. Tjek venligst din internetforbindelse eller firewall-konfiguration.\nVil du konfigurere proxy?',
    'errorInvalidCode':u'Koden er ugyldig.',
    'errorInvalidUserPassword':u'Forkert brugernavn eller kodeord.',
    'fieldRequired':u'Feltet \'{0}\' er påkrævet.',
    'install':u'Installer',
    'installMonitor':u'Installation af monitor...',
    'installMonitorErr':u'Installation af monitor mislykkedes.',
    'installService':u'Installation af service...',
    'installServiceErr':u'Installations tjenesten mislykkedes.',
    'installShortcuts':u'Installation af genveje...',
    'installShortcutsErr':u'Installations genveje mislykkedes.',
    'installerNotSupported':u'Installationsprogrammet understøttes ikke længere. Hent venligst den nyeste version.',
    'ipAddress':u'IP-adresse: {0}',
    'linuxRootPrivileges':u'Du skal have root privilegier for at installere DWAgent.\nStart venligst scriptet ved hjælp af root-brugeren.',
    'menuConfigure':u'Konfigurer',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Afinstaller',
    'missingInfoFile':u'Filen info.json ikke fundet.',
    'missingNative':u'Native ikke fundet.',
    'missingRuntime':u'Runtime ikke fundet.',
    'monitorActive':u'aktiv',
    'monitorAgentDisabled':u'Agent deaktiveret.',
    'monitorAgentEnabled':u'Agent aktiveret.',
    'monitorConfigure':u'Konfigurer',
    'monitorConnections':u'Forbindelser',
    'monitorCurrentActivities':u'Nuværende aktiviteter',
    'monitorDisable':u'Deaktiver',
    'monitorDisableAgentQuestion':u'Vil du deaktivere agenten?',
    'monitorDownload':u'Download',
    'monitorEnable':u'Aktiver',
    'monitorEnableAgentQuestion':u'Vil du aktivere agenten?',
    'monitorEnterPassword':u'Indtast Kodeord',
    'monitorErrorConnectionConfig':u'Forbindelsesfejl. Tjek venligst om DWAgent-tjenesten er startet.',
    'monitorHide':u'Skjul',
    'monitorInvalidPassword':u'Forkert Kodeord!',
    'monitorNoActivities':u'Ingen aktiviteter',
    'monitorScreenCapture':u'skærm-dump',
    'monitorSession':u'Session',
    'monitorShellSession':u'Shell',
    'monitorShow':u'Vis',
    'monitorStatus':u'Status',
    'monitorStatusDisabled':u'Deaktiveret',
    'monitorStatusNoService':u'Ingen service',
    'monitorStatusOffline':u'Ikke forbundet',
    'monitorStatusOnline':u'Forbundet',
    'monitorStatusUpdating':u'Opdatere',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Afinstaller',
    'monitorUninstallNotRun':u'Du kan ikke afinstallere uden adminstrator-rettigheder.\nKør kommandoen dwaguninstall i et terminal/kommandovindue.',
    'monitorUpload':u'Upload',
    'mustAccept':u'For at kunne fortsætte, skal du vælge mulighed {0}',
    'mustSelectOptions':u'Du skal vælge en valgmulighed.',
    'next':u'Næste',
    'no':u'Nej',
    'noTryAgain':u'Nej, prøv igen',
    'notInstalled':u'DWAgent er ikke installeret.',
    'ok':u'OK',
    'option':u'Valgmulighed',
    'optionNotValid':u'Den valgte valgmulighed er ikke gyldig.',
    'or':u'eller',
    'password':u'Kodeord',
    'path':u'Sti',
    'pathCreating':u'Folder dannelse...',
    'pathNotCreate':u'Kunne ikke lave folderen. Stien er ugyldig, eller manglende rettigheder.',
    'pressEnter':u'Tryk på retur for at fortsætte.',
    'privacyPolicy':u'Privatlivspolitik',
    'proxyAuthPassword':u'Kodeord',
    'proxyAuthUser':u'Bruger',
    'proxyHost':u'Agent',
    'proxyHttp':u'Http',
    'proxyInfo':u'Indsæt proxy-information.',
    'proxyNone':u'Ingen',
    'proxyPort':u'Port',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'System',
    'reEnterCode':u'Indtast koden igen',
    'reEnterData':u'Indtast data igen',
    'rePassword':u'Indtast kodeordet igen',
    'reject':u'Afvis',
    'removeFile':u'Fjerner filen...',
    'runWithoutInstallation':u'Kør',
    'runWithoutInstallationClosing':u'Lukker session...',
    'runWithoutInstallationConnecting':u'Åbner session...',
    'runWithoutInstallationEnd':u'Sessionen er afsluttet.',
    'runWithoutInstallationOnlineBottom':u'ADVARSEL:\nDu bør ikke dele denne information med andre som der ikke er tillid til, da det vil give dem adgang til denne agent. Så hvis du ikke er sikker på, hvad du gør, bør du lukke denne applikation.',
    'runWithoutInstallationOnlineBottomPutCode':u'ADVARSEL:\nAgenten er nu klar til at modtage en forbindelse. Hvis du ikke er sikker på hvad du gør, bør du lukke denne applikation.',
    'runWithoutInstallationOnlinePassword':u'Kodeord: {0}',
    'runWithoutInstallationOnlineTop':u'Sessionen er aktiv.\nFor at forbinde til denne agent, gå til https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Sessionen er aktiv.',
    'runWithoutInstallationOnlineUser':u'Bruger: {0}',
    'runWithoutInstallationStarting':u'Agenten starter...',
    'runWithoutInstallationUnexpectedError':u'Uventet fejl.\nDet var ikke muligt at starte DWAgent. Hvis problemet fortsætter, så prøv at downloade den seneste udgave af DWAgent, slet folderen \'{0}\' og køre DWAgent igen.',
    'runWithoutInstallationUpdating':u'Agenten opdateres...',
    'runWithoutInstallationWait':u'Vent til den nye forbindelse oprettes (forsøg {0})...',
    'selectPathInstall':u'Vælg stien til installationen:',
    'skipCertValidation':u'Advarsel: Sikkerhedscrtifikatet kunne ikke valideres. Hvis du fortsætter er forbindelsen muligvis ikke sikker.\nKontroller venligst konfigurationen af router/firewall/antivirus på netværket eller lokalt.\nØnsker du at fortsætte?',
    'startService':u'Starter servicen...',
    'startServiceErr':u'Fejl ved start af servicen...',
    'termsAndConditions':u'Vilkår og betingelser',
    'titleInstall':u'DWAgent - Installation',
    'titleUninstall':u'DWAgent - Afinstallation',
    'toBack':u'for at vende tilbage.',
    'toExit':u'for at afslutte.',
    'unattendedAccess':u'Uovervåget\nadgang',
    'unexpectedError':u'Uventet fejl.\n{0}',
    'uninstallMonitor':u'Afinstallerer monitor...',
    'uninstallService':u'Afinstallerer service...',
    'uninstallShortcuts':u'Afinstallerer genveje...',
    'unknownUser':u'Ukendt bruger',
    'user':u'Bruger',
    'validInteger':u'Feltet \'{0}\' skal være et heltal.',
    'versionInstallNotValid':u'Installationsprogrammet er ikke den korrekte version for dit operativsystem.\nDownload venligst den korrekte version. {0}',
    'waiting':u'Venter...',
    'warningLoginLogout':u'Brugeren skal logge ud og ind igen før ændringen træder i kraft.',
    'warningRemovePath':u'Advarsel destinationsfolderen eksisterer allerede, derefter vil den blive slettet.',
    'warningSpyingTool':u'Vær opmærksom på, at du muligvis ikke må tilgå en fjerncomputer uden brugerens tilladelse. Ved at anvende DWService som et spionværktøj kan du være i konflikt med loven i det land du bor i.',
    'welcomeLicense':u'Licens\nDenne software er gratis og Open Source.\nDen består af en hovedkomponent og adskillige tilhørende komponenter, defineret som "apps" som kan være reguleret af forskellige licenser. For flere informationer, besøg https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Ved at fortsætte installationen eller ved at afvikle denne softeware accepterer du #TERMSANDCONDITIONS og #PRIVACYPOLICY',
    'welcomeSecurity':u'Sikkerhed\nFor at beskytte dit privatliv garanterer vi, at ingen information vil blive opbevaret på vores servere, og at kommunikationer er krypterede så trediepart ikke kan aflæse dem.',
    'welcomeSoftwareUpdates':u'Softwareopdateringer\nDenne software bliver automatisk opdateret.',
    'windowsAdminPrivileges':u'Du skal have administatorrettigheder for at installere DWAgent.\nKør venligst programmet igen med "Kør som administrator"',
    'yes':u'Ja'
}
        ui/messages/el.py                                                                                   0000644 0001750 0001750 00000042374 14113374076 013562  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Αποδέχομαι',
    'agentName':u'Όνομα Agent',
    'alreadyInstalled':u'Το DWAgent έχει ήδη εγκατασταθεί.\n\nΟ DWAgent ενημερώνεται αυτόματα στην τελευταία έκδοση. Αυτό σημαίνει ότι δεν χρειάζεται να κάνετε χειροκίνητα ενημερώσεις.',
    'back':u'Πίσω',
    'cancel':u'Άκυρο',
    'cancelInstall':u'Η εγκατάσταση ακυρώθηκε.',
    'cancelUninstall':u'Η απεγκατάσταση ακυρώθηκε.',
    'checkInstallCode':u'Έλεγχος κωδικού εγκατάστασης ...',
    'chooseProxyType':u'Τύπος διαμεσολαβητή (proxy) που θέλετε να χρησιμοποιήσετε;',
    'close':u'Κλείσιμο',
    'code':u'Κωδικός',
    'commands':u'Εντολές',
    'configureAgent':u'Ρύθμιση agent',
    'configureAgentDisabled':u'Ο Agent απενεργοποιήθηκε.',
    'configureAgentEnabled':u'Ο Agent ενεργοποιήθηκε.',
    'configureChangeInstallKey':u'Αλλαγή κωδικού εγκατάστασης',
    'configureChooseMonitorTrayIconVisibility':u'Επιθυμείτε εμφάνιση εικονιδίου ειδοποίησης (tray icon);',
    'configureChooseOperation':u'Παρακαλώ επιλέξτε λειτουργία:',
    'configureDesktopNotification':u'Ειδοποίηση επιφάνειας εργασίας',
    'configureDesktopNotificationOK':u'Η ειδοποίηση επιφάνειας εργασίας διαμορφώθηκε με επιτυχία.',
    'configureDisableAgent':u'Απενεργοποίηση agent',
    'configureDisableAgentQuestion':u'Θέλετε να απενεργοποιήσετε τον agent;',
    'configureEnableAgent':u'Ενεργοποίηση agent',
    'configureEnableAgentQuestion':u'Θέλετε να ενεργοποιηθεί ο agent;',
    'configureEnd':u'Η διαμόρφωση έχει ολοκληρωθεί.',
    'configureErrorConnection':u'Σφάλμα σύνδεσης.  Ελέγξτε αν έχει ξεκινήσει η υπηρεσία DWAgent.',
    'configureExit':u'Έξοδος',
    'configureInsertPassword':u'Παρακαλώ εισάγετε κωδικό ρυθμίσεων:',
    'configureInstallAgent':u'Πώς προτιμάτε να διαμορφώσετε τον agent;',
    'configureInstallCode':u'Εισαγωγή κωδικού εγκατάστασης',
    'configureInstallNewAgent':u'Δημιουργία νέου agent',
    'configureInvalidPassword':u'Λανθασμένος κωδικός.',
    'configureKeyInstalled':u'Το κλειδί εγκαταστάθηκε με επιτυχία.',
    'configureLater':u'Ρύθμιση αργότερα',
    'configureMonitor':u'Ρύθμιση οθόνης',
    'configurePassword':u'Ρύθμιση κωδικού πρόσβασης',
    'configurePasswordErrNoMatch':u'Οι κωδικοί δεν ταιριάζουν.',
    'configurePasswordUpdated':u'Ο κωδικός ενημερώθηκε.',
    'configureProxy':u'Ρύθμιση διαμεσολαβητή (proxy)',
    'configureProxyEnd':u'Επιτυχής ρύθμιση διαμεσολαβητή (proxy)',
    'configureRemovePassword':u'Κατάργηση του κωδικού πρόσβασης',
    'configureRemovePasswordQuestion':u'Θέλετε να καταργήσετε τον κωδικό πρόσβασης;',
    'configureSetPassword':u'Ορισμός κωδικού πρόσβασης',
    'configureTitle':u'DWAgent - Ρυθμίσεις',
    'configureTrayIconOK':u'Η εμφάνιση εικονιδίου ειδοποίησης ρυθμίστηκε με επιτυχία.',
    'configureTrayIconVisibility':u'Εμφάνιση εικονιδίου',
    'configureUninstallKeyQuestion':u'Απεγκατάσταση τρέχοντος κωδικού εγκατάστασης;',
    'configureUninstallationKey':u'Απεγκατάσταση....',
    'confirmExit':u'Είστε σίγουροι ότι θέλετε έξοδο;',
    'confirmInstall':u'Θέλετε να εγκαταστήσετε το DWAgent στο \'{0}\'?',
    'confirmUninstall':u'Θέλετε να αφαιρέσετε τον DWAgent;',
    'copyFiles':u'Αντιγραφή αρχείων...',
    'createNewAgent':u'Δημιουργία agent σε εξέλιξη...',
    'decline':u'Δεν αποδέχομαι',
    'desktopNotificationAutoHide':u'Αυτόματη απόκρυψη',
    'desktopNotificationNone':u'Καθόλου',
    'desktopNotificationVisible':u'Ορατό',
    'downloadFile':u'Λήψη αρχείου {0}...',
    'dwsPassword':u'DWS κωδικός πρόσβασης',
    'dwsUser':u'DWS χρήστης',
    'endInstall':u'Η εγκατάσταση ολοκληρώθηκε.',
    'endInstallConfigLater':u'Η εγκατάσταση ολοκληρώθηκε.\nΔεν έχει ρυθμιστεί ο agent.  Μπορείτε να προχωρήσετε στη ρύθμιση αργότερα.',
    'endUninstall':u'Η κατάργηση της εγκατάστασης ολοκληρώθηκε.',
    'enter':u'είσοδος',
    'enterInstallCode':u'Εισάγετε τον κωδικό εγκατάστασης',
    'enterInstallNewAgent':u'Εισάγετε δεδομένα δημιουργίας νέου agent:',
    'enterRunCode':u'Εισάγετε τον κωδικό σύνδεσης',
    'error':u'Σφάλμα',
    'errorAgentAlreadyExsists':u'O agent {0} υπάρχει ήδη.',
    'errorAgentMax':u'Υπέρβαση του μέγιστου αριθμού των agents.',
    'errorAgentNameNotValid':u'Το όνομα του agent δεν είναι έγκυρο.  Δεν μπορείτε να χρησιμοποιήσετε τους χαρακτήρες / \ |  # @ : .',
    'errorConnectionConfig':u'Σφάλμα σύνδεσης. Παρακαλώ ελέγξτε εάν έχει ξεκινήσει η υπηρεσία DWagent.',
    'errorConnectionQuestion':u'Σφάλμα σύνδεσης. Ελέγξτε τη σύνδεση στο διαδίκτυο ή τη διαμόρφωση του τείχους προστασίας.\nΘέλετε να ρυθμίσετε τον διακομιστή μεσολάβησης (proxy);',
    'errorInvalidCode':u'Ο κωδικός που καταχωρίσατε δεν είναι έγκυρος.',
    'errorInvalidUserPassword':u'Μη έγκυρος χρήστης ή κωδικός πρόσβασης.',
    'fieldRequired':u'Το πεδίο \'{0}\' απαιτείται.',
    'install':u'Εγκατάσταση',
    'installMonitor':u'Εγκατάσταση οθόνης...',
    'installMonitorErr':u'Η εγκατάσταση οθόνης απέτυχε...',
    'installService':u'Εγκατάσταση υπηρεσίας...',
    'installServiceErr':u'Η εγκατάσταση υπηρεσίας απέτυχε.',
    'installShortcuts':u'Εγκατάσταση συντομεύσεων...',
    'installShortcutsErr':u'Η εγκατάσταση συντομεύσεων απέτυχε.',
    'linuxRootPrivileges':u'Πρέπει να έχετε δικαιώματα root για να εγκαταστήσετε το DWAgent.\nΞεκινήστε τη δέσμη ενεργειών (script) χρησιμοποιώντας τον χρήστη root.',
    'menuConfigure':u'Διαμορφώστε',
    'menuMonitor':u'Οθόνη',
    'menuUninstall':u'Απεγκατάσταση',
    'missingInfoFile':u'Το αρχείο info.json δεν βρέθηκε.',
    'missingNative':u'Native not found.',
    'missingRuntime':u'Runtime not found.',
    'monitorActive':u'ενεργό',
    'monitorAgentDisabled':u'Agent απενεργοποιημένος.',
    'monitorAgentEnabled':u'Agent ενεργοποιημένος.',
    'monitorConfigure':u'Διαμόρφωση',
    'monitorConnections':u'Συνδέσεις',
    'monitorCurrentActivities':u'Τρέχουσες δραστηριότητες',
    'monitorDisable':u'Απενεργοποίηση',
    'monitorDisableAgentQuestion':u'Θέλετε να απενεργοποίησετε τον agent;',
    'monitorDownload':u'Λήψη',
    'monitorEnable':u'Ενεργοποίηση',
    'monitorEnableAgentQuestion':u'Θέλετε να ενεργοποίησετε τον agent;',
    'monitorEnterPassword':u'Εισάγετε τον κωδικό πρόσβασης:',
    'monitorErrorConnectionConfig':u'Σφάλμα σύνδεσης. Ελέγξτε αν έχει ξεκινήσει η υπηρεσία DWAgent.',
    'monitorHide':u'Απόκρυψη',
    'monitorInvalidPassword':u'Λανθασμένος κωδικός.',
    'monitorNoActivities':u'Καμία δραστηριότητα',
    'monitorScreenCapture':u'πρόσβαση οθόνης',
    'monitorSession':u'Συνεδρία',
    'monitorShellSession':u'πρόσβαση στο τερματικό',
    'monitorShow':u'Εμφάνιση',
    'monitorStatus':u'Κατάσταση',
    'monitorStatusDisabled':u'Απενεργοποιημένο',
    'monitorStatusNoService':u'Δεν υπάρχει υπηρεσία',
    'monitorStatusOffline':u'Εκτός σύνδεσης',
    'monitorStatusOnline':u'Σε σύνδεση',
    'monitorStatusUpdating':u'Ενημέρωση',
    'monitorTitle':u'DWAgent - Οθόνη',
    'monitorUninstall':u'Απεγκατάσταση',
    'monitorUninstallNotRun':u'Δεν μπορείτε να απεγκαταστήσετε χωρίς δικαιώματα root.\nΕκτελέστε την εντολή dwaguninstall στο κέλυφος (shell).',
    'monitorUpload':u'μεταφόρτωση',
    'mustAccept':u'Για να συνεχίσετε, πρέπει να επιλέξετε την επιλογή {0}',
    'mustSelectOptions':u'Πρέπει να επιλέξετε μια επιλογή.',
    'next':u'Επόμενο',
    'no':u'Όχι',
    'noTryAgain':u'Όχι, προσπαθείστε πάλι',
    'notInstalled':u'Το DWAgent δεν είναι εγκατεστημένο.',
    'ok':u'Εντάξει',
    'option':u'Επιλογή',
    'optionNotValid':u'Η επιλεγμένη επιλογή δεν είναι έγκυρη.',
    'or':u'ή',
    'password':u'Κωδικός πρόσβασης',
    'path':u'Διαδρομή',
    'pathCreating':u'Δημιουργία φακέλου...',
    'pathNotCreate':u'Δεν ήταν δυνατή η δημιουργία του φακέλου. Μη έγκυρη διαδρομή ή δεν έχετε άδεια.',
    'pressEnter':u'Πατήστε το πλήκτρο enter για να συνεχίσετε.',
    'privacyPolicy':u'Πολιτική απορρήτου',
    'proxyAuthPassword':u'Κωδικός πρόσβασης',
    'proxyAuthUser':u'Χρήστης',
    'proxyHost':u'Host',
    'proxyHttp':u'Http',
    'proxyInfo':u'Εισάγετε πληροφορίες διακομιστή μεσολάβησης (proxy).',
    'proxyNone':u'Κανένα',
    'proxyPort':u'Θύρα',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Σύστημα',
    'reEnterCode':u'Εισαγάγετε ξανά τον κωδικό',
    'reEnterData':u'Επανεισάγετε τα δεδομένα',
    'rePassword':u'Εισάγετε ξανά τον κωδικό πρόσβασης',
    'removeFile':u'Κατάργηση αρχείου...',
    'runWithoutInstallation':u'Εκτέλεση',
    'runWithoutInstallationClosing':u'Κλείσιμο συνεδρίας...',
    'runWithoutInstallationConnecting':u'Έναρξη συνεδρίας...',
    'runWithoutInstallationEnd':u'Η συνεδρία τελείωσε.',
    'runWithoutInstallationOnlineBottom':u'ΠΡΟΕΙΔΟΠΟΙΗΣΗ:\nΜην αποκαλύπτετε αυτές τις πληροφορίες σε μη έμπιστα πρόσωπα, ειδάλλως θα τους επιτρέψετε να έχουν πρόσβαση σε αυτόν τον υπολογιστή. Αν δεν είστε σίγουροι τι κάνετε, κλείστε αυτήν την εφαρμογή.',
    'runWithoutInstallationOnlineBottomPutCode':u'ΠΡΟΕΙΔΟΠΟΙΗΣΗ:\nΤώρα ο agent είναι έτοιμος να δεχτεί σύνδεση. Εάν δεν είστε σίγουροι τι κάνετε, παρακαλώ κλείστε αυτήν την εφαρμογή.',
    'runWithoutInstallationOnlinePassword':u'Κωδικός: {0}',
    'runWithoutInstallationOnlineTop':u'Η συνεδρία είναι ενεργή.\nΓια να συνδεθείτε με αυτόν τον υπολογιστή, μεταβείτε στη διεύθυνση https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Η συνεδρία είναι ενεργή.',
    'runWithoutInstallationOnlineUser':u'Χρήστης: {0}',
    'runWithoutInstallationStarting':u'Έναρξη agent...',
    'runWithoutInstallationUnexpectedError':u'Απρόσμενο σφάλμα.\nΔεν ήταν δυνατό να ξεκινήσει το DWAgent. Εάν το πρόβλημα παραμένει, δοκιμάστε να κατεβάσετε την τελευταία έκδοση του DWAgent, να διαγράψετε το φάκελο \'{0}\' και να εκτελέσετε ξανά το DWAgent.',
    'runWithoutInstallationUpdating':u'Ενημέρωση agent...',
    'runWithoutInstallationWait':u'Αναμονή νέας σύνδεσης σε εξέλιξη (απόπειρα {0}) ...',
    'selectPathInstall':u'Επιλέξτε τη διαδρομή εγκατάστασης:',
    'startService':u'Εκκίνηση υπηρεσίας...',
    'startServiceErr':u'Η εκκίνηση της υπηρεσίας απέτυχε.',
    'termsAndConditions':u'Οροι και Προϋποθέσεις',
    'titleInstall':u'DWAgent - Εγκατάσταση',
    'titleUninstall':u'DWAgent - Απεγκατάσταση',
    'toBack':u'για μετάβαση πίσω.',
    'toExit':u'για έξοδο.',
    'unexpectedError':u'Απρόσμενο σφάλμα.\n{0}',
    'uninstallMonitor':u'Απεγκατάσταση οθόνης...',
    'uninstallService':u'Απεγκατάσταση υπηρεσίας...',
    'uninstallShortcuts':u'Απεγκατάσταση συντομεύσεων...',
    'user':u'Χρήστης',
    'validInteger':u'Το πεδίο \'{0}\' πρέπει να είναι ακέραιος αριθμός.',
    'versionInstallNotValid':u'Η έκδοση του προγράμματος εγκατάστασης δεν είναι η σωστή για το λειτουργικό σας σύστημα.\nΠαρακαλώ κάνετε λήψη της σωστής έκδοσης. {0}',
    'waiting':u'Αναμονή...',
    'warningLoginLogout':u'Για να τεθεί σε ισχύ αυτή η αλλαγή, ο χρήστης πρέπει να αποσυνδεθεί και να συνδεθεί ξανά.',
    'warningRemovePath':u'Προειδοποίηση, ο φάκελος προορισμού υπάρχει ήδη οπότε θα διαγραφεί.',
    'warningSpyingTool':u'Λάβετε υπόψη ότι δεν πρέπει να έχετε πρόσβαση σε έναν απομακρυσμένο υπολογιστή χωρίς τη συγκατάθεση του χρήστη του. Χρησιμοποιώντας το DWService ως εργαλείο κατασκοπείας, ενδέχεται να παραβιάζετε νόμους στη χώρα διαμονής σας.',
    'welcomeLicense':u'Αδεια\nΑυτό το λογισμικό είναι δωρεάν λογισμικό ανοιχτού κώδικα (free & open source). \nΑποτελείται από ένα κύριο στοιχείο και διάφορα πρόσθετα που ορίζονται ως "app" και τα οποία ενδέχεται να διέπονται από διαφορετικές άδειες. Για περισσότερες πληροφορίες επισκεφτείτε: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Συνεχίζοντας την εγκατάσταση ή εκτελώντας αυτό το λογισμικό, αποδέχεστε τους #TERMSANDCONDITIONS και τους #PRIVACYPOLICY',
    'welcomeSecurity':u'Ασφάλεια\nΠροκειμένου να προστατεύσουμε το ιδιωτικό σας απόρρητο, εγγυόμαστε ότι δεν θα αποθηκεύονται πληροφορίες στους διακομιστές μας ενώ οι επικοινωνίες είναι κρυπτογραφημένες, έτσι ώστε να μην μπορούν να διαβαστούν με κανένα τρόπο από τρίτους.',
    'welcomeSoftwareUpdates':u'Ενημερώσεις λογισμικού\nΟι ενημερώσεις αυτού του λογισμικού είναι αυτόματες.',
    'windowsAdminPrivileges':u'Πρέπει να έχετε δικαιώματα διαχειριστή για να εγκαταστήσετε το DWAgent.\nΞεκινήστε το εκτελέσιμο με  "εκτέλεση ως διαχειριστής".',
    'yes':u'Ναί'
}
                                                                                                                                                                                                                                                                    ui/messages/hr.py                                                                                   0000644 0001750 0001750 00000023375 13422307023 013561  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'runWithoutInstallationClosing':u'Zatvaranje sesije...',
    'configureInvalidPassword':u'Pogrešna lozinka',
    'configureEnd':u'Konfiguracija je završena.',
    'noTryAgain':u'Ne, pokušajte ponovno.',
    'chooseProxyType':u'Kakav proxy želite koristiti?',
    'monitorTitle':u'DWAgent - Monitor',
    'agentName':u'Ime agenta',
    'installShortcutsErr':u'Instalacija prečaca nije uspjela.',
    'runWithoutInstallationUpdating':u'Nadogradnja Agenta...',
    'proxyHttp':u'Http',
    'proxyPort':u'Port',
    'runWithoutInstallationOnlineTop':u'Sesija je aktivna. \nZa spajanje na ovog agenta posjetite https://www.dwservice.net',
    'cancelUninstall':u'Deinstalacija je bila prekinuta.',
    'back':u'Natrag',
    'toExit':u'za izlaz',
    'pathNotCreate':u'Izrada mape nije uspjela. Pogrešna putanja ili odbijen pristup. Provjerite putanju i dozvole mape.',
    'configureRemovePassword':u'Ukloni lozinku.',
    'welcomeSoftwareUpdates':u'Ažuriranja softvera\nAžuriranja ovog softvera su automatski.',
    'monitorDisableAgentQuestion':u'Želite li onemogućiti agenta?',
    'errorConnectionQuestion':u'Mrežna pogreška- Molimo provjerite vašu internet vezu ili postavke vatrozida.\nŽelite li podesiti proxy?',
    'titleUninstall':u'DWAgent - Deinstalacija',
    'installShortcuts':u'Instaliram prečace...',
    'dwsPassword':u'DWS lozinka',
    'configureExit':u'Izlaz',
    'uninstallService':u'Deinstaliram servis...',
    'monitorStatusOffline':u'Izvan mreže',
    'configureInsertPassword':u'Unesite lozinku konfiguracije:',
    'monitorStatusNoService':u'Nema usluge',
    'configureChangeInstallKey':u'Promjeni kod instalacije.',
    'monitorUninstall':u'Deinstaliraj',
    'reEnterCode':u'Ponovno unesite kod',
    'monitorEnable':u'Omogući',
    'copyFiles':u'Kopiram datoteke...',
    'removeFile':u'Uklanjanje datoteke...',
    'configureEnableAgent':u'Omogući agenta',
    'configureProxyEnd':u'Proxy uspješno podešen.',
    'mustSelectOptions':u'Morate odabrati opciju',
    'unexpectedError':u'Neočekivana pogreška. \n{0}',
    'code':u'Kod',
    'monitorHide':u'Sakrij',
    'proxyAuthPassword':u'Lozinka',
    'errorAgentNameNotValid':u'Ime agenta nije ispravno.  Zabranjeni znakovi su:  / \ | # @ : .',
    'validInteger':u'Polje "{0}" mora biti cijeli broj.',
    'confirmExit':u'Sigurno želite izaći?',
    'configureTrayIconVisibility':u'Vidljivost tray ikone.',
    'monitorConnections':u'Veze',
    'fieldRequired':u'Polje \'{0}\' je obavezno',
    'decline':u'Ne prihvaćam',
    'password':u'Lozinka',
    'installMonitorErr':u'Instalacija monitora nije uspjela.',
    'missingInfoFile':u'Datoteka info.json nije pronađena',
    'alreadyInstalled':u'DWAgent je već instaliran na ovome računalu.\n\nAgent je podešen na automatsku nadogradnju, pa nije potrebna ručna instalacija novih verzija.',
    'configureUninstallationKey':u'Deinstalacija...',
    'configureChooseMonitorTrayIconVisibility':u'Želite li prikaz monitora u tray ikoni?',
    'installMonitor':u'Instaliram monitor...',
    'errorInvalidUserPassword':u'Pogrešno korisničko ime ili lozinka.',
    'rePassword':u'Ponovno upišite lozinku',
    'runWithoutInstallationUnexpectedError':u'Neočekivana greška.\nNije moguće pokrenuti DWAgent--a. Ukoliko se progrem ponovi, pokupajte preuzeti posljednju inačicu DWAgent-a, obrišite mapu \'{0}\' i pokrenite DWAgenta ponovno.',
    'enterInstallNewAgent':u'Unesite podatke za izradu novog agenta',
    'no':u'Ne',
    'selectPathInstall':u'Odaberite instalacijsku putanju:',
    'confirmUninstall':u'Želite li ukloniti DWAgent?',
    'next':u'Dalje',
    'ok':u'Ok',
    'monitorStatusUpdating':u'Nadogradnja',
    'or':u'ili',
    'versionInstallNotValid':u'Verzija instalacijskog programa nije ispravna za vaš operativni sustav.\nPreuzmite ispravnu verziju. {0}',
    'monitorStatus':u'Status',
    'proxySocks4a':u'Socks4a',
    'cancel':u'Prekini',
    'linuxRootPrivileges':u'Morate imati root ovlasti za instalaciju DWAgent-a\nPonovno pokrenite skriptu kao root korisnik,',
    'errorInvalidCode':u'Uneseni kod nije ispravan.',
    'configureInstallNewAgent':u'Izrada novog agenta',
    'error':u'Greška',
    'menuMonitor':u'Monitor',
    'runWithoutInstallation':u'Pokreni',
    'proxySocks4':u'Socks4',
    'proxySocks5':u'Socks5',
    'monitorUninstallNotRun':u'Ne možete deinstalirati bez root ovlasti.\nPokrenite naredbu dwaguninstall u shell-u.',
    'path':u'Putanja',
    'welcomeSecurity':u'Sigurnosti\nDa bismo zaštitili vašu privatnost jamčimo da se na našim poslužiteljima neće pohranjivati ​​nikakvi podaci, a komunikacije su šifrirane kako ih treće strane ne bi mogle čitati.',
    'monitorStatusOnline':u'Na mreži',
    'windowsAdminPrivileges':u'Morate imati administratorske ovlasti za instalaciju DWAgenta.\nPokrenite izvršnu datoteku s opcijom "pokreni kao administrator".',
    'user':u'Korisnik',
    'monitorAgentDisabled':u'Agent onemogućen.',
    'configureTrayIconOK':u'VIdljivost tray ikone uspješno podešena.',
    'runWithoutInstallationWait':u'Čekanje na novi pokušaj spajanja (attempt {0})...',
    'enter':u'enter',
    'proxyAuthUser':u'Korisnik',
    'notInstalled':u'DWAgent nije instaliran.',
    'configureEnableAgentQuestion':u'Želite li omogućiti agenta?',
    'proxyInfo':u'Unesite podatke proxyja.',
    'monitorShow':u'Prikaži',
    'runWithoutInstallationOnlineBottom':u'UPOZORENJE: \nNe prenosite slijedeće podatke osobama kojima ne vjerujete, Davanjem podataka  dopuštate udaljeni pristup bez nadzora. Ako niste sigurni što radite, molimo Vas da zatvorite aplikaciju.',
    'startService':u'Pokretanje servisa...',
    'errorAgentMax':u'Premašen najveći broj agenata.',
    'configureLater':u'Podesi kasnije',
    'option':u'Opcija',
    'installServiceErr':u'Instalacija servisa nije uspjela.',
    'configureDisableAgent':u'Onemogući agenta.',
    'configurePasswordUpdated':u'Lozinka promijenjena.',
    'errorAgentAlreadyExsists':u'Agent {0} već postoji.',
    'configureUninstallKeyQuestion':u'Deinstalirati trenutni instalacijski kod?',
    'configureChooseOperation':u'Molimo izaberite operaciju:',
    'configureAgent':u'Konfiguriraj Agenta',
    'configureRemovePasswordQuestion':u'Želite li ukloniti lozinku?',
    'configureErrorConnection':u'Greška u komunikaciji. Provjerite da li je DWAgent servis pokrenut.',
    'menuUninstall':u'Deinstaliraj',
    'startServiceErr':u'Pokretanje servisa neuspješno.',
    'configureDisableAgentQuestion':u'Želite li onemogućiti agenta?',
    'createNewAgent':u'Kreiranje agenta...',
    'missingNative':u'Lokalizacija nije pronađena.',
    'toBack':u'za povratak',
    'proxySystem':u'Sistem',
    'proxyHost':u'Domaćin',
    'monitorStatusDisabled':u'Onemogućeno',
    'installService':u'Instalacija servisa...',
    'mustAccept':u'Za nastavak odaberite opciju {0}',
    'monitorConfigure':u'Podesi',
    'runWithoutInstallationOnlineUser':u'Korisnik: {0}',
    'waiting':u'Čekam...',
    'configureAgentDisabled':u'Agent onemugućen.',
    'monitorInvalidPassword':u'Pogrešna lozinka',
    'configureSetPassword':u'Postavi lozinku',
    'optionNotValid':u'Odabrana opcija je neispravna',
    'runWithoutInstallationConnecting':u'Otvaranje sesije',
    'enterInstallCode':u'Unesite instalacijski kod',
    'configureKeyInstalled':u'Ključ instaliran uspješno.',
    'configureInstallCode':u'Unos instalacijskog koda',
    'pathCreating':u'Izrada mape...',
    'endInstallConfigLater':u'Instalacija je završena.\nAgent nije podešen. Podešavanje možete obaviti i naknadno.',
    'endUninstall':u'Deinstalacija je završena',
    'errorConnectionConfig':u'Mrežna pogreška. Provjerite status servisa DWAgent',
    'monitorDisable':u'Onemogući',
    'warningRemovePath':u'Upozorenje da odredišna mapa već postoji i bit će izbrisana.',
    'cancelInstall':u'Instalacija je bila prekinuta.',
    'monitorErrorConnectionConfig':u'Mrežna pogreška. Provjerite status DWAgent servisa.',
    'menuConfigure':u'Podešavanja',
    'configureInstallAgent':u'Kako želite podesiti agenta?',
    'confirmInstall':u'Želite li instalirati DWAgent na \'{0}\'?',
    'dwsUser':u'DWS korisnik:',
    'configureAgentEnabled':u'Agent omogućen.',
    'titleInstall':u'DWAgent - Instalacija',
    'checkInstallCode':u'Provjeravam kod instalacije...',
    'pressEnter':u'Pritisnite enter za nastavak.',
    'endInstall':u'Instalacija je završena.',
    'missingRuntime':u'Runtime nije pronađen.',
    'runWithoutInstallationEnd':u'Sesija završena.',
    'yes':u'Da',
    'downloadFile':u'Preuzimanje datoteke {0}...',
    'runWithoutInstallationOnlinePassword':u'Lozinka: {0}',
    'reEnterData':u'Ponovno unesite podatke',
    'configureTitle':u'DWAgent - Podešenja',
    'configureProxy':u'Podesi proxy',
    'monitorAgentEnabled':u'Agent omogućen',
    'runWithoutInstallationStarting':u'Pokretanje agenta...',
    'accept':u'Prihvaćam',
    'configurePasswordErrNoMatch':u'Lozinke se ne podudaraju.',
    'welcomeLicense':u'Licenca\nOvaj softver je besplatan i otvorenog koda.\nSastoji se od jedne glavne komponente i nekoliko dodatnih komponenti definiranih "aplikacija" koje bi mogle biti regulirane različitim licencama. Za više informacija posjetite: https://www.dwservice.net/en/licenses-sources.html',
    'commands':u'Naredbe',
    'close':u'Zatvori',
    'monitorEnterPassword':u'Unesite lozinku',
    'configurePassword':u'Postavi lozinku',
    'uninstallShortcuts':u'Deinstaliram prečace...',
    'install':u'Instaliraj',
    'configureMonitor':u'Podesi monitor',
    'uninstallMonitor':u'Deinstaliram monitor...',
    'proxyNone':u'Ništa.',
    'monitorEnableAgentQuestion':u'Želite li omogućiti klijenta?'
}
                                                                                                                                                                                                                                                                   ui/messages/et.py                                                                                   0000644 0001750 0001750 00000027464 14443646237 013604  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Nõustun',
    'accessConfirm':u'Me soovime juurdepääsu teie seadmele.',
    'agentName':u'Agendi nimi',
    'alreadyInstalled':u'DWAgent on juba installitud.\n\nAgent värskendab automaatselt viimast versiooni. See tähendab, et te ei pea uuemaid värskendusi käsitsi installima.',
    'back':u'Tagasi',
    'cancel':u'Tühista',
    'cancelInstall':u'Paigaldamine tühistati.',
    'cancelUninstall':u'Eemaldamine tühistati',
    'checkInstallCode':u'Paigalduskoodi kontrollimine ...',
    'chooseProxyType':u'Millist puhverserverit soovite kasutada?',
    'close':u'Sulge',
    'code':u'Kood',
    'commands':u'Käsud',
    'configureAgent':u'Agendi konfigureerimine',
    'configureAgentDisabled':u'Agent on keelatud.',
    'configureAgentEnabled':u'Agent on lubatud.',
    'configureChangeInstallKey':u'Muuda paigalduskood',
    'configureChooseMonitorTrayIconVisibility':u'Kas soovite kuvada ikooni tegumiribal?',
    'configureChooseOperation':u'Valige operatsioon:',
    'configureDesktopNotification':u'Töölaua teavitused',
    'configureDesktopNotificationOK':u'Töölaua teavitused on edukalt seadistatud.',
    'configureDisableAgent':u'Keela agent',
    'configureDisableAgentQuestion':u'Kas soovite vahendit keelata?',
    'configureEnableAgent':u'Luba agent',
    'configureEnableAgentQuestion':u'Kas soovite agenti lubada?',
    'configureEnd':u'Konfiguratsioon on lõpetatud.',
    'configureErrorConnection':u'Ühenduse viga. Palun kontrollige, kas DWAgent teenust alustatakse.',
    'configureExit':u'Välju',
    'configureInsertPassword':u'Palun sisesta config parool:',
    'configureInstallAgent':u'Kuidas soovite agenti konfigureerida?',
    'configureInstallCode':u'Paigalduskoodi sisestamine',
    'configureInstallNewAgent':u'Uue agendi loomine',
    'configureInstallPassword':u'Paigalduse parool',
    'configureInstallUser':u'Kasutaja',
    'configureInvalidPassword':u'Vale parool.',
    'configureKeyInstalled':u'Võti on edukalt installitud.',
    'configureLater':u'Konfigureerige hiljem',
    'configureMonitor':u'Monitori seadistamine',
    'configurePassword':u'Parooli seadistamine',
    'configurePasswordErrNoMatch':u'Parool ei sobi.',
    'configurePasswordUpdated':u'Parool uuendatud.',
    'configureProxy':u'Puhverserveri seadistamine',
    'configureProxyEnd':u'Proksi seadistatakse edukalt',
    'configureRemovePassword':u'Eemalda parool',
    'configureRemovePasswordQuestion':u'Kas soovite parooli eemaldada?',
    'configureSetPassword':u'Määra parool',
    'configureTitle':u'DWAgent - Seadistamine',
    'configureTrayIconOK':u'Salveikooni nähtavus, seadistatud edukalt.',
    'configureTrayIconVisibility':u'Salve ikooni nähtavus',
    'configureUninstallKeyQuestion':u'Kas soovid paigalduskoodi desinstallida?',
    'configureUninstallationKey':u'Desinstallimine ...',
    'confirmExit':u'Kas olete kindel, et soovite väljuda?',
    'confirmInstall':u'Kas soovite paigaldada DWAgendi asukohta "{0}"?',
    'confirmUninstall':u'Kas soovite eemaldada DWAgendi?',
    'copyFiles':u'Failide kopeerimine ...',
    'createNewAgent':u'Agendi loomine käsil...',
    'decline':u'Ei nõustu',
    'desktopNotificationAutoHide':u'Peiad automaatselt',
    'desktopNotificationNone':u'Puuduvad',
    'desktopNotificationVisible':u'Nähtaval',
    'downloadFile':u'Faili allalaadimine {0} ...',
    'endInstall':u'Paigaldus on lõpetatud.',
    'endInstallConfigLater':u'Paigaldus on lõpetatud.\nAgent ei ole konfigureeritud. Konfiguratsiooni saate siiski jätkata hiljem.',
    'endUninstall':u'Desinstallimine on lõpetatud.',
    'enter':u'sisesta',
    'enterInstallCode':u'Sisesta installeerimise kood',
    'enterInstallNewAgent':u'Sisesta andmed uue agendi loomiseks:',
    'enterRunCode':u'Sisesta ühendamise kood',
    'error':u'Viga',
    'errorAgentAlreadyExsists':u'Agent {0} juba eksiteerib',
    'errorAgentMax':u'Agentide maksimaalne arv ületatud.',
    'errorAgentNameNotValid':u'Agendi nimi sisaldab keelatud tähemärke. Keelatud märgid: / \ | # @ : .',
    'errorConnectionConfig':u'Ühenduse viga. Kontrolli kas DWAgendi teenus töötab ühendatavas arvutis.',
    'errorConnectionQuestion':u'Ühendumise viga. Kontrolli interneti ühendust või tulemüüri seadeid.\nKas soovid konfigureerida proxy ühenduse?',
    'errorInvalidCode':u'Sisestatud kood ei ole õige.',
    'errorInvalidUserPassword':u'Vale kasutaja või parool.',
    'fieldRequired':u'Välja \'{0}\' täitmine on kohustuslik.',
    'install':u'Paigalda',
    'installMonitor':u'Lisan monitori...',
    'installMonitorErr':u'Monitori lisamine nurjus.',
    'installService':u'Paigaldan service moodulit...',
    'installServiceErr':u'Service mooduli paigaldus ebaõnnestus.',
    'installShortcuts':u'Paigaldan otseteid...',
    'installShortcutsErr':u'Otseteede paigaldus nurjus.',
    'installerNotSupported':u'Seda paigaldusprogrammi ei toetata enam. Palun laadige alla uusim versioon.',
    'ipAddress':u'IP Aadress: {0}',
    'linuxRootPrivileges':u'Sa pead olema root privileegidega kasutaja DWAgendi paigaldamiseks.\nPalun käivita script root kasutaja alt.',
    'menuConfigure':u'Konfigureeri',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Deinstalleeri',
    'missingInfoFile':u'Ei leia faili info.json.',
    'missingNative':u'Loomulikku (Native) ei leitud.',
    'missingRuntime':u'Käitusaega (Runtime) ei leitud',
    'monitorActive':u'aktiivne',
    'monitorAgentDisabled':u'Agent keelatud.',
    'monitorAgentEnabled':u'Agent lubatud.',
    'monitorConfigure':u'Konfigureeri',
    'monitorConnections':u'Ühendused',
    'monitorCurrentActivities':u'Hetke tegevused',
    'monitorDisable':u'Keela',
    'monitorDisableAgentQuestion':u'Kas tahad agenti keelata?',
    'monitorDownload':u'Lae alla',
    'monitorEnable':u'Luba',
    'monitorEnableAgentQuestion':u'Kas tahad seda agenti lubada?',
    'monitorEnterPassword':u'Sisesta parool:',
    'monitorErrorConnectionConfig':u'Ühenduse viga. Kontrolli kas DWAgendi teenus on käivitunud.',
    'monitorHide':u'Peida',
    'monitorInvalidPassword':u'Vale parool.',
    'monitorNoActivities':u'Pole tegevusi',
    'monitorScreenCapture':u'Ekraanitõmmis',
    'monitorSession':u'Sessioon',
    'monitorShellSession':u'Käsukest',
    'monitorShow':u'Näita',
    'monitorStatus':u'Olek',
    'monitorStatusDisabled':u'Keelatud',
    'monitorStatusNoService':u'Teenus puudub',
    'monitorStatusOffline':u'Võrguühenduseta',
    'monitorStatusOnline':u'Võrgus saadaval',
    'monitorStatusUpdating':u'Uuendan',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Desinstalli',
    'monitorUninstallNotRun':u'Sa ei saa desinstallida ilma root õigusteta.\nKäivita käsurealt käsk "sudo dwaguninstall".',
    'monitorUpload':u'Lae ülesse',
    'mustAccept':u'Et jätkata pead valima valiku {0}',
    'mustSelectOptions':u'Pead valima valiku',
    'next':u'Järgmine',
    'no':u'Ei',
    'noTryAgain':u'Ei, proovi uuesti.',
    'notInstalled':u'Rakendus DWAgent pole paigaldatud.',
    'ok':u'Ok',
    'option':u'Valik',
    'optionNotValid':u'Valitud valik pole õige.',
    'or':u'või',
    'password':u'Parool',
    'path':u'Kausta asukoht:',
    'pathCreating':u'Kausta loomine...',
    'pathNotCreate':u'Ei saanud kausta luua. Vale kausta asukoht või puuduvad admin õigused.',
    'pressEnter':u'Jätkamiseks vajuta Enter klahvi',
    'privacyPolicy':u'Andmekaitse põhimõtted',
    'proxyAuthPassword':u'Parool',
    'proxyAuthUser':u'Kasutaja',
    'proxyHost':u'Võõrustaja',
    'proxyHttp':u'Http',
    'proxyInfo':u'Sisesta puhverserveri info.',
    'proxyNone':u'Puudub',
    'proxyPort':u'Port',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Süsteem',
    'reEnterCode':u'Sisesta kood uuesti',
    'reEnterData':u'Sisesta andmed uuesti',
    'rePassword':u'Sisesta parool uuesti',
    'reject':u'Keeldu',
    'removeFile':u'Eemaldan faili...',
    'runWithoutInstallation':u'Käivita',
    'runWithoutInstallationClosing':u'Sulgen sessiooni...',
    'runWithoutInstallationConnecting':u'Avan sessiooni...',
    'runWithoutInstallationEnd':u'Sessioon lõppes.',
    'runWithoutInstallationOnlineBottom':u'HOIATUS:\nÄra avalda antud informatsiooni inimestele keda sa ei saa usaldada ega luba neil teist viisi sellele agendile ligi pääseda. Kui sa pole kindel mida teed siis palun sulge see rakendus.',
    'runWithoutInstallationOnlineBottomPutCode':u'HOIATUS:\nNüüd on agent ühendumiseks valmis. Kui sa pole kindel mida teed, siis palun sulge see rakendus.',
    'runWithoutInstallationOnlinePassword':u'Parool: {0}',
    'runWithoutInstallationOnlineTop':u'Sessioon on aktiivne.\nSelle agendiga ühendumiseks mine https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Sessioon on aktiivne.',
    'runWithoutInstallationOnlineUser':u'Kasutaja: {0}',
    'runWithoutInstallationStarting':u'Agent käivitub...',
    'runWithoutInstallationUnexpectedError':u'Ootamatu viga.\nPolnud võimalik DWAgendi rakendust käivitada. Kui probleem püsib, proovi alla laadida uusim versioon, kustuta kaust \'{0}\' ja käivita DWAgent uuesti.',
    'runWithoutInstallationUpdating':u'Agendi uuendamine...',
    'runWithoutInstallationWait':u'Oota uue ühenduse loomist (katse {0})...',
    'selectPathInstall':u'Vali programmi paigaldamise asukoht:',
    'skipCertValidation':u'Hoiatus. Turvasertifikaati ei saa kinnitada, jätkamisel ei pruugi ühendus olla turvaline.\nKontrollige võrgu või kohaliku ruuteri/tulemüüri/viirusetõrje konfiguratsiooni.\nKas soovite siiski jätkata?',
    'startService':u'Käivitan teenust...',
    'startServiceErr':u'Teenuse käivitus ebaõnnestus.',
    'termsAndConditions':u'Üldtingimused',
    'titleInstall':u'DWAgent - Paigaldamine',
    'titleUninstall':u'DWAgent - Eemaldamine',
    'toBack':u'mine tagasi.',
    'toExit':u'väljapääsuni.',
    'unattendedAccess':u'Järelevalveta\njuurdepääs',
    'unexpectedError':u'Ootamatu viga.\n{0}',
    'uninstallMonitor':u'Deinstallin monitori...',
    'uninstallService':u'Deinstallin teenust...',
    'uninstallShortcuts':u'Eemaldan otseteid...',
    'unknownUser':u'Tundmatu kasutaja',
    'user':u'Kasutaja',
    'validInteger':u'Väli \'{0}\' peab olema täisarv.',
    'versionInstallNotValid':u'Paigaldusprogrammi versioon ei vasta sinu operatsiooni süsteemile.\nPalun lae alla õige versioon. {0}',
    'waiting':u'Ootan...',
    'warningLoginLogout':u'Selle muudatuse jõustumiseks peab kasutaja välja logima ja uuesti sisse logima.',
    'warningRemovePath':u'Hoiatus- kui sihtkaust juba eksisteerib, siis see kustutatakse.',
    'warningSpyingTool':u'Pange palun tähele, et kaugarvutile juurdepääsu ei tohi kasutada ilma kaugarvuti kasutaja nõusolekuta. Kasutades DWService\'i nuhkimisvahendina, võite rikkuda oma asukohariigi seadusi.',
    'welcomeLicense':u'Litsents\nSee tarkvara on tasuta ja avatud lähtekoodiga.\nSee koosneb ühest põhikomponendist ja mitmest lisakomponendist, mis on määratletud kui "rakendus" ja mida võiks reguleerida erinevate litsentsidega. Lisateabe saamiseks külastage: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Jätkates selle tarkvara paigaldamisega või selle käivitamisel nõustute dokumendiga: #TERMSANDCONDITIONS ja #PRIVACYPOLICY',
    'welcomeSecurity':u'Turvalisus\nTeie privaatsuse kaitsmiseks tagame, et meie serverites ei salvestata ühtegi teavet ja side on krüpteeritud nii, et kolmandad osapooled ei saa neid andmeid lugeda.',
    'welcomeSoftwareUpdates':u'Tarkvara uuendused\nSelle tarkvara värskendused on automaatsed.',
    'windowsAdminPrivileges':u'DWAgendi paigaldamiseks peate omama administraatoriõigusi.\nKäivita paigaldusprogramm käsuga \'käivita administraatorina\'.',
    'yes':u'Jah'
}
                                                                                                                                                                                                            ui/messages/az.py                                                                                   0000644 0001750 0001750 00000031315 14443646242 013570  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Qəbul edirəm',
    'accessConfirm':u'Cihazınıza daxil olmaq istərdiniz.',
    'agentName':u'Istifadəçi adı',
    'alreadyInstalled':u'DWAgent artıq quraşdırılıb.\n\nAgent avtomatik olaraq son versiyaya yenilənir. Bu o deməkdir ki, daha yeni yeniləmələri əl ilə quraşdırmanıza ehtiyac yoxdur.',
    'back':u'cArxa',
    'cancel':u'Ləğv et',
    'cancelInstall':u'Quraşdırma ləğv edildi.',
    'cancelUninstall':u'Silinmə ləğv edildi.',
    'checkInstallCode':u'Quraşdırma kodu yoxlanılır...',
    'chooseProxyType':u'Hansı proxy növündən istifadə etmək istəyirsiniz?',
    'close':u'Yaxın',
    'code':u'Kod',
    'commands':u'əmr',
    'configureAgent':u'Agenti konfiqurasiya edin',
    'configureAgentDisabled':u'Agent əlildir.',
    'configureAgentEnabled':u'Agent aktivdir.',
    'configureChangeInstallKey':u'Quraşdırma kodunu dəyişdirin',
    'configureChooseMonitorTrayIconVisibility':u'Tepsidəki monitor nişanını göstərmək istəyirsiniz?',
    'configureChooseOperation':u'Zəhmət olmasa bir əməliyyat seçin:',
    'configureDesktopNotification':u'Masaüstü bildiriş',
    'configureDesktopNotificationOK':u'Masaüstü bildirişi uğurla konfiqurasiya edildi.',
    'configureDisableAgent':u'Agenti deaktiv edin',
    'configureDisableAgentQuestion':u'Agenti söndürmək istəyirsiniz?',
    'configureEnableAgent':u'Agenti aktiv edin',
    'configureEnableAgentQuestion':u'Agenti aktivləşdirmək istəyirsiniz?',
    'configureEnd':u'Konfiqurasiya tamamlandı.',
    'configureErrorConnection':u'Əlaqə xətası. Xahiş edirəm DWAgent xidmətinin işlədiyini yoxlayın.',
    'configureExit':u'Çıx',
    'configureInsertPassword':u'Zəhmət olmasa konfiqurasiya parolunu daxil edin:',
    'configureInstallAgent':u'Agenti necə konfiqurasiya etmək istərdiniz?',
    'configureInstallCode':u'Quraşdırma kodunu daxil edin',
    'configureInstallNewAgent':u'Yeni agent yaratmaq',
    'configureInstallPassword':u'Quraşdırma parolu',
    'configureInstallUser':u'İstifadəçi',
    'configureInvalidPassword':u'Etibarsız Şifrə.',
    'configureKeyInstalled':u'Key installed succesfully.',
    'configureLater':u'Sonra konfiqurasiya edin',
    'configureMonitor':u'Monitoru konfiqurasiya edin',
    'configurePassword':u'Parolu konfiqurasiya edin',
    'configurePasswordErrNoMatch':u'Parollar uyğun gəlmir.',
    'configurePasswordUpdated':u'Şifrə yeniləndi.',
    'configureProxy':u'Proxy konfiqurasiya edin',
    'configureProxyEnd':u'Proxy uğurla konfiqurasiya edildi.',
    'configureRemovePassword':u'Şifrəni silin',
    'configureRemovePasswordQuestion':u'Parolu silmək istəyirsiniz?',
    'configureSetPassword':u'Parol seçin',
    'configureTitle':u'DWAgent - Konfiqurasiya',
    'configureTrayIconOK':u'Tabla nişanı uğurla konfiqurasiya edildi.',
    'configureTrayIconVisibility':u'Tepsiya nişanının görünməsi',
    'configureUninstallKeyQuestion':u'Cari quraşdırma kodu silinsin?',
    'configureUninstallationKey':u'Silinir ...',
    'confirmExit':u'Çıxmaq istədiyinizə əminsiniz?',
    'confirmInstall':u'DWAgent-i \'{0}\' quraşdırmaq istəyirsiniz?',
    'confirmUninstall':u'DWAgent silmək istəyirsiniz?',
    'copyFiles':u'Fayllar kopyalanır ...',
    'createNewAgent':u'Agent yaradılması davam edir ...',
    'decline':u'Qəbul etmirəm',
    'desktopNotificationAutoHide':u'Avtomatik olaraq gizlədin',
    'desktopNotificationNone':u'Yoxdur',
    'desktopNotificationVisible':u'Görünən',
    'downloadFile':u'{0} faylı endirilir ...',
    'endInstall':u'Quraşdırma başa çatıb.',
    'endInstallConfigLater':u'Quraşdırma başa çatıb.\nAgent konfiqurasiya edilməyib. Yenidən konfiqurasiya yarada bilərsiniz.',
    'endUninstall':u'Silinmə tamamlandı.',
    'enter':u'daxil edin',
    'enterInstallCode':u'Quraşdırma kodunu daxil edin',
    'enterInstallNewAgent':u'Yeni agent yaratmaq üçün məlumat daxil edin:',
    'enterRunCode':u'Bağlantı kodunu daxil edin',
    'error':u'Xəta',
    'errorAgentAlreadyExsists':u'Agent {0} artıq mövcuddur.',
    'errorAgentMax':u'Maksimum agent sayını keçdi.',
    'errorAgentNameNotValid':u'Agent adı etibarlı deyil. / \ | Simvollarından istifadə edə bilməzsiniz # @:.',
    'errorConnectionConfig':u'Əlaqə xətası. Xahiş edirəm DWAgent xidmətinin işlədiyini yoxlayın.',
    'errorConnectionQuestion':u'Əlaqə xətası. Zəhmət olmasa internet bağlantınızı və ya təhlükəsizlik divarınızı yoxlayın.\nBir proxy konfiqurasiya etmək istəyirsiniz?',
    'errorInvalidCode':u'Girilən kod etibarsızdır.',
    'errorInvalidUserPassword':u'Yanlış istifadəçi və ya parol.',
    'fieldRequired':u'\'{0}\' sahəsi tələb olunur.',
    'install':u'Yüklemek',
    'installMonitor':u'Monitor quraşdırılır ...',
    'installMonitorErr':u'Quraşdırma monitoru alınmadı.',
    'installService':u'Xidmət quraşdırılır ...',
    'installServiceErr':u'Xidmət quraşdırılması uğursuz oldu.',
    'installShortcuts':u'Qısayollar quraşdırılır ...',
    'installShortcutsErr':u'Qısayol quraşdırıla bilmədi.',
    'installerNotSupported':u'Bu quraşdırıcı artıq dəstəklənmir. Zəhmət olmasa son versiyanı endirin.',
    'ipAddress':u'IP ünvanı: {0}',
    'linuxRootPrivileges':u'DWAgent qurmaq üçün kök imtiyazlarınız olmalıdır.\nZəhmət olmasa skripti sudo ilə və ya kök olaraq çalıştırın.',
    'menuConfigure':u'Konfiqurasiya edin',
    'menuMonitor':u'Ekran',
    'menuUninstall':u'Sil',
    'missingInfoFile':u'Fayl məlumatı.json tapılmadı.',
    'missingNative':u'Yerli tapılmadı.',
    'missingRuntime':u'İş vaxtı tapılmadı.',
    'monitorActive':u'aktivdir',
    'monitorAgentDisabled':u'Agent əlildir.',
    'monitorAgentEnabled':u'Agent aktivdir.',
    'monitorConfigure':u'Konfiqurasiya edin',
    'monitorConnections':u'Əlaqələr',
    'monitorCurrentActivities':u'Cari fəaliyyətlər',
    'monitorDisable':u'Deaktiv edin',
    'monitorDisableAgentQuestion':u'Agenti söndürmək istəyirsiniz?',
    'monitorDownload':u'Yükləyin',
    'monitorEnable':u'Aktiv edin',
    'monitorEnableAgentQuestion':u'Agenti aktivləşdirmək istəyirsiniz?',
    'monitorEnterPassword':u'Parol daxil edin:',
    'monitorErrorConnectionConfig':u'Əlaqə xətası. Xahiş edirəm DWAgent xidmətinin işlədiyini yoxlayın.',
    'monitorHide':u'Gizlədin',
    'monitorInvalidPassword':u'Etibarsız Şifrə.',
    'monitorNoActivities':u'Fəaliyyət yoxdur',
    'monitorScreenCapture':u'Ekrana giriş',
    'monitorSession':u'Sessiya',
    'monitorShellSession':u'Qabıq girişi',
    'monitorShow':u'Göstər',
    'monitorStatus':u'Status',
    'monitorStatusDisabled':u'Əlildir',
    'monitorStatusNoService':u'Xidmət yoxdur',
    'monitorStatusOffline':u'Oflayn',
    'monitorStatusOnline':u'Onlayn',
    'monitorStatusUpdating':u'Yenilənir',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Sil',
    'monitorUninstallNotRun':u'Kök icazələri olmadan silə bilməzsiniz.\nSudo ilə və ya kök kimi dwaguninstall əmrini işə salın.',
    'monitorUpload':u'Yükləmək',
    'mustAccept':u'Davam etmək üçün {0} seçimini seçməlisiniz',
    'mustSelectOptions':u'Bir seçim seçməlisiniz.',
    'next':u'Növbəti',
    'no':u'Yox',
    'noTryAgain':u'Xeyr, yenidən cəhd edin',
    'notInstalled':u'DWAgent quraşdırılmayıb.',
    'ok':u'tamam',
    'option':u'Seçim',
    'optionNotValid':u'Seçilmiş seçim etibarsızdır.',
    'or':u'və ya',
    'password':u'Şifrə',
    'path':u'Yol',
    'pathCreating':u'Qovluq yaradılması ...',
    'pathNotCreate':u'Qovluq yarana bilmədi. Yanlış yol və ya icazə rədd edildi.',
    'pressEnter':u'Davam etmək üçün enter düyməsini basın.',
    'privacyPolicy':u'Gizlilik Siyasəti',
    'proxyAuthPassword':u'Şifrə',
    'proxyAuthUser':u'İstifadəçi',
    'proxyHost':u'Ev sahibi',
    'proxyHttp':u'HTTP',
    'proxyInfo':u'Vəkil məlumatını daxil edin.',
    'proxyNone':u'Yoxdur',
    'proxyPort':u'Liman',
    'proxySocks4':u'SOCKS4',
    'proxySocks4a':u'SOCKS4a',
    'proxySocks5':u'SOCKS5',
    'proxySystem':u'Sistem',
    'reEnterCode':u'Kodu yenidən daxil edin',
    'reEnterData':u'Məlumatları yenidən daxil edin',
    'rePassword':u'Parolu yenidən yığın',
    'reject':u'Rədd edin',
    'removeFile':u'Fayl silinir ...',
    'runWithoutInstallation':u'Qaç',
    'runWithoutInstallationClosing':u'Bağlanış sessiyası ...',
    'runWithoutInstallationConnecting':u'Sessiya açılır ...',
    'runWithoutInstallationEnd':u'Sessiya başa çatdı.',
    'runWithoutInstallationOnlineBottom':u'XƏBƏRDARLIQ:\nBu məlumatları etibar etmədiyiniz insanlara açıqlamayın. Bu cihazı əldə etmələrinə imkan verəcəkdir. Nə etdiyinizdən əmin deyilsinizsə, xahiş edirəm bu tətbiqi bağlayın.',
    'runWithoutInstallationOnlineBottomPutCode':u'XƏBƏRDARLIQ:\nAgent artıq bir əlaqə qəbul etməyə hazırdır. Nə etdiyinizdən əmin deyilsinizsə, xahiş edirəm bu tətbiqi bağlayın.',
    'runWithoutInstallationOnlinePassword':u'Şifrə: {0}',
    'runWithoutInstallationOnlineTop':u'Sessiya aktivdir.\nBu agentə qoşulmaq üçün https://www.dwservice.net saytına daxil olun',
    'runWithoutInstallationOnlineTopPutCode':u'Sessiya aktivdir.',
    'runWithoutInstallationOnlineUser':u'İstifadəçi: {0}',
    'runWithoutInstallationStarting':u'Agentin işə salınması ...',
    'runWithoutInstallationUnexpectedError':u'Gözlənilməz səhv.\nDWAgent başlaya bilmədi. Problem davam edərsə, xahiş edirəm DWAgent-in ən son versiyasını yükləyin, \'{0}\' qovluğunu silin və DWAgent-i yenidən çalıştırın.',
    'runWithoutInstallationUpdating':u'Agent yeniləməsi ...',
    'runWithoutInstallationWait':u'Yeni əlaqənin davam etməsini gözləyin (cəhd {0}) ...',
    'selectPathInstall':u'Quraşdırma yolunu seçin:',
    'skipCertValidation':u'Xəbərdarlıq: Təhlükəsizlik sertifikatı təsdiq edilə bilməz, əgər davam etsəniz, əlaqə təhlükəsiz olmaya bilər.\nŞəbəkənin və ya lokalın marşrutlaşdırıcı/firewall/antivirus konfiqurasiyasını yoxlayın.\nHər halda davam etmək?',
    'startService':u'Xidmət başlayır ...',
    'startServiceErr':u'Xidmətə başlamaq alınmadı.',
    'termsAndConditions':u'Şərtlər və Qaydalar',
    'titleInstall':u'DWAgent - Quraşdırma',
    'titleUninstall':u'DWAgent - Silinmə',
    'toBack':u'geriyə qayıtmaq.',
    'toExit':u'çıxmaq.',
    'unattendedAccess':u'Nəzarətsiz\nGiriş',
    'unexpectedError':u'Gözlənilməz səhv.\n{0}',
    'uninstallMonitor':u'Monitor silinir ...',
    'uninstallService':u'Xidmət silinir ...',
    'uninstallShortcuts':u'Qısayollar silinir ...',
    'unknownUser':u'Naməlum istifadəçi',
    'user':u'İstifadəçi',
    'validInteger':u'\'{0}\' sahəsi bir tam olmalıdır.',
    'versionInstallNotValid':u'Quraşdırıcının bu versiyası əməliyyat sisteminiz üçün düzgün deyil.\nXahiş edirəm düzgün versiyanı yükləyin. {0}',
    'waiting':u'Gözləyirəm ...',
    'warningLoginLogout':u'Bu dəyişikliyin qüvvəyə minməsi üçün istifadəçi yenidən çıxış etməli və giriş etməlidir.',
    'warningRemovePath':u'Xəbərdarlıq: təyinat qovluğu artıq mövcuddur və silinəcəkdir.',
    'warningSpyingTool':u'Lütfən, istifadəçinin razılığı olmadan uzaq bir kompüterə daxil ola bilməyəcəyinizi unutmayın. DWService\'i casusluq vasitəsi kimi istifadə edərək, yaşadığınız ölkədəki qanunları pozmuş ola bilərsiniz.',
    'welcomeLicense':u'Lisenziya\nBu proqram pulsuz və açıq mənbəlidir.\nMPLv2 lisenziyası altında buraxılmış bir əsas komponentdən və fərqli lisenziyalarla idarə olunan bir neçə əlavə komponentdən ibarətdir. Daha çox məlumat üçün müraciət edin: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Bu proqramı quraşdırmağa və ya işə salmaqla #TERMSANDCONDITIONS və #PRIVACYPOLICY qəbul edirsiniz',
    'welcomeSecurity':u'Təhlükəsizlik\nMəxfiliyinizi qorumaq üçün agentdəki məlumatları serverlərimizdə saxlamırıq. İstifadəçilər, serverlərimiz və agentlərimiz arasında rabitə şifrələnir ki, üçüncü tərəflər onlara daxil ola bilməsin.',
    'welcomeSoftwareUpdates':u'Proqram yeniləmələri\nBu proqram avtomatik olaraq yenilənir',
    'windowsAdminPrivileges':u'DWAgent qurmaq üçün inzibati imtiyazlarınız olmalıdır.\nZəhmət olmasa yürütülə bilən düyməni vurun və quraşdırıcıyı başlamaq üçün \'idarəçi olaraq çalıştır\' düyməsini basın.',
    'yes':u'Bəli'
}
                                                                                                                                                                                                                                                                                                                   ui/messages/__init__.py                                                                             0000644 0001750 0001750 00000000601 13422307023 014672  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''
import resources

restext=resources.ResText("ui.messages")

def set_locale(lng):
    restext.set_locale(lng)

def get_message(key):
    return restext.get(key)                                                                                                                               ui/messages/tr.py                                                                                   0000644 0001750 0001750 00000030750 14441141756 013603  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Kabul ediyorum',
    'accessConfirm':u'Cihazınıza erişmek istiyorum.',
    'agentName':u'Ajan adı',
    'alreadyInstalled':u'DWAgent zaten yüklendi.\n\nAjan son sürüme otomatik olarak güncellenir. Yeni güncellemeleri elle kurmanıza gerek yoktur.',
    'back':u'Geri',
    'cancel':u'İptal Et',
    'cancelInstall':u'Kurulum işlemi iptal edildi.',
    'cancelUninstall':u'Kaldırma işlemi iptal edildi.',
    'checkInstallCode':u'Kurulum kodu kontrol ediliyor...',
    'chooseProxyType':u'Hangi proxy türünü kullanmak istiyorsunuz?',
    'close':u'Kapat',
    'code':u'Kod',
    'commands':u'Komutlar',
    'configureAgent':u'Ajanı yapılandır',
    'configureAgentDisabled':u'Ajan pasif edildi.',
    'configureAgentEnabled':u'Ajan aktif edildi.',
    'configureChangeInstallKey':u'Kurulum kodunu değiştir',
    'configureChooseMonitorTrayIconVisibility':u'Uygulamayı Tepsi Simgesinde göstermek istiyor musunuz?',
    'configureChooseOperation':u'Lütfen bir aksiyon seçiniz.',
    'configureDesktopNotification':u'Sistem bildirimleri',
    'configureDesktopNotificationOK':u'Sistem bildirimleri başarılı şekilde ayarlandı.',
    'configureDisableAgent':u'Ajanı devre dışı bırak',
    'configureDisableAgentQuestion':u'DWAgent\'i devre dışı bırakmak istiyor musunuz?',
    'configureEnableAgent':u'Ajanı etkinleştir.',
    'configureEnableAgentQuestion':u'DWAgent\'i devreye almak istiyor musunuz?',
    'configureEnd':u'Konfigürasyon tamamlanmıştır.',
    'configureErrorConnection':u'Bağlantı hatası. DWAgent servisinin başladığından emin olunuz.',
    'configureExit':u'Çıkış',
    'configureInsertPassword':u'Lütfen yapılandırma şifresini giriniz:',
    'configureInstallAgent':u'DWAgent\'i nasıl yapılandırmayı tercih edersiniz?',
    'configureInstallCode':u'Kurulum kodunu giriniz',
    'configureInstallNewAgent':u'Yeni bir ajan oluştur',
    'configureInstallPassword':u'Kurulum şifresi',
    'configureInstallUser':u'Kullanıcı',
    'configureInvalidPassword':u'Hatalı şifre.',
    'configureKeyInstalled':u'Anahtar başarıyla kuruldu.',
    'configureLater':u'Daha sonra yapılandır.',
    'configureMonitor':u'Monitör yapılandırması.',
    'configurePassword':u'Şifreyi yapılandır',
    'configurePasswordErrNoMatch':u'Parolalar uyuşmuyor.',
    'configurePasswordUpdated':u'Parola güncellendi.',
    'configureProxy':u'Vekil sunucuyu yapılandır',
    'configureProxyEnd':u'Vekil sunucu başarıyla yapılandırıldı.',
    'configureRemovePassword':u'Parolayı kaldır.',
    'configureRemovePasswordQuestion':u'Parolayı kaldırmak istediğinizden emin misiniz?',
    'configureSetPassword':u'Parola belirle',
    'configureTitle':u'DWAgent - Yapılandırma',
    'configureTrayIconOK':u'Sistem tepsisi simge görünürlüğü başarı bir şekilde ayarlandı.',
    'configureTrayIconVisibility':u'Sistem tepsisi simge görünürlüğü',
    'configureUninstallKeyQuestion':u'Mevcut yükleme kodu kaldırılsın mı?',
    'configureUninstallationKey':u'Kaldırma...',
    'confirmExit':u'Çıkmak istediğinizden emin misiniz?',
    'confirmInstall':u'DWAgent\'i \'{0}\' konumuna yüklemek istiyor musunuz?',
    'confirmUninstall':u'WGAgent\'i kaldırmak istiyor musunuz?',
    'copyFiles':u'Dosyalar kopyalanıyor...',
    'createNewAgent':u'Ajan oluşturma devam ediyor...',
    'decline':u'Kabul etmiyorum.',
    'desktopNotificationAutoHide':u'Otomatik olarak gizle',
    'desktopNotificationNone':u'Hiçbiri',
    'desktopNotificationVisible':u'Görünür',
    'downloadFile':u'{0} Dosyası  İndiriliyor...',
    'endInstall':u'Kurulum tamamlandı.',
    'endInstallConfigLater':u'Kurulum Tamamlandı.\nAjan yazılımı yapılandırılmadı. Daha sonra yapılandırmaya devam edebilirsiniz.',
    'endUninstall':u'Kaldırma İşlemi Sorunsuz Kaldırıldı.',
    'enter':u'giriş',
    'enterInstallCode':u'Kurulum kodunu giriniz.',
    'enterInstallNewAgent':u'Yeni ajan oluşturmak için verileri giriniz:',
    'enterRunCode':u'Bağlantı kodunu giriniz',
    'error':u'Hata',
    'errorAgentAlreadyExsists':u'{0} aracısı zaten var.',
    'errorAgentMax':u'Maksimum ajan sayısı aşıldı.',
    'errorAgentNameNotValid':u'Ajan adı geçerli değil. Karakterleri kullanamazsınız. / \ #@ : . |',
    'errorConnectionConfig':u'Bağlantı Hatası.Lütfen DWAjan Yazılımının çalışma durumunu kontrol edin.',
    'errorConnectionQuestion':u'Bağlantı hatası. Lütfen internet bağlantınızı veya güvenlik duvarı yapılandırmanızı kontrol edin.\nProxy\'yi yapılandırmak ister misiniz?',
    'errorInvalidCode':u'Girilen kod geçeriz',
    'errorInvalidUserPassword':u'Geçersiz kullanıcı veya şifre',
    'fieldRequired':u'Bu Alan \'{0}\' Gereklidir.',
    'install':u'Kur',
    'installMonitor':u'Ekran Kuruluyor...',
    'installMonitorErr':u'Ekran yüklemesi başarısız oldu.',
    'installService':u'Servis yükleniyor...',
    'installServiceErr':u'Servis yüklemesi başarısız oldu.',
    'installShortcuts':u'Kısayollar yükleniyor...',
    'installShortcutsErr':u'Kısayolların yüklenmesi başarısız oldu.',
    'ipAddress':u'IP Adresi: {0}',
    'linuxRootPrivileges':u'DWAgent\'i yüklemek için root ayrıcalıklarına sahip olmalısınız.\nLütfen root kullanıcısı olarak betiği çalıştırınız.',
    'menuConfigure':u'Yapılandırma',
    'menuMonitor':u'Ekran',
    'menuUninstall':u'Kaldır',
    'missingInfoFile':u'info.json dosyası bulunamadı.',
    'missingNative':u'Native bulunamadı.',
    'missingRuntime':u'Çalışma Zamanı bulunamadı.',
    'monitorActive':u'aktif',
    'monitorAgentDisabled':u'Ajan devre dışı bırakıldı.',
    'monitorAgentEnabled':u'Ajan etkinleştirildi.',
    'monitorConfigure':u'Yapılandırma',
    'monitorConnections':u'Bağlantılar',
    'monitorCurrentActivities':u'Mevcut aktiviteler',
    'monitorDisable':u'Devre dışı',
    'monitorDisableAgentQuestion':u'Ajan\'ı devre dışı bırakmak istiyor musunuz?',
    'monitorDownload':u'İndirme',
    'monitorEnable':u'Etkin',
    'monitorEnableAgentQuestion':u'Ajan\'ı etkinleştirmek istiyor musunuz?',
    'monitorEnterPassword':u'Şifrenizi giriniz:',
    'monitorErrorConnectionConfig':u'Bağlantı hatası. Lütfen DWAgent hizmetinin başlatıldığından emin olunuz.',
    'monitorHide':u'Gizle',
    'monitorInvalidPassword':u'Geçersiz şifre.',
    'monitorNoActivities':u'Aktivite mevcut değil',
    'monitorScreenCapture':u'Ekran erişimi',
    'monitorSession':u'Oturum',
    'monitorShellSession':u'Shell erişimi',
    'monitorShow':u'Göster',
    'monitorStatus':u'Durum',
    'monitorStatusDisabled':u'Etkin Değil',
    'monitorStatusNoService':u'Servis yok',
    'monitorStatusOffline':u'Çevrimdışı',
    'monitorStatusOnline':u'Çevrimiçi',
    'monitorStatusUpdating':u'Güncelleniyor',
    'monitorTitle':u'DWAgent - Ekran',
    'monitorUninstall':u'Kaldır',
    'monitorUninstallNotRun':u'Root izinleri olmadan kaldıramazsınız.\ndwaguninstall komutunu, komut satırında çalıştırın.',
    'monitorUpload':u'Karşıya yükleme (Upload)',
    'mustAccept':u'Devam etmek için {0} seçeneğini işaretlemelisiniz.',
    'mustSelectOptions':u'Bir seçeneği işaretlemelisiniz.',
    'next':u'Sonraki',
    'no':u'Hayır',
    'noTryAgain':u'Hayır, yeniden deneyin',
    'notInstalled':u'DWAgent kurulu değil.',
    'ok':u'Tamam',
    'option':u'Seçenek',
    'optionNotValid':u'İşaretli seçenek geçersizdir.',
    'or':u'veya',
    'password':u'Şifre',
    'path':u'Yol',
    'pathCreating':u'Klasör oluşturma...',
    'pathNotCreate':u'Klasör oluşturulamadı. Yetki reddedildi veya yol geçersiz.',
    'pressEnter':u'Devam etmek için Enter tuşuna basınız.',
    'privacyPolicy':u'Gizlilik politikası',
    'proxyAuthPassword':u'Şifre',
    'proxyAuthUser':u'Kullanıcı',
    'proxyHost':u'Host',
    'proxyHttp':u'Http',
    'proxyInfo':u'Vekil Sunucu bilgisi giriniz.',
    'proxyNone':u'Hiçbiri',
    'proxyPort':u'Port',
    'proxySocks4':u'SOCKS4',
    'proxySocks4a':u'SOCKS4a',
    'proxySocks5':u'SOCKS5',
    'proxySystem':u'Sistem',
    'reEnterCode':u'Kodu tekrar gir.',
    'reEnterData':u'Veriyi tekrar gir.',
    'rePassword':u'Şifreyi Tekrarı',
    'reject':u'Reddet',
    'removeFile':u'Dosya kaldırılıyor...',
    'runWithoutInstallation':u'Çalıştır',
    'runWithoutInstallationClosing':u'Oturum kapatılıyor...',
    'runWithoutInstallationConnecting':u'Oturum açılıyor...',
    'runWithoutInstallationEnd':u'Oturum sonlandırıldı.',
    'runWithoutInstallationOnlineBottom':u'UYARI:\nBu bilgileri güvenmediğiniz kişilerle paylaşmayın. Bu istenmeyen kişilerin cihazınıza erişmesine sebep olabilir. Eğer ne yaptığınızdan emin değilseniz lütfen uygulamayı kapatın.',
    'runWithoutInstallationOnlineBottomPutCode':u'UYARI:\nAjan, şuan bağlantı kabul etmeye hazır. Ne yaptığınızdan emin değilseniz lütfen bu uygulamayı kapatınız.',
    'runWithoutInstallationOnlinePassword':u'Şifre: {0}',
    'runWithoutInstallationOnlineTop':u'Oturum aktif.\nBu Ajan\'a bağlanmak için https://www.dwservice.net adresini ziyaret ediniz.',
    'runWithoutInstallationOnlineTopPutCode':u'Oturum aktif.',
    'runWithoutInstallationOnlineUser':u'Kullanıcı: {0}',
    'runWithoutInstallationStarting':u'Ajan başlatılıyor...',
    'runWithoutInstallationUnexpectedError':u'Beklenmeyen hata.\nDWAgent\'i başlatmak mümkün olmadı. Eğer sorun kalıcıysa, DWAgent\'in son sürümünü karşıdan yüklemeyi deneyin, \'{0}\' klasörünü silin ve DWAgent\'i tekrar çalıştırın.',
    'runWithoutInstallationUpdating':u'Ajan güncellemesi...',
    'runWithoutInstallationWait':u'Yeni bağlantı bekleyişi devam ediyor (deneme {0})...',
    'selectPathInstall':u'Yükleme yolunu seçiniz:',
    'skipCertValidation':u'Uyarı: Güvenlik sertifikası doğrulanamıyor, devam ederseniz bağlantı güvenli olmayabilir.\nLütfen ağın veya yerelin yönlendirici/güvenlik duvarı/antivirüs yapılandırmasını kontrol edin.\nYine de devam edilsin mi?',
    'startService':u'Hizmet başlatılıyor...',
    'startServiceErr':u'Hizmet başlatılamadı.',
    'termsAndConditions':u'Şartlar ve Koşullar',
    'titleInstall':u'DWAgent - Yükleme',
    'titleUninstall':u'DWAgent - Kaldırma',
    'toBack':u'geri git.',
    'toExit':u'çık.',
    'unattendedAccess':u'Katılımsız\nerişim',
    'unexpectedError':u'Beklenmeyen hata.\n{0}',
    'uninstallMonitor':u'Ekran kaldırılıyor...',
    'uninstallService':u'Hizmet kaldırılıyor...',
    'uninstallShortcuts':u'Kısayollar kaldırılıyor...',
    'unknownUser':u'Bilinmeyen kullanıcı',
    'user':u'Kullanıcı',
    'validInteger':u'\'{0}\' alanı tamsayı olmalıdır.',
    'versionInstallNotValid':u'Yükleyicinin versiyonu, işletim sisteminiz için uygun değildir.\nLütfen uygun versiyonu karşıdan yükleyiniz. {0}',
    'waiting':u'Bekleniyor...',
    'warningLoginLogout':u'Bu değişikliklerin geçerli olması için kullanıcının çıkış yaptıktan sonra tekrar giriş yapması gerekmetedir.',
    'warningRemovePath':u'UYARI: Hedef klasöz zaten var, bunu nedenle silinecek.',
    'warningSpyingTool':u'Lütfen Dikkat!  Kullanıcı rızası olmadan kullanıcının bilgisayarına erişemezsiniz. DWService\'i casusuluk amacı ile kullanmak bulunduğunuz ülkenin yerel kanunlarını ihlale sebep olabilir.',
    'welcomeLicense':u'Lisans\nBu yazılım ücretsiz ve açık kaynaktır.\nAna bileşenler MPLv2 lisansı altında piyasaya sunulmuştur, ancak bazı bileşenler farklı lisanslara sahip olabilir. Aşağıdaki linkten daha fazla bilgi alabilirsiniz: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Kuruluma devam ederek veya bu yazılımı çalıştırarak #TERMSANDCONDITIONS ve #PRIVACYPOLICY\'nı kabul etmiş olursunuz.',
    'welcomeSecurity':u'Güvenlik\nGizliliğinizi korumak için uygulama bilgilerinizi sunucularımızda  saklamıyoruz. Kullanıcılar, sunucularımız ve uygulamalar arasındaki iletişim şifrelidir ve üçüncü kişiler tarafından ulaşılamaz.',
    'welcomeSoftwareUpdates':u'Yazılım güncellemeleri.\nBu yazılımın güncellemeleri kendiliğinden yapılır.',
    'windowsAdminPrivileges':u'DWAgent\'i yüklemek için yönetici ayrıcalıklarına sahip olmalısınız.\nLütfen çalıştırılabilir dosyayı \'Yönetici olarak çalıştır\' ile başlatınız.',
    'yes':u'Evet'
}
                        ui/messages/pl.py                                                                                   0000644 0001750 0001750 00000030121 14443646207 013564  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Akceptuję',
    'accessConfirm':u'Chcesz uzyskać dostęp do swojego urządzenia.',
    'agentName':u'Nazwa agenta',
    'alreadyInstalled':u'DWAgent jest już zainstalowany.\n\nAgent automatycznie aktualizuje się do najnowszej wersji. Znaczy to, że nie będziesz musiał instalować aktualizacji ręcznie.',
    'back':u'Cofnij',
    'cancel':u'Anuluj',
    'cancelInstall':u'Instalacja została anulowana',
    'cancelUninstall':u'Dezinstalacja została anulowana',
    'checkInstallCode':u'Sprawdzanie kodu instalacji...',
    'chooseProxyType':u'Jakiego typu proxy chcesz użyć?',
    'close':u'Zamknij',
    'code':u'Kod',
    'commands':u'Polecenia',
    'configureAgent':u'Konfiguruj agenta',
    'configureAgentDisabled':u'Agent wyłączony',
    'configureAgentEnabled':u'Agent włączony',
    'configureChangeInstallKey':u'Zmień kod instalacji',
    'configureChooseMonitorTrayIconVisibility':u'Czy wyświetlać ikonę w tray\'u',
    'configureChooseOperation':u'Wybierz operację:',
    'configureDesktopNotification':u'Powiadomienia',
    'configureDesktopNotificationOK':u'Powiadomienia zostały skonfigurowane pomyślnie.',
    'configureDisableAgent':u'Wyłącz agenta',
    'configureDisableAgentQuestion':u'Czy chcesz wyłączyć agenta?',
    'configureEnableAgent':u'Włącz agenta',
    'configureEnableAgentQuestion':u'Czy chcesz włączyć agenta?',
    'configureEnd':u'Konfiguracja została zakończona.',
    'configureErrorConnection':u'Problem z połączeniem. Proszę sprawdzić czy usługa DWAgent jest uruchomiona.',
    'configureExit':u'Wyjście',
    'configureInsertPassword':u'Proszę podać hasło konfiguracji:',
    'configureInstallAgent':u'Jak chcesz skonfigurować agenta?',
    'configureInstallCode':u'Podaj kod instalacji',
    'configureInstallNewAgent':u'Utwórz nowego agenta',
    'configureInstallPassword':u'Hasło instalacji',
    'configureInstallUser':u'Użytkownik',
    'configureInvalidPassword':u'Złe hasło.',
    'configureKeyInstalled':u'Klucz zainstalowany pomyślnie.',
    'configureLater':u'Skonfiguruj później',
    'configureMonitor':u'Skonfiguruj monitor',
    'configurePassword':u'Skonfiguruj hasło',
    'configurePasswordErrNoMatch':u'Hasła nie są takie same.',
    'configurePasswordUpdated':u'Hasło zaktualizowane.',
    'configureProxy':u'Skonfiguruj proxy',
    'configureProxyEnd':u'Proxy skonfigurowane prawidłowo.',
    'configureRemovePassword':u'Usuń hasło.',
    'configureRemovePasswordQuestion':u'Czy chcesz usunąć hasło?',
    'configureSetPassword':u'Ustaw hasło',
    'configureTitle':u'DWAgent - konfiguracja',
    'configureTrayIconOK':u'Widoczność ikony w tray\'u - skonfigurowano pomyślnie.',
    'configureTrayIconVisibility':u'Widoczność ikony w tray\'u',
    'configureUninstallKeyQuestion':u'Odinstalować obecny kod instalacyjny?',
    'configureUninstallationKey':u'Dezinstalacja...',
    'confirmExit':u'Czy jesteś pewien, że chcesz wyjść?',
    'confirmInstall':u'Chcesz zainstalować DWAgent w \'{0}\'?',
    'confirmUninstall':u'Czy chcesz usunąć DWAgent?',
    'copyFiles':u'Kopiowanie plików...',
    'createNewAgent':u'Tworzenie agenta w toku...',
    'decline':u'Nie zgadzam się',
    'desktopNotificationAutoHide':u'Automatycznie ukryj',
    'desktopNotificationNone':u'Brak',
    'desktopNotificationVisible':u'Widoczne',
    'downloadFile':u'Pobieranie pliku {0}...',
    'endInstall':u'Instalacja została zakończona.',
    'endInstallConfigLater':u'Instalacja została zakończona.\nAgent nie został skonfigurowany. Możesz skonfigurować go później.',
    'endUninstall':u'Odinstalowywanie zakończyło się.',
    'enter':u'wprowadź',
    'enterInstallCode':u'Wprowadź kod instalacji',
    'enterInstallNewAgent':u'Wprowadź dane, aby stworzyć nowego agenta:',
    'enterRunCode':u'Wprowadź kod połączenia',
    'error':u'Błąd',
    'errorAgentAlreadyExsists':u'Agent {0} już istnieje.',
    'errorAgentMax':u'Przekroczono maksymalną liczbę agentów.',
    'errorAgentNameNotValid':u'Nazwa agenta nie jest prawidłowa. Nie możesz użyć znaków / \ | # @ : .',
    'errorConnectionConfig':u'Błąd połączenia. Proszę sprawdzić czy usługa DWAgent jest uruchomiona.',
    'errorConnectionQuestion':u'Błąd połączenia. Proszę sprawdzić połączenie internetowe lub konfigurację zapory.\nCzy chcesz skonfigurować proxy?',
    'errorInvalidCode':u'Wprowadzono błędny kod.',
    'errorInvalidUserPassword':u'Nieprawidłowy użytkownik lub hasło.',
    'fieldRequired':u'Pole \'{0}\' jest wymagane.',
    'install':u'Zainstaluj',
    'installMonitor':u'Instalowanie monitora...',
    'installMonitorErr':u'Instalacja monitora nie powiodła się.',
    'installService':u'Instalowanie usługi...',
    'installServiceErr':u'Instalacja usługi nie powiodła się.',
    'installShortcuts':u'Instalacja skrótów...',
    'installShortcutsErr':u'Instalacja skrótów nie powiodła się.',
    'installerNotSupported':u'Ten instalator nie jest już obsługiwany. Pobierz najnowszą wersję.',
    'ipAddress':u'Adres IP: {0}',
    'linuxRootPrivileges':u'Potrzebujesz uprawnień administratora, aby zainstalować DWAgent.\nProszę rozpocząć skrypt używając użytkownika administracyjnego.',
    'menuConfigure':u'Konfiguruj',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Odinstaluj',
    'missingInfoFile':u'Plik info.json nie znaleziony.',
    'missingNative':u'Nie znaleziono natywnej wersji.',
    'missingRuntime':u'Nie znaleziono pliku wykonywalnego.',
    'monitorActive':u'aktywny',
    'monitorAgentDisabled':u'Agent wyłączony.',
    'monitorAgentEnabled':u'Agent włączony.',
    'monitorConfigure':u'Konfiguruj',
    'monitorConnections':u'Połączenia',
    'monitorCurrentActivities':u'Obecne połączenia',
    'monitorDisable':u'Wyłącz',
    'monitorDisableAgentQuestion':u'Czy chcesz wyłączyć agenta?',
    'monitorDownload':u'Pobieranie',
    'monitorEnable':u'Włącz',
    'monitorEnableAgentQuestion':u'Czy chcesz włączyć agenta?',
    'monitorEnterPassword':u'Wprowadź hasło:',
    'monitorErrorConnectionConfig':u'Błąd połączenia. Proszę sprawdzić czy usługa DWAgent jest uruchomiona.',
    'monitorHide':u'Ukryj',
    'monitorInvalidPassword':u'Nieprawidłowe hasło.',
    'monitorNoActivities':u'Brak aktywności',
    'monitorScreenCapture':u'Przechwytywanie ekranu',
    'monitorSession':u'Sesja',
    'monitorShellSession':u'Terminal',
    'monitorShow':u'Pokaż',
    'monitorStatus':u'Status',
    'monitorStatusDisabled':u'Wyłączony',
    'monitorStatusNoService':u'Brak usługi',
    'monitorStatusOffline':u'Wyłączony',
    'monitorStatusOnline':u'Włączony',
    'monitorStatusUpdating':u'Aktualizacja',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Odinstaluj',
    'monitorUninstallNotRun':u'Nie możesz odinstalować bez praw administratora.\nUruchom komendę dwaguninstall w konsoli.',
    'monitorUpload':u'Wgrywanie',
    'mustAccept':u'Aby kontynuować, musisz wybrać opcję {0}',
    'mustSelectOptions':u'Musisz wybrać opcję.',
    'next':u'Dalej',
    'no':u'Nie',
    'noTryAgain':u'Nie, spróbuj ponownie',
    'notInstalled':u'DWAgent nie zainstalowany.',
    'ok':u'Ok',
    'option':u'Opcja',
    'optionNotValid':u'Wybrana opcja jest nieprawidłowa.',
    'or':u'lub',
    'password':u'Hasło',
    'path':u'Ścieżka',
    'pathCreating':u'Tworzenie folderu...',
    'pathNotCreate':u'Nie można stworzyć folderu. Nieprawidłowa ścieżka, lub odmowa dostępu.',
    'pressEnter':u'Wciśnij enter, aby kontynuować.',
    'privacyPolicy':u'Polityka prywatności',
    'proxyAuthPassword':u'Hasło',
    'proxyAuthUser':u'Użytkownik',
    'proxyHost':u'Host',
    'proxyHttp':u'Http',
    'proxyInfo':u'Wprowadź dane proxy.',
    'proxyNone':u'Brak',
    'proxyPort':u'Port',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Systemowe',
    'reEnterCode':u'Wprowadź kod ponownie',
    'reEnterData':u'Wprowadź dane ponownie',
    'rePassword':u'Powtórz hasło',
    'reject':u'Odrzucony',
    'removeFile':u'Usuwanie pliku...',
    'runWithoutInstallation':u'Uruchom',
    'runWithoutInstallationClosing':u'Zamykanie sesji...',
    'runWithoutInstallationConnecting':u'Otwieranie sesji...',
    'runWithoutInstallationEnd':u'Sesja zakończona.',
    'runWithoutInstallationOnlineBottom':u'UWAGA:\nNie ujawniaj tych informacji ludziom, którym nie ufasz, ani nie pozwalaj na dostęp w żaden inny sposób. Jeśli nie wiesz co robisz, proszę zamknij tą aplikację.',
    'runWithoutInstallationOnlineBottomPutCode':u'UWAGA:\nAgent jest teraz gotowy do przyjmowania połączeń. Jeśli nie jesteś pewien co robisz, zamknij ten program.',
    'runWithoutInstallationOnlinePassword':u'Hasło: {0}',
    'runWithoutInstallationOnlineTop':u'Sesja jest aktywna.\nAby połączyć się z tym agentem odwiedź https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Sesja jest aktywna.',
    'runWithoutInstallationOnlineUser':u'Użytkownik: {0}',
    'runWithoutInstallationStarting':u'Uruchamianie agenta...',
    'runWithoutInstallationUnexpectedError':u'Niespodziewany błąd.\nNie udało się uruchomić DWAgent. Jeśli problem będzie dalej występować, spróbuj pobrać najnowszą wersję DWAgent, usuń folder \'{0}\' i uruchom DWAgent ponownie.',
    'runWithoutInstallationUpdating':u'Aktualizacja agenta...',
    'runWithoutInstallationWait':u'Oczekiwanie na nowe połączenie (próba {0})...',
    'selectPathInstall':u'Wybierz folder instalacji:',
    'skipCertValidation':u'Ostrzeżenie: Certyfikat bezpieczeństwa nie może być zatwierdzony, jeśli będziesz kontynuować połączenie może nie być bezpieczne.\nProszę sprawdzić konfigurację sieciową lub lokalną routera/firewalla/antywirusa.\nKontynuować mimo wszystko?',
    'startService':u'Uruchamianie usługi...',
    'startServiceErr':u'Uruchamianie usługi nie powiodło się.',
    'termsAndConditions':u'Warunki Użytkowania',
    'titleInstall':u'DWAgent - Instalacja',
    'titleUninstall':u'DWAgent - Deinstalacja',
    'toBack':u'aby wrócić.',
    'toExit':u'aby wyjść.',
    'unattendedAccess':u'Dostęp\nbez nadzoru',
    'unexpectedError':u'Niespodziewany błąd.\n{0}',
    'uninstallMonitor':u'Odinstalowywanie monitora...',
    'uninstallService':u'Odinstalowywanie usługi...',
    'uninstallShortcuts':u'Odinstalowywanie skrótów...',
    'unknownUser':u'Użytkownik nieznany',
    'user':u'Użytkownik',
    'validInteger':u'Pole \'{0}\' musi być liczbą całkowitą.',
    'versionInstallNotValid':u'Wersja instalatora nie jest prawidłowa dla Twojego systemu operacyjnego.\nProszę pobrać prawidłową wersję. {0}',
    'waiting':u'Czekam...',
    'warningLoginLogout':u'Aby zmiany weszły w życie, musisz wylogować się i zalogować ponownie.',
    'warningRemovePath':u'Ostrzeżenie. Jeśli folder docelowy istnieje, zostanie usunięty.',
    'warningSpyingTool':u'Nie łącz się z komputerem bez pozwolenia jego użytkownika. Jeśli używasz DWService jako programu szpiegowskiego, możesz łamać prawo swojego kraju.',
    'welcomeLicense':u'Licencja\nTo jest wolne i otwarte oprogramowanie.\nSkłada się z jednego głównego komponentu i kilku dodatkowych, które mogą wykorzystywać inne licencje. Aby dowiedzieć się więcej, odwiedź: https://www.dwservice.net/pl/licenses-sources.html',
    'welcomePrivacyTerms':u'#TERMSANDCONDITIONSLINK, #PRIVACYPOLICYLINK - Instalując program wyrażasz na nie zgodę.',
    'welcomeSecurity':u'Bezpieczeństwo\nAby chronić Twoją prywatność, gwarantujemy, że żadne informacje nie będą gromadzone na naszych serwerach, a komunikacja jest szyfrowana, aby osoby trzecie nie mogły jej odczytać.',
    'welcomeSoftwareUpdates':u'Aktualizacje oprogramowania\nOprogramowanie aktualizuje się automatycznie.',
    'windowsAdminPrivileges':u'Musisz mieć uprawnienia administratora, aby zainstalować DWAgent.\nProszę uruchomić plik wykonywalny z opcją \'uruchom jako administrator\'.',
    'yes':u'Tak'
}
                                                                                                                                                                                                                                                                                                                                                                                                                                               ui/messages/uk.py                                                                                   0000644 0001750 0001750 00000040751 14443646236 013604  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Я приймаю',
    'accessConfirm':u'Хотів би отримати доступ до вашого пристрою.',
    'agentName':u'Назва агента',
    'alreadyInstalled':u'DWAgent вже встановлено.\n\nАгент автоматично оновлюється до останньої версії. Це означає, що вам не потрібно вручну встановлювати новіші оновлення.',
    'back':u'Назад',
    'cancel':u'Відміна',
    'cancelInstall':u'Встановлення скасовано.',
    'cancelUninstall':u'Видалення було скасовано.',
    'checkInstallCode':u'Перевірка коду встановлення...',
    'chooseProxyType':u'Який тип proxy ви хочете використовувати?',
    'close':u'Закрити',
    'code':u'Код',
    'commands':u'Команди',
    'configureAgent':u'Налаштування агента',
    'configureAgentDisabled':u'Агент вимкнений.',
    'configureAgentEnabled':u'Агент ввімкнено.',
    'configureChangeInstallKey':u'Змінити інсталяційний код',
    'configureChooseMonitorTrayIconVisibility':u'Хочете показати значок монітора у треї?',
    'configureChooseOperation':u'Виберіть операцію:',
    'configureDesktopNotification':u'Сповіщення на робочому столі',
    'configureDesktopNotificationOK':u'Сповіщення на робочому столі налаштовано успішно.',
    'configureDisableAgent':u'Вимкннути агент',
    'configureDisableAgentQuestion':u'Ви хочете вимкнути агента?',
    'configureEnableAgent':u'Увімкнути агент',
    'configureEnableAgentQuestion':u'Хочете увімкнути агента?',
    'configureEnd':u'Конфігурування завершена.',
    'configureErrorConnection':u'Помилка з\'єднання. Перевірте, чи запущено службу DWAgent.',
    'configureExit':u'вихід',
    'configureInsertPassword':u'Введіть пароль конфігурації:',
    'configureInstallAgent':u'Як ви вважаєте за краще налаштувати агента?',
    'configureInstallCode':u'Введення коду встановлення',
    'configureInstallNewAgent':u'Створення нового агента',
    'configureInstallPassword':u'Пароль інсталяції',
    'configureInstallUser':u'Користувач',
    'configureInvalidPassword':u'Недійсний пароль.',
    'configureKeyInstalled':u'Ключ успішно встановлено.',
    'configureLater':u'Налаштувати пізніше',
    'configureMonitor':u'Налаштувати монітор',
    'configurePassword':u'Налаштувати пароль',
    'configurePasswordErrNoMatch':u'Пароль не співпадає.',
    'configurePasswordUpdated':u'Пароль оновлено.',
    'configureProxy':u'Налаштувати проксі',
    'configureProxyEnd':u'Проксі налаштовано успішно.',
    'configureRemovePassword':u'Видалити пароль',
    'configureRemovePasswordQuestion':u'Ви хочете видалити пароль?',
    'configureSetPassword':u'Встановити пароль',
    'configureTitle':u'DWAgent - конфігурація',
    'configureTrayIconOK':u'Видимість значка у треї успішно налаштована.',
    'configureTrayIconVisibility':u'Видимість значка у треї',
    'configureUninstallKeyQuestion':u'Видалити поточний код установки?',
    'configureUninstallationKey':u'Видалення',
    'confirmExit':u'Ви впевнені що хочете вийти?',
    'confirmInstall':u'Ви хочете встановити DWAgent у \'{0}\'?',
    'confirmUninstall':u'Ви хочете видалити DWAgent?',
    'copyFiles':u'Копіювання файлів ...',
    'createNewAgent':u'Створення агента ...',
    'decline':u'Я не приймаю',
    'desktopNotificationAutoHide':u'Автоматично приховувати',
    'desktopNotificationNone':u'Жоден',
    'desktopNotificationVisible':u'видимий',
    'downloadFile':u'Скачування файлу {0}...',
    'endInstall':u'Встановлення завершено.',
    'endInstallConfigLater':u'Встановлення завершено.\nАгент не налаштований. Ви можете продовжити налаштування пізніше.',
    'endUninstall':u'Видалення завершено.',
    'enter':u'введіть',
    'enterInstallCode':u'Введіть код установки',
    'enterInstallNewAgent':u'Введіть дані, щоб створити нового агента:',
    'enterRunCode':u'Введіть код з\'єднання',
    'error':u'Помилка',
    'errorAgentAlreadyExsists':u'Агент {0} вже існує.',
    'errorAgentMax':u'Перевищено максимальну кількість агентів.',
    'errorAgentNameNotValid':u'Назва агента недійсна. Не можна використовувати символи  / \ | # @ : .',
    'errorConnectionConfig':u'Помилка з\'єднання. Перевірте, чи запущено службу DWAgent.',
    'errorConnectionQuestion':u'Помилка з\'єднання. Перевірте підключення до Інтернету або налаштування брандмауера.\nВи хочете налаштувати проксі-сервер?',
    'errorInvalidCode':u'Введений код недійсний.',
    'errorInvalidUserPassword':u'Недійсний користувач або пароль.',
    'fieldRequired':u'Поле \'{0}\' є обов\'язковим.',
    'install':u'Встановити',
    'installMonitor':u'Встановлення монітора ...',
    'installMonitorErr':u'Помилка встановлення монітора.',
    'installService':u'Встановлення служби ...',
    'installServiceErr':u'Помилка інсталяції служби.',
    'installShortcuts':u'Встановлення ярликів ...',
    'installShortcutsErr':u'Не вдалося встановити ярлики інсталяції.',
    'installerNotSupported':u'Цей інсталятор більше не підтримується. Будь ласка, завантажте останню версію.',
    'ipAddress':u'IP Адреса: {0}',
    'linuxRootPrivileges':u'Для встановлення DWAgent необхідно мати права адміністратора.\nЗапустіть скрипт від імені адміністратора.',
    'menuConfigure':u'Налаштувати',
    'menuMonitor':u'Монітор',
    'menuUninstall':u'Видалити',
    'missingInfoFile':u'Файл info.json не знайдено.',
    'missingNative':u'Native не знайдено',
    'missingRuntime':u'Runtime не знайдено.',
    'monitorActive':u'Активний',
    'monitorAgentDisabled':u'Агент вимкнено.',
    'monitorAgentEnabled':u'Агент увімкнено.',
    'monitorConfigure':u'Налаштувати',
    'monitorConnections':u'З\'єднання',
    'monitorCurrentActivities':u'Поточна діяльність',
    'monitorDisable':u'Вимкнути',
    'monitorDisableAgentQuestion':u'Ви хочете вимкнути агента?',
    'monitorDownload':u'Скачати',
    'monitorEnable':u'Увімкнути',
    'monitorEnableAgentQuestion':u'Хочете увімкнути агента?',
    'monitorEnterPassword':u'Введіть пароль:',
    'monitorErrorConnectionConfig':u'Помилка з\'єднання. Перевірте, чи запущено службу DWAgent.',
    'monitorHide':u'Приховати',
    'monitorInvalidPassword':u'Недійсний пароль.',
    'monitorNoActivities':u'Жодної діяльності',
    'monitorScreenCapture':u'Скріншот',
    'monitorSession':u'Сесія',
    'monitorShellSession':u'Оболонка',
    'monitorShow':u'Показати',
    'monitorStatus':u'Стан',
    'monitorStatusDisabled':u'Вимкнено',
    'monitorStatusNoService':u'Не обслуговується',
    'monitorStatusOffline':u'Офлайн',
    'monitorStatusOnline':u'Онлайн',
    'monitorStatusUpdating':u'Оновлення',
    'monitorTitle':u'DWAgent - монітор',
    'monitorUninstall':u'Видалити',
    'monitorUninstallNotRun':u'Ви не можете видалити без прав адміністратора.\nЗапустіть команду dwaguninstall в оболонці.',
    'monitorUpload':u'Завантажити',
    'mustAccept':u'Щоб продовжити, потрібно вибрати опцію {0}',
    'mustSelectOptions':u'Необхідно вибрати опцію.',
    'next':u'Далі',
    'no':u'Ні',
    'noTryAgain':u'Ні, спробуйте ще раз',
    'notInstalled':u'DWAgent не встановлено.',
    'ok':u'Ok',
    'option':u'опція',
    'optionNotValid':u'Вибрана опція недійсна.',
    'or':u'або',
    'password':u'Пароль',
    'path':u'Шлях до',
    'pathCreating':u'Створення папки ...',
    'pathNotCreate':u'Не вдалося створити папку. Недійсний шлях або дозвіл заборонено.',
    'pressEnter':u'Натисніть enter, щоб продовжити.',
    'privacyPolicy':u'Політика конфіденційності',
    'proxyAuthPassword':u'Пароль',
    'proxyAuthUser':u'Користувач',
    'proxyHost':u'Хост',
    'proxyHttp':u'Http',
    'proxyInfo':u'Вставити інформацію про проксі.',
    'proxyNone':u'Немає',
    'proxyPort':u'Порт',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Система',
    'reEnterCode':u'Введіть код повторно',
    'reEnterData':u'Введіть дані повторно',
    'rePassword':u'Повторіть пароль',
    'reject':u'відхилино',
    'removeFile':u'Видалення файлу ...',
    'runWithoutInstallation':u'Запустити',
    'runWithoutInstallationClosing':u'Закриття сеансу ...',
    'runWithoutInstallationConnecting':u'Відкриття сеансу ...',
    'runWithoutInstallationEnd':u'Сесія закінчилася.',
    'runWithoutInstallationOnlineBottom':u'УВАГА:\nНе розголошувати цю інформацію людям, яким не довіряєте, інакше дозвольте їм отримати доступ до цього агента. Отже, якщо ви не впевнені, що робите, закрийте цю програму.',
    'runWithoutInstallationOnlineBottomPutCode':u'УВАГА:\nТепер агент готовий приймати з\'єднання. Отже, якщо ви не впевнені, що робите, закрийте цю програму.',
    'runWithoutInstallationOnlinePassword':u'Пароль: {0}',
    'runWithoutInstallationOnlineTop':u'Сеанс активний.\nЩоб підключитися до цього агента, перейдіть на сторінку https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Сеанс активний.',
    'runWithoutInstallationOnlineUser':u'Користувач: {0}',
    'runWithoutInstallationStarting':u'Запуск агента ...',
    'runWithoutInstallationUnexpectedError':u'Неочікувана помилка.\nНе вдалося запустити DWAgent. Якщо проблема не зникає, спробуйте скачати останню версію DWAgent, видаліть папку \'{0}\' і знову запустіть DWAgent.',
    'runWithoutInstallationUpdating':u'Оновлення агента ...',
    'runWithoutInstallationWait':u'Зачекайте, поки відбуватиметься нове з\'єднання (спроба {0}) ...',
    'selectPathInstall':u'Виберіть шлях встановлення:',
    'skipCertValidation':u'Попередження: Сертифікат безпеки не можна перевірити, якщо ви продовжите, з’єднання може бути незахищеним.\nПеревірте мережеву або локальну конфігурацію маршрутизатора/брандмауера/антивірусу.\nВсе одно продовжити?',
    'startService':u'Запуск служби ...',
    'startServiceErr':u'Помилка запуску служби.',
    'termsAndConditions':u'Правила та умови',
    'titleInstall':u'DWAgent - Установка',
    'titleUninstall':u'DWAgent - Видалення',
    'toBack':u'повернутися.',
    'toExit':u'до виходу.',
    'unattendedAccess':u'Неконтрольований\nдоступ',
    'unexpectedError':u'Неочікувана помилка.\n{0}',
    'uninstallMonitor':u'Видалення монітора ...',
    'uninstallService':u'Видалення служби ...',
    'uninstallShortcuts':u'Видалення ярликів ...',
    'unknownUser':u'Невідомий користувач',
    'user':u'Користувач',
    'validInteger':u'Поле \'{0}\' має бути цілим числом.',
    'versionInstallNotValid':u'Версія інсталятора неправильна для вашої операційної системи.\nСкачайте правильну версію. {0}',
    'waiting':u'Очікування ...',
    'warningLoginLogout':u'Щоб ця зміна набрала чинності, користувач повинен вийти та ввійти ще раз.',
    'warningRemovePath':u'Попередження: папка призначення вже існує, вона буде видалена.',
    'warningSpyingTool':u'Зверніть увагу, що ви не можете отримати доступ до віддаленого комп’ютера без згоди його користувача. Використовуючи DWService як інструмент шпигунства, ви, можливо, порушуєте закони вашої країни проживання.',
    'welcomeLicense':u'Ліцензія\nЦе програмне забезпечення є вільним і з відкритим кодом.\nВін складається з одного основного компонента і декількох додаткових компонентів, визначених "app", які можуть регулюватися різними ліцензіями. Додаткова інформація-на сайті: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Продовжуючи встановлення або запуск цього програмного забезпечення, ви погоджуєтесь з #TERMSANDCONDITIONS і #PRIVACYPOLICY',
    'welcomeSecurity':u'Безпека\nЩоб захистити вашу конфіденційність, ми гарантуємо, що на наших серверах не буде збережено жодної інформації, а зв\'язок буде зашифрованим, тому треті сторони не зможуть їх прочитати.',
    'welcomeSoftwareUpdates':u'Оновлення програмного забезпечення\nОновлення цього програмного забезпечення є автоматичними.',
    'windowsAdminPrivileges':u'Для встановлення DWAgent необхідно мати права адміністратора.\nБудь ласка, запустіть виконуваний файл із \'запустити від імені адміністратора\'.',
    'yes':u'Так'
}
                       ui/messages/no.py                                                                                   0000644 0001750 0001750 00000023666 13560001665 013575  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Jeg godtar',
    'agentName':u'Agentnavn',
    'alreadyInstalled':u'DWAgent er allerede installert.\n\nAgenten vil automatisk oppdatere seg til nyere versjon. Dette betyr at du aldri mer vil trenge å manuelt installere oppdateringer.',
    'back':u'Tilbake',
    'cancel':u'Avbryt',
    'cancelInstall':u'Installasjonen ble kanselert.',
    'cancelUninstall':u'Jeg godtar',
    'checkInstallCode':u'Sjekker installasjonskode...',
    'chooseProxyType':u'Hvilken proxy vil du bruke?',
    'close':u'Lukk',
    'code':u'Kode',
    'commands':u'Kommandoer',
    'configureAgent':u'Konfigurer agent',
    'configureAgentDisabled':u'Agenten er deaktivert.',
    'configureAgentEnabled':u'Agenten er på.',
    'configureChangeInstallKey':u'Endre installasjonskode',
    'configureChooseMonitorTrayIconVisibility':u'Vil du vise agenten i oppgavelinjen?',
    'configureChooseOperation':u'Vennligst velg en oppgave:',
    'configureDisableAgent':u'Deaktiver agent',
    'configureDisableAgentQuestion':u'Ønsker du å deaktivere agenten?',
    'configureEnableAgent':u'Slå på agent',
    'configureEnableAgentQuestion':u'Ønsker du å slå på agenten?',
    'configureEnd':u'Konfigurasjonen er fullført.',
    'configureErrorConnection':u'Tilkoblingsfeil. Vær vennlig å sjekke om DWAgent tjenesten kjører.',
    'configureExit':u'Gå ut',
    'configureInsertPassword':u'Venligst skriv konfigurasjonspassord:',
    'configureInstallAgent':u'Hvordan foretrekker du å konfigurere agenten?',
    'configureInstallCode':u'Skriv inn installasjonskoden',
    'configureInstallNewAgent':u'Lag ny agent',
    'configureInvalidPassword':u'Ugyldig passord',
    'configureKeyInstalled':u'Nøkkel ble installert',
    'configureLater':u'Konfigurer senere',
    'configureMonitor':u'Konfigurer monitor',
    'configurePassword':u'Konfigurer passord',
    'configurePasswordErrNoMatch':u'Passordene er ikke like',
    'configurePasswordUpdated':u'Passord oppdatert.',
    'configureProxy':u'Konfigurer proxy.',
    'configureProxyEnd':u'Proxy er nå konfigurert.',
    'configureRemovePassword':u'Fjern passord',
    'configureRemovePasswordQuestion':u'Ønsker du å fjerne passordet?',
    'configureSetPassword':u'Sett passord',
    'configureTitle':u'DWAgent - konfigurasjon',
    'configureTrayIconOK':u'Skuff ikon synlighet, konfigurert vellykket.',
    'configureTrayIconVisibility':u'Skuff ikon synlighet',
    'configureUninstallKeyQuestion':u'Fjern den gjeldende installasjonskoden?',
    'configureUninstallationKey':u'Avinstallerer...',
    'confirmExit':u'Ønsker du å avslutte?',
    'confirmInstall':u'Vil du installere DWAgent til \'{0}\'?',
    'confirmUninstall':u'Ønsker du å fjerne DWAgent?',
    'copyFiles':u'Kopierer filer...',
    'createNewAgent':u'Oppretter agent...',
    'decline':u'Jeg godtar ikke',
    'downloadFile':u'Last ned fil {0}...',
    'dwsPassword':u'DWS passord',
    'dwsUser':u'DWS bruker',
    'endInstall':u'Installasjonen er fullført.',
    'endInstallConfigLater':u'Installasjon er fullført.\nAgenten har ikke blitt konfigurert. Du kan fortsette med konfigurasjonen senere.',
    'endUninstall':u'Avinstallering fullført.',
    'enter':u'skriv inn',
    'enterInstallCode':u'Skriv inn installasjonskoden',
    'enterInstallNewAgent':u'Angi data for å lage en ny agent:',
    'enterRunCode':u'Skriv inn tilkoblingskoden',
    'error':u'Feil',
    'errorAgentAlreadyExsists':u'Agenten {0} finnes allerede.',
    'errorAgentMax':u'Overgått maksimum antall agenter.',
    'errorAgentNameNotValid':u'Agent navnet er ikke gyldig. Du kan ikke bruke symbolene / \ | # @ : .',
    'errorConnectionConfig':u'Tilkoblingsfeil. Vær så snill å sjekke om DWAgent tjenesten er startet.',
    'errorConnectionQuestion':u'Tilkoblingsfeil. Vær så snill å sjekke internett tilkoblingen din eller brannmur konfigurasjonen.\nVil du konfigurere proxy?',
    'errorInvalidCode':u'Koden angitt er invalid.',
    'errorInvalidUserPassword':u'Ugyldig bruker eller passord.',
    'fieldRequired':u'Feltet \'{0}\' er krevet.',
    'install':u'Installer',
    'installMonitor':u'Installerer monitor...',
    'installMonitorErr':u'Installasjon monitor feilet.',
    'installService':u'Installerer tjeneste...',
    'installServiceErr':u'Installasjon tjeneste feilet.',
    'installShortcuts':u'Installerer snarveier...',
    'installShortcutsErr':u'Installasjon snarveier feilet.',
    'linuxRootPrivileges':u'Du må ha rot privilegier for å installere DWAgent.\nVennligst start skriptet ved bruk av rot bruker.',
    'menuConfigure':u'Konfigurer',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Avinstaller',
    'missingInfoFile':u'Fil info.json ikke funnet.',
    'missingNative':u'Native ikke funnet.',
    'missingRuntime':u'Runtime ikke funnet.',
    'monitorAgentDisabled':u'Agent deaktivert.',
    'monitorAgentEnabled':u'Agent aktivert.',
    'monitorConfigure':u'Konfigurer',
    'monitorConnections':u'Tilkoblinger',
    'monitorDisable':u'Deaktiver',
    'monitorDisableAgentQuestion':u'Vil du deaktivere agenten?',
    'monitorEnable':u'Aktiver',
    'monitorEnableAgentQuestion':u'Vil du aktivere agenten?',
    'monitorEnterPassword':u'Angi passord:',
    'monitorErrorConnectionConfig':u'Tilkoblingsfeil. Vær så snill å sjekke om DWAgent tjenesten er startet.',
    'monitorHide':u'Skjul',
    'monitorInvalidPassword':u'Ugyldig passord.',
    'monitorShow':u'Vis',
    'monitorStatus':u'Status',
    'monitorStatusDisabled':u'Deaktivert',
    'monitorStatusNoService':u'Ingen tjeneste',
    'monitorStatusOffline':u'Av nett',
    'monitorStatusOnline':u'På nett',
    'monitorStatusUpdating':u'Oppdaterer',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Avinstaller',
    'monitorUninstallNotRun':u'Du kan ikke installere uten rot permisjoner.\nKjør kommandoen dwaguninstall i shell.',
    'mustAccept':u'For å fortsette, må du velge alternativ {0}',
    'mustSelectOptions':u'Du må velge et alternativ.',
    'next':u'Neste',
    'no':u'Nei',
    'noTryAgain':u'Nei, prøv igjen',
    'notInstalled':u'DWAgent ikke installert.',
    'ok':u'Ok',
    'option':u'Alternativ',
    'optionNotValid':u'Alternativ valgt er ugyldig.',
    'or':u'eller',
    'password':u'Passord',
    'path':u'Sti',
    'pathCreating':u'Mappe opprettelse...',
    'pathNotCreate':u'Kunne ikke lage mappe. Ugyldig sti eller permisjon benektet.',
    'pressEnter':u'Trykk på enter for å fortsette.',
    'proxyAuthPassword':u'Passord',
    'proxyAuthUser':u'Bruker',
    'proxyHost':u'Vert',
    'proxyHttp':u'Http',
    'proxyInfo':u'Sett inn proxy informasjon.',
    'proxyNone':u'Ingen',
    'proxyPort':u'Port',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'System',
    'reEnterCode':u'Skriv koden på nytt',
    'reEnterData':u'Skriv data-en på nytt',
    'rePassword':u'Skriv passord igjen',
    'removeFile':u'Fjerner fil...',
    'runWithoutInstallation':u'Kjør',
    'runWithoutInstallationClosing':u'Lukker økt...',
    'runWithoutInstallationConnecting':u'Åpner økt...',
    'runWithoutInstallationEnd':u'Økt avsluttet.',
    'runWithoutInstallationOnlineBottom':u'ADVARSEL:\nIkke del denne informasjonen med folk som ikke er klarert, ellers vil du tillate dem tilgang til denne agenten. Dersom du ikke er sikker på hva du gjør, vær så snill å lukke denne applikasjonen.',
    'runWithoutInstallationOnlineBottomPutCode':u'ADVARSEL:\nAgenten er nå klar til tilkobling',
    'runWithoutInstallationOnlinePassword':u'Passord: {0}',
    'runWithoutInstallationOnlineTop':u'Denne økten er aktiv.\nFor å koble til denne agenten gå til https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Økten er aktiv.',
    'runWithoutInstallationOnlineUser':u'Bruker: {0}',
    'runWithoutInstallationStarting':u'Agent oppstart...',
    'runWithoutInstallationUnexpectedError':u'Uforventet feil.\nDet var ikke mulig å starte DWAgent. Hvis problemet fortsetter, prøv å laste ned den nyeste utgaven av DWAgent, slett mappen \'{0}\' og kjør DWAgent igjen.',
    'runWithoutInstallationUpdating':u'Agent oppdatering...',
    'runWithoutInstallationWait':u'Vent på den nye tilkoblingen i prosess (forsøk {0})...',
    'selectPathInstall':u'Velg en ny installasjons vei:',
    'startService':u'Starter tjenesten...',
    'startServiceErr':u'Tjeneste start feilet.',
    'titleInstall':u'DWAgent - Installasjon',
    'titleUninstall':u'DWAgent - Avinstallasjon',
    'toBack':u'å gå tilbake.',
    'toExit':u'å gå ut av.',
    'unexpectedError':u'Uforventet feil.\n{0}',
    'uninstallMonitor':u'Avinstallerer monitor...',
    'uninstallService':u'Avinstallerer tjeneste...',
    'uninstallShortcuts':u'Avinstallerer snarveier...',
    'user':u'Bruker',
    'validInteger':u'Feltet \'{0}\' må være et integer.',
    'versionInstallNotValid':u'Versjonen av installatøren er ikke korrekt for ditt operativsystem.\nVær så snill å laste ned korrekt versjon. {0}',
    'waiting':u'Venter...',
    'warningRemovePath':u'Advarsel destinasjons mappen eksisterer allerede da blir den slettet',
    'welcomeLicense':u'Lisens\nDette programvare er gratis og åpen kilde.\nDen består av en hoved komponent og flere tilbehør komponenter definert "app" som kan bli styrt av forskjellige lisenser. For mer informasjon besøk: https://www.dwservice.net/en/licenses-sources.html',
    'welcomeSecurity':u'Sikkerhet\nFor å beskytte ditt privatliv garanterer vi at ingen informasjon vil bli lagret i våre servere og kommunikasjoner er kryptert så tredjepartier ikke kan lese de.',
    'welcomeSoftwareUpdates':u'Programvare oppdateringer\nOppdateringene til denne programvaren er automatisk.',
    'windowsAdminPrivileges':u'Du må ha administrator privilegier for å installere DWAgent.\nVær så snill å starte den kjørbare med \'kjør som administrator\'.',
    'yes':u'Ja'
}
                                                                          ui/messages/default.py                                                                              0000755 0001750 0001750 00000027201 14406630070 014573  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'I accept',
    'agentName':u'Agent name',
    'alreadyInstalled':u'DWAgent already installed.\n\nThe agent automatically updates to the last version. It means that you do not need to manually install newer updates.',
    'back':u'Back',
    'cancel':u'Cancel',
    'cancelInstall':u'The installation was canceled.',
    'cancelUninstall':u'The uninstallation was canceled.',
    'checkInstallCode':u'Checking installation code...',
    'chooseProxyType':u'What proxy type do you want to use?',
    'close':u'Close',
    'code':u'Code',
    'commands':u'Commands',
    'configureAgent':u'Configure agent',
    'configureAgentDisabled':u'Agent disabled.',
    'configureAgentEnabled':u'Agent enabled.',
    'configureChangeInstallKey':u'Change installation code',
    'configureChooseMonitorTrayIconVisibility':u'Do you want show monitor icon in tray?',
    'configureChooseOperation':u'Please choose an operation:',
    'configureDisableAgent':u'Disable agent',
    'configureDisableAgentQuestion':u'Do you want disable the agent?',
    'configureEnableAgent':u'Enable agent',
    'configureEnableAgentQuestion':u'Do you want enable the agent?',
    'configureEnd':u'Configuration has been completed.',
    'configureErrorConnection':u'Connection error. Please check if the DWAgent service is running.',
    'configureExit':u'Exit',
    'configureInsertPassword':u'Please enter config password:',
    'configureInstallAgent':u'How would you like to configure the agent?',
    'configureInstallCode':u'Enter the installation code',
    'configureInstallNewAgent':u'Creating a new agent',
    'configureInvalidPassword':u'Invalid password.',
    'configureKeyInstalled':u'Key installed successfully.',
    'configureLater':u'Configure later',
    'configureMonitor':u'Configure monitor',
    'configurePassword':u'Configure password',
    'configurePasswordErrNoMatch':u'The passwords do not match.',
    'configurePasswordUpdated':u'Password updated.',
    'configureProxy':u'Configure proxy',
    'configureProxyEnd':u'Proxy configured successfully.',
    'configureRemovePassword':u'Remove password',
    'configureRemovePasswordQuestion':u'Do you want remove the password?',
    'configureSetPassword':u'Set password',
    'configureTitle':u'DWAgent - Configuration',
    'configureTrayIconOK':u'Tray icon configured successfully.',
    'configureTrayIconVisibility':u'Tray icon visibility',
    'configureUninstallKeyQuestion':u'Uninstall the current installation code?',
    'configureUninstallationKey':u'Uninstallation...',
    'confirmExit':u'Are you sure you want to exit?',
    'confirmInstall':u'Do you want to install DWAgent to \'{0}\'?',
    'confirmUninstall':u'Do you want remove DWAgent?',
    'copyFiles':u'Copying files...',
    'createNewAgent':u'Agent creation in progress...',
    'decline':u'I do not accept',
    'downloadFile':u'Downloading file {0}...',
    'configureInstallPassword':u'Installation password',
    'configureInstallUser':u'User',
    'endInstall':u'Installation has been completed.',
    'endInstallConfigLater':u'Installation has completed.\nThe agent has not been configured. You can still create the configuration later.',
    'endUninstall':u'Uninstallation has completed.',
    'enter':u'enter',
    'enterInstallCode':u'Enter the installation code',
    'enterInstallNewAgent':u'Enter data to create a new agent:',
    'enterRunCode':u'Enter the connection code',
    'error':u'Error',
    'errorAgentAlreadyExsists':u'The agent {0} already exists.',
    'errorAgentMax':u'Exceeded maximum number of agents.',
    'errorAgentNameNotValid':u'The agent name is not valid. You can not use the characters / \ | # @ : .',
    'errorConnectionConfig':u'Connection error. Please check if the DWAgent service is running.',
    'errorConnectionQuestion':u'Connection error. Please check your internet connection or firewall.\nDo you want to configure a proxy?',
    'errorInvalidCode':u'The code entered is invalid.',
    'errorInvalidUserPassword':u'Invalid user or password.',
    'fieldRequired':u'The field \'{0}\' is required.',
    'install':u'Install',
    'installMonitor':u'Installing monitor...',
    'installMonitorErr':u'Installation monitor failed.',
    'installService':u'Installing service...',
    'installServiceErr':u'Service installation failed.',
    'installShortcuts':u'Installing shortcuts...',
    'installShortcutsErr':u'Shortcut installation failed.',
    'linuxRootPrivileges':u'You must have root privileges to install DWAgent.\nPlease run the script with sudo or as root.',
    'menuConfigure':u'Configure',
    'menuMonitor':u'Monitor',
    'menuUninstall':u'Uninstall',
    'missingInfoFile':u'File info.json not found.',
    'missingNative':u'Native not found.',
    'missingRuntime':u'Runtime not found.',
    'monitorAgentDisabled':u'Agent disabled.',
    'monitorAgentEnabled':u'Agent enabled.',
    'monitorConfigure':u'Configure',
    'monitorConnections':u'Connections',
    'monitorDisable':u'Disable',
    'monitorDisableAgentQuestion':u'Do you want disable the agent?',
    'monitorEnable':u'Enable',
    'monitorEnableAgentQuestion':u'Do you want enable the agent?',
    'monitorEnterPassword':u'Enter password:',
    'monitorErrorConnectionConfig':u'Connection error. Please check if the DWAgent service is running.',
    'monitorHide':u'Hide',
    'monitorInvalidPassword':u'Invalid password.',
    'monitorShow':u'Show',
    'monitorStatus':u'Status',
    'monitorStatusDisabled':u'Disabled',
    'monitorStatusNoService':u'No service',
    'monitorStatusOffline':u'Offline',
    'monitorStatusOnline':u'Online',
    'monitorStatusUpdating':u'Updating',
    'monitorTitle':u'DWAgent - Monitor',
    'monitorUninstall':u'Uninstall',
    'monitorUninstallNotRun':u'You can not uninstall without root permissions.\nRun the command dwaguninstall with sudo or as root.',
    'mustAccept':u'In order to continue, you must select the option {0}',
    'mustSelectOptions':u'You must select an option.',
    'next':u'Next',
    'no':u'No',
    'noTryAgain':u'No, try again',
    'notInstalled':u'DWAgent not installed.',
    'ok':u'OK',
    'option':u'Option',
    'optionNotValid':u'Selected option is invalid.',
    'or':u'or',
    'password':u'Password',
    'path':u'Path',
    'pathCreating':u'Folder creation...',
    'pathNotCreate':u'Could not create the folder. Invalid path or permission denied.',
    'pressEnter':u'Press enter to continue.',
    'proxyAuthPassword':u'Password',
    'proxyAuthUser':u'User',
    'proxyHost':u'Host',
    'proxyHttp':u'HTTP',
    'proxyInfo':u'Insert proxy info.',
    'proxyNone':u'None',
    'proxyPort':u'Port',
    'proxySocks4':u'SOCKS4',
    'proxySocks4a':u'SOCKS4a',
    'proxySocks5':u'SOCKS5',
    'proxySystem':u'System',
    'reEnterCode':u'Re-enter the code',
    'reEnterData':u'Re-enter the data',
    'rePassword':u'Retype Password',
    'removeFile':u'Removing file...',
    'runWithoutInstallation':u'Run',
    'runWithoutInstallationClosing':u'Closing session...',
    'runWithoutInstallationConnecting':u'Opening session...',
    'runWithoutInstallationEnd':u'Session ended.',
    'runWithoutInstallationOnlineBottom':u'WARNING:\nDo not disclose this information to people you don\'t trust. It will allow them to access this device. If you are not sure what are you doing, please close this application.',
    'runWithoutInstallationOnlineBottomPutCode':u'WARNING:\nThe agent is now ready to accept a connection. If you are not sure what are you doing, please close this application.',
    'runWithoutInstallationOnlinePassword':u'Password: {0}',
    'runWithoutInstallationOnlineTop':u'The session is active.\nTo connect to this agent go to https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'The session is active.',
    'runWithoutInstallationOnlineUser':u'User: {0}',
    'runWithoutInstallationStarting':u'Agent startup...',
    'runWithoutInstallationUnexpectedError':u'Unexpected error.\nDWAgent was unable to start. If the problem persists, please download the latest release of DWAgent, delete the folder \'{0}\' and run DWAgent again.',
    'runWithoutInstallationUpdating':u'Agent update...',
    'runWithoutInstallationWait':u'Wait for the new connection in progress (attempt {0})...',
    'selectPathInstall':u'Select the installation path:',
    'startService':u'Starting service...',
    'startServiceErr':u'Failed to start service.',
    'titleInstall':u'DWAgent - Installation',
    'titleUninstall':u'DWAgent - Uninstallation',
    'toBack':u'to go back.',
    'toExit':u'to exit.',
    'unexpectedError':u'Unexpected error.\n{0}',
    'uninstallMonitor':u'Uninstalling monitor...',
    'uninstallService':u'Uninstalling service...',
    'uninstallShortcuts':u'Uninstalling shortcuts...',
    'user':u'User',
    'validInteger':u'The field \'{0}\' must be an integer.',
    'versionInstallNotValid':u'This version of the installer is not correct for your operating system.\nPlease download the correct version. {0}',
    'waiting':u'Waiting...',
    'warningRemovePath':u'Warning: the destination folder already exists and will be deleted.',
    'welcomeLicense':u'License\nThis software is free and open source.\nIt consists of one main component released under the MPLv2 license and several additional components that are governed by different licenses. For more information, visit: https://www.dwservice.net/en/licenses-sources.html',
    'welcomeSecurity':u'Security\nTo protect your privacy we don\'t store information from the agent on our servers. Communications between users, our servers and agents are encrypted so that third parties can\'t access them.',
    'welcomeSoftwareUpdates':u'Software updates\nThis software updates automatically',
    'welcomePrivacyTerms':u'By proceeding with the installation or running this software you agree to the #TERMSANDCONDITIONS and the #PRIVACYPOLICY',
    'termsAndConditions': u'Terms and Conditions',
    'privacyPolicy': u'Privacy policy',
    'windowsAdminPrivileges':u'You must have administrative privileges to install DWAgent.\nPlease right click the executable and click \'run as administrator\' to start the installer.',
    'yes':u'Yes',
    'monitorCurrentActivities': u'Current activities',
    'monitorNoActivities': u'No activities',
    'monitorSession': u'Session',
    'monitorScreenCapture': u'Screen access',
    'monitorShellSession': u'Shell access',
    'monitorDownload': u'Download',
    'monitorUpload': u'Upload',
    'monitorActive': u'active',
    'configureDesktopNotification': u'Desktop notification',
    'configureDesktopNotificationOK': u'Desktop notification configured successfully.',
    'desktopNotificationVisible': u'Visible',
    'desktopNotificationAutoHide': u'Automatically hide',
    'desktopNotificationNone': u'None',
    'warningSpyingTool': u'Please be aware that you may not access a remote computer without the consent of its user. By using DWService as a spying tool you may be infringing laws in your country of residence.',
    'warningLoginLogout': u'For this change to take effect, the user must logout and login again.',
    'reject': u'Reject',
    'ipAddress': u'IP Address: {0}',
    'accessConfirm': u'Would like to access to your device.',
    'unattendedAccess': u'Unattended\naccess',
    'unknownUser': u'Unknown user',
    'skipCertValidation': u'Warning: The security certificate cannot be validated, if you proceed the connection may not be secure.\nPlease check the router/firewall/antivirus configuration of the network or local.\nProceed anyway?',
    'installerNotSupported': u'This installer is no longer supported. Please download latest version.'
}
                                                                                                                                                                                                                                                                                                                                                                                               ui/messages/ru.py                                                                                   0000644 0001750 0001750 00000040634 14443646226 013612  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

data={
    'accept':u'Принимаю',
    'accessConfirm':u'Получить доступ к своему устройству.',
    'agentName':u'Имя агента',
    'alreadyInstalled':u'DWAgent уже установлен.\n\nАгент автоматически обновляется до последней версии. Это означает, что вам не нужно вручную устанавливать новые обновления.',
    'back':u'Назад',
    'cancel':u'Отмена',
    'cancelInstall':u'Установка была отменена.',
    'cancelUninstall':u'Деинсталляция была отменена.',
    'checkInstallCode':u'Проверка кода установки...',
    'chooseProxyType':u'Какой тип прокси вы хотите использовать?',
    'close':u'Закрыть',
    'code':u'Код',
    'commands':u'Команды',
    'configureAgent':u'Настроить агента',
    'configureAgentDisabled':u'Агент отключен.',
    'configureAgentEnabled':u'Агент включен.',
    'configureChangeInstallKey':u'Сменить код установки',
    'configureChooseMonitorTrayIconVisibility':u'Показывать значок монитора в трее?',
    'configureChooseOperation':u'Пожалуйста, выберите дейстие:',
    'configureDesktopNotification':u'Уведомления на рабочем столе',
    'configureDesktopNotificationOK':u'Уведомления на рабочем столе настроены.',
    'configureDisableAgent':u'Отключить агента',
    'configureDisableAgentQuestion':u'Вы хотите отключить агента?',
    'configureEnableAgent':u'Включить агента',
    'configureEnableAgentQuestion':u'Вы хотите включить агента?',
    'configureEnd':u'Настройка завершена.',
    'configureErrorConnection':u'Ошибка соединения. Проверьте, что служба DWAgent запущена.',
    'configureExit':u'Выход',
    'configureInsertPassword':u'Пожалуйста, вставьте пароль конфигурации:',
    'configureInstallAgent':u'Как вы хотите настроить агента?',
    'configureInstallCode':u'Введите код установки',
    'configureInstallNewAgent':u'Создание нового агента',
    'configureInstallPassword':u'Установка пароля',
    'configureInstallUser':u'Пользователь',
    'configureInvalidPassword':u'Неверный пароль.',
    'configureKeyInstalled':u'Ключ установлен успешно.',
    'configureLater':u'Настроить позже',
    'configureMonitor':u'Настроить мониторинг',
    'configurePassword':u'Настроить пароль',
    'configurePasswordErrNoMatch':u'Пароль не совпадает.',
    'configurePasswordUpdated':u'Пароль обновлен.',
    'configureProxy':u'Настроить прокси',
    'configureProxyEnd':u'Прокси настроен успешно.',
    'configureRemovePassword':u'Убрать пароль',
    'configureRemovePasswordQuestion':u'Хотите убрать пароль?',
    'configureSetPassword':u'Установить пароль',
    'configureTitle':u'DWAgent - Настройки',
    'configureTrayIconOK':u'Видимость значка в трее настроена успешно.',
    'configureTrayIconVisibility':u'Видимость значка в трее',
    'configureUninstallKeyQuestion':u'Удалить текущий код установки?',
    'configureUninstallationKey':u'Удаление...',
    'confirmExit':u'Действительно выйти?',
    'confirmInstall':u'Хотите установить DWAgent на \'{0}\'?',
    'confirmUninstall':u'Хотите удалить DWAgent?',
    'copyFiles':u'Копирую...',
    'createNewAgent':u'Создание агента...',
    'decline':u'Не принимаю',
    'desktopNotificationAutoHide':u'Автоматическое скрытие уведомления',
    'desktopNotificationNone':u'Без уведомления',
    'desktopNotificationVisible':u'Видимое уведомление',
    'downloadFile':u'Скачивание файла {0}...',
    'endInstall':u'Установка завершена.',
    'endInstallConfigLater':u'Установка завершена.\nАгент не был настроен. Вы можете приступить к конфигурации позднее.',
    'endUninstall':u'Удаление завершено.',
    'enter':u'ввод',
    'enterInstallCode':u'Введите код установки',
    'enterInstallNewAgent':u'Введите данные для создания нового агента:',
    'enterRunCode':u'Введите код соединения',
    'error':u'Ошибка',
    'errorAgentAlreadyExsists':u'Агент {0} уже существует.',
    'errorAgentMax':u'Превышено максимальное число агентов.',
    'errorAgentNameNotValid':u'Имя агента недопустимо. Нельзя использовать символы / \ | # @ : .',
    'errorConnectionConfig':u'Ошибка соединения. Проверьте, запущена ли служба DWAgent.',
    'errorConnectionQuestion':u'Ошибка соединения. Проверьте подключение к интернету или настройки брандмауэра.\nХотите настроить прокси?',
    'errorInvalidCode':u'Введенный код недействителен.',
    'errorInvalidUserPassword':u'Неверное имя пользователя или пароль.',
    'fieldRequired':u'Поле \'{0}\' является обязательным.',
    'install':u'Установить',
    'installMonitor':u'Мониторинг устанавливается...',
    'installMonitorErr':u'Не удалось установить мониторинг.',
    'installService':u'Установка службы...',
    'installServiceErr':u'Не удалось установить службу.',
    'installShortcuts':u'Установка ярлыков...',
    'installShortcutsErr':u'Не удалось установить ярлыки.',
    'installerNotSupported':u'Эта версия устарела. Пожалуйста, скачайте последнюю версию.',
    'ipAddress':u'IP-адрес: {0}',
    'linuxRootPrivileges':u'У вас должны быть права суперпользователя, чтобы установить DWAgent.\nЗапустите скрипт с помощью пользователя root.',
    'menuConfigure':u'Настройка',
    'menuMonitor':u'Мониторинг',
    'menuUninstall':u'Удаление',
    'missingInfoFile':u'Файл info.json не найден.',
    'missingNative':u'Native не найден.',
    'missingRuntime':u'Runtime не найден.',
    'monitorActive':u'активно',
    'monitorAgentDisabled':u'Агент отключен.',
    'monitorAgentEnabled':u'Агент включен.',
    'monitorConfigure':u'Настройка',
    'monitorConnections':u'Соединения',
    'monitorCurrentActivities':u'Активные соединения',
    'monitorDisable':u'Отключить',
    'monitorDisableAgentQuestion':u'Хотите отключить агента?',
    'monitorDownload':u'Скачать',
    'monitorEnable':u'Включить',
    'monitorEnableAgentQuestion':u'Хотите включить агента?',
    'monitorEnterPassword':u'Введите пароль:',
    'monitorErrorConnectionConfig':u'Ошибка соединения. Проверьте, запущена ли служба DWAgent.',
    'monitorHide':u'Скрыть',
    'monitorInvalidPassword':u'Неверный пароль.',
    'monitorNoActivities':u'Активности нет',
    'monitorScreenCapture':u'Захват экрана',
    'monitorSession':u'Сессия',
    'monitorShellSession':u'Консоль',
    'monitorShow':u'Показать',
    'monitorStatus':u'Состояние',
    'monitorStatusDisabled':u'Выключено',
    'monitorStatusNoService':u'Не обслуживается',
    'monitorStatusOffline':u'Офлайн',
    'monitorStatusOnline':u'Онлайн',
    'monitorStatusUpdating':u'Обновление',
    'monitorTitle':u'DWAgent - Мониторинг',
    'monitorUninstall':u'Удаление',
    'monitorUninstallNotRun':u'Вы не можете удалить без прав суперпользователя.\nЗапустите команду dwaguninstall в консоли.',
    'monitorUpload':u'Закачать',
    'mustAccept':u'Для продолжения необходимо выбрать опцию {0}',
    'mustSelectOptions':u'Необходимо выбрать опцию.',
    'next':u'Далее',
    'no':u'Нет',
    'noTryAgain':u'Нет, попробовать еще раз',
    'notInstalled':u'DWAgent не установлен.',
    'ok':u'Ok',
    'option':u'Опции',
    'optionNotValid':u'Выбранный параметр недопустим.',
    'or':u'или',
    'password':u'Пароль',
    'path':u'Путь',
    'pathCreating':u'Создание папки...',
    'pathNotCreate':u'Папка не создана. Неверный путь или запрещен доступ.',
    'pressEnter':u'Нажмите Enter для продолжения.',
    'privacyPolicy':u'Политика конфиденциальности',
    'proxyAuthPassword':u'Пароль',
    'proxyAuthUser':u'Пользователь',
    'proxyHost':u'Host',
    'proxyHttp':u'Http',
    'proxyInfo':u'Введите информацию о прокси-сервере.',
    'proxyNone':u'Нет',
    'proxyPort':u'Port',
    'proxySocks4':u'Socks4',
    'proxySocks4a':u'Socks4a',
    'proxySocks5':u'Socks5',
    'proxySystem':u'Система',
    'reEnterCode':u'Введите код еще раз',
    'reEnterData':u'Введите данные еще раз',
    'rePassword':u'Повторите пароль',
    'reject':u'Отклонить',
    'removeFile':u'Удаление файла...',
    'runWithoutInstallation':u'Запустить',
    'runWithoutInstallationClosing':u'Закрытие сеанса...',
    'runWithoutInstallationConnecting':u'Открытие сеанса...',
    'runWithoutInstallationEnd':u'Сеанс закончен.',
    'runWithoutInstallationOnlineBottom':u'ПРЕДУПРЕЖДЕНИЕ:\nНе сообщайте эту информацию людям, которым не доверяете, иначе позволите им получить доступ к агенту. Если вы не понимаете до конца, что именно вы делаете, пожалуйста, закройте это приложение.',
    'runWithoutInstallationOnlineBottomPutCode':u'Внимание: \nсейчас агент готов принимать соединение. Если вы не уверены в том, что делаете, - закройте это окно.',
    'runWithoutInstallationOnlinePassword':u'Пароль: {0}',
    'runWithoutInstallationOnlineTop':u'Сеанс активен.\nДля подключения к агенту перейдите по ссылке https://www.dwservice.net',
    'runWithoutInstallationOnlineTopPutCode':u'Сессия активна.',
    'runWithoutInstallationOnlineUser':u'Пользователь: {0}',
    'runWithoutInstallationStarting':u'Агент запускается...',
    'runWithoutInstallationUnexpectedError':u'Непредвиденная ошибка.\nDWAgent не был запущен. Если проблема сохранится, попробуйте загрузить последнюю версию DWAgent, удалите папку "{0} " и запустите DWAgent снова.',
    'runWithoutInstallationUpdating':u'Агент обновляется...',
    'runWithoutInstallationWait':u'Ожидаем нового соединения (попытка {0})...',
    'selectPathInstall':u'Выберите путь установки:',
    'skipCertValidation':u'Невозможно проверить сертификат безопасности, соединение может быть небезопасным.\nПроверьте настройки маршрутизатора, файрвола или антивируса.\nПродолжить все равно?',
    'startService':u'Служба запускается...',
    'startServiceErr':u'Не удалось запустить службу.',
    'termsAndConditions':u'Условия использования',
    'titleInstall':u'DWAgent - Установка',
    'titleUninstall':u'DWAgent - Удаление',
    'toBack':u'назад.',
    'toExit':u'выход.',
    'unattendedAccess':u'Неконтролируемый\nдоступ',
    'unexpectedError':u'Непредвиденная ошибка.\n{0}',
    'uninstallMonitor':u'Удаление мониторинга...',
    'uninstallService':u'Удаление службы...',
    'uninstallShortcuts':u'Удаление ярлыков...',
    'unknownUser':u'Неизвестный пользователь',
    'user':u'Пользователь',
    'validInteger':u'Поле \'{0}\' должно быть целым числом.',
    'versionInstallNotValid':u'Версия установщика не подходит для вашей операционной системы.\nСкачайте правильную версию. {0}',
    'waiting':u'Ожидание...',
    'warningLoginLogout':u'Чтобы изменение вступило в силу, пользователь должен выйти и снова войти в систему.',
    'warningRemovePath':u'Предупреждение: целевая папка уже существует и будет удалена.',
    'warningSpyingTool':u'Важно! Вы не имеете права осуществлять доступ к удаленному компьютеру без согласия пользователя. Используя DWService в противоправных целях, вы нарушаете уголовный закон.',
    'welcomeLicense':u'Лицензия\nЭто программное обеспечение является бесплатным и открытым (open source).\nОно состоит из одного основного компонента и нескольких дополнительных компонентов, которые могут регулироваться различными лицензиями. Для получения дополнительной информации посетите: https://www.dwservice.net/en/licenses-sources.html',
    'welcomePrivacyTerms':u'Устанавливая или запуская данный программный продукт, вы соглашаетесь с политикой в отношении обработки персональных данных (#PRIVACYPOLICY) и пользовательским соглашением (#TERMSANDCONDITIONS).',
    'welcomeSecurity':u'Безопасность\nДля защиты вашей конфиденциальности мы гарантируем, что никакая информация не будет храниться на наших серверах, сетевые соединения зашифрованы, так что третьи лица не могут прочитать их в любом случае.',
    'welcomeSoftwareUpdates':u'Обновление программного обеспечения\nОбновления программного обеспечения осуществляются автоматически.',
    'windowsAdminPrivileges':u'Необходимо иметь права администратора для установки DWAgent.\nЗапустите исполняемый от имени администратора.',
    'yes':u'Да'
}
                                                                                                    ui/configure.py                                                                                     0000644 0001750 0001750 00000070523 14220266777 013340  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

try:
    from . import messages
except: #FIX INSTALLER
    import messages
try:
    from . import images
except: #FIX INSTALLER
    import images
try:
    from . import gdi
except: #FIX INSTALLER
    import gdi 
try:
    from . import ui
except: #FIX INSTALLER
    import ui
import sys
import listener
import utils
import json

class Configure:
    
    def __init__(self):
        #self._config_port = 7950
        #self._path_config='config.json'
        self._ipc_client=None
        self._install_code=ui.VarString()
        self._proxy_type=ui.VarString("SYSTEM")
        self._proxy_host=ui.VarString("")
        self._proxy_port=ui.VarString("")
        self._proxy_user=ui.VarString("")
        self._proxy_password=ui.VarString("", True)
        self._password=""
        self._main_menu_sel=ui.VarString("configureAgent")
        self._agent_menu_sel=ui.VarString("configureChangeInstallKey")
        self._password_menu_sel=ui.VarString("configureSetPassword")
        self._name=None
        self._config_base_path=None
    
    def _set_config_base_path(self, pth):
        self._config_base_path=pth
    
    def _get_message(self, key):
        smsg = messages.get_message(key)
        if self._name is not None:
            return smsg.replace(u"DWAgent",self._name)
        else:
            return smsg
    
    def send_req(self, req, prms=None):
        try:
            if self._ipc_client==None or self._ipc_client.is_close():
                self._ipc_client=listener.IPCClient(path=self._config_base_path)
            return self._ipc_client.send_request("admin", self._password, req, prms);
        except: 
            return 'ERROR:REQUEST_TIMEOUT'
    
    def close_req(self):
        if self._ipc_client!=None and not self._ipc_client.is_close():
            self._ipc_client.close()
            
    def check_auth(self):
        sret=self.send_req("check_auth", None)
        if sret=="OK":
            return True
        elif sret=="ERROR:FORBIDDEN":
            return False
        else:
            raise Exception(sret[6:])
    
    def get_config(self, key):
        sret=self.send_req("get_config", {'key':key})
        if sret[0:2]=="OK":
            return sret[3:]
        else:
            raise Exception(sret[6:])
        return sret     
    
    def set_config(self, key, val):
        sret=self.send_req("set_config", {'key':key, 'value':val})
        if sret!="OK":
            raise Exception(sret[6:])
            
    def uninstall_key(self):
        sret=self.send_req("remove_key", None)
        if sret!="OK":
            raise Exception(sret[6:])
        return sret  
    
    def install_key(self, code):
        sret=self.send_req("install_key", {'code':code})
        if sret!="OK":
            raise Exception(sret[6:])
        return sret  
    
    def change_config_pwd(self, pwd):
        if pwd!="":
            sret=self.send_req("change_config_pwd", {'password':self._change_config_pwd.get()})
        else:
            sret=self.send_req("change_config_pwd", {'nopassword':'true'})
        if sret!="OK":
            raise Exception(sret[6:])
        return sret
    
    def change_session_pwd(self, pwd):
        if pwd!="":
            sret=self.send_req("change_session_pwd", {'password':self._change_session_pwd.get()})
        else:
            sret=self.send_req("change_session_pwd", {'nopassword':'true'})
        if sret!="OK":
            raise Exception(sret[6:])
        return sret  
    
    def is_agent_enable(self):
        s = self.get_config("enabled")
        return s=="True"
    
    def read_proxy_info(self):
        pt = self.get_config("proxy_type")
        self._proxy_type.set(pt)
        if self._proxy_type.get()=='HTTP' or self._proxy_type.get()=='SOCKS4' or self._proxy_type.get()=='SOCKS4A' or self._proxy_type.get()=='SOCKS5':
            self._proxy_host.set(self.get_config("proxy_host"))
            self._proxy_port.set(self.get_config("proxy_port"))
            self._proxy_user.set(self.get_config("proxy_user"))
    
    def start(self, bgui=True):        
        confjson={}
        try:
            f = utils.file_open('config.json')
            confjson = json.loads(f.read())
            f.close()
        except Exception:
            None
        prmsui={}
        if "name" in confjson:
            self._name=utils.str_new(confjson["name"])            
        prmsui["title"]=self._get_message('configureTitle')
        if "topinfo" in confjson:
            prmsui["topinfo"]=confjson["topinfo"]
        if "topimage" in confjson:
            prmsui["topimage"]=u"ui" + utils.path_sep + u"images" + utils.path_sep + u"custom" + utils.path_sep + confjson["topimage"]
        applg = gdi._get_logo_from_conf(confjson, u"ui" + utils.path_sep + u"images" + utils.path_sep + u"custom" + utils.path_sep)
        if applg != "":
            prmsui["logo"]=applg
        if "leftcolor" in confjson:
            prmsui["leftcolor"]=confjson["leftcolor"]  
        self._uinterface = ui.UI(prmsui, self.step_init)
        self._uinterface.start(bgui)
        self.close_req();
            

    def step_init(self, curui):
        '''
        try:
            msg = ui.Message(self._get_message('configureWelcome'))
            msg.next_step(self.step_check_password)
        except Exception as e:
            msg = ui.Message(utils.exception_to_string(e))
        return msg
        '''
        return self.step_check_password(curui);
    
    def step_check_password(self, curui):
        try:
            if curui.get_key() is not None and curui.get_key()=='insert_password':
                self._password=self._ins_pwd.get()
            if not self.check_auth():
                if curui.get_key() is not None and curui.get_key()=='insert_password':
                    return ui.ErrorDialog(self._get_message('configureInvalidPassword'))
                return self.step_password(curui)
            else:
                return self.step_menu_main(curui)
        except:
            return ui.ErrorDialog(self._get_message('configureErrorConnection'))
    
    def step_password(self, curui):
        self._ins_pwd=ui.VarString("", True)
        ipt = ui.Inputs()
        ipt.set_key("insert_password")
        ipt.set_message(self._get_message('configureInsertPassword'))
        ipt.add('password', self._get_message('password'), self._ins_pwd,  True)
        ipt.next_step(self.step_check_password)
        return ipt
    
    def step_menu_main(self, curui):
        try:
            self.read_proxy_info()
        except:
            return ui.ErrorDialog(self._get_message('configureErrorConnection'))
        chs = ui.Chooser()
        chs.set_message(self._get_message('configureChooseOperation'))
        chs.add("configureAgent", self._get_message('configureAgent'))
        chs.add("configureProxy", self._get_message('configureProxy'))
        chs.add("configureMonitor", self._get_message('configureMonitor'))        #
        #chs.add("configureExit", self._get_message('configureExit'))
        chs.set_variable(self._main_menu_sel)
        chs.next_step(self.step_menu_main_selected)
        return chs

    def step_menu_main_selected(self, curui):
        if curui.get_variable().get()=="configureAgent":
            return self.step_menu_agent(curui)
        elif curui.get_variable().get()=="configureProxy":
            curui.set_key("menuProxy")
            return self.step_configure_proxy_type(curui)
        elif curui.get_variable().get()=="configureMonitor":
            return self.step_menu_monitor(curui)
        elif curui.get_variable().get()=="configureExit":
            return ui.Message(self._get_message('configureEnd'))
    
    def step_menu_agent(self, curui):
        try:
            self._install_code.set("")
            key = self.get_config("key")
            if key == "":
                return self.step_menu_agent_install_key_selected(curui)
            else:
                chs = ui.Chooser()
                chs.set_message(self._get_message('configureChooseOperation'))
                chs.add("configureChangeInstallKey", self._get_message('configureChangeInstallKey'))
                chs.add("configurePassword", self._get_message('configurePassword'))
                if self.is_agent_enable():
                    chs.add("configureDisableAgent", self._get_message('configureDisableAgent'))
                else:
                    chs.add("configureEnableAgent", self._get_message('configureEnableAgent'))
                chs.set_variable(self._agent_menu_sel)
                chs.prev_step(self.step_menu_main)
                chs.next_step(self.step_menu_agent_selected)
                return chs
        except:
            return ui.ErrorDialog(self._get_message('configureErrorConnection'))
            
    
    def step_menu_agent_selected(self, curui):
        if curui.get_variable().get()=="configureChangeInstallKey":
            return self.step_menu_agent_install_key(curui)
        elif curui.get_variable().get()=="configurePassword":
                return self.step_menu_agent_password(curui)
        elif curui.get_variable().get()=="configureEnableAgent":
            return self.step_menu_agent_enable(curui)
        elif curui.get_variable().get()=="configureDisableAgent":
            return self.step_menu_agent_disable(curui)
    
    
    def step_menu_agent_password(self, curui):
        chs = ui.Chooser()
        chs.set_message(self._get_message('configureChooseOperation'))
        chs.add("configureSetPassword", self._get_message('configureSetPassword'))
        chs.add("configureRemovePassword", self._get_message('configureRemovePassword'))
        chs.set_variable(self._password_menu_sel)
        chs.prev_step(self.step_menu_agent)
        chs.next_step(self.step_config_agent_password)
        return chs

    def step_config_agent_password(self, curui):
        if curui.get_variable().get()=='configureSetPassword':
            self._change_session_pwd=ui.VarString("", True)
            self._change_resession_pwd=ui.VarString("", True)
            ipt = ui.Inputs()
            ipt.set_key("set_password")
            ipt.set_message(self._get_message('configurePassword'))
            ipt.add('password', self._get_message('password'), self._change_session_pwd,  True)
            ipt.add('rePassword', self._get_message('rePassword'), self._change_resession_pwd,  True)
            ipt.prev_step(self.step_menu_agent_password)
            ipt.next_step(self.step_config_agent_password_procede)
            return ipt
        elif curui.get_variable().get()=='configureRemovePassword':
            chs = ui.Chooser()
            chs.set_key("remove_password")
            chs.set_message(self._get_message('configureRemovePasswordQuestion'))
            chs.add("yes", self._get_message('yes'))
            chs.add("no", self._get_message('no'))
            chs.set_variable(ui.VarString("no"))
            chs.set_accept_key("yes")
            chs.prev_step(self.step_menu_agent_password)
            chs.next_step(self.step_config_agent_password_procede)
            return chs
    
    def step_config_agent_password_procede(self, curui):
        if curui.get_key() is not None and curui.get_key()=='set_password':
            if self._change_session_pwd.get()==self._change_resession_pwd.get():
                try:
                    self.change_session_pwd(self._change_session_pwd.get())
                    self._password=self._change_session_pwd.get()
                    msg = ui.Message(self._get_message('configurePasswordUpdated'))
                    msg.next_step(self.step_menu_main)
                    return msg
                except:
                    return ui.ErrorDialog(self._get_message('configureErrorConnection'))
            else:
                return ui.ErrorDialog(self._get_message('configurePasswordErrNoMatch'))
        elif curui.get_key() is not None and curui.get_key()=='remove_password':
            if curui.get_variable().get()=='yes':
                try:
                    self.change_session_pwd("")
                    self._password=""
                    msg = ui.Message(self._get_message('configurePasswordUpdated'))
                    msg.next_step(self.step_menu_main)
                    return msg
                except:
                    return ui.ErrorDialog(self._get_message('configureErrorConnection'))
    
    def step_menu_agent_install_key(self, curui):
        chs = ui.Chooser()
        chs.set_message(self._get_message('configureUninstallKeyQuestion'))
        chs.add("yes", self._get_message('yes'))
        chs.add("no", self._get_message('no'))
        chs.set_variable(ui.VarString("no"))
        chs.set_accept_key("yes")
        chs.prev_step(self.step_menu_agent)
        chs.next_step(self.step_menu_agent_remove_key_selected)
        return chs
    
    def step_menu_agent_remove_key_selected(self, curui):
        if curui.get_variable().get()=='yes':
            try:
                self._uinterface.wait_message(self._get_message('configureUninstallationKey'),  0)
                self.uninstall_key()
            except:
                    return ui.ErrorDialog(self._get_message('configureErrorConnection'))
            return self.step_menu_agent_install_key_selected(curui)
        else:
            return self.step_menu_agent(curui)
    
    def step_menu_agent_install_key_selected(self, curui):
        ipt = ui.Inputs()
        ipt.set_message(self._get_message('enterInstallCode'))
        ipt.add('code', self._get_message('code'), self._install_code, True)
        ipt.prev_step(self.step_menu_agent)
        ipt.next_step(self.step_check_install_code)
        return ipt
    
    def step_check_install_code(self, curui):
        if curui.get_key() is not None and curui.get_key()=='tryAgain':
            if curui.get_variable().get()=='configureLater':
                return self.step_menu_main(curui)
            elif curui.get_variable().get()=='configProxy':
                curui.set_key("installCode")
                return self.step_configure_proxy_type(curui)
            elif curui.get_variable().get()=='reEnterCode':
                return self.step_menu_agent_install_key_selected(curui)
        msg=self._get_message('checkInstallCode')
        self._uinterface.wait_message(msg)
        key = self._install_code.get()
        try:
            self.install_key(key)
            msg = ui.Message(self._get_message('configureKeyInstalled'))
            msg.next_step(self.step_menu_main)
            return msg
        except Exception as e:
            s = utils.exception_to_string(e)
            if s=="INVALID_CODE":
                chs = ui.Chooser()
                chs.set_key("tryAgain")
                chs.set_message(self._get_message('errorInvalidCode'))
                chs.add("reEnterCode", self._get_message('reEnterCode'))
                chs.add("configureLater", self._get_message('configureLater'))
                chs.set_variable(ui.VarString("reEnterCode"))
                chs.prev_step(self.step_menu_agent_install_key_selected)
                chs.next_step(self.step_check_install_code)
                return chs
            elif s=="CONNECT_ERROR":
                chs = ui.Chooser()
                chs.set_key("tryAgain")
                chs.set_message(self._get_message('errorConnectionQuestion'))
                chs.add("configProxy", self._get_message('yes'))
                chs.add("noTryAgain", self._get_message('noTryAgain'))
                chs.add("configureLater", self._get_message('configureLater'))
                chs.set_variable(ui.VarString("noTryAgain"))
                chs.prev_step(self.step_menu_agent_install_key_selected)
                chs.next_step(self.step_check_install_code)
                return chs
            elif s=="REQUEST_TIMEOUT":
                return ui.ErrorDialog(self._get_message('configureErrorConnection'))
            else:
                return ui.ErrorDialog(s) 
    
    def step_configure_proxy_type(self, curui):
        chs = ui.Chooser()
        chs.set_key(curui.get_key())
        chs.set_message(self._get_message('chooseProxyType'))
        chs.add("SYSTEM", self._get_message('proxySystem'))
        chs.add("HTTP", self._get_message('proxyHttp'))
        chs.add("SOCKS4", self._get_message('proxySocks4'))
        chs.add("SOCKS4A", self._get_message('proxySocks4a'))
        chs.add("SOCKS5", self._get_message('proxySocks5'))
        chs.add("NONE", self._get_message('proxyNone'))
        chs.set_variable(self._proxy_type)
        
        if curui.get_key()=="menuProxy":
            chs.prev_step(self.step_menu_main)
        elif curui.get_key()=="installCode":
            chs.prev_step(self.step_menu_agent_install_key_selected)
        
        chs.next_step(self.step_configure_proxy_info)
        return chs
    
    def step_configure_proxy_info(self, curui):
        if curui.get_variable().get()=='HTTP' or curui.get_variable().get()=='SOCKS4' or curui.get_variable().get()=='SOCKS4A' or curui.get_variable().get()=='SOCKS5':
            ipt = ui.Inputs()
            ipt.set_key(curui.get_key())
            ipt.set_message(self._get_message('proxyInfo'))
            ipt.add('proxyHost', self._get_message('proxyHost'), self._proxy_host,  True)
            ipt.add('proxyPort', self._get_message('proxyPort'), self._proxy_port,  True)
            ipt.add('proxyAuthUser', self._get_message('proxyAuthUser'), self._proxy_user,  False)
            ipt.add('proxyAuthPassword', self._get_message('proxyAuthPassword'), self._proxy_password,  False)
            ipt.prev_step(self.step_configure_proxy_type)
            ipt.next_step(self.step_configure_proxy_set)
            return ipt
        else:
            self._proxy_host.set("")
            self._proxy_port.set("")
            self._proxy_user.set("")
            self._proxy_password.set("")
            return self.step_configure_proxy_set(curui)
    
    
    def step_configure_proxy_set(self, curui):
        ar = curui.get_key().split('_')
        curui.set_key(ar[0]) 
        if len(ar)==2 and ar[1]=='tryAgain':
            if curui.get_variable() is not None and curui.get_variable().get()=='configureLater':
                if curui.get_key()=="menuProxy":
                    return self.step_menu_main(curui)
                elif curui.get_key()=="installCode":
                    return self.step_menu_agent_install_key_selected(curui)
        try:
            if self._proxy_type.get()=='HTTP' or self._proxy_type.get()=='SOCKS4' or self._proxy_type.get()=='SOCKS4A' or self._proxy_type.get()=='SOCKS5':
                try:
                    int(self._proxy_port.get())
                except:
                    return ui.ErrorDialog(self._get_message("validInteger") .format(self._get_message('proxyPort')))
            sret=self.send_req("set_proxy",  {'type': self._proxy_type.get(), 
                                                       'host':  self._proxy_host.get(), 
                                                       'port': self._proxy_port.get(), 
                                                       'user': self._proxy_user.get(), 
                                                       'password': self._proxy_password.get()})
            if sret!="OK":
                raise Exception(sret[6:])
        except:
            chs = ui.Chooser()
            chs.set_key(curui.get_key() + "_tryAgain")
            chs.set_message(self._get_message('errorConnectionConfig'))
            chs.add("noTryAgain", self._get_message('noTryAgain'))
            chs.add("configureLater", self._get_message('configureLater'))
            chs.set_variable(ui.VarString("noTryAgain"))
            if curui.get_key()=="menuProxy":
                chs.prev_step(self.step_menu_main)
            elif curui.get_key()=="installCode":
                chs.prev_step(self.step_menu_agent_install_key_selected)
            chs.next_step(self.step_configure_proxy_set)
            return chs
        if curui.get_key()=="menuProxy":
            msg = ui.Message(self._get_message('configureProxyEnd'))
            msg.next_step(self.step_menu_main)
            return msg
        elif curui.get_key()=="installCode":
            return self.step_check_install_code(curui)
        
    
    def step_menu_agent_enable(self, curui):
        chs = ui.Chooser()
        chs.set_message(self._get_message('configureEnableAgentQuestion'))
        chs.add("yes", self._get_message('yes'))
        chs.add("no", self._get_message('no'))
        chs.set_variable(ui.VarString("no"))
        chs.set_accept_key("yes")
        chs.prev_step(self.step_menu_agent)
        chs.next_step(self.step_menu_agent_enable_procede)
        return chs
    
    def step_menu_agent_disable(self, curui):
        chs = ui.Chooser()
        chs.set_message(self._get_message('configureDisableAgentQuestion'))
        chs.add("yes", self._get_message('yes'))
        chs.add("no", self._get_message('no'))
        chs.set_variable(ui.VarString("no"))
        chs.set_accept_key("yes")
        chs.prev_step(self.step_menu_agent)
        chs.next_step(self.step_menu_agent_disable_procede)
        return chs
        
    def step_menu_agent_enable_procede(self, curui):
        if curui.get_variable().get()=='yes':
            try:
                self.set_config("enabled", "True")
                msg = ui.Message(self._get_message('configureAgentEnabled'))
                msg.next_step(self.step_menu_main)
                return msg
            except:
                    return ui.ErrorDialog(self._get_message('configureErrorConnection'))
        else:
            return self.step_menu_agent(curui)
    
    def step_menu_agent_disable_procede(self, curui):
        if curui.get_variable().get()=='yes':
            try:
                self.set_config("enabled", "False")
                msg = ui.Message(self._get_message('configureAgentDisabled'))
                msg.next_step(self.step_menu_main)
                return msg
            except:
                return ui.ErrorDialog(self._get_message('configureErrorConnection'))
        else:
            return self.step_menu_agent(curui)
    
    def step_menu_monitor(self, curui):
        chs = ui.Chooser()
        chs.set_message(self._get_message('configureChooseOperation'))
        chs.add("configurePassword", self._get_message('configurePassword'))
        chs.add("configureDesktopNotification", self._get_message('configureDesktopNotification'))
        #chs.add("configureTrayIconVisibility", self._get_message('configureTrayIconVisibility'))
        chs.set_variable(ui.VarString("configurePassword"))
        chs.prev_step(self.step_menu_main)        
        chs.next_step(self.step_menu_monitor_selected)
        return chs
    
    def step_menu_monitor_selected(self, curui):
        try:
            if curui.get_variable().get()=="configurePassword":
                return self.step_menu_monitor_password(curui)
            elif curui.get_variable().get()=="configureDesktopNotification":
                return self.step_menu_monitor_desktop_notification(curui)
        except:
            return ui.ErrorDialog(self._get_message('configureErrorConnection'))
       
    def step_menu_monitor_desktop_notification(self, curui):
        try:
            chs = ui.Chooser()
            chs.set_message(self._get_message('configureDesktopNotification') + "\n\n" + self._get_message('warningSpyingTool'))
            chs.add("visible", self._get_message('desktopNotificationVisible'))
            chs.add("autohide", self._get_message('desktopNotificationAutoHide'))
            chs.add("none", self._get_message('desktopNotificationNone'))
               
            appv = self.get_config("monitor_desktop_notification")                     
            if appv=="autohide":
                chs.set_variable(ui.VarString("autohide"))
            elif appv=="none":
                chs.set_variable(ui.VarString("none"))
            else:
                chs.set_variable(ui.VarString("visible"))
            
            chs.prev_step(self.step_menu_monitor)
            chs.next_step(self.step_menu_monitor_desktop_notification_procede)
            return chs
        except:
            return ui.ErrorDialog(self._get_message('configureErrorConnection'))
    
    def step_menu_monitor_desktop_notification_procede(self, curui):
        try:
            self.set_config("monitor_desktop_notification", curui.get_variable().get())
            msg = ui.Message(self._get_message('configureDesktopNotificationOK') + "\n\n" + self._get_message('warningLoginLogout'))
            msg.next_step(self.step_menu_main)
            return msg
        except:
            return ui.ErrorDialog(self._get_message('configureErrorConnection'))
        
    def step_menu_monitor_password(self, curui):
        chs = ui.Chooser()
        chs.set_message(self._get_message('configureChooseOperation'))
        chs.add("configureSetPassword", self._get_message('configureSetPassword'))
        chs.add("configureRemovePassword", self._get_message('configureRemovePassword'))
        chs.set_variable(self._password_menu_sel)
        chs.prev_step(self.step_menu_monitor)
        chs.next_step(self.step_config_monitor_password)
        return chs

    def step_config_monitor_password(self, curui):
        if curui.get_variable().get()=='configureSetPassword':
            self._change_config_pwd=ui.VarString("", True)
            self._change_reconfig_pwd=ui.VarString("", True)
            ipt = ui.Inputs()
            ipt.set_key("set_password")
            ipt.set_message(self._get_message('configurePassword'))
            ipt.add('password', self._get_message('password'), self._change_config_pwd,  True)
            ipt.add('rePassword', self._get_message('rePassword'), self._change_reconfig_pwd,  True)
            ipt.prev_step(self.step_menu_monitor_password)
            ipt.next_step(self.step_config_monitor_password_procede)
            return ipt
        elif curui.get_variable().get()=='configureRemovePassword':
            chs = ui.Chooser()
            chs.set_key("remove_password")
            chs.set_message(self._get_message('configureRemovePasswordQuestion'))
            chs.add("yes", self._get_message('yes'))
            chs.add("no", self._get_message('no'))
            chs.set_variable(ui.VarString("no"))
            chs.set_accept_key("yes")
            chs.prev_step(self.step_menu_monitor_password)
            chs.next_step(self.step_config_monitor_password_procede)
            return chs
    
    def step_config_monitor_password_procede(self, curui):
        if curui.get_key() is not None and curui.get_key()=='set_password':
            if self._change_config_pwd.get()==self._change_reconfig_pwd.get():
                try:
                    self.change_config_pwd(self._change_config_pwd.get())
                    self._password=self._change_config_pwd.get()
                    msg = ui.Message(self._get_message('configurePasswordUpdated'))
                    msg.next_step(self.step_menu_main)
                    return msg
                except:
                    return ui.ErrorDialog(self._get_message('configureErrorConnection'))
            else:
                return ui.ErrorDialog(self._get_message('configurePasswordErrNoMatch'))
        elif curui.get_key() is not None and curui.get_key()=='remove_password':
            if curui.get_variable().get()=='yes':
                try:
                    self.change_config_pwd("")
                    self._password=""
                    msg = ui.Message(self._get_message('configurePasswordUpdated'))
                    msg.next_step(self.step_menu_main)
                    return msg
                except:
                    return ui.ErrorDialog(self._get_message('configureErrorConnection'))
                
def fmain(args): #SERVE PER MACOS APP
    bgui=True
    for arg in args: 
        if arg.lower() == "-console":
            bgui=False
    i = Configure()
    i.start(bgui)

if __name__ == "__main__":
    fmain(sys.argv)
    
                                                                                                                                                                             ui/monitor.py                                                                                       0000755 0001750 0001750 00000160335 14406350465 013044  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''
try:
    from . import messages
except: #FIX INSTALLER
    import messages
try:
    from . import images
except: #FIX INSTALLER
    import images
try:
    from . import gdi
except: #FIX INSTALLER
    import gdi 
import utils
import json
import sys
import subprocess
import threading
import listener
import time
import os

_WIDTH=550
_HEIGHT=300

_WIDTH_RIGHT=140
_CONTENT_WIDTH=_WIDTH-_WIDTH_RIGHT
_HEIGHT_STATUS_BAR=28
_HEIGHT_STATUS=60

MENU_SHOW = 1
MENU_HIDE = 2
MENU_ENABLE = 11
MENU_DISABLE = 12
MENU_CONFIGURE = 21

COLOR_NOSERVICE="949494"
COLOR_ONLINE="259126"
COLOR_ONLINE_DISABLE="e08803"
COLOR_OFFLINE="949494"
COLOR_UPDATING="bfba34"
COLOR_DISABLE="c21b1a"

TIMEOUT_REQ=5

def is_windows():
    return utils.is_windows()

def is_linux():
    return utils.is_linux()

def is_mac():
    return utils.is_mac()

def get_user_dir():
    try:
        import ctypes
        buf = ctypes.create_unicode_buffer(1024)
        ctypes.windll.shell32.SHGetFolderPathW(None, 40, None, 0, buf) #40 = CSIDL_PROFILE
        return buf.value
    except:
        return utils.path_expanduser("~")


class NotifyActivitiesHideEffect():
    def __init__(self, dlg):
        self._dlg = dlg
        self._cancel=False
        self._first=True
    
    def run(self):
        if self._cancel:
            return            
        if self._first:
            self._first=False
            gdi.add_scheduler(4, self.run)
        else:
            cx = self._dlg.get_x()+2
            self._dlg.set_position(cx,self._dlg.get_y())
            ar = gdi.get_screen_size()
            if cx>=ar["width"]:
                self._dlg.hide()
            else:            
                gdi.add_scheduler(0.05, self.run)

    def cancel(self):
        self._cancel=True

class NotifyAcceptSession():
    
    def __init__(self, prt):
        self._parent=prt
        self._curitm=None
        self._dlg = gdi.Window(gdi.WINDOW_TYPE_POPUP)
        self._dlg.set_show_position(gdi.WINDOW_POSITION_CENTER_SCREEN);
        self._dlg_brdsz=1        
        self._dlg_w=340
        self._dlg_h=168
        self._dlg.set_background("a0a0a0")
        gapbtn=20
        wbtn=(self._dlg_w-((gapbtn*2)+6))/2
        hbtn=36
        
        self._pnl = gdi.Panel()
        self._pnl.set_position(self._dlg_brdsz, self._dlg_brdsz)        
        self._pnl.set_size(self._dlg_w-(2*self._dlg_brdsz), self._dlg_h-(2*self._dlg_brdsz))
        self._pnl.set_background("f2f2f2")
        self._dlg.add_component(self._pnl)
                
        self._btn_accept = gdi.Button()
        self._btn_accept.set_text(messages.get_message("accept"))
        self._btn_accept.set_position(gapbtn, self._dlg_h-hbtn-12)
        self._btn_accept.set_size(wbtn, hbtn)
        self._btn_accept.set_action(self._on_accept)
        self._pnl.add_component(self._btn_accept)
        
        self._btn_reject = gdi.Button()
        self._btn_reject.set_text(messages.get_message("reject"))
        self._btn_reject.set_position(gapbtn+wbtn+6, self._dlg_h-hbtn-12)
        self._btn_reject.set_size(wbtn, hbtn)
        self._btn_reject.set_action(self._on_reject)
        self._pnl.add_component(self._btn_reject)
        
        implogo = gdi.ImagePanel()
        implogo.set_position(10, 16)
        implogo.set_filename(self._parent._get_image(u"logo48x48.bmp"))
        self._pnl.add_component(implogo)
        
        self._lbl_user = gdi.Label()
        self._lbl_user.set_position(16+48,16)
        self._lbl_user.set_size(self._dlg_w-(2*self._dlg_brdsz)-16-48-10,20)
        self._pnl.add_component(self._lbl_user)
        
        self._lbl_ip = gdi.Label()
        self._lbl_ip.set_position(self._lbl_user.get_x(),self._lbl_user.get_y()+self._lbl_user.get_height())
        self._lbl_ip.set_size(self._lbl_user.get_width(),self._lbl_user.get_height())
        self._pnl.add_component(self._lbl_ip)
        
        self._lbl_msg = gdi.Label()
        self._lbl_msg.set_text_align(gdi.TEXT_ALIGN_LEFTTOP)
        self._lbl_msg.set_text(messages.get_message("accessConfirm"))
        self._lbl_msg.set_wordwrap(True)
        self._lbl_msg.set_position(self._lbl_ip.get_x(),self._lbl_ip.get_y()+self._lbl_ip.get_height()+4)
        self._lbl_msg.set_size(self._lbl_ip.get_width(),self._btn_accept.get_y()-self._lbl_msg.get_y())
        self._pnl.add_component(self._lbl_msg)
                
        self._list=[]
        self._skip_ids=[]
    
    def _on_accept(self, e):
        if e["action"]=="PERFORMED":
            if self._curitm is not None:
                self._parent.accept_session(self._curitm["idSession"])
                self._skip_ids.append(self._curitm["idSession"])
                self._curitm=None
            self._dlg.hide()
    
    def _on_reject(self, e):
        if e["action"]=="PERFORMED":
            if self._curitm is not None:
                self._parent.reject_session(self._curitm["idSession"])
                self._skip_ids.append(self._curitm["idSession"])
                self._curitm=None
            self._dlg.hide()
        
    def update(self, ar):
        itm=None
        for i in ar:
            bok=True
            for idses in self._skip_ids:
                if i["idSession"]==idses:
                    bok=False
                    break
            if bok:
                itm=i
                break
    
        self._skip_ids=[]
        self._list=ar        
        bok=False
        if self._curitm is None and itm is not None:
            bok=True 
        elif self._curitm is not None and itm is None:
            bok=True 
        elif self._curitm is not None and itm is not None and self._curitm["idSession"]!=itm["idSession"]:
            bok=True            
        if bok:
            if itm is not None:
                self._curitm=itm
                susr=""
                if self._parent._mode!="runonfly" and "accessType" in self._curitm and (self._curitm["accessType"]=="ACCOUNT" or self._curitm["accessType"]=="SHARE_USER") and "userName" in self._curitm: 
                    susr=self._curitm["userName"]
                if susr=="":
                    susr=messages.get_message("unknownUser")
                self._lbl_user.set_text(susr)
                self._lbl_ip.set_text(messages.get_message("ipAddress").format(self._curitm["ipAddress"]))
                self._dlg.set_size(self._dlg_w, self._dlg_h)
                self._dlg.show()
            else:
                self._curitm=None
                self._dlg.hide()
    
    def destroy(self):
        try:
            if self._dlg is not None:
                self._dlg.destroy()
        except:
            None

class NotifyActivities():
    
    def __init__(self, prt):
        self._parent=prt        
        self._list=[u"screencapture",u"shell",u"transfers"]
        self._sessions=False
        self._cmps={}
        self._visible_cmps={}
        self._screen_w=0
        self._screen_h=0
        self._dlg_y_gap=180                
        self._dlg_w=21
        self._move_y=None
        self._skip_click=False
        self._hide_effect=None
        self._dlg = gdi.Window(gdi.WINDOW_TYPE_POPUP)
        self._dlg.set_background("ffaa33")
        self._pnl = gdi.Panel()
        self._pnl.set_position(1, 1)      
        self._pnl.set_size(self._dlg_w, 20)  
        self._pnl.set_background("313536")
        self._dlg.add_component(self._pnl)
        implogo = gdi.ImagePanel()
        implogo.set_position(2, 2)        
        implogo.set_filename(self._parent._get_image(u"logo16x16.bmp"))
        self._pnl.add_component(implogo)        
        
        for k in self._list:
            self._cmps[k] = gdi.ImagePanel()            
            self._cmps[k].set_filename(self._parent._get_image(u"activities_" + k + u".bmp"))            
            self._dlg.add_component(self._cmps[k])
            self._visible_cmps[k]=False
            self._cmps[k].set_visible(False)
                
        self._sessions_last_update=self._sessions
        self._visible_cmps_last_update=self._visible_cmps.copy()
        self._dlg.set_action(self.on_action)
        
                        
            
    def set_sessions(self, i):
        self._sessions=i
        
    def set_visible(self, k, b):        
        self._visible_cmps[k]=b
    
    def _move_y_timer(self):
        if self._move_y is not None:
            mp = gdi.get_mouse_position()
            ar = gdi.get_screen_size()
            if mp["x"]<=ar["width"]-self._dlg.get_width():
                self._move_y=None
            else:
                ny=mp["y"]-self._move_y            
                if ny>=0 and ny<=ar["height"]-120 and self._dlg.get_y()!=ny:
                    self._dlg.set_position(self._dlg.get_x(),ny)
                    self._dlg_y_gap=ar["height"]-ny
                self._skip_click=True
                gdi.add_scheduler(0.1, self._move_y_timer)
    
    def on_action(self,e):
        if e["action"]=="MOUSEBUTTONDOWN":            
            if e["button"]==1:
                self._move_y=e["y"]
                gdi.add_scheduler(0.1, self._move_y_timer)
        if e["action"]=="MOUSEBUTTONUP":
            self._move_y=None
        if e["action"]=="MOUSECLICK":
            if not self._skip_click:
                self._parent._app.show()
                self._parent._app.to_front()
            self._skip_click=False
    
    def update(self):
        bok=False
        if self._sessions_last_update != self._sessions:
            bok=True
        else:
            for k in self._list:
                if self._visible_cmps_last_update[k] != self._visible_cmps[k]:
                    bok=True
        ar = gdi.get_screen_size()
        if self._screen_w!=ar["width"] or self._screen_h!=ar["height"]:
            self._screen_w=ar["width"]
            self._screen_h=ar["height"]
            bok=True 
        if bok:
            if self._hide_effect is not None:
                self._hide_effect.cancel()
            if self._sessions>0:
                self._dlg_h=22
                for k in self._list:
                    if self._visible_cmps[k]:
                        self._cmps[k].set_position(3, self._dlg_h)
                        self._cmps[k].set_visible(True)
                        self._dlg_h+=18
                    else:
                        self._cmps[k].set_visible(False)
                self._dlg.set_position(self._screen_w-self._dlg_w,self._screen_h-self._dlg_y_gap)
                self._dlg.set_size(self._dlg_w, self._dlg_h)
                self._dlg.show()                
                if self._parent._monitor_desktop_notification=="autohide":                    
                    self._hide_effect = NotifyActivitiesHideEffect(self._dlg)
                    self._hide_effect.run()                                    
            else:
                self._dlg.hide()
                for k in self._list:
                    self._visible_cmps[k]=False
                    self._cmps[k].set_visible(False)
            self._sessions_last_update=self._sessions
            self._visible_cmps_last_update=self._visible_cmps.copy()
    
    def destroy(self):
        try:
            if self._dlg is not None:
                self._dlg.destroy()
        except:
            None
       
class Main():
    
    def __init__(self):
        self._name=u"DWAgent"
        self._logo=None
        self._properties={}
        self._config_base_path=None
        self._runonfly_base_path=None
        self._bstop=True        
        self._notifyActivities=None
        self._notifyAcceptSession=None
        try:
            f = utils.file_open('config.json', "rb")
            s=f.read()
            self._properties = json.loads(utils.bytes_to_str(s,"utf8"))
            f.close()
        except Exception:
            None
        if 'name' in self._properties:
            self._name=utils.str_new(self._properties["name"])
        applg = gdi._get_logo_from_conf(self._properties, u"ui" + utils.path_sep + u"images" + utils.path_sep + u"custom" + utils.path_sep)
        if applg != "":
            self._logo=applg        
    
    def _get_image(self, name):
        apps = images.get_image(name)
        if self._mode=="runonfly":            
            apps=self._runonfly_base_path + utils.path_sep + apps
        return apps
    
    def _get_message(self, key):
        smsg = messages.get_message(key)
        if not self._name==u"DWAgent":
            return smsg.replace(u"DWAgent",self._name)
        else:
            return smsg
    
    @staticmethod
    def get_instance():
        return Main._instance_monitor
    
    @staticmethod
    def set_instance(i):
        Main._instance_monitor=i
    
    def _set_config_base_path(self, pth):
        self._config_base_path=pth
        f = utils.file_open(self._config_base_path + os.sep + 'config.json', "rb")
        s=f.read()
        self._properties = json.loads(utils.bytes_to_str(s,"utf8"))
        f.close()
    
    def lock(self):
        self._homedir = get_user_dir() + utils.path_sep + u"." + self._name.lower()
        if not utils.path_exists(self._homedir):
            utils.path_makedirs(self._homedir)
        self._lockfilename = self._homedir + utils.path_sep + "monitor.lock"
        try:
            if is_linux() or is_mac():
                import fcntl
                self._lockfile = utils.file_open(self._lockfilename , "w")
                fcntl.lockf(self._lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
            else:
                if utils.path_exists(self._lockfilename ):
                    utils.path_remove(self._lockfilename ) 
                self._lockfile = utils.file_open(self._lockfilename , "w")
                self._lockfile.write("\x00")
        except:
            try:
                self._lockfile.close()
            except:
                None
            if self._mode=="systray":
                print("An Instance is already running.")
            else:
                self.add_show_file()
            return False
        
        #self.remove_show_file()
        return True

    def unlock(self):
        self._lockfile.close()  
        try:
            utils.path_remove(self._lockfilename ) 
        except:
            None
        #self.remove_show_file()
        
    def check_stop(self):
        stopfilename = "monitor.stop"
        return utils.path_exists(stopfilename)
    
    def check_update(self):
        stopfilename = "monitor.update"
        return utils.path_exists(stopfilename)
    
    def add_show_file(self):
        showfilename  = self._homedir + utils.path_sep + "monitor.show"
        if not utils.path_exists(showfilename):
            f = utils.file_open(showfilename, "w")
            f.write("\x00")
            f.close()
        
    def remove_show_file(self):
        showfilename  = self._homedir + utils.path_sep + "monitor.show"        
        try:
            utils.path_remove(showfilename)
        except:
            None
    
    def check_show(self):
        showfilename = self._homedir + utils.path_sep + "monitor.show"
        return utils.path_exists(showfilename)
    
    def get_ico_file(self, name):
        return self._get_image(name + ".bmp")
    
    def get_activities(self, csts):
        ar = {}
        ar["screenCapture"]=0
        ar["shellSession"]=0
        ar["downloads"]=0
        ar["uploads"]=0
        cnt=0
        for itm in csts:
            if "waitAccept" not in itm or not itm["waitAccept"]:
                cnt+=1
                actvs = itm["activities"]
                if actvs["screenCapture"]>0:
                    ar["screenCapture"]+=actvs["screenCapture"]
                if actvs["shellSession"]>0:
                    ar["shellSession"]+=actvs["shellSession"]
                if actvs["downloads"]>0:
                    ar["downloads"]+=actvs["downloads"]
                if actvs["uploads"]>0:
                    ar["uploads"]+=actvs["uploads"]            
        ar["sessions"]=cnt
        return ar
    
    def get_wait_sessions(self, csts):
        ar = []
        for itm in csts:
            if "waitAccept" in itm and itm["waitAccept"]:
                ar.append({"idSession": itm["idSession"],"ipAddress": itm["ipAddress"],"userName": itm["userName"],"initTime": itm["initTime"],"accessType": itm["accessType"]})
        ar = sorted(ar, key=lambda k: k['initTime'])
        return ar
    
    def get_info(self):
        ret={"state": "-1","sessions_status":[]}
        self._semaphore.acquire()
        try:
            if self._ipc_client==None or self._ipc_client.is_close():                
                self._ipc_client=listener.IPCClient(path=self._config_base_path)
                self._status_cnt=-1

            cnt=int(self._ipc_client.get_property("counter"))
            if self._status_cnt!=cnt:
                if self._status_cnt==-1: #SKIP FIRST READ
                    self._status_cnt=cnt
                    return ret;
                else:
                    self._status_cnt=cnt                
                    ret["state"] = self._ipc_client.get_property("state")
                    try:
                        ret["name"] = self._ipc_client.get_property("name")
                        if utils.is_py2():
                            ret["name"]=ret["name"].decode("unicode-escape")
                    except:
                        None
                    try:
                        if ret["state"]=='1':
                            csts = json.loads(self._ipc_client.get_property("sessions_status"))
                        else:
                            csts = []
                        ret["sessions_status"] = csts
                        if self._monitor_desktop_notification!="none":
                            if self._notifyActivities is None:
                                self._notifyActivities=NotifyActivities(self)
                            appar=self.get_activities(csts)
                            self._notifyActivities.set_sessions(appar["sessions"])
                            self._notifyActivities.set_visible("screencapture", appar["screenCapture"]>0)
                            self._notifyActivities.set_visible("shell", appar["shellSession"]>0)
                            self._notifyActivities.set_visible("transfers", (appar["downloads"]+appar["uploads"])>0)
                            self._notifyActivities.update()                            
                                                        
                        appar = self.get_wait_sessions(csts)
                        if len(appar)>0 and self._notifyAcceptSession is None:
                            self._notifyAcceptSession=NotifyAcceptSession(self)                                
                        if self._notifyAcceptSession is not None:
                            self._notifyAcceptSession.update(appar)
                        
                    except Exception as ex:
                        print(utils.get_exception_string(ex))
                    return ret;
            else:
                if self._monitor_desktop_notification!="none":
                    if self._notifyActivities is not None:
                        self._notifyActivities.set_sessions(0)
                        self._notifyActivities.update()
                    
                        
                return ret
        except Exception as e:            
            print(utils.get_exception_string(e))
            return ret
        finally:
            self._semaphore.release()
            
    def check_events(self):
        if self._bstop:
            return
        if self.check_stop():
            if self._notifyActivities is not None:
                self._notifyActivities.destroy()
            if self._notifyAcceptSession is not None:
                self._notifyAcceptSession.destroy()
            if self._monitor_tray_icon:
                self._monitor_tray_obj.destroy()
            self._app.destroy()
            return
        if self.check_update():
            self._update=True
            if self._notifyActivities is not None:
                self._notifyActivities.destroy()
            if self._notifyAcceptSession is not None:
                self._notifyAcceptSession.destroy()
            if self._monitor_tray_icon:
                self._monitor_tray_obj.destroy()
            self._app.destroy()
            return
        if self.check_show():
            self._app.show()
            self._app.to_front()
            self.remove_show_file()
        gdi.add_scheduler(0.5, self.check_events)
    
    def update_status(self):
        if self._bstop:
            return        
        bground=""
        self.msgst=""
        self.icofile=""
        stateBtnEnDis=True
        msgBtnEnDis="monitorDisable"
        appar = self.get_info()
        s=appar["state"]
        newst=""
        newnm=""
        if "name" in appar:
            newnm=appar["name"]
        if s=='0': #STATUS_OFFLINE 
            newst="OFFLINE"
            self.msgst=self._get_message('monitorStatusOffline')
            bground=COLOR_OFFLINE
            self.icofile="monitor_grey"
        elif s=='1': #STATUS_ONLINE 
            newst="ONLINE"
            self.msgst=self._get_message('monitorStatusOnline')
            bground=COLOR_ONLINE
            self.icofile="monitor_green"
        elif s=='2': #STATUS_ONLINE_DISABLE
            newst="ONLINE_DISABLE"
            self.msgst=self._get_message('monitorStatusOnline') + " (" + self._get_message('monitorStatusDisabled') + ")"
            bground=COLOR_ONLINE_DISABLE
            self.icofile="monitor_orange"
        elif s=='3': #STATUS_DISABLE 
            newst="DISABLE"
            self.msgst=self._get_message('monitorStatusDisabled')
            bground=COLOR_DISABLE
            msgBtnEnDis="monitorEnable"
            self.icofile="monitor_red"
        elif s=='10': #STATUS_UPDATING 
            newst="UPDATING"
            self.msgst=self._get_message('monitorStatusUpdating')
            bground=COLOR_UPDATING
            self.icofile="monitor_yellow"
        else:
            newst="NOSERVICE"
            stateBtnEnDis=False
            self.msgst=self._get_message('monitorStatusNoService')
            bground=COLOR_NOSERVICE
            self.icofile="monitor_warning"
        
        breadconf=(newst!=self._cur_status) or self._mode=="runonfly"
        if not breadconf and not stateBtnEnDis and self._lbl_unattended_mode_yes.get_selected()==False and self._lbl_unattended_mode_no.get_selected()==False:
            breadconf=True        
        curact = self.get_activities(appar["sessions_status"])
        bchgact=False                
        
        if self._cur_activities is None:
            bchgact=True
        else:
            for k in curact:
                if curact[k]!=self._cur_activities[k]:
                    bchgact=True
                    break;
        if newst != self._cur_status or newnm != self._cur_agent_name or bchgact is True:
            self._cur_status=newst 
            self._cur_activities=curact
            self._reload_activities=False
            self.update_systray(self.icofile, self.msgst)
            if self._mode!="runonfly":
                self._img_status_top.set_background_gradient(bground,"ffffff",gdi.GRADIENT_DIRECTION_TOPBOTTOM)
                self._img_status_bottom.set_background_gradient(bground,"ffffff",gdi.GRADIENT_DIRECTION_BOTTONTOP)
            apptx=[]
            bexline=False
            if "name" in appar and appar["name"]!="":
                self._cur_agent_name=appar["name"]
                apptx.append(appar["name"])
                apptx.append(u"\n")
                bexline=True
            else:
                self._cur_agent_name=""
            if bexline is True:
                apptx.append(u"\n")
            apptx.append(self.msgst)
            if self._mode!="runonfly":
                self._lbl_status.set_text(u"".join(apptx))                        
            
            if curact["sessions"]==0:
                self._lbl_notificationsn.set_visible(True)
                self._lbl_notificationsl.set_text("")
                self._lbl_notificationsr.set_text("")
            else:
                apptxl=""
                apptxr=""
                apptxl+=self._get_message('monitorSession') + ":"
                apptxr+=self._get_message('monitorActive') + " (" + str(curact["sessions"]) + ")"
                                
                if curact["screenCapture"]>0:
                    apptxl+="\n" + self._get_message('monitorScreenCapture') + ":"
                    apptxr+="\n" + self._get_message('monitorActive') + " (" + str(curact["screenCapture"]) + ")"
                
                if curact["shellSession"]>0:
                    apptxl+="\n" + self._get_message('monitorShellSession') + ":"
                    apptxr+="\n" + self._get_message('monitorActive') + " (" + str(curact["shellSession"]) + ")"
                
                if curact["downloads"]>0:
                    apptxl+="\n" + self._get_message('monitorDownload') + ":"
                    apptxr+="\n" + self._get_message('monitorActive') + " (" + str(curact["downloads"]) + ")"
                
                if curact["uploads"]>0:
                    apptxl+="\n" + self._get_message('monitorUpload') + ":"
                    apptxr+="\n" + self._get_message('monitorActive') + " (" + str(curact["uploads"]) + ")"
                
                self._lbl_notificationsn.set_visible(False)
                self._lbl_notificationsl.set_text(apptxl)
                self._lbl_notificationsr.set_text(apptxr)
            
            if self._mode!="runonfly":
                self._btconfig.set_enable(stateBtnEnDis)
                self._btends.set_text(self._get_message(msgBtnEnDis))
                self._btends.set_enable(stateBtnEnDis)            
                self._lbl_unattended_mode.set_enable(stateBtnEnDis);
                self._lbl_unattended_mode_yes.set_enable(stateBtnEnDis);
                self._lbl_unattended_mode_no.set_enable(stateBtnEnDis);
            
        if breadconf:
            if stateBtnEnDis or self._mode=="runonfly":
                self.update_unattended()
            else:
                self._lbl_unattended_mode_yes.set_selected(False)
                self._lbl_unattended_mode_no.set_selected(False)            
        gdi.add_scheduler(2, self.update_status)
    
    def update_unattended(self):
        try:
            sua=self.get_config("unattended_access")  
            self._lbl_unattended_mode_yes.set_selected(sua=="True")
            self._lbl_unattended_mode_no.set_selected(sua!="True")                    
        except:
            self._lbl_unattended_mode_yes.set_selected(False)
            self._lbl_unattended_mode_no.set_selected(False)

    
    def send_req(self, usr, pwd, req, prms=None):
        self._semaphore.acquire()
        try:
            if self._ipc_client==None or self._ipc_client.is_close():
                self._ipc_client=listener.IPCClient(path=self._config_base_path)
            return self._ipc_client.send_request(usr, pwd, req, prms);
        except: 
            return 'ERROR:REQUEST_TIMEOUT'
        finally:
            self._semaphore.release()

    def get_config(self, key):
        sret=self.send_req("", "", 'get_config',  {'key':key})
        if sret.startswith("OK:"):
            return sret[3:]
        else:
            raise Exception(sret[6:])
            

    def set_config(self, pwd, key, val):
        sret=self.send_req("admin", pwd, 'set_config',  {'key':key, 'value':val})
        if sret!="OK":
            raise Exception(sret[6:])

    
    def check_auth(self, pwd):
        sret=self.send_req("admin", pwd, "check_auth", None)
        if sret=="OK":
            return True
        elif sret=="ERROR:FORBIDDEN":
            return False
        else:
            raise Exception(sret[6:])
    
    
    def accept_session(self, sid):
        try:
            sret=self.send_req("", "", "accept_session",  {"id":sid})
            if sret!="OK":
                raise Exception(sret[6:])                
        except Exception as e:
            dlg = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_OK,gdi.DIALOGMESSAGE_LEVEL_ERROR,self._app)
            dlg.set_title(self._get_message('monitorTitle'))
            dlg.set_message(utils.exception_to_string(e))
            dlg.show();
    
    def reject_session(self, sid):
        try:
            sret=self.send_req("", "", "reject_session",  {"id":sid})
            if sret!="OK":
                raise Exception(sret[6:])                
        except Exception as e:
            dlg = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_OK,gdi.DIALOGMESSAGE_LEVEL_ERROR,self._app)
            dlg.set_title(self._get_message('monitorTitle'))
            dlg.set_message(utils.exception_to_string(e))
            dlg.show();
            
    def _enable_disable_action_pwd(self,e):
        if e["action"]=="PERFORMED":
            pwd = ""
            for c in e["window"].get_components():
                if c.get_name()=="txtPassword":
                    pwd=c.get_text()            
            e["window"].destroy()        
            val = "false"
            mess_ok='monitorAgentDisabled'
            if self._cur_status=="DISABLE":
                val="true"
                mess_ok='monitorAgentEnabled'
            if self.check_auth(pwd):
                self.set_config(pwd, "enabled", val)
                dlg = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_OK,gdi.DIALOGMESSAGE_LEVEL_INFO,self._app)
                dlg.set_title(self._get_message('monitorTitle'))
                dlg.set_message(self._get_message(mess_ok))
                dlg.show();
            else:
                dlg = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_OK,gdi.DIALOGMESSAGE_LEVEL_ERROR,self._app)
                dlg.set_title(self._get_message('monitorTitle'))
                dlg.set_message(self._get_message('monitorInvalidPassword'))
                dlg.show();            
    
    def _enable_disable_action(self,e):
        if e["action"]=="DIALOG_YES":
            try:
                val = "false"
                mess_ok='monitorAgentDisabled'
                if self._cur_status=="DISABLE":
                    val="true"
                    mess_ok='monitorAgentEnabled'
                pwd = ""
                if self.check_auth(pwd):
                    self.set_config(pwd, "enabled", val)
                    dlg = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_OK,gdi.DIALOGMESSAGE_LEVEL_INFO,self._app)
                    dlg.set_title(self._get_message('monitorTitle'))
                    dlg.set_message(self._get_message(mess_ok))
                    dlg.show();
                else:
                    self.ask_password(self._enable_disable_action_pwd)
            except Exception as e:
                dlg = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_OK,gdi.DIALOGMESSAGE_LEVEL_ERROR,self._app)
                dlg.set_title(self._get_message('monitorTitle'))
                dlg.set_message(utils.exception_to_string(e))
                dlg.show();
    
    def ask_password(self, faction):
        dlg = gdi.Window(gdi.WINDOW_TYPE_DIALOG, self._app)
        def fdlgact(e):
            if e["action"]=="ONCLOSE":
                faction(e)
        dlg.set_action(fdlgact)
        dlg.set_title(self._get_message('monitorTitle'))
        dlg.set_size(220, 140)
        dlg.set_show_position(gdi.WINDOW_POSITION_CENTER_SCREEN)
        lbl = gdi.Label()
        lbl.set_text(self._get_message('monitorEnterPassword'))
        lbl.set_position(10, 10)
        lbl.set_width(200)
        dlg.add_component(lbl)
        txt = gdi.TextBox()
        txt.set_name("txtPassword");
        txt.set_password_mask(True)
        txt.set_position(10, 10+lbl.get_height())
        txt.set_width(200)
        dlg.add_component(txt)
        pnlBottomH=55
        pnl = gdi.Panel();
        pnl.set_position(0, dlg.get_height()-pnlBottomH)
        pnl.set_size(dlg.get_width(),pnlBottomH)
        dlg.add_component(pnl)
        bt = gdi.Button();
        bt.set_position(int((dlg.get_width()/2)-(bt.get_width()/2)), 10)
        bt.set_text(self._get_message('ok'))
        bt.set_action(faction)        
        pnl.add_component(bt)
        dlg.show()
    
    def _set_unattended_access_pwd(self, e):
        if e["action"]=="PERFORMED":
            pwd = ""
            for c in e["window"].get_components():
                if c.get_name()=="txtPassword":
                    pwd=c.get_text()            
            e["window"].destroy()  
            if self.check_auth(pwd):
                val="false"
                if self._lbl_unattended_mode_yes.get_selected():
                    val="true"
                self.set_config("", "unattended_access", val)
            else:           
                self.update_unattended()     
                dlg = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_OK,gdi.DIALOGMESSAGE_LEVEL_ERROR,self._app)
                dlg.set_title(self._get_message('monitorTitle'))
                dlg.set_message(self._get_message('monitorInvalidPassword'))
                dlg.show();   
        elif e["action"]=="ONCLOSE":
            self.update_unattended()
    
    def set_unattended_access(self, e):
        if e["action"]=="SELECTED":
            pwd = ""
            if self.check_auth(pwd):
                val="false"
                if e["source"]==self._lbl_unattended_mode_yes:
                    val="true"
                self.set_config("", "unattended_access", val)                
            else:
                self.ask_password(self._set_unattended_access_pwd)        
    
    def enable_disable(self, e):
        if e["action"]=="PERFORMED":
            msg=self._get_message('monitorDisableAgentQuestion')
            if self._cur_status=="DISABLE":
                msg=self._get_message('monitorEnableAgentQuestion')
            
            dlg = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_YESNO,gdi.DIALOGMESSAGE_LEVEL_INFO,self._app)
            dlg.set_title(self._get_message('monitorTitle'))
            dlg.set_message(msg)
            dlg.set_action(self._enable_disable_action)
            dlg.show()    
    
    def configure(self, e):
        if e["action"]=="PERFORMED":
            if is_windows():
                subprocess.call(["native" + utils.path_sep + "dwaglnc.exe" , "configure"]) 
            elif is_linux():
                self._runproc(["native" + utils.path_sep + "configure"])
            elif is_mac():
                #KEEP FOR COMPATIBILITY
                if utils.path_exists("native/Configure.app/Contents/MacOS/Configure"):
                    self._runproc(["native/Configure.app/Contents/MacOS/Configure"])
                else:
                    self._runproc(["native/Configure.app/Contents/MacOS/Run"])            
            
    def run_update(self):
        #Lancia se stesso perche con il file monitor.update attende che le librerie si aggiornano
        if is_windows():
            subprocess.call(["native" + utils.path_sep + "dwaglnc.exe" , "systray"]) 
        elif is_linux():
            self._runproc(["native" + utils.path_sep + self._name.lower(),"systray","&"])
        elif is_mac():
            None            
    
    def unistall(self, e):
        if e["action"]=="PERFORMED":
            if is_windows():
                subprocess.call(["native" + utils.path_sep + "dwaglnc.exe" , "uninstall"]) 
            elif is_linux():
                sucmd=None
                if self._which("gksu"):
                    sucmd="gksu"
                elif self._which("kdesu"):
                    sucmd="kdesu"
                if sucmd is not None:
                    osenv = os.environ
                    libenv = {}
                    for k in osenv:
                        if k!="LD_LIBRARY_PATH":
                            libenv[k]=osenv[k]
                    subprocess.Popen([sucmd , utils.path_absname("native" + utils.path_sep + "uninstall")],env=libenv)
                else:
                    dlg = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_OK,gdi.DIALOGMESSAGE_LEVEL_ERROR,self._app)
                    dlg.set_title(self._get_message('monitorTitle'))
                    dlg.set_message(self._get_message('monitorUninstallNotRun'))
                    dlg.show();
            elif is_mac():
                self._runproc(["open", "-a", os.path.abspath("native/Uninstall.app")])
                  
    
    def _runproc(self, ar, ev=None):
        if ev is None:
            p = subprocess.Popen(ar)
        else:
            p = subprocess.Popen(ar,env=ev)
        p.communicate()
        p.wait()
    
    def _which(self, name):
        p = subprocess.Popen("which " + name, stdout=subprocess.PIPE, shell=True)
        (po, pe) = p.communicate()
        p.wait()
        return len(po) > 0     
    
    def printInfo(self):
        msgst=u""
        appar = self.get_info()
        s=appar["state"]
        if s=='0': #STATUS_OFFLINE 
            msgst=self._get_message('monitorStatusOffline')
        elif s=='1': #STATUS_ONLINE 
            msgst=self._get_message('monitorStatusOnline')
        elif s=='3': #STATUS_DISABLE 
            msgst=self._get_message('monitorStatusDisabled')
        elif s=='10': #STATUS_UPDATING 
            msgst=self._get_message('monitorStatusUpdating')
        else:
            msgst=self._get_message('monitorStatusNoService')
        print(self._get_message('monitorStatus') + u": " + msgst) 
        if "sessions" in appar: 
            print(self._get_message('monitorSession') + u" : " + self._get_message('monitorActive') + u" (" + str(appar["sessions"]) + u")")
        if "screenCapture" in appar:
            if appar["screenCapture"]>0:
                print(self._get_message('monitorScreenCapture')+ u": " + self._get_message('monitorActive') + u" (" + str(appar["screenCapture"]) + u")")            
        if "shellSession" in appar:
            if appar["shellSession"]>0:
                print(self._get_message('monitorShellSession')+ u": " + self._get_message('monitorActive') + u" (" + str(appar["shellSession"]) + u")")
        if "downloads" in appar:
            if appar["downloads"]>0:
                print(self._get_message('monitorDownload')+ u": " + self._get_message('monitorActive') + u" (" + str(appar["downloads"]) + u")")
        if "uploads" in appar:
            if appar["uploads"]>0:
                print(self._get_message('monitorUpload')+ u": " + self._get_message('monitorActive') + u" (" + str(appar["uploads"]) + u")")
            
            
    
    def _actions_systray(self,e):
        if e["action"]=="PERFORMED":
            if e["name"]=="show":
                self._app.show()
                self._app.to_front()
            elif e["name"]=="hide":
                self._app.hide()
            elif e["name"]=="enable":
                self.enable_disable(e)
            elif e["name"]=="disable":
                self.enable_disable(e)
            elif e["name"]=="configure":
                self.configure(e)
    
    def _window_action(self,e):
        if e["action"]==u"ONCLOSE":
            if self._monitor_tray_icon:
                e["source"].hide()
                e["cancel"]=True        
            else:
                if self._notifyActivities is not None:
                    self._notifyActivities.destroy()
                if self._notifyAcceptSession is not None:
                    self._notifyAcceptSession.destroy()
            
    
    def notify_action(self, e):
        if e["action"]==u"ACTIVATE":
            e["source"].get_object("window").show()
            e["source"].get_object("window").to_front()
        elif e["action"]==u"CONTEXTMENU":
            pp=gdi.PopupMenu()
            if not e["source"].get_object("window").is_show():
                pp.add_item("show",self._get_message('monitorShow'))
            else:
                pp.add_item("hide",self._get_message('monitorHide'))
            
            if self._cur_status!="NOSERVICE":
                if self._cur_status=="DISABLE":
                    pp.add_item("enable",self._get_message('monitorEnable'))
                else:
                    pp.add_item("disable",self._get_message('monitorDisable'))
                pp.add_item("configure",self._get_message('monitorConfigure'))
            pp.set_action(self._actions_systray);
            pp.show()
    
    def update_systray(self,icon,msg):
        if self._monitor_tray_icon:
            self._monitor_tray_obj.update(self.get_ico_file(icon), self._name + " - " + msg)
        
    def prepare_systray(self):
        ti=True
        try:
            if 'monitor_tray_icon' in self._properties:
                ti=self._properties['monitor_tray_icon']
        except Exception:
            None
        if self._monitor_tray_icon!=ti:
            msgst=self._get_message('monitorStatusNoService')
            self._monitor_tray_obj=gdi.NotifyIcon(self.get_ico_file(u"monitor_warning"), self._name + " - " + msgst)
            self._monitor_tray_obj.set_object("window",self._app)
            self._monitor_tray_obj.set_action(self.notify_action)            
            self._monitor_tray_icon=ti
    
    def prepare_window(self):        
        #msgst=self._get_message('monitorStatusNoService')        
        
        self._app = gdi.Window(gdi.WINDOW_TYPE_NORMAL_NOT_RESIZABLE,None,self._logo);
        self._app.set_title(self._get_message('monitorTitle'))
        self._app.set_size(_WIDTH, _HEIGHT)
        self._app.set_show_position(gdi.WINDOW_POSITION_CENTER_SCREEN)
        self._app.set_action(self._window_action)
                
        
        self._img_status_top = gdi.Panel()
        self._img_status_top.set_position(0, 0)
        self._img_status_top.set_size(_CONTENT_WIDTH, _HEIGHT_STATUS_BAR)
        self._img_status_top.set_background_gradient("ffffff", "ffffff", gdi.GRADIENT_DIRECTION_TOPBOTTOM)
        self._app.add_component(self._img_status_top)
        
        
        self._lbl_status = gdi.Label()
        self._lbl_status.set_background("ffffff")
        self._lbl_status.set_opaque(True)
        self._lbl_status.set_text_align(gdi.TEXT_ALIGN_CENTERMIDDLE)
        self._lbl_status.set_text(self._get_message('waiting'))
        self._lbl_status.set_position(0, _HEIGHT_STATUS_BAR)
        #self._lbl_status.set_size(_CONTENT_WIDTH,int((_HEIGHT-(2*_HEIGHT_STATUS_BAR))/2.8))
        self._lbl_status.set_size(_CONTENT_WIDTH,_HEIGHT_STATUS)        
        self._app.add_component(self._lbl_status)
        
        self._img_status_bottom = gdi.Panel()
        self._img_status_bottom.set_position(0, self._lbl_status.get_y() + self._lbl_status.get_height())
        self._img_status_bottom.set_size(_CONTENT_WIDTH,_HEIGHT_STATUS_BAR)
        self._img_status_bottom.set_background_gradient("ffffff", "ffffff", gdi.GRADIENT_DIRECTION_BOTTONTOP)
        self._app.add_component(self._img_status_bottom)
        
        self._lbl_notificationst = gdi.Label()
        self._lbl_notificationst.set_background("d9d9d9")
        self._lbl_notificationst.set_opaque(True)
        self._lbl_notificationst.set_text_align(gdi.TEXT_ALIGN_CENTERMIDDLE)
        self._lbl_notificationst.set_text(self._get_message('monitorCurrentActivities'))
        self._lbl_notificationst.set_position(0, self._img_status_bottom.get_y() + self._img_status_bottom.get_height())
        self._lbl_notificationst.set_size(_CONTENT_WIDTH,25)
        self._app.add_component(self._lbl_notificationst)
        
        self._lbl_notificationsl = gdi.Label()
        self._lbl_notificationsl.set_background("ffffff")
        self._lbl_notificationsl.set_opaque(True)
        self._lbl_notificationsl.set_text_align(gdi.TEXT_ALIGN_RIGHTMIDDLE)
        self._lbl_notificationsl.set_position(0, self._lbl_notificationst.get_y() + self._lbl_notificationst.get_height())
        self._lbl_notificationsl.set_size(int(_CONTENT_WIDTH/2),_HEIGHT-(self._lbl_notificationst.get_y() + self._lbl_notificationst.get_height()))
        self._app.add_component(self._lbl_notificationsl)
        
        self._lbl_notificationsr = gdi.Label()
        self._lbl_notificationsr.set_background("ffffff")
        self._lbl_notificationsr.set_opaque(True)
        self._lbl_notificationsr.set_text_align(gdi.TEXT_ALIGN_LEFTMIDDLE)
        self._lbl_notificationsr.set_position(int(_CONTENT_WIDTH/2), self._lbl_notificationsl.get_y())
        self._lbl_notificationsr.set_size(self._lbl_notificationsl.get_width(),self._lbl_notificationsl.get_height())
        self._app.add_component(self._lbl_notificationsr)
        
        self._lbl_notificationsn = gdi.Label()
        self._lbl_notificationsn.set_background("ffffff")
        self._lbl_notificationsn.set_position(0,self._lbl_notificationsl.get_y()+(int(self._lbl_notificationsl.get_height()/2)-(26/2)))
        self._lbl_notificationsn.set_text(self._get_message('monitorNoActivities'))
        self._lbl_notificationsn.set_text_align(gdi.TEXT_ALIGN_CENTERMIDDLE)
        self._lbl_notificationsn.set_size(_CONTENT_WIDTH,26)
        self._lbl_notificationsn.set_opaque(True)
        self._app.add_component(self._lbl_notificationsn)
                
        self._pnl_bottom = gdi.Panel()
        self._pnl_bottom.set_position(_CONTENT_WIDTH, 0)
        self._pnl_bottom.set_size(_WIDTH_RIGHT, _HEIGHT)
        self._app.add_component(self._pnl_bottom)
        
        wbtn=_WIDTH_RIGHT-20
        hbtn=36
        appy=10
        
        self._btends = gdi.Button()
        self._btends.set_position(10, appy)
        self._btends.set_size(wbtn, hbtn)
        self._btends.set_text(self._get_message('monitorDisable'))
        self._btends.set_action(self.enable_disable)
        self._btends.set_enable(False)
        self._pnl_bottom.add_component(self._btends)
        appy+=hbtn+6        
        
        self._btconfig = gdi.Button()
        self._btconfig.set_position(10, appy)
        self._btconfig.set_size(wbtn, hbtn)
        self._btconfig.set_text(self._get_message('monitorConfigure'))
        self._btconfig.set_action(self.configure)
        self._btconfig.set_enable(False)
        self._pnl_bottom.add_component(self._btconfig)
        appy+=hbtn+6
        
        self._btunistall = gdi.Button()
        self._btunistall.set_position(10, appy)
        self._btunistall.set_size(wbtn, hbtn)
        self._btunistall.set_text(self._get_message('monitorUninstall'))
        self._btunistall.set_action(self.unistall)
        self._pnl_bottom.add_component(self._btunistall)
        appy+=hbtn+6
        
        hunm=40
        gapunm=80
        self._lbl_unattended_mode = gdi.Label()
        self._lbl_unattended_mode.set_position(10, appy+gapunm)
        self._lbl_unattended_mode.set_text(self._get_message('unattendedAccess'))
        self._lbl_unattended_mode.set_text_align(gdi.TEXT_ALIGN_CENTERMIDDLE)
        self._lbl_unattended_mode.set_size(wbtn, hunm)
        self._lbl_unattended_mode.set_enable(False);
        self._pnl_bottom.add_component(self._lbl_unattended_mode)
        appy+=gapunm+hunm
        
        self._lbl_unattended_mode_yes = gdi.RadioButton()
        self._lbl_unattended_mode_yes.set_group("unattendedaccess")
        self._lbl_unattended_mode_yes.set_position(10, appy)
        self._lbl_unattended_mode_yes.set_text(self._get_message('yes'))
        self._lbl_unattended_mode_yes.set_enable(False);
        self._lbl_unattended_mode_yes.set_action(self.set_unattended_access)
        self._pnl_bottom.add_component(self._lbl_unattended_mode_yes)
        
        self._lbl_unattended_mode_no = gdi.RadioButton()
        self._lbl_unattended_mode_no.set_group("unattendedaccess")
        self._lbl_unattended_mode_no.set_position(_WIDTH_RIGHT/2, appy)
        self._lbl_unattended_mode_no.set_text(self._get_message('no'))
        self._lbl_unattended_mode_no.set_enable(False);
        self._lbl_unattended_mode_no.set_action(self.set_unattended_access)
        self._pnl_bottom.add_component(self._lbl_unattended_mode_no)
        
        appy+=hbtn+6
        
    def prepare_runonfly_panel(self, capp, bpth, appwmsg):
        self._runonfly_base_path = bpth
        try:
            from . import ui
        except: #FIX INSTALLER
            import ui
        self._app = capp
                
        pnl = gdi.Panel()
        pnl.set_background("ffffff")
        w=ui._CONTENT_WIDTH
        h=ui._CONTENT_HEIGHT
        lblh= int(h*60/100)
        rpw = ui._BUTTON_WIDTH+(2*ui._BUTTON_GAP)
        pnl.set_size(w, h)
        
        lblmsg = gdi.Label()
        lblmsg.set_wordwrap(True)
        lblmsg.set_text(u"".join(appwmsg))
        lblmsg.set_position(ui._GAP_TEXT,0)
        lblmsg.set_size(w-(2*ui._GAP_TEXT),lblh)
        pnl.add_component(lblmsg)            
        
        self._lbl_notificationst = gdi.Label()
        self._lbl_notificationst.set_background("d9d9d9")
        self._lbl_notificationst.set_opaque(True)
        self._lbl_notificationst.set_text_align(gdi.TEXT_ALIGN_CENTERMIDDLE)
        self._lbl_notificationst.set_text(self._get_message('monitorCurrentActivities'))
        self._lbl_notificationst.set_position(ui._GAP_TEXT, lblh)
        self._lbl_notificationst.set_size(w-ui._GAP_TEXT-rpw,25)
        pnl.add_component(self._lbl_notificationst)
        
        self._lbl_notificationsl = gdi.Label()
        self._lbl_notificationsl.set_background("ffffff")
        self._lbl_notificationsl.set_opaque(True)
        self._lbl_notificationsl.set_text_align(gdi.TEXT_ALIGN_RIGHTMIDDLE)
        self._lbl_notificationsl.set_position(self._lbl_notificationst.get_x(), self._lbl_notificationst.get_y() + self._lbl_notificationst.get_height())
        self._lbl_notificationsl.set_size(int(self._lbl_notificationst.get_width()/2),h-(self._lbl_notificationst.get_y() + self._lbl_notificationst.get_height()))
        pnl.add_component(self._lbl_notificationsl)
        
        self._lbl_notificationsr = gdi.Label()
        self._lbl_notificationsr.set_background("ffffff")
        self._lbl_notificationsr.set_opaque(True)
        self._lbl_notificationsr.set_text_align(gdi.TEXT_ALIGN_LEFTMIDDLE)
        self._lbl_notificationsr.set_position(self._lbl_notificationst.get_x()+int(self._lbl_notificationst.get_width()/2), self._lbl_notificationsl.get_y())
        self._lbl_notificationsr.set_size(self._lbl_notificationsl.get_width(),self._lbl_notificationsl.get_height())
        pnl.add_component(self._lbl_notificationsr)
        
        self._lbl_notificationsn = gdi.Label()
        self._lbl_notificationsn.set_background("ffffff")
        self._lbl_notificationsn.set_position(self._lbl_notificationst.get_x(),self._lbl_notificationsl.get_y()+(int(self._lbl_notificationsl.get_height()/2)-(26/2)))
        self._lbl_notificationsn.set_text(self._get_message('monitorNoActivities'))
        self._lbl_notificationsn.set_text_align(gdi.TEXT_ALIGN_CENTERMIDDLE)
        self._lbl_notificationsn.set_size(self._lbl_notificationst.get_width(),26)
        self._lbl_notificationsn.set_opaque(True)
        pnl.add_component(self._lbl_notificationsn)
        
        pnlr = gdi.Panel()
        pnlr.set_background("d9d9d9")
        pnlr.set_position(w-rpw, lblh)
        pnlr.set_size(rpw,h-lblh)
        pnl.add_component(pnlr)
                
        appy=20
        hunm=40
        gapunm=80
        self._lbl_unattended_mode = gdi.Label()
        self._lbl_unattended_mode.set_position(ui._BUTTON_GAP, appy+gapunm)
        self._lbl_unattended_mode.set_text(self._get_message('unattendedAccess'))
        self._lbl_unattended_mode.set_text_align(gdi.TEXT_ALIGN_CENTERMIDDLE)
        self._lbl_unattended_mode.set_size(ui._BUTTON_WIDTH, hunm)
        pnlr.add_component(self._lbl_unattended_mode)
        appy+=gapunm+hunm
        
        self._lbl_unattended_mode_yes = gdi.RadioButton()
        self._lbl_unattended_mode_yes.set_group("unattendedaccess")
        self._lbl_unattended_mode_yes.set_position(ui._BUTTON_GAP*2, appy)
        self._lbl_unattended_mode_yes.set_text(self._get_message('yes'))
        self._lbl_unattended_mode_yes.set_action(self.set_unattended_access)
        pnlr.add_component(self._lbl_unattended_mode_yes)
        
        self._lbl_unattended_mode_no = gdi.RadioButton()
        self._lbl_unattended_mode_no.set_group("unattendedaccess")
        self._lbl_unattended_mode_no.set_position(rpw/2, appy)
        self._lbl_unattended_mode_no.set_text(self._get_message('no'))
        self._lbl_unattended_mode_no.set_action(self.set_unattended_access)
        pnlr.add_component(self._lbl_unattended_mode_no)
        
        return pnl
    
    def stop(self):
        self._bstop=True
        if self._notifyActivities is not None:
            self._notifyActivities.destroy()
        if self._notifyAcceptSession is not None:
            self._notifyAcceptSession.destroy()
        if self._ipc_client is not None:
            self._ipc_client.close()
        
        
    def start(self, mode):
        self._semaphore = threading.Condition()
        self._ipc_client = None
        self._mode=mode
        self._monitor_tray_icon=False
        self._monitor_tray_obj=None
        self._monitor_desktop_notification="visible"
        self._update=False
        self._cur_status="NOSERVICE"
        self._cur_activities=None
        self._cur_agent_name=""
        self._bstop=False
        
        if mode=="info":
            self.printInfo()
        elif mode=="runonfly":
            gdi.add_scheduler(0.1, self.update_status)                        
        else:
            if not self.lock():
                if mode=="window":
                    self.add_show_file()
                return            
            
            while self.check_update() or self.check_stop():
                time.sleep(2) #Attende finché il server non cancella l'update file o lo stop file
        
            try:
                if 'monitor_desktop_notification' in self._properties:
                    self._monitor_desktop_notification=self._properties['monitor_desktop_notification']
            except Exception:
                None
            
            self.prepare_window()            
            if mode=="systray":
                self.prepare_systray()
                try:
                    if utils.is_mac():
                        gdi.mac_nsapp_set_activation_policy(1)
                except:
                    None
            else:
                self._app.show()
            
            #Start Shedulers
            gdi.add_scheduler(0.5, self.update_status)
            gdi.add_scheduler(1, self.check_events)
            
            gdi.loop()
            self.unlock()
            if self._update:
                self.run_update()
        if self._ipc_client is not None:
            self._ipc_client.close()


def fmain(args): #SERVE PER MACOS APP
    try:
        mode = None
        for arg in args: 
            if arg.lower() == "systray":
                mode = "systray"
                break
            elif arg.lower() == "window":
                mode = "window"
                break
            elif arg.lower() == "info":
                mode = "info"
                break
        if mode is not None:
            main = Main()
            Main.set_instance(main)
            main.start(mode)
        else:
            try:
                main = Main()
                Main.set_instance(main)
                main.start("window")
            except:
                main = Main()
                Main.set_instance(main)
                main.start("info")
        sys.exit(0)
    except Exception as e:
        print(utils.get_exception_string(e))
        sys.exit(1)

def ctrlHandler(ctrlType):    
    return 1

if __name__ == "__main__":
    fmain(sys.argv)
    
                                                                                                                                                                                                                                                                                                       ui/installer.py                                                                                     0000644 0001750 0001750 00000363550 14433614767 013363  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''
try:
    from . import messages
except: #FIX INSTALLER
    import messages
try:
    from . import gdi
except: #FIX INSTALLER
    import gdi
try:
    from . import ui
except: #FIX INSTALLER
    import ui
import os
import hashlib
import json
import shutil
import time
import sys
import communication
import stat
import platform
import listener
import importlib
import zlib
import base64
import ipc
import ctypes
import subprocess
import utils


_MAIN_URL = "https://www.dwservice.net/"
_MAIN_URL_QA = "https://qa.dwservice.net/"
_MAIN_URL_DEV = "https://dev.dwservice.net/dws_site/"
_NATIVE_PATH = u'native'
_RUNTIME_PATH = u'runtime'
_INSTALLER_VERSION=2

def get_native():
    if gdi.is_windows():
        return NativeWindows()
    elif gdi.is_linux():
        return NativeLinux()
    elif gdi.is_mac():
        return NativeMac()
    
def get_os_type():
    if gdi.is_linux():
        return "Linux"
    elif gdi.is_windows():
        return "Windows"
    elif gdi.is_mac():
        return "Mac"
    else:
        return "Unknown"

def get_os_type_code():
    if gdi.is_linux():
        return 0
    elif gdi.is_windows():
        return 1
    elif gdi.is_mac():
        return 2
    else:
        return -1

def stop_monitor(installpath):
    try:
        stopfilename = installpath + utils.path_sep + u"monitor.stop"
        if not utils.path_exists(stopfilename):
            stopfile = utils.file_open(stopfilename, "w", encoding='utf-8')
            stopfile.close()
        time.sleep(5) #Attende in modo che si chiudono i monitor
        utils.path_remove(stopfilename) 
    except:
        None

class NativeLinux:
    def __init__(self):
        self._name=None
        self._current_path=None
        self._install_path=None
        self._etc_path=None
        self._logo_path=u"/ui/images/logo.png"
    
    def set_name(self, k):
        self._name=k
        self._etc_path = u"/etc/" + self._name.lower()
    
    def set_logo_path(self, pth):
        self._logo_path=pth
    
    def set_current_path(self, pth):
        self._current_path=pth
    
    def set_install_path(self, pth):
        self._install_path=pth
        
    def set_install_log(self, log):
        self._install_log=log
        
    def get_proposal_path(self):
        return u"/usr/share/" + self._name.lower()
    
    def get_install_path(self) :
        if utils.path_exists(self._etc_path):
            f = utils.file_open(self._etc_path,"rb")
            try:
                s=f.read()
                ar = json.loads(utils.bytes_to_str(s,"utf8"))
                pth = ar['path']
                if utils.path_exists(pth):
                    return pth
            finally:
                f.close()
        return  None
    
    def is_task_running(self, pid):
        try:
            os.kill(pid, 0)
        except OSError:
            return False
        return True
    
    def check_init_run(self):
        return None         
     
    def check_init_install(self, onlycheck=False):
        if os.geteuid() != 0: #DEVE ESSERE EUID
            return messages.get_message("linuxRootPrivileges")
        return None
    
    def check_init_uninstall(self):
        if os.geteuid() != 0: #DEVE ESSERE EUID
            return messages.get_message("linuxRootPrivileges")
        return None

    def stop_service(self):
        ret = utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc stop", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
        self._install_log.flush()
        return ret==0
    
    def start_service(self):
        ret = utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc start", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
        self._install_log.flush()
        return ret==0
    
    def replace_key_file(self, path, lst):
        fin = utils.file_open(path, "r", encoding='utf-8')
        data = fin.read()
        fin.close()
        fout = utils.file_open(path, "w", encoding='utf-8')
        for k in lst:
            data = data.replace(k,lst[k])
        fout.write(data)
        fout.close()
    
    def get_replace_list(self):
        return {
                u"@NAME@": self._name, 
                u"@EXE_NAME@": self._name.lower(), 
                u"@PATH_DWA@": self._install_path,
                u"@PATH_LOGOOS@": self._install_path + self._logo_path
            }
    
    def prepare_file_service(self, pth):
        lstrepl = self.get_replace_list()
        fdwagsvc=pth + utils.path_sep + u"dwagsvc"
        self.replace_key_file(fdwagsvc, lstrepl)
        utils.path_change_permissions(fdwagsvc,  stat.S_IRWXU + stat.S_IRGRP + stat.S_IROTH)
        fdwagent=pth + utils.path_sep + u"dwagent.service"
        if self._name.lower()!=u"dwagent":
            utils.path_rename(fdwagent,pth + utils.path_sep  + self._name.lower() + u".service")
            fdwagent=pth + utils.path_sep  + self._name.lower() + u".service"
        self.replace_key_file(fdwagent, lstrepl)
        utils.path_change_permissions(fdwagent,  stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IROTH)        
        fdwagent=pth + utils.path_sep + u"dwagent.openrc"
        if self._name.lower()!=u"dwagent":
            utils.path_rename(fdwagent,pth + utils.path_sep  + self._name.lower() + u".openrc")
            fdwagent=pth + utils.path_sep  + self._name.lower() + u".openrc"
        self.replace_key_file(fdwagent, lstrepl)
        utils.path_change_permissions(fdwagent,  stat.S_IRWXU + stat.S_IRGRP + stat.S_IROTH)
        
    
    def prepare_file_sh(self, pth):
        lstrepl = self.get_replace_list()        
        appf=pth + utils.path_sep + u"dwagent"        
        if self._name.lower()!=u"dwagent":
            utils.path_rename(appf, pth + utils.path_sep + self._name.lower())
            appf=pth + utils.path_sep + self._name.lower()
        self.replace_key_file(appf, lstrepl)        
        utils.path_change_permissions(appf,  stat.S_IRWXU + stat.S_IRGRP +  stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH)
        
        appf=pth + utils.path_sep + u"configure"
        self.replace_key_file(appf, lstrepl)
        utils.path_change_permissions(appf,  stat.S_IRWXU + stat.S_IRGRP +  stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH)
        
        appf=pth + utils.path_sep + u"uninstall"
        self.replace_key_file(appf, lstrepl)
        utils.path_change_permissions(appf,  stat.S_IRWXU + stat.S_IRGRP +  stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH)
        
        #Menu
        fmenuconf=pth + utils.path_sep + u"dwagent.desktop"
        if utils.path_exists(fmenuconf):
            if self._name.lower()!=u"dwagent":
                utils.path_rename(fmenuconf, pth + utils.path_sep + self._name.lower() + u".desktop")
                fmenuconf=pth + utils.path_sep + self._name.lower() + u".desktop"        
            self.replace_key_file(fmenuconf, lstrepl)
            utils.path_change_permissions(fmenuconf,  stat.S_IRWXU + stat.S_IRGRP + stat.S_IRWXO)
        
    
    #LO USA ANCHE agent.py
    def prepare_file_monitor(self, pth):
        lstrepl = self.get_replace_list()
        appf=pth + utils.path_sep + u"systray"
        if utils.path_exists(appf):
            self.replace_key_file(appf, lstrepl)
            utils.path_change_permissions(appf,  stat.S_IRWXU + stat.S_IRGRP +  stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH)
        
        fmenusystray=pth + utils.path_sep + u"systray.desktop"
        if utils.path_exists(fmenusystray):
            self.replace_key_file(fmenusystray, lstrepl)
            utils.path_change_permissions(fmenusystray,  stat.S_IRWXU + stat.S_IRGRP + stat.S_IRWXO)
    
    def prepare_file(self):
        self.prepare_file_service(self._install_path + utils.path_sep + u"native")
        self.prepare_file_sh(self._install_path + utils.path_sep + u"native")
        self.prepare_file_monitor(self._install_path + utils.path_sep + u"native")
    
    def prepare_file_runonfly(self, runcode):
        None
    
    def start_runonfly(self, runcode):
        pargs=[]
        pargs.append(sys.executable)
        pargs.append(u'agent.py')
        pargs.append(u'-runonfly')
        pargs.append(u'-filelog')
        if runcode is not None:
            pargs.append(u'runcode=' + runcode)
        
        libenv = os.environ
        libenv["LD_LIBRARY_PATH"]=utils.path_absname(self._current_path + utils.path_sep + u"runtime" + utils.path_sep + u"lib")
        return subprocess.Popen(pargs, env=libenv)

    
    def prepare_runtime_by_os(self,ds):
        utils.path_makedir(ds)
        utils.path_makedir(ds + utils.path_sep + u"bin")
        utils.path_makedir(ds + utils.path_sep + u"lib")
        utils.path_symlink(sys.executable, ds + utils.path_sep + u"bin" + utils.path_sep + self._name.lower())
        return True;
    
    def install_service(self):
        ret = utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc install", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
        self._install_log.flush()
        return ret==0
    
    def delete_service(self):
        ret = utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc delete", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
        self._install_log.flush()
        return ret==0
    
    def install_auto_run_monitor(self):
        try:
            pautos = u"/etc/xdg/autostart"
            utils.path_copy(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"systray.desktop", pautos + utils.path_sep + self._name.lower() + u"_systray.desktop")
            utils.path_change_permissions(pautos + utils.path_sep + self._name.lower() + u"_systray.desktop",  stat.S_IRWXU + stat.S_IRGRP + stat.S_IRWXO)
            #Run monitor (we have to run for user connect to X)
            #os.system(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwaglnc systray &")
        except:
            None
        return True
    
    def remove_auto_run_monitor(self):
        try:
            fnm = u"/etc/xdg/autostart/" + self._name.lower() + u"_systray.desktop"
            if utils.path_exists(fnm):
                utils.path_remove(fnm)
        except:
            None
        return True
    
    def install_extra(self):
        return True
    
    def install_shortcuts(self):
        try:
            #Crea MENU
            utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc install_shortcuts", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
            self._install_log.flush()
            
            #CREA /etc/dwagent
            if utils.path_exists(self._etc_path):
                utils.path_remove(self._etc_path)
            ar = {'path': self._install_path}
            s = json.dumps(ar, sort_keys=True, indent=1)
            f = utils.file_open(self._etc_path, 'wb')
            f.write(utils.str_to_bytes(s,"utf8"))            
            f.close()
            return True
        except:
            return False
        
        
    def remove_shortcuts(self) :
        try:
            #RIMUOVE /etc/dwagent
            if utils.path_exists(self._etc_path):
                utils.path_remove(self._etc_path)
                
            #RIMUOVE MENU
            utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc uninstall_shortcuts", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
            self._install_log.flush()
        
            return True
        except:
            return False

class NativeMac:
    def __init__(self):
        self._name=None
        self._current_path = None
        self._install_path = None
        self._svcnm = None
        #self._guilncnm = None
        self._systraynm = None
        self._logo_path=u"/ui/images/logo.icns"

    def set_name(self, k):
        self._name=k
        if self._name.lower()==u"dwagent":            
            self._svcnm = u"net.dwservice.agsvc"
            #self._guilncnm = u"net.dwservice.agguilnc"
            self._systraynm = u"net.dwservice.agsystray"
        else:
            self._svcnm = u"com.apiremoteaccess." + self._name.lower() + u"svc"
            #self._guilncnm = u"com.apiremoteaccess." + self._name.lower() + u"lnc"
            self._systraynm = u"com.apiremoteaccess." + self._name.lower() +  u"systray"
        
    def set_logo_path(self, pth):
        self._logo_path=pth
    
    def set_current_path(self, pth):
        self._current_path=pth

    def set_install_path(self, pth):
        self._install_path=pth
        
    def set_install_log(self, log):
        self._install_log=log
        
    def get_proposal_path(self):
        return u'/Library/' + self._name 
    
    def get_install_path(self) :        
        ldpth = u"/Library/LaunchDaemons/" + self._svcnm + u".plist"
        if utils.path_exists(ldpth) and utils.path_islink(ldpth):
            return utils.path_dirname(utils.path_dirname(utils.path_realname(ldpth)))
        
        if self._name.lower()==u"dwagent":
            #KEEP FOR COMPATIBILITY
            oldlncdmn_path = u"/Library/LaunchDaemons/net.dwservice.agent.plist"
            if utils.path_exists(oldlncdmn_path) and utils.path_islink(oldlncdmn_path):
                return utils.path_dirname(utils.path_dirname(utils.path_realname(oldlncdmn_path)))
            #KEEP FOR COMPATIBILITY                        
            oldlncdmn_path = u"/System/Library/LaunchDaemons/org.dwservice.agent.plist"
            if utils.path_exists(oldlncdmn_path) and utils.path_islink(oldlncdmn_path):
                return utils.path_dirname(utils.path_dirname(utils.path_realname(oldlncdmn_path)))        
        
        return None             
    
    def is_task_running(self, pid):
        try:
            os.kill(pid, 0)
        except OSError:
            return False
        return True
    
    def check_init_run(self):
        return None
    
    def check_init_install(self, onlycheck=False):
        if os.geteuid() != 0: #MUST BE EUID
            if onlycheck:
                return messages.get_message("linuxRootPrivileges")
            else:
                f = utils.file_open(u"runasadmin.install", 'wb')
                f.close()
                raise SystemExit
        return None
    
    def check_init_uninstall(self):
        if os.geteuid() != 0: #MUST BE EUID
            return messages.get_message(u"linuxRootPrivileges")
        return None

    def _get_os_ver(self):
        try:
            sver = platform.mac_ver()[0]
            ar = sver.split(".")
            if len(ar)==0:
                return [99999,99999]
            elif len(ar)==1:
                return [int(ar[0]),0]
            else:
                return [int(ar[0]),int(ar[1])]
        except:
            return [99999,99999]

    def _bootstrap_agent(self,pn):
        arver=self._get_os_ver()
        if arver[0]<10 or (arver[0]==10 and arver[1]<=9):
            utils.system_call(u"sudo -u $(id -nu `stat -f '%u' /dev/console`) launchctl load -S Aqua /Library/LaunchAgents/" + pn, shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
            self._install_log.flush()
        else:
            utils.system_call(u"launchctl bootstrap gui/`stat -f '%u' /dev/console` /Library/LaunchAgents/" + pn, shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
            self._install_log.flush()
    
    def _bootout_agent(self,pn):
        arver=self._get_os_ver()
        if arver[0]<10 or (arver[0]==10 and arver[1]<=9):
            utils.system_call(u"launchctl unload /Library/LaunchAgents/" + pn, shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
            self._install_log.flush()
            utils.system_call(u"for USER in `users`; do sudo -u $USER launchctl unload -S Aqua /Library/LaunchAgents/" + pn + "; done", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
            self._install_log.flush()
        else:
            utils.system_call(u"launchctl bootout gui/0 /Library/LaunchAgents/" + pn, shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
            self._install_log.flush()
            utils.system_call(u"for USER in `users`; do launchctl bootout gui/`id -u $USER` /Library/LaunchAgents/" + pn + "; done", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
            self._install_log.flush()
            
    def stop_service(self):
        #Arresta GUILauncher
        #self._bootout_agent(self._guilncnm + u".plist")
        ret =utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc stop", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
        self._install_log.flush()
        return ret==0
    
    def start_service(self):
        ret = utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc start", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
        self._install_log.flush()
        bret = (ret==0)
        #if bret:
        #Avvia GUILauncher
        #    self._bootstrap_agent(self._guilncnm + u".plist")
        return bret
    
    def get_replace_list(self):
        return {
            u"@NAME@": self._name, 
            u"@EXE_NAME@": self._name.lower(), 
            u"@PATH_DWA@": self._install_path,
            u"@PATH_LOGOOS@": self._install_path + self._logo_path,
            u"@LDNAME_SERVICE@": self._svcnm ,
            #u"@LDNAME_GUILNC@": self._guilncnm ,
            u"@LDNAME_SYSTRAY@": self._systraynm 
        }
    
    def replace_key_file(self, path, enc,  lst):
        fin=utils.file_open(path, "r", enc)
        data = fin.read()
        fin.close()
        fout=utils.file_open(path,"w", enc)
        for k in lst:
            data = data.replace(k,lst[k])
        fout.write(data)
        fout.close()
            
    def prepare_file_service(self, pth):
        lstrepl = self.get_replace_list()
        #Service
        fapp=pth + utils.path_sep + "dwagsvc"
        self.replace_key_file(fapp, "utf-8", lstrepl)
        utils.path_change_permissions(fapp,  stat.S_IRWXU + stat.S_IRGRP + stat.S_IROTH)
        
        fapp=pth + utils.path_sep + "dwagsvc.plist"
        self.replace_key_file(fapp, "utf-8", lstrepl)
        utils.path_change_permissions(fapp,  stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IROTH)
        
        
        #GUI Launcher
        fapp=pth + utils.path_sep + "dwagguilnc"
        utils.path_change_permissions(fapp,  stat.S_IRWXU + stat.S_IRGRP + stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH)
        
        '''
        fapp=pth + utils.path_sep + "dwagguilnc.plist"
        self.replace_key_file(fapp, "utf-8", lstrepl)
        utils.path_change_permissions(fapp,  stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IROTH)
        '''
        
    
    def prepare_file_app(self, pth):
        utils.path_makedir(pth + u"/DWAgent.app/Contents/Resources")
        utils.path_copy(self._install_path + self._logo_path, pth + u"/DWAgent.app/Contents/Resources/Icon.icns")
        shutil.copytree(pth + u"/DWAgent.app",pth + u"/Configure.app")
        shutil.copytree(pth + u"/DWAgent.app",pth + u"/Uninstall.app")
        idname=u"net.dwservice."
        if self._name.lower()!=u"dwagent":
            shutil.move(pth + u"/DWAgent.app",pth + u"/" + self._name + u".app")            
            idname=u"com.apiremoteaccess."
        
        #DWAGENT        
        utils.path_change_permissions(pth + u"/" + self._name + u".app/Contents/MacOS/Run",  stat.S_IRUSR + stat.S_IWUSR + stat.S_IXUSR + stat.S_IRGRP + stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH)           
        lstrepl = self.get_replace_list()
        lstrepl["@MOD_DWA@"]=u"monitor"
        self.replace_key_file(pth + u"/" + self._name + u".app/Contents/MacOS/Run", "utf-8", lstrepl)
        lstrepl["@ID_NAME@"]=idname + lstrepl["@EXE_NAME@"] 
        self.replace_key_file(pth + u"/" + self._name + u".app/Contents/Info.plist", "utf-8", lstrepl)        
        
        #CONFIGURE
        utils.path_change_permissions(pth + u"/Configure.app/Contents/MacOS/Run",  stat.S_IRUSR + stat.S_IWUSR + stat.S_IXUSR + stat.S_IRGRP + stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH)
        lstrepl = self.get_replace_list()
        lstrepl["@MOD_DWA@"]=u"configure"
        self.replace_key_file(pth + u"/Configure.app/Contents/MacOS/Run", "utf-8", lstrepl)
        lstrepl["@NAME@"]=u"Configure"
        lstrepl["@EXE_NAME@"]=u"configure"        
        lstrepl["@ID_NAME@"]=idname + lstrepl["@EXE_NAME@"]
        self.replace_key_file(pth + u"/Configure.app/Contents/Info.plist", "utf-8", lstrepl)                
        
        #UNINSTALL        
        utils.path_change_permissions(pth + u"/Uninstall.app/Contents/MacOS/Run",  stat.S_IRUSR + stat.S_IWUSR + stat.S_IXUSR + stat.S_IRGRP + stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH)
        lstrepl = self.get_replace_list()
        lstrepl["@MOD_DWA@"]=u"uninstall"
        self.replace_key_file(pth + u"/Uninstall.app/Contents/MacOS/Run", "utf-8", lstrepl)
        lstrepl["@NAME@"]=u"Uninstall"
        lstrepl["@EXE_NAME@"]=u"uninstall"        
        lstrepl["@ID_NAME@"]=idname + lstrepl["@EXE_NAME@"]
        self.replace_key_file(pth + u"/Uninstall.app/Contents/Info.plist", "utf-8", lstrepl)                
        
    
    def prepare_file_monitor(self, pth):
        lstrepl = self.get_replace_list()
        
        fapp=pth + utils.path_sep + "dwagsystray"
        utils.path_change_permissions(fapp,  stat.S_IRWXU + stat.S_IRGRP + stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH)
        
        fapp=pth + utils.path_sep + "dwagsystray.plist"
        self.replace_key_file(fapp, "utf-8", lstrepl)
        utils.path_change_permissions(fapp,  stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IROTH)
        
    
    def prepare_file(self):
        self.prepare_file_service(self._install_path + utils.path_sep + u"native")
        self.prepare_file_app(self._install_path + utils.path_sep + u"native")
        self.prepare_file_monitor(self._install_path + utils.path_sep + u"native")
    
    def prepare_file_runonfly(self, runcode):
        None

    def start_runonfly(self, runcode):
        pargs=[]
        pargs.append(sys.executable)
        pargs.append(u'agent.py')
        pargs.append(u'-runonfly')
        pargs.append(u'-filelog')
        if runcode is not None:
            pargs.append(u'runcode=' + runcode)
        libenv = os.environ
        libenv["LD_LIBRARY_PATH"]=utils.path_absname(self._current_path + utils.path_sep + u"runtime" + utils.path_sep + u"lib")
        return subprocess.Popen(pargs, env=libenv)

    def prepare_runtime_by_os(self,ds):
        utils.path_makedir(ds)
        utils.path_makedir(ds + utils.path_sep + u"bin")
        utils.path_makedir(ds + utils.path_sep + u"lib")
        utils.path_symlink(sys.executable, ds + utils.path_sep + u"bin" + utils.path_sep + self._name.lower())
        return True;
    
    def install_service(self):
        ret = utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc install", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
        self._install_log.flush()
        return ret==0
    
    def delete_service(self):
        ret = utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc delete", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
        self._install_log.flush()
        return ret==0
    
    def install_auto_run_monitor(self):
        ret = utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc installAutoRun", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
        self._install_log.flush()
        bret = (ret==0)
        if bret:
            #Avvia systray
            self._bootstrap_agent(self._systraynm + u".plist")
        return bret
        
    
    def remove_auto_run_monitor(self):
        #Chiude tutti systray
        self._bootout_agent(self._systraynm + u".plist")
        ret = utils.system_call(self._install_path + utils.path_sep + u"native" + utils.path_sep + u"dwagsvc removeAutoRun", shell=True, stdout=self._install_log, stderr=subprocess.STDOUT)
        self._install_log.flush()
        return ret==0
    
    def install_extra(self):
        return True
    
    def install_shortcuts(self):
        try:
            pathsrc = self._install_path + utils.path_sep + u"native/"
            pathdst = u"/Applications/"
            if utils.path_exists(pathdst):
                shutil.copytree(pathsrc + self._name + u".app", pathdst + self._name +u".app", symlinks=True)
            return True
        except:
            return False
        
        
    def remove_shortcuts(self) :
        try:
            pathsrc = u"/Applications/" + self._name + u".app"
            if utils.path_exists(pathsrc):
                utils.path_remove(pathsrc)
            return True
        except:
            return False


if gdi.is_windows():
    
    if utils.is_py2():
        import types
        import _subprocess
        from ctypes import byref, windll, c_char_p, c_wchar_p, c_void_p, Structure, sizeof, c_wchar, WinError
        from ctypes.wintypes import BYTE, WORD, LPWSTR, BOOL, DWORD, LPVOID, HANDLE
    
        class NativeWindowsPopenUnicodeSTARTUPINFOW(Structure):
            _fields_ = [
                ("cb",              DWORD),  ("lpReserved",    LPWSTR),
                ("lpDesktop",       LPWSTR), ("lpTitle",       LPWSTR),
                ("dwX",             DWORD),  ("dwY",           DWORD),
                ("dwXSize",         DWORD),  ("dwYSize",       DWORD),
                ("dwXCountChars",   DWORD),  ("dwYCountChars", DWORD),
                ("dwFillAtrribute", DWORD),  ("dwFlags",       DWORD),
                ("wShowWindow",     WORD),   ("cbReserved2",   WORD),
                ("lpReserved2",     ctypes.POINTER(BYTE)), ("hStdInput",     HANDLE),
                ("hStdOutput",      HANDLE), ("hStdError",     HANDLE),
            ]
        
        
        class NativeWindowsPopenUnicodePROCESS_INFORMATION(Structure):
            _fields_ = [
                ("hProcess",         HANDLE), ("hThread",          HANDLE),
                ("dwProcessId",      DWORD),  ("dwThreadId",       DWORD),
            ]
        
        
        class NativeWindowsPopenUnicodeHANDLE(ctypes.c_void_p):
        
            def __init__(self, *a, **kw):
                super(NativeWindowsPopenUnicodeHANDLE, self).__init__(*a, **kw)
                self.closed = False
        
            def Close(self):
                if not self.closed:
                    windll.kernel32.CloseHandle(self)
                    self.closed = True
        
            def __int__(self):
                return self.value
    
        
        NativeWindowsPopenUnicodeCreateProcessW = windll.kernel32.CreateProcessW
        NativeWindowsPopenUnicodeCreateProcessW.argtypes = [
            c_char_p, c_wchar_p, c_void_p,
            c_void_p, BOOL, DWORD, LPVOID, c_char_p,
            ctypes.POINTER(NativeWindowsPopenUnicodeSTARTUPINFOW), ctypes.POINTER(NativeWindowsPopenUnicodePROCESS_INFORMATION),
        ]
        NativeWindowsPopenUnicodeCreateProcessW.restype = BOOL
    
        class NativeWindowsPopenUnicode(subprocess.Popen):
            
            def _createProcessW(self, executable, args, _p_attr, _t_attr,
                              inherit_handles, creation_flags, env, cwd,
                              startup_info):
                si = NativeWindowsPopenUnicodeSTARTUPINFOW(
                    dwFlags=startup_info.dwFlags,
                    wShowWindow=startup_info.wShowWindow,
                    cb=sizeof(NativeWindowsPopenUnicodeSTARTUPINFOW),
                    hStdInput=int(startup_info.hStdInput),
                    hStdOutput=int(startup_info.hStdOutput),
                    hStdError=int(startup_info.hStdError),
                )    
                wenv = None
                if env is not None:
                    '''
                    env = (utils.str_new("").join([
                        utils.str_new("%s=%s\0") % (k, v)
                        for k, v in env.items()])) + utils.str_new("\0")
                    '''
                    appenv=[]
                    for k, v in env.items():
                        k = utils.str_new(k)
                        n= ctypes.windll.kernel32.GetEnvironmentVariableW(k, None, 0)
                        if n>0:
                            buf= ctypes.create_unicode_buffer(u'\0'*n)
                            ctypes.windll.kernel32.GetEnvironmentVariableW(k, buf, n)
                            appenv.append(utils.str_new("%s=%s\0") % (k , buf.value))
                    appenv.append(utils.str_new("\0"))
                    env = utils.str_new("").join(appenv)
                    wenv = (c_wchar * len(env))()
                    wenv.value = env
            
                pi = NativeWindowsPopenUnicodePROCESS_INFORMATION()
                creation_flags |= 0x00000400 #CREATE_UNICODE_ENVIRONMENT
            
                if NativeWindowsPopenUnicodeCreateProcessW(executable, args, None, None,
                                  inherit_handles, creation_flags,
                                  wenv, cwd, byref(si), byref(pi)):
                    return (NativeWindowsPopenUnicodeHANDLE(pi.hProcess), NativeWindowsPopenUnicodeHANDLE(pi.hThread),
                            pi.dwProcessId, pi.dwThreadId)
                raise WinError()
        
        
            def _execute_child(self, args, executable, preexec_fn, close_fds,
                                   cwd, env, universal_newlines,
                                   startupinfo, creationflags, shell, to_close,
                                   p2cread, p2cwrite,
                                   c2pread, c2pwrite,
                                   errread, errwrite):
                    """Execute program (MS Windows version)"""
        
                    if not isinstance(args, types.StringTypes):
                        args = subprocess.list2cmdline(args)
        
                    # Process startup details
                    if startupinfo is None:
                        startupinfo = subprocess.STARTUPINFO()
                    if None not in (p2cread, c2pwrite, errwrite):
                        startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES
                        startupinfo.hStdInput = p2cread
                        startupinfo.hStdOutput = c2pwrite
                        startupinfo.hStdError = errwrite
        
                    if shell:
                        startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
                        startupinfo.wShowWindow = _subprocess.SW_HIDE
                        comspec = os.environ.get("COMSPEC", utils.str_new("cmd.exe"))
                        args = utils.str_new('{} /c "{}"').format (comspec, args)
                        if (_subprocess.GetVersion() >= 0x80000000 or
                                utils.path_basename(comspec).lower() == "command.com"):
                            w9xpopen = self._find_w9xpopen()
                            args = utils.str_new('"%s" %s') % (w9xpopen, args)
                            creationflags |= _subprocess.CREATE_NEW_CONSOLE
        
                    def _close_in_parent(fd):
                        fd.Close()
                        to_close.remove(fd)
        
                    try:
                        hp, ht, pid, tid = self._createProcessW(executable, args,
                                                 None, None,
                                                 int(not close_fds),
                                                 creationflags,
                                                 env,
                                                 cwd,
                                                 startupinfo)
                    except subprocess.pywintypes.error as e:
                        raise WindowsError(*e.args)
                    finally:
                        if p2cread is not None:
                            _close_in_parent(p2cread)
                        if c2pwrite is not None:
                            _close_in_parent(c2pwrite)
                        if errwrite is not None:
                            _close_in_parent(errwrite)
        
                    self._child_created = True
                    self._handle = hp
                    self.pid = pid
                    ht.Close()
        
        NativeWindowsRegCloseKey = ctypes.windll.advapi32.RegCloseKey
        NativeWindowsRegCloseKey.restype = ctypes.c_long
        NativeWindowsRegCloseKey.argtypes = [ctypes.c_void_p]
        
        NativeWindowsRegOpenKeyEx = ctypes.windll.advapi32.RegOpenKeyExW
        NativeWindowsRegOpenKeyEx.restype = ctypes.c_long
        NativeWindowsRegOpenKeyEx.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p, ctypes.c_ulong,
                                 ctypes.c_ulong, ctypes.POINTER(ctypes.c_void_p)]
        
        RegQueryValueEx = ctypes.windll.advapi32.RegQueryValueExW
        RegQueryValueEx.restype = ctypes.c_long
        RegQueryValueEx.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p, ctypes.POINTER(ctypes.wintypes.DWORD), ctypes.POINTER(ctypes.wintypes.DWORD),
                                ctypes.POINTER(ctypes.wintypes.BYTE), ctypes.POINTER(ctypes.wintypes.DWORD)]

    else:        
        
        from ctypes.wintypes import BYTE, WORD, LPWSTR, BOOL, DWORD, LPVOID, HANDLE
        
        NativeWindowsPopenUnicode=subprocess.Popen
                        
        dll_advapi32 = ctypes.WinDLL("advapi32")
        NativeWindowsRegCloseKey = dll_advapi32.RegCloseKey
        NativeWindowsRegCloseKey.restype = ctypes.c_long
        NativeWindowsRegCloseKey.argtypes = [ctypes.c_void_p]
        
        NativeWindowsRegOpenKeyEx = dll_advapi32.RegOpenKeyExW
        NativeWindowsRegOpenKeyEx.restype = ctypes.c_long
        NativeWindowsRegOpenKeyEx.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p, ctypes.c_ulong,
                                 ctypes.c_ulong, ctypes.POINTER(ctypes.c_void_p)]
        
        RegQueryValueEx = dll_advapi32.RegQueryValueExW
        RegQueryValueEx.restype = ctypes.c_long
        RegQueryValueEx.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p, ctypes.POINTER(ctypes.wintypes.DWORD), ctypes.POINTER(ctypes.wintypes.DWORD),
                                ctypes.POINTER(ctypes.wintypes.BYTE), ctypes.POINTER(ctypes.wintypes.DWORD)]
        


class NativeWindows:
        
    def __init__(self):
        self._name=None
        self._current_path=None
        self._install_path=None
        self._os_env=None
        self._py_exe=None
        self._runtime=None
        self._logo_path=u"\\ui\\images\\logo.ico"
    
    def set_name(self, k):
        self._name=k
        self._runtime=k.lower() + u".exe"
    
    def set_logo_path(self, pth):
        self._logo_path=pth
    
    def set_current_path(self, pth):
        self._current_path=pth
    
    def set_install_path(self, pth):
        self._install_path=pth
        
    def set_install_log(self, log):
        None
        #self._install_log=log

    def get_proposal_path(self):
        return utils.str_new(os.environ["ProgramFiles"]) + utils.path_sep + self._name
    
    def get_install_path(self) :
        vret = None
        try:
            rk = ctypes.c_void_p()
            #HKEY_LOCAL_MACHINE = 0x80000002
            ret = NativeWindowsRegOpenKeyEx(ctypes.c_void_p(0x80000002), u"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + self._name, 0, 0x20019, ctypes.cast(ctypes.byref(rk), ctypes.POINTER(ctypes.c_void_p)))
            if ret == 0:
                sz = 256
                tp = ctypes.wintypes.DWORD()
                while True:
                    tmp_size = ctypes.wintypes.DWORD(sz)
                    buf = ctypes.create_string_buffer(sz)
                    ret = RegQueryValueEx(rk, u"InstallLocation", ctypes.POINTER(ctypes.wintypes.DWORD)(),
                                         ctypes.byref(tp),
                                         ctypes.cast(buf, ctypes.POINTER(ctypes.wintypes.BYTE)), ctypes.byref(tmp_size))
                    if ret != 234:
                        break
                    sz *= 2
                if ret == 0:
                    if tp.value == 1 or tp.value == 2:
                        vret = ctypes.wstring_at(buf, tmp_size.value // 2).rstrip(u'\x00')
                    elif tp.value != 4 or tp.value != 7:
                        vret = ctypes.string_at(buf, tmp_size.value)
                
                NativeWindowsRegCloseKey(rk)
            return vret
        except:
            None 
        return None
    
    def is_task_running(self, pid):
        return gdi.is_windows_task_running(pid)
    
    def check_init_run(self):
        if gdi.is_windows_user_in_admin_group():
            if gdi.is_windows_run_as_admin():
                if gdi.is_windows_process_elevated():
                    return None
                else:
                    f = utils.file_open(u"runasadmin.install", "w", encoding='utf-8')
                    f.close()
                    raise SystemExit
            else:
                f = utils.file_open(u"runasadmin.run", "w", encoding='utf-8')
                f.close()
                raise SystemExit
        else:
            return None
    
    def check_init_install(self, onlycheck=False):
        if gdi.is_windows_user_in_admin_group() and gdi.is_windows_run_as_admin():
            if gdi.is_windows_process_elevated():
                return None
            else:
                if onlycheck:
                    return messages.get_message("windowsAdminPrivileges")
                else:
                    f = utils.file_open(u"runasadmin.install", "w", encoding='utf-8')
                    f.close()
                    raise SystemExit
        else:
            if onlycheck:
                return messages.get_message("windowsAdminPrivileges")
            else:
                f = utils.file_open(u"runasadmin.install", "w", encoding='utf-8')
                f.close()
                raise SystemExit
                        
    
    def check_init_uninstall(self):
        if gdi.is_windows_user_in_admin_group() and gdi.is_windows_run_as_admin():
            try:
                if gdi.is_windows_process_elevated():
                    return None
                else:
                    return messages.get_message("windowsAdminPrivileges")
            except:
                return None #XP
        else:
            return messages.get_message("windowsAdminPrivileges")
        
    
    def prepare_file(self):
        #Scrive service.properties
        pth=self._install_path
        arf = []
        arf.append(u''.join([u"serviceName=",self._name,u"\r\n"]))
        arf.append(u''.join([u"iconPath=" ,  pth, self._logo_path + u"\r\n"]))
        #FIX UNICODE PATH
        arf.append(u''.join([u"pythonHome=runtime\r\n"]))
        arf.append(u''.join([u"pythonPath=",  pth, utils.path_sep, u"runtime", utils.path_sep, self._runtime, u"\r\n"]))
        arf.append(u"parameters=-S -m agent -filelog")
        f=utils.file_open(pth + utils.path_sep + u'native' + utils.path_sep + u'service.properties', 'w', encoding='utf-8') 
        f.write(u''.join(arf))
        f.close()
    
    def prepare_file_runonfly(self, runcode):
        #Scrive service.properties
        pth=self._install_path
        arf = []
        arf.append(u''.join([u"serviceName=",self._name + u"RunOnFly",u"\r\n"]))
        arf.append(u''.join([u"iconPath=" ,  pth, self._logo_path + u"\r\n"]))
        #FIX UNICODE PATH
        ar = self._current_path.split(utils.path_sep)
        arf.append(u''.join([u"pythonHome=.." + utils.path_sep + ar[len(ar)-1] + utils.path_sep + u"runtime\r\n"]))
        arf.append(u''.join([u"pythonPath=",  self._current_path, utils.path_sep, u"runtime", utils.path_sep, self._runtime, u"\r\n"]))
        arf.append(u"parameters=-S -m agent -runonfly -filelog")        
        if runcode is not None:
            arf.append(u" runcode=" + runcode)
        
        f=utils.file_open(pth + utils.path_sep + u'native' + utils.path_sep + u'service.properties', 'w', encoding='utf-8') 
        f.write(u''.join(arf))
        f.close()        
        self._os_env = os.environ
        self._os_env['PYTHONHOME'] = u".." + utils.path_sep + ar[len(ar)-1] + utils.path_sep + u"runtime"
        self._py_exe = self._current_path + utils.path_sep + u"runtime" + utils.path_sep + self._runtime    
    
    def start_runonfly(self, runcode):
        pargs=[]
        pargs.append(self._py_exe)
        pargs.append(u'-S')
        pargs.append(u'-m')
        pargs.append(u'agent')
        pargs.append(u'-runonfly')
        pargs.append(u'-filelog')
        if runcode is not None:
            pargs.append(u'runcode=' + runcode)         
        
        badmin=False
        if gdi.is_windows_user_in_admin_group() and gdi.is_windows_run_as_admin():
            try:
                if gdi.is_windows_process_elevated():
                    badmin=True
            except:
                badmin=True #XP
        if badmin:
            bsvcok=False
            cmd=u'"' + u'native' + utils.path_sep + u'dwagsvc.exe" startRunOnFly'
            appout = NativeWindowsPopenUnicode(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 
            lines = utils.bytes_to_str(appout[0],"utf8").splitlines()
            for l in lines:
                if l=='OK':
                    bsvcok = True
            if bsvcok==False:
                return NativeWindowsPopenUnicode(pargs, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=self._os_env)
            else:
                return None
        else:
            return NativeWindowsPopenUnicode(pargs, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=self._os_env)
    
    def prepare_runtime_by_os(self,ds):
        return False;    
    
    def executecmd(self, cmd):
        appout = NativeWindowsPopenUnicode(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
        lines = utils.bytes_to_str(appout[0],"utf8").splitlines()
        for l in lines:
            if l=='OK':
                return True
        return False
    
    def stop_service(self):
        cmd=u'"' + self._install_path + utils.path_sep + u'native' + utils.path_sep + u'dwagsvc.exe" stopService'
        return self.executecmd(cmd)
    
    def start_service(self):
        cmd=u'"' + self._install_path + utils.path_sep + u'native' + utils.path_sep + u'dwagsvc.exe" startService'
        return self.executecmd(cmd)
    
    def install_service(self):
        cmd=u'"' + self._install_path + utils.path_sep + u'native' + utils.path_sep + u'dwagsvc.exe" installService'
        return self.executecmd(cmd)
    
    def delete_service(self):
        cmd=u'"' + self._install_path + utils.path_sep + u'native' + utils.path_sep + u'dwagsvc.exe" deleteService'
        return self.executecmd(cmd)
        
    def install_auto_run_monitor(self):
        cmd=u'"' + self._install_path + utils.path_sep + u'native' + utils.path_sep + u'dwagsvc.exe" installAutoRun'
        b = self.executecmd(cmd)
        if b==True:
            #Esegue il monitor
            cmdmon=u'"' + self._install_path + utils.path_sep + u'native' + utils.path_sep + u'dwaglnc.exe" systray' 
            NativeWindowsPopenUnicode(cmdmon, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
        return b    
    
    def remove_auto_run_monitor(self):
        cmd=u'"' + self._install_path + utils.path_sep + u'native' + utils.path_sep + u'dwagsvc.exe" removeAutoRun'
        return self.executecmd(cmd)
    
    def install_extra(self):
        return True
    
    def install_shortcuts(self) :        
        cmd=u'"' + self._install_path + utils.path_sep + u'native' + utils.path_sep + u'dwagsvc.exe" installShortcuts'
        return self.executecmd(cmd)
            
    def remove_shortcuts(self) :
        cmd=u'"' + self._install_path + utils.path_sep + u'native' + utils.path_sep + u'dwagsvc.exe" removeShortcuts'
        return self.executecmd(cmd)


class Install:
    
    def __init__(self):
        self._gotoopt=None
        self._silent=False
        self._options={}
        self._native = get_native()
        self._main_url = None
        self._ambient="PROD"
        self._uinterface=None
        self._current_path=None;
        self._install_path=ui.VarString()
        self._install_log_path=None
        self._install_log=None
        self._inatall_agent_mode=None
        self._install_code=ui.VarString()
        self._run_code=ui.VarString()
        self._install_newag_user=ui.VarString()
        self._install_newag_password=ui.VarString("", True)
        self._install_newag_name=ui.VarString()
        self._proxy_type=ui.VarString("SYSTEM")
        self._proxy_host=ui.VarString("")
        self._proxy_port=ui.VarString("")
        self._proxy_user=ui.VarString("")
        self._proxy_password=ui.VarString("", True)
        self._proxy = None
        self._ipc_client = None
        self._name = None
        self._listen_port = 7950
        self._runWithoutInstall = False
        self._runWithoutInstallProxySet = False;
        self._runWithoutInstallAgentAlive = True
        self._runWithoutInstallAgentCloseByClient=False
        self._runWithoutInstallAgentCloseEnd=True
        self._skipcertsvalidity=False
        self._main_monitor=None
        self._bmock=False        
        
    
    def _get_message(self, key):
        smsg = messages.get_message(key)
        if self._name is not None:
            return smsg.replace(u"DWAgent",self._name)
        else:
            return smsg
    
    def _get_main_url(self):
        if self._main_url is not None:
            return self._main_url
        elif self._ambient=="QA":
            return _MAIN_URL_QA
        elif self._ambient=="DEV":
            return _MAIN_URL_DEV
        return _MAIN_URL

    def _uinterface_action(self,e):
        if e["action"]=="CLOSE":
            self._runWithoutInstallAgentAlive=False
            self._runWithoutInstallAgentCloseByClient=True
            if self._uinterface.is_gui():
                cnt=0
                while not self._runWithoutInstallAgentCloseEnd:
                    time.sleep(1)
                    cnt+=1
                    if cnt>=20:
                        break
            
    
    def start(self, aropts={}):
        self._options=aropts
        
        #debug purpose
        if 'mock' in self._options:
            self._bmock = self._options['mock']
            if "lang" in self._options:
                messages.set_locale(self._options["lang"])
        
        #Load install.json
        appjs=None
        if utils.path_exists("install.json"):
            f=None
            try:
                f = utils.file_open("install.json","rb")
                s=f.read()
                appjs = json.loads(utils.bytes_to_str(s,"utf8"))
            except:
                None
            finally:
                if f is not None:
                    f.close()
        elif 'install.json' in self._options:
            appjs = self._options['install.json']
            del self._options['install.json']
        if appjs is not None:
            for p in appjs:
                if p=="lang":
                    messages.set_locale(appjs[p])
                else:
                    self._options[p]=appjs[p]
                    
        self._gotoopt=None
        if "mainurl" in self._options:
            self._main_url=self._options["mainurl"]
        if "logpath" in self._options:
            self._install_log_path=self._options["logpath"]
            if self._install_log_path[len(self._install_log_path)-1:]==utils.path_sep or self._install_log_path[len(self._install_log_path)-1:]=='"':
                self._install_log_path=self._install_log_path[0:len(self._install_log_path)-1]
            if utils.path_isdir(self._install_log_path):
                self._install_log_path = self._install_log_path + utils.path_sep + "dwaginstall.log"
        if "gotoopt" in self._options:
            self._gotoopt=self._options["gotoopt"]
        bgui=True
        if "gui" in self._options:
            bgui=self._options["gui"]
        self._silent=False;
        if "silent" in self._options:
            self._silent=self._options["silent"]
            if self._silent:
                bgui=False
                messages.set_locale(None)
            self._gotoopt="install"        
                
        if "name" in self._options:
            self._name=utils.str_new(self._options["name"])
            self._native.set_name(self._name)
        else:
            self._native.set_name(u"DWAgent")
        
        self._current_path=utils.os_getcwd()
        if self._current_path.endswith(utils.path_sep) is True:
            self._current_path=self._current_path[0:len(self._current_path)-1]
        self._native.set_current_path(self._current_path)
        if self._silent:
            self._runWithoutInstall=False
        prmsui = {}
        if "title" in self._options:
            prmsui["title"]=self._options["title"]
        else:
            prmsui["title"]="DWAgent"
        if "topinfo" in self._options:
            prmsui["topinfo"]=self._options["topinfo"]
        if "topimage" in self._options:
            prmsui["topimage"]=self._options["topimage"]
        applg = gdi._get_logo_from_conf(self._options,None)
        if applg != "":
            prmsui["logo"]=applg
        if "leftcolor" in self._options:
            prmsui["leftcolor"]=self._options["leftcolor"]
        self._uinterface = ui.UI(prmsui, self.step_init)
        
        if not self._silent:
            self._uinterface.set_action(self._uinterface_action)
        self._uinterface.start(bgui) 
        self.close_req()
                
        #CHIUDE LOG
        try:
            if self._install_log is not None:
                self._install_log.close()
        except:
            None
        
        

    '''def _read_info_file(self):
        try:
            f = utils.file_open("info.json")
            prop = json.loads(f.read())
            f.close()   
            return prop
        except Exception:
            return None'''
    
    def step_init(self, curui):
        #Verifica version dell'installer se è valida per la macchina
        if not gdi.is_windows() and not gdi.is_linux() and not gdi.is_mac():
            return ui.Message(self._get_message('versionInstallNotValid').format(""))
        if not self._silent:
            chs = ui.Chooser()
            if "welcometext" in self._options:
                m=utils.str_new(self._options["welcometext"])
            else:            
                m=self._get_message('welcomeLicense') + "\n\n" 
                m+=self._get_message('welcomeSecurity') + "\n\n" 
                m+=self._get_message('welcomeSoftwareUpdates') + "\n\n\n"
                m+=self._get_message('welcomePrivacyTerms')
                                
                p1 = m.index("https://www.dwservice.net/")
                p2 = m.index(".html",p1)
                surl= m[p1:p2+5]
                chs.add_message_hyperlink(p1, len(surl), "https://www.dwservice.net/licenses-sources.html")
                
                mtc = self._get_message('termsAndConditions')                
                ptc = m.index("#TERMSANDCONDITIONS")                
                chs.add_message_hyperlink(ptc, len(mtc), "https://www.dwservice.net/terms-and-conditions.html")
                m=m.replace("#TERMSANDCONDITIONS", mtc)
                
                mpp = self._get_message('privacyPolicy')
                ppp = m.index("#PRIVACYPOLICY")                
                chs.add_message_hyperlink(ppp, len(mpp), "https://www.dwservice.net/privacy-policy.html")
                m=m.replace("#PRIVACYPOLICY", mpp)
                
                
                
            chs.set_message(m)            
            chs.set_message_height(320)
            if "mode" in self._options and self._options["mode"]=="install":
                chs.add("install", self._get_message('install'))
            elif "mode" in self._options and self._options["mode"]=="run":
                chs.add("runWithoutInstallation", self._get_message('runWithoutInstallation'))
            else:
                chs.add("install", self._get_message('install'))
                chs.add("runWithoutInstallation", self._get_message('runWithoutInstallation'))
            chs.add("decline", self._get_message('decline'))
            chs.set_variable(ui.VarString("decline"))
            chs.set_accept_key("install;runWithoutInstallation")
            
            if self._gotoopt is not None:
                return self.step_install_choose(chs)
            else:
                chs.next_step(self.step_install_choose)
                return chs
        else:
            return self.step_install_choose(curui)
    
    def step_install_choose(self, curui):
        sopt=None
        if self._gotoopt is not None and self._gotoopt=="install":
            self._gotoopt=None
            sopt="install"
        elif self._gotoopt is not None and self._gotoopt=="run":
            self._gotoopt=None
            sopt="run"
        elif self._gotoopt is not None:
            self._gotoopt=None
            return self.step_init(curui)
        else:
            if curui.get_key() is None and curui.get_variable().get()=="runWithoutInstallation":
                if not self._silent:
                    if not self._bmock:
                        msg = self._native.check_init_run()
                        if msg is not None:
                            return ui.Message(msg)
                    sopt="run"
            else:
                if not self._silent:
                    if not self._bmock:
                        msg = self._native.check_init_install()
                        if msg is not None:
                            return ui.Message(msg)
                sopt="install"
                
        if sopt=="run":
            self._runWithoutInstall=True
            return self.step_install(curui)
        else:
            self._runWithoutInstall=False
            return self.step_check_already_install(curui)

    def step_check_already_install(self, curui):
        if not self._bmock:
            pth = self._native.get_install_path()
        else:
            pth=None
        if pth is not None:     
            if self._silent:       
                try:
                    if self._install_log_path is not None:
                        if self._install_log is None:
                            self._install_log = utils.file_open(self._install_log_path, "w", encoding='utf-8')
                        self._append_log(self._get_message('alreadyInstalled'))
                        self._install_log.close()
                        self._install_log=None
                        
                except:
                    None
            return ui.Message(self._get_message('alreadyInstalled'))
        else:
            if not self._silent:
                ipt = ui.Inputs()
                if self._install_path.get() is None:
                    self._install_path.set(self._native.get_proposal_path())
                ipt.set_message(self._get_message('selectPathInstall'))
                ipt.add('path', self._get_message('path'), self._install_path, True)
                ipt.prev_step(self.step_init)
                ipt.next_step(self.step_check_install_path)
                return ipt
            else:
                self._install_path.set(self._native.get_proposal_path())
                return self.step_check_install_path(curui)

    def step_check_install_path(self, curui):
        pth = self._install_path.get()
        if pth.startswith("#DEV#"):
            self._ambient="DEV"
            pth=pth[5:]
            self._install_path.set(pth)
        elif pth.startswith("#QA#"):
            self._ambient="QA"
            pth=pth[4:]
            self._install_path.set(pth)
        if not self._silent:
            if not self._bmock and utils.path_exists(pth):
                m=self._get_message('confirmInstall').format(pth) + u'\n' + self._get_message('warningRemovePath')
            else:
                m=self._get_message('confirmInstall').format(pth)
            chs = ui.Chooser()
            chs.set_message(m)
            chs.add("yes", self._get_message('yes'))
            chs.add("no", self._get_message('no'))
            chs.set_variable(ui.VarString("no"))
            chs.set_accept_key("yes")
            chs.prev_step(self.step_check_already_install)
            chs.next_step(self.step_install)
            return chs
        else:
            return self.step_install(curui)
    
    def _download_progress(self, rtp):
        if "downloadtext" in self._options:
            dwnmsg=self._options["downloadtext"]
        else:
            dwnmsg=self._get_message('downloadFile')
        perc = int((float(rtp.get_byte_transfer()) / float(rtp.get_byte_length())) * 100.0)
        msg=dwnmsg.format(rtp.get_property('file_name'))
        prog = rtp.get_property('prog_start') + ((rtp.get_property('prog_end') - rtp.get_property('prog_start')) * (float(perc)/100.0))
        if "downloadtext" in self._options:
            perc=None
        self._uinterface.wait_message(msg, perc, prog)
    
    def _download_file(self, node_url, name, version, pstart,  pend):
        pth = self._install_path.get()
        url = node_url +  "getAgentFile.dw?name=" + name + "&version=" + version
        file_name = pth + utils.path_sep + name
        rtp = communication.Response_Transfer_Progress({'on_data': self._download_progress})
        rtp.set_property('file_name', name)
        rtp.set_property('prog_start', pstart)
        rtp.set_property('prog_end', pend)
        communication.download_url_file(url, file_name, self._proxy, rtp)
    
    def _check_hash_file(self, name, shash):
        pth = self._install_path.get()
        fpath=pth + utils.path_sep + name
        
        md5 = hashlib.md5()
        with utils.file_open(fpath,'rb') as f: 
            for chunk in iter(lambda: f.read(8192), b''): 
                md5.update(chunk)
        h = md5.hexdigest()
        if h!=shash:
            raise Exception("Hash not valid. (file '{0}').".format(name))

    def _unzip_file(self, name, unzippath):
        pth = self._install_path.get()
        if unzippath!='':
            unzippath+=utils.path_sep 
        fpath=pth + utils.path_sep + name
        zfile = utils.zipfile_open(fpath)
        for nm in zfile.namelist():
            npath=pth + utils.path_sep + unzippath
            appnm = nm
            appar = nm.split("/")
            if (len(appar)>1):
                appnm = appar[len(appar)-1]
                npath+= nm[0:len(nm)-len(appnm)].replace("/",utils.path_sep)
            if not utils.path_exists(npath):
                utils.path_makedirs(npath)
            npath+=appnm
            fd = utils.file_open(npath,"wb")
            fd.write(zfile.read(nm))
            fd.close()
        zfile.close()
        
        #TO REMOVE 03/11/2021 KEEP COMPATIBILITY WITH OLD LINUX INSTALLER
        try:
            if name=="agent.zip":
                if utils.path_exists(unzippath + "daemon.pyc"):
                    utils.path_remove(unzippath + "daemon.pyc")                    
        except:
            None
    
    def load_prop_json(self, fname):
        f = utils.file_open(fname, "rb")
        s=f.read()
        prp  = json.loads(utils.bytes_to_str(s,"utf8"))
        f.close()
        return prp        
    
    def store_prop_json(self, prp, fname):
        s = json.dumps(prp, sort_keys=True, indent=1)
        f = utils.file_open(fname, 'wb')
        f.write(utils.str_to_bytes(s,"utf8"))
        f.close()
    
    def obfuscate_password(self, pwd):
        return utils.bytes_to_str(utils.enc_base64_encode(utils.zlib_compress(utils.str_to_bytes(pwd,"utf8"))))        

    def read_obfuscated_password(self, enpwd):
        return utils.bytes_to_str(utils.zlib_decompress(utils.enc_base64_decode(enpwd)),"utf8")
    
    def _copy_custom_images(self, prpconf, pth):
        ar = ["topimage", "logoxos", "logo16x16", "logo32x32", "logo48x48"]
        for nm in ar:
            if nm in prpconf and utils.path_exists(prpconf[nm]):
                dstpth = pth + utils.path_sep + "ui" + utils.path_sep + "images" + utils.path_sep + "custom"
                if not utils.path_exists(dstpth):
                    utils.path_makedirs(dstpth)
                utils.path_copy(self._options[nm], dstpth + utils.path_sep + self._options[nm])
    
    def _download_files(self, pstart, pend):
        iniperc=0;
        if "downloadtext" in self._options:
            dwnmsg=self._options["downloadtext"]
            iniperc=None
        else:
            dwnmsg=self._get_message('downloadFile')
        
        if self._bmock:
            msg=dwnmsg.format(u'MOCK')
            self._uinterface.wait_message(msg,  None,  pstart)
            time.sleep(2)
            self._uinterface.wait_message(msg, None,  pend)
            return
        
        pth = self._install_path.get()
        fileversions = {}
                
        msg=dwnmsg.format(u'config.xml')
        self._uinterface.wait_message(msg,  iniperc,  pstart)
        jocheck={}
        jocheck["version"]=_INSTALLER_VERSION
        jocheck["os"]=get_os_type_code()
        jocheck["osname"]=get_os_type()        
        if self._runWithoutInstall:
            jocheck["mode"]="R"
        else:
            jocheck["mode"]="I"
        if self._silent:
            jocheck["silent"]={}
            if "key" in self._options:
                jocheck["silent"]["key"]=self._options["key"]                
            elif "user" in self._options:
                jocheck["silent"]["user"]=self._options["user"]
        scheck=utils.bytes_to_str(utils.enc_base64_encode(utils.str_to_bytes(json.dumps(jocheck),"utf8")))        
        prpconf = communication.get_url_prop(self._get_main_url() + "getAgentFile.dw?name=config.xml&check=" + scheck, self._proxy)
        if "error" in prpconf:
            raise Exception(prpconf["error"])
        if "name" in self._options:
            prpconf["name"] = self._options["name"]
        if "topinfo" in self._options:
            prpconf["topinfo"]=self._options["topinfo"]
        if "topimage" in self._options and utils.path_exists(self._options["topimage"]):
            prpconf["topimage"]=self._options["topimage"]
        if "logoxos" in self._options and utils.path_exists(self._options["logoxos"]):
            prpconf["logoxos"]=self._options["logoxos"]
            self._native.set_logo_path(utils.path_sep + u"ui" + utils.path_sep + u"images" + utils.path_sep + u"custom" + utils.path_sep + prpconf["logoxos"])        
        if "logo16x16" in self._options and utils.path_exists(self._options["logo16x16"]):
            prpconf["logo16x16"]=self._options["logo16x16"]
        if "logo32x32" in self._options and utils.path_exists(self._options["logo32x32"]):
            prpconf["logo32x32"]=self._options["logo32x32"]
        if "logo48x48" in self._options and utils.path_exists(self._options["logo48x48"]):
            prpconf["logo48x48"]=self._options["logo48x48"]
        if "leftcolor" in self._options:
            prpconf["leftcolor"]=self._options["leftcolor"]                    
        if not self._runWithoutInstall:
            if "listenport" in self._options:
                prpconf['listen_port'] = self._options["listenport"]
            else:
                prpconf['listen_port'] = self._listen_port
        
        if self._runWithoutInstall:
            try:
                bmonok=False
                if self._uinterface.is_gui():
                    try:
                        try:
                            from ui import monitor
                        except: #FIX INSTALLER
                            import monitor
                        bmonok=True
                    except:
                        None
                if utils.path_exists(self._install_path.get() + utils.path_sep +  u'config.json'):				
                    appconf = self.load_prop_json(self._install_path.get() + utils.path_sep +  u'config.json')
                    if "preferred_run_user" in appconf:
                        prpconf["preferred_run_user"]=appconf["preferred_run_user"]
                    if bmonok:
                        if "unattended_access" in appconf:
                            prpconf["unattended_access"]=appconf["unattended_access"]
                        else:
                            prpconf["unattended_access"]=False
                    else:
                        prpconf["unattended_access"]=True
                    if "ssl_cert_required" in appconf:
                        del prpconf["ssl_cert_required"] 
                else:
                    if bmonok:
                        prpconf["unattended_access"]=False
                    else:
                        prpconf["unattended_access"]=True
            except:
                None
        
        
        self._copy_custom_images(prpconf, pth)        
        if self._skipcertsvalidity:
            prpconf["ssl_cert_required"]=False        
        self.store_prop_json(prpconf, pth + utils.path_sep + u'config.json')
        
        if not (self._runWithoutInstall and utils.path_exists(pth + utils.path_sep + u"config.json") 
                and utils.path_exists(pth + utils.path_sep + u"fileversions.json") and utils.path_exists(pth + utils.path_sep + u"agent.py") 
                and utils.path_exists(pth + utils.path_sep + u"communication.py") and utils.path_exists(pth + utils.path_sep + u"ipc.py")):
            msg=dwnmsg.format('files.xml')
            self._uinterface.wait_message(msg, iniperc,  pstart)
            prpfiles = communication.get_url_prop(self._get_main_url() + "getAgentFile.dw?name=files.xml", self._proxy)
            
            if "nodeUrl" in prpfiles:
                node_url = prpfiles['nodeUrl']
            if node_url is None or node_url=="":
                raise Exception("Download files: Node not available.")
            fls = []            
            import detectinfo
            appnsfx = detectinfo.get_native_suffix()
            if not self._runWithoutInstall:
                if appnsfx is not None:
                    fls.append({'name':u'agentupd_' + appnsfx + '.zip', 'unzippath':u'native'})
            
            fls.append({'name':'agent.zip', 'unzippath':u''})
            if not self._runWithoutInstall:
                fls.append({'name':u'agentui.zip', 'unzippath':u''})
            fls.append({'name':u'agentapps.zip', 'unzippath':u''})            
            if appnsfx is not None:
                if not appnsfx=="linux_generic":
                    if not self._runWithoutInstall:
                        fls.append({'name':u'agentui_' + appnsfx + u'.zip', 'unzippath':u'native'})
                    fls.append({'name':u'agentlib_' + appnsfx + u'.zip', 'unzippath':u'native'})
            step = (pend-pstart) / float(len(fls))
            pos = pstart
            for i in range(len(fls)):
                fnm=fls[i]['name'];
                file_name = pth + utils.path_sep + fnm
                try:
                    utils.path_remove(file_name)
                except Exception:
                    None
                self._append_log(u"Download file " + fnm + " ...")
                self._download_file(node_url, fnm, prpfiles[fnm + '@version'], pos,  pos+step)
                self._append_log(u"Download file " + fnm + u".OK!")
                self._append_log(u"Check file hash " + fnm + " ...")
                self._check_hash_file(fnm, prpfiles[fnm + '@hash'])
                self._append_log(u"Check file hash " + fnm + u".OK!")
                self._append_log(u"Unzip file " + fnm + " ...")
                self._unzip_file(fnm, fls[i]['unzippath'])
                self._append_log(u"Unzip file " + fnm + u".OK!")
                try:
                    utils.path_remove(file_name)
                except Exception:
                    None
                fileversions[fnm ]=prpfiles[fnm + '@version']
                pos+=step
            
            self.store_prop_json(fileversions, pth + utils.path_sep + u'fileversions.json')
    
    def _count_file_in_path(self, valid_path):
        x = 0
        for root, dirs, files in utils.path_walk(valid_path):
            for f in files:
                x = x+1
        return x

    def _copy_tree_file(self, fs, fd, msginfo):
        if utils.path_isdir(fs):
            if not utils.path_exists(fd):
                utils.path_makedirs(fd)
            lst=utils.path_list(fs)
            for fname in lst:
                self._copy_tree_file(fs + utils.path_sep + fname, fd + utils.path_sep + fname, msginfo)
        else:
            msginfo["progr"]+=msginfo["step"]
            perc =  int(((msginfo["progr"] - msginfo["pstart"] ) / (msginfo["pend"] - msginfo["pstart"] )) * 100.0)
            self._uinterface.wait_message(msginfo["message"], perc,  msginfo["progr"])
            if utils.path_exists(fd):
                utils.path_remove(fd)
            if utils.path_islink(fs):
                linkto = utils.path_readlink(fs)
                utils.path_symlink(linkto, fd)
            else:
                utils.path_copy(fs, fd)
                
        
    def _copy_tree(self, fs, ds, msg, pstart, pend):
        self._uinterface.wait_message(msg, 0, pstart)
        nfile = self._count_file_in_path(fs)
        step = (pend-pstart) / nfile
        self._copy_tree_file(fs, ds, {'message':msg,  'pstart':pstart,  'pend':pend,  'progr':pstart, 'step':step })
    
    def _make_directory(self, pstart, pend):
        if self._bmock:
            return 
            
        pth = self._install_path.get()
        if utils.path_exists(pth):
            self._uinterface.wait_message(self._get_message('removeFile'), None, pstart)
            try:
                try:
                    self._native.stop_service()
                    self._native.delete_service()
                except:
                    None 
                utils.path_remove(pth)
            except:
                raise Exception(u'Can not remove path.') #Inserire messaggio in lingua
            
        try:
            self._uinterface.wait_message(self._get_message('pathCreating'),  None, pend)
            utils.path_makedirs(pth)
        except:
            raise Exception(self._get_message('pathNotCreate'))
        
    def copy_runtime(self,pstart, pend):
        if self._bmock:
            msg=self._get_message('copyFiles')
            self._uinterface.wait_message(msg,  None,  pstart)
            time.sleep(1)
            self._uinterface.wait_message(msg,  None,  pend)
            return
        ds=self._install_path.get() + utils.path_sep + "runtime"
        msg=self._get_message('copyFiles')
        if utils.path_exists(_RUNTIME_PATH):
            self._copy_tree(_RUNTIME_PATH,ds,msg,pstart,pend)
        else:
            if not self._native.prepare_runtime_by_os(ds):
                raise Exception(self._get_message('missingRuntime'))
    
    
    def copy_native(self,pstart, pend):
        if self._bmock:
            msg=self._get_message('copyFiles')
            self._uinterface.wait_message(msg,  None,  pstart)
            time.sleep(1)
            self._uinterface.wait_message(msg,  None,  pend)
            return
        
        if not utils.path_exists(_NATIVE_PATH):
            raise Exception(self._get_message('missingNative'))            
        ds=self._install_path.get() + utils.path_sep + "native"
        msg=self._get_message('copyFiles')
        self._copy_tree(_NATIVE_PATH,ds,msg,0.76, 0.8)
        
        #CREATE installer.ver
        dsver=ds + utils.path_sep + "installer.ver"
        if utils.path_exists(dsver):
            utils.path_remove(dsver)
        fver = utils.file_open(dsver,"wb")
        fver.write(utils.str_to_bytes(str(_INSTALLER_VERSION)))
        fver.close()
        
    
    def _install_service(self, pstart, pend):
        if self._bmock:
            msg=self._get_message('installService')
            self._uinterface.wait_message(msg,  None,  pstart)
            time.sleep(1)
            msg=self._get_message('startService')
            self._uinterface.wait_message(msg,  None,  pstart)
            time.sleep(1)
            self._uinterface.wait_message(msg,  None,  pend)
            return
        msg=self._get_message('installService')
        self._uinterface.wait_message(msg, None,  pstart)
        
        self._append_log(u"Service - Try to remove dirty installation...")
        self._native.stop_service()
        self._native.delete_service()
                
        self._append_log(u"Service - Installation...")
        if not self._native.install_service():
            raise Exception(self._get_message('installServiceErr'))
            
        self._append_log(u"Service - Starting...")
        msg=self._get_message('startService')
        self._uinterface.wait_message(msg, None,  pend)
        if not self._native.start_service():
            raise Exception(self._get_message("startServiceErr"))        
    
    def _install_monitor(self, pstart, pend):
        if self._bmock:
            msg=self._get_message('installMonitor')
            self._uinterface.wait_message(msg,  None,  pstart)
            time.sleep(1)
            self._uinterface.wait_message(msg,  None,  pend)
            return
        
        msg=self._get_message('installMonitor')
        self._uinterface.wait_message(msg,  None, pstart)        
        
        self._append_log(u"Monitor - Stopping...")
        stop_monitor(self._install_path.get())
        
        self._append_log(u"Monitor - Try to remove dirty installation...")
        self._native.remove_auto_run_monitor()
        
        self._append_log(u"Monitor - Installing...")
        if not self._native.install_auto_run_monitor():
            raise Exception(self._get_message('installMonitorErr'))
        self._uinterface.wait_message(msg,  None, pend)
    
    def _install_shortcuts(self, pstart, pend):
        if self._bmock:
            msg=self._get_message('installShortcuts')
            self._uinterface.wait_message(msg,  None,  pstart)
            time.sleep(1)
            self._uinterface.wait_message(msg,  None,  pend)
            return
        
        msg=self._get_message('installShortcuts')
        self._uinterface.wait_message(msg,  None, pstart)
        
        self._append_log(u"Shortcut - Try to remove dirty installation...")
        self._native.remove_shortcuts()
        
        self._append_log(u"Shortcut - Installing...")
        if not self._native.install_shortcuts():
            raise Exception(self._get_message('installShortcutsErr'))
        self._uinterface.wait_message(msg,  None, pend)
    
    def step_config_init(self, curui):
        chs = ui.Chooser()
        m=self._get_message('configureInstallAgent')
        chs.set_message(m)
        chs.set_key("chooseInstallMode")
        chs.set_param('firstConfig',curui.get_param('firstConfig',False))
        chs.add("installCode", self._get_message('configureInstallCode'))
        chs.add("installNewAgent", self._get_message('configureInstallNewAgent'))        
        chs.set_variable(ui.VarString("installCode"))
        chs.next_step(self.step_config)
        if "installputcode" in self._options and self._options["installputcode"]:
            return self.step_config(chs)
        return chs
    
    def step_config(self, curui):
        if curui.get_param('tryAgain',False):
            if curui.get_variable().get()=='configureLater':
                return ui.Message(self._get_message('endInstallConfigLater'))
        
        if curui.get_key() is not None and curui.get_key()=='chooseInstallMode':
            self._inatall_agent_mode=curui.get_variable().get()
        
        if self._inatall_agent_mode=="installNewAgent":
            ipt = ui.Inputs()
            ipt.set_key('configure')
            ipt.set_param('firstConfig',curui.get_param('firstConfig',False))
            ipt.set_message(self._get_message('enterInstallNewAgent'))
            if self._install_newag_user.get() is None:
                self._install_newag_user.set("")
            ipt.add('user', self._get_message('configureInstallUser'), self._install_newag_user, True)
            if self._install_newag_password.get() is None:
                self._install_newag_password.set("")
            ipt.add('password', self._get_message('configureInstallPassword'), self._install_newag_password, True)
            if self._install_newag_name.get() is None:
                self._install_newag_name.set("")
            ipt.add('name', self._get_message('agentName'), self._install_newag_name, True)
        else:
            ipt = ui.Inputs()
            ipt.set_key('configure')
            ipt.set_param('firstConfig',curui.get_param('firstConfig',False))
            if self._install_code.get() is None:
                self._install_code.set("")
            ipt.set_message(self._get_message('enterInstallCode'))
            ipt.add('code', self._get_message('code'), self._install_code, True)
        if not ("installputcode" in self._options and self._options["installputcode"]):            
            ipt.prev_step(self.step_config_init)
        ipt.next_step(self.step_config_install_request)
        return ipt
    
    def send_req(self, req, prms=None):
        try:
            if self._ipc_client==None or self._ipc_client.is_close():
                self._ipc_client=listener.IPCClient(self._install_path.get())
            return self._ipc_client.send_request("admin", "", req, prms)
        except: 
            return 'ERROR:REQUEST_TIMEOUT'
    
    def close_req(self):
        if self._ipc_client!=None and not self._ipc_client.is_close():
            self._ipc_client.close()
    
    def _send_password_config(self):
        if "configPassword" in self._options:
            self.send_req("change_pwd",{'password': self._options["configPassword"]})
    
    def _send_proxy_config(self):
        pt = ''
        if self._proxy.get_port() is not None:
            pt=str(self._proxy.get_port())
        return self.send_req("set_proxy",{'type': self._proxy.get_type(), 
                                   'host': self._proxy.get_host(), 
                                   'port': pt, 
                                   'user': self._proxy.get_user(), 
                                   'password': self._proxy.get_password()})
    
    def step_configure_proxy_type(self, curui):
        chs = ui.Chooser()
        chs.set_key(curui.get_key())
        chs.set_message(self._get_message('chooseProxyType'))
        chs.add("SYSTEM", self._get_message('proxySystem'))
        chs.add("HTTP", self._get_message('proxyHttp'))
        chs.add("SOCKS4", self._get_message('proxySocks4'))
        chs.add("SOCKS4A", self._get_message('proxySocks4a'))
        chs.add("SOCKS5", self._get_message('proxySocks5'))
        chs.add("NONE", self._get_message('proxyNone'))
        chs.set_variable(self._proxy_type)
        if curui.get_key()=="install":
            if not self._runWithoutInstall:
                chs.prev_step(self.step_check_install_path)
            else:
                chs.prev_step(self.step_init)
        elif curui.get_key()=="runonfly":
            None #disable prev button
        else:
            chs.prev_step(self.step_config)
        chs.next_step(self.step_configure_proxy_info)
        return chs
    
    def step_configure_proxy_info(self, curui):
        if curui.get_variable().get()=='HTTP' or curui.get_variable().get()=='SOCKS4' or curui.get_variable().get()=='SOCKS4A' or curui.get_variable().get()=='SOCKS5':
            ipt = ui.Inputs()
            ipt.set_key(curui.get_key())
            ipt.set_message(self._get_message('proxyInfo'))
            ipt.add('proxyHost', self._get_message('proxyHost'), self._proxy_host,  True)
            ipt.add('proxyPort', self._get_message('proxyPort'), self._proxy_port,  True)
            ipt.add('proxyAuthUser', self._get_message('proxyAuthUser'), self._proxy_user,  False)
            ipt.add('proxyAuthPassword', self._get_message('proxyAuthPassword'), self._proxy_password,  False)
            ipt.prev_step(self.step_configure_proxy_type)
            ipt.next_step(self.step_configure_proxy_set)
            return ipt
        else:
            self._proxy_host.set("")
            self._proxy_port.set("")
            self._proxy_user.set("")
            self._proxy_password.set("")
            return self.step_configure_proxy_set(curui)
    
    def step_configure_proxy_set(self, curui):
        if curui.get_param('tryAgain',False):
            if curui.get_variable() is not None and curui.get_variable().get()=='configureLater':
                return self.step_config(curui)
        oldprx = self._proxy
        self._proxy=communication.ProxyInfo()
        self._proxy.set_type(self._proxy_type.get())
        self._proxy.set_host(self._proxy_host.get())
        if self._proxy_type.get()=='HTTP' or self._proxy_type.get()=='SOCKS4' or self._proxy_type.get()=='SOCKS4A' or self._proxy_type.get()=='SOCKS5':
            try:
                self._proxy.set_port(int(self._proxy_port.get()))
            except:
                self._proxy = oldprx
                return ui.ErrorDialog(self._get_message("validInteger") .format(self._get_message('proxyPort')))
        self._proxy.set_user(self._proxy_user.get())
        self._proxy.set_password(self._proxy_password.get())
        if curui.get_key()=='install':
            curui.set_key('retryDownloadProxy')
            return self.step_install(curui)
        elif curui.get_key()=="runonfly":
            curui.set_key('retryRunOnFlyProxy')
            return self.step_runonfly(curui)
        else:
            try:
                s=self._send_proxy_config()
                if s=='OK':
                    return self.step_config_install_request(curui)
                elif s=="ERROR:REQUEST_TIMEOUT":
                    return ui.ErrorDialog(self._get_message('errorConnectionConfig'))
                else:
                    return ui.ErrorDialog(s) 
            except:
                chs = ui.Chooser()
                chs.set_key(curui.get_key())
                chs.set_param("tryAgain", True)
                chs.set_message(self._get_message('errorConnectionConfig'))
                chs.add("noTryAgain", self._get_message('noTryAgain'))
                chs.add("configureLater", self._get_message('configureLater'))
                chs.set_variable(ui.VarString("noTryAgain"))
                chs.prev_step(self.step_config)
                chs.next_step(self.step_configure_proxy_set)
                return chs
            return self._configure_proxy_set(curui)

    def step_config_install_request(self, curui):
        if self._bmock:
            self._append_log(u"End Installation.")
            return ui.Message(self._get_message('endInstall'))
        
        if not self._silent:
            if curui.get_param('tryAgain',False):
                if curui.get_variable().get()=='configureLater':
                    return ui.Message(self._get_message('endInstallConfigLater'))
                elif curui.get_variable().get()=='configProxy':
                    return self.step_configure_proxy_type(curui)
        
        if self._silent:
            if gdi.is_mac():
                time.sleep(14) #silent install on Mac 
            if "key" in self._options:
                self._inatall_agent_mode="installCode"
                self._install_code.set(self._options["key"])
            elif "user" in self._options and "password" in self._options:
                self._inatall_agent_mode="installNewAgent"
                self._install_newag_user.set(self._options["user"])
                self._install_newag_password.set(self._options["password"])
                if "agentName" in self._options:
                    self._install_newag_name.set(self._options["agentName"])
                else:
                    self._install_newag_name.set(platform.node())
            else:
                self._append_log(u"End Installation.")
                return ui.Message(self._get_message('endInstall'))
            
        if self._inatall_agent_mode=="installNewAgent":
            self._append_log(u"Create new Agent ...")
            msg=self._get_message('createNewAgent')
        else:
            self._append_log(u"Check Install Code ...")
            msg=self._get_message('checkInstallCode')            
        self._uinterface.wait_message(msg)
        page = None
        try:
            if curui.get_param('firstConfig',False) and self._proxy is not None:
                s=self._send_proxy_config()
                if s!='OK':
                    if s=="ERROR:REQUEST_TIMEOUT":
                        self._append_log(u"Error Configure: Request timeout")
                        return ui.ErrorDialog(self._get_message('errorConnectionConfig'))
                    else:
                        self._append_log(u"Error Configure: " + s)
                        return ui.ErrorDialog(s)
            s = None
            if self._inatall_agent_mode=="installNewAgent":
                s = self.send_req("install_new_agent",{'user': self._install_newag_user.get(), 'password': self._install_newag_password.get(), 'name':self._install_newag_name.get()})
            else:
                s = self.send_req("install_key",{'code': self._install_code.get().strip().replace(" ", "")})
            if s=='OK':
                self._append_log(u"End Installation.")
                return ui.Message(self._get_message('endInstall'))
            elif s=="ERROR:INVALID_CODE" or s=="ERROR:INVALID_USER_PASSWORD" or s=="ERROR:NAME_NOT_VALID" or s=="ERROR:ALREADY_EXISTS" or s=="ERROR:AGENT_MAX":
                if not self._silent:
                    chs = ui.Chooser()
                    chs.set_key('configure')
                    chs.set_param('tryAgain',True)
                    if s=="ERROR:INVALID_CODE":
                        chs.set_message(self._get_message('errorInvalidCode'))
                    elif s=="ERROR:INVALID_USER_PASSWORD":
                        chs.set_message(self._get_message('errorInvalidUserPassword'))
                    elif s=="ERROR:NAME_NOT_VALID":
                        chs.set_message(self._get_message('errorAgentNameNotValid'))
                    elif s=="ERROR:ALREADY_EXISTS":
                        chs.set_message(self._get_message('errorAgentAlreadyExsists').format(self._install_newag_name.get()))
                    elif s=="ERROR:AGENT_MAX":
                        chs.set_message(self._get_message('errorAgentMax'))
                    else:
                        chs.set_message(s)
                    chs.add("reEnter", self._get_message('reEnterData'))
                    chs.add("configureLater", self._get_message('configureLater'))
                    chs.set_variable(ui.VarString("reEnter"))
                    chs.next_step(self.step_config)
                    chs.prev_step(self.step_config)
                    return chs
                else:
                    appse=s.split(":")[1];
                    self._append_log(u"Error Configure: " + appse)
                    return ui.ErrorDialog(appse)
            elif s=="ERROR:CONNECT_ERROR":
                if not self._silent:
                    chs = ui.Chooser()
                    chs.set_key('configure')
                    chs.set_param('tryAgain',True)
                    chs.set_message(self._get_message('errorConnectionQuestion'))
                    chs.add("configProxy", self._get_message('yes'))
                    chs.add("noTryAgain", self._get_message('noTryAgain'))
                    chs.add("configureLater", self._get_message('configureLater'))
                    chs.set_variable(ui.VarString("noTryAgain"))
                    chs.prev_step(self.step_config)
                    chs.next_step(self.step_config_install_request)
                    return chs
                else:
                    appse="Connect Error";
                    self._append_log(u"Error Configure: " + appse)
                    return ui.ErrorDialog(appse)
            
            elif s=="ERROR:REQUEST_TIMEOUT":
                self._append_log(u"Error Configure: Request timeout")
                return ui.ErrorDialog(self._get_message('errorConnectionConfig'))
            else:
                self._append_log(u"Error Configure: " + s)
                return ui.ErrorDialog(s) 
        except Exception as e:
            if not self._silent:
                chs = ui.Chooser()
                chs.set_key('configure')
                chs.set_param('tryAgain',True)
                chs.set_message(self._get_message('errorConnectionConfig'))
                chs.add("noTryAgain", self._get_message('noTryAgain'))
                chs.add("configureLater", self._get_message('configureLater'))
                chs.set_variable(ui.VarString("noTryAgain"))
                chs.prev_step(self.step_config)
                chs.next_step(self.step_config_install_request)
                return chs
            else:
                self._append_log(u"Error Configure: " + utils.exception_to_string(e))
                return ui.ErrorDialog(utils.exception_to_string(e))
        finally:
            if page is not None:
                page.close()
    
    def _append_log(self, txt):
        try:
            if not self._bmock:
                if self._install_log is not None:
                    self._install_log.write(utils.str_new(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) + u" - " + txt + u"\n")
                    self._install_log.flush()
        except:
            None    
    
    def _runonfly_update(self,pthsrc,pthdst):
        lst=utils.path_list(pthsrc)
        for fname in lst:
            if utils.path_isfile(pthsrc + utils.path_sep + fname):
                if utils.path_isfile(pthdst + utils.path_sep + fname):
                    utils.path_remove(pthdst + utils.path_sep + fname)
                utils.path_copy(pthsrc + utils.path_sep + fname, pthdst + utils.path_sep + fname)
            elif utils.path_isdir(pthsrc + utils.path_sep + fname):
                self._runonfly_update(pthsrc + utils.path_sep + fname,pthdst + utils.path_sep + fname)
    
    
    #COMPATIBILITY OLD VERSIONS OF RUNONFLY
    def _fix_runonfly_old_version(self):
        if utils.path_exists(u"fileversions.json"):            
            fver = self.load_prop_json('fileversions.json')
            if 'agent.zip' in fver:
                lver = int(fver['agent.zip'])
                if lver<1484751796000:
                    self._append_log(u"Fixing old version...")
                    sys.path.insert(0,self._install_path.get())
                    objlib = importlib.import_module("agent")
                    try:
                        if utils.is_py2():
                            reload(objlib)                            
                        else:
                            importlib.reload(objlib)
                        func = getattr(objlib,  'Main')
                        appcls = func(["-runonfly","-filelog"])
                        #IMPOSTARE IL PROXY
                        appcls._read_config_file()
                        appcls._load_config()
                        appcls._update_ready=False
                        bnoupd = appcls._check_update()
                        #appcls.set_runonfly_action(self._runonfly_action)
                        #appcls.start()
                    finally:
                        if appcls is not None:
                            try:
                                appcls.unload_library()
                            except:
                                None
                        sys.path.remove(sys.path[0])
                    if bnoupd:
                        raise Exception("") #DONE IN step_runonfly
                    return True
        return False                
        
    def _step_runonfly_conn_msg(self, usr, pwd):
        appwmsg=[]
        if "runputcode" in self._options and self._options["runputcode"]:
            if "runtoptext" in self._options:                            
                appwmsg.append(self._options["runtoptext"])
            else:
                appwmsg.append(self._get_message("runWithoutInstallationOnlineTopPutCode"))
            appwmsg.append(u"\n\n\n\n")
            if "runbottomtext" in self._options:                            
                appwmsg.append(self._options["runbottomtext"])
            else:
                appwmsg.append(self._get_message("runWithoutInstallationOnlineBottomPutCode"))
        else:
            if "runtoptext" in self._options:                            
                appwmsg.append(self._options["runtoptext"])
            else:
                appwmsg.append(self._get_message("runWithoutInstallationOnlineTop"))
            appwmsg.append(u"\n\n")
            appwmsg.append(self._get_message("runWithoutInstallationOnlineUser").format(usr))
            appwmsg.append(u"\n\n")
            appwmsg.append(self._get_message("runWithoutInstallationOnlinePassword").format(pwd))
            appwmsg.append(u"\n\n")
            if "runbottomtext" in self._options:                            
                appwmsg.append(self._options["runbottomtext"])
            else:
                appwmsg.append(self._get_message("runWithoutInstallationOnlineBottom"))
        
        
        if not self._uinterface.is_gui() or self._bmock:
            self._uinterface.wait_message(u"".join(appwmsg), allowclose=True)
        else:
            try:
                try:
                    from ui import monitor
                except: #FIX INSTALLER
                    import monitor
                self._destroy_main_monitor()
                self._main_monitor = monitor.Main()
                self._main_monitor._set_config_base_path(self._install_path.get())
                pnl = self._main_monitor.prepare_runonfly_panel(self._uinterface._app, self._current_path, u"".join(appwmsg))                
                self._main_monitor.start("runonfly")
                self._uinterface.wait_panel(pnl,self._destroy_main_monitor, allowclose=True)
            except Exception as e:
                print(u"Error: " + utils.exception_to_string(e) + u"\n" + utils.get_stacktrace_string())
                self._append_log(u"Error: " + utils.exception_to_string(e) + u"\n" + utils.get_stacktrace_string())
                self._uinterface.wait_message(u"".join(appwmsg), allowclose=True)
    
    def _destroy_main_monitor(self):
        if self._main_monitor is not None:
            self._main_monitor.stop()
            self._main_monitor=None        
    
    def step_runonfly_putcode(self, curui):
        ipt = ui.Inputs()
        ipt.set_key('configure')
        #ipt.set_param('firstConfig',curui.get_param('firstConfig',False))
        if self._run_code.get() is None:
            self._run_code.set("")
        ipt.set_message(self._get_message('enterRunCode'))
        ipt.add('code', self._get_message('code'), self._run_code, True)
        ipt.prev_step(self.step_init)
        ipt.next_step(self.step_runonfly)
        return ipt
    
    def step_runonfly(self, curui):
        if self._bmock:
            self._uinterface.wait_message(self._get_message("runWithoutInstallationStarting"))
            time.sleep(1)
            self._step_runonfly_conn_msg("MOCK","MOCK")
            while self._runWithoutInstallAgentAlive:
                time.sleep(1)
            return ui.Message(self._get_message('runWithoutInstallationEnd')) 
        
        #Prepare file
        self._append_log(u"Prepare file...")
        if "runputcode" in self._options and self._options["runputcode"]:
            self._native.prepare_file_runonfly(self._run_code.get())
        else:
            self._native.prepare_file_runonfly(None)
        self._append_log(u"Prepare file.OK!")
        
        #Start agent
        if self._proxy is not None:
            prpconf = self.load_prop_json(self._install_path.get() + utils.path_sep +  u'config.json')
            if self._proxy.get_type() is not None:
                prpconf['proxy_type'] = self._proxy.get_type()
            if self._proxy.get_host() is not None:
                prpconf['proxy_host'] = self._proxy.get_host()
            if self._proxy.get_port() is not None:
                prpconf['proxy_port'] = self._proxy.get_port()
            if self._proxy.get_user() is not None:
                prpconf['proxy_user'] = self._proxy.get_user()
            else:
                prpconf['proxy_user'] = ""
            if self._proxy.get_password() is not None:
                prpconf['proxy_password'] = self.obfuscate_password(self._proxy.get_password())
            else:
                prpconf['proxy_password'] = ""
            self.store_prop_json(prpconf, self._install_path.get() + utils.path_sep +  u'config.json')
        
        if curui.get_key() is not None and curui.get_key()=='retryRunOnFly':
            if curui.get_variable().get()=='configProxy':
                curui.set_key('runonfly')
                return self.step_configure_proxy_type(curui)
        
        self._append_log(u"Changing current directory to " + utils.path_absname(self._install_path.get()) + u" ...")
        utils.system_changedir(self._install_path.get())
        self._runWithoutInstallAgentCloseEnd=False
        runcode_notfound=False
        runcode_connected=False
        pstipc=None
        try:   
            while self._runWithoutInstallAgentAlive:
                self._uinterface.wait_message(self._get_message("runWithoutInstallationStarting"))
                self._append_log(u"Starting...")
                if utils.path_exists(u"update"):
                    self._append_log(u"Updating...")
                    self._uinterface.wait_message(self._get_message("runWithoutInstallationUpdating"))
                    self._runonfly_update(u"update",".")
                    utils.path_remove(u"update")
            
                #COMPATIBILITY OLD VERSIONS OF RUNONFLY
                if self._fix_runonfly_old_version():
                    if utils.path_exists(u"update"):
                        self._uinterface.wait_message(self._get_message("runWithoutInstallationUpdating"))
                        self._runonfly_update(u"update",".")
                        utils.path_remove(u"update")
            
                #CHECK FILE
                if utils.path_exists(u"dwagent.pid"):
                    utils.path_remove(u"dwagent.pid")
                if utils.path_exists(u"dwagent.start"):
                    utils.path_remove(u"dwagent.start")
                if utils.path_exists(u"dwagent.stop"):
                    utils.path_remove(u"dwagent.stop")
                if utils.path_exists(u"dwagent.status"):
                    utils.path_remove(u"dwagent.status")
                
                #Write pid
                f = utils.file_open(u"dwagent.pid", 'wb')
                f.write(utils.str_to_bytes(str(os.getpid())))
                f.close()            
                 
                #Start serice
                self._append_log(u"Run... ")
                if "runputcode" in self._options and self._options["runputcode"]:
                    ponfly=self._native.start_runonfly(self._run_code.get())
                else:
                    ponfly=self._native.start_runonfly(None)
                
                #Wait the start
                cnt=0
                while (not utils.path_exists(u"dwagent.start")):
                    time.sleep(1)
                    cnt+=1
                    if cnt>10: #10 Secondi
                        raise Exception("") #GESTITO SOTTO
                if utils.path_exists(u"dwagent.start"):
                    utils.path_remove(u"dwagent.start")
                self._append_log(u"Started.")
                
                #Handle the status
                pstipc = ipc.Property()
                pstipc.open("runonfly")
                agpid=int(pstipc.get_property("pid"))
                curst=""
                while self._native.is_task_running(agpid) and (ponfly is None or ponfly.poll() is None):
                    st = pstipc.get_property("status")
                    if st!=curst:
                        curst=st
                        if st=="CONNECTED":
                            if "runputcode" in self._options and self._options["runputcode"]:
                                runcode_connected=True
                                self._step_runonfly_conn_msg(None,None)
                            else:            
                                usr=pstipc.get_property("user")
                                usr=usr[0:3] + u"-" + usr[3:6] + u"-" + usr[6:9] + u"-" + usr[9:]
                                self._step_runonfly_conn_msg(usr, pstipc.get_property("password"))                            
                        elif st=="CONNECTING":
                            self._uinterface.wait_message(self._get_message("runWithoutInstallationConnecting"), allowclose=True)
                        elif st=="RUNCODE_NOTFOUND":
                            if "runputcode" in self._options and self._options["runputcode"]:
                                self._runWithoutInstallAgentAlive=False
                                if runcode_connected:
                                    self._runWithoutInstallAgentCloseByClient=True
                                else:
                                    runcode_notfound=True
                        elif st is not None and st.startswith("WAIT:"):
                            retry=int(st.split(":")[1])
                            if retry>3:
                                self._runWithoutInstallAgentAlive=False
                            else:
                                self._uinterface.wait_message(self._get_message("runWithoutInstallationWait").format(str(retry)), allowclose=True)

                    if self._runWithoutInstallAgentAlive==False:
                        break
                    time.sleep(1)
                
                if runcode_notfound==False:
                    self._uinterface.wait_message(self._get_message("runWithoutInstallationClosing"))
                
                f = utils.file_open(u"dwagent.stop", 'wb')
                f.close()
                cnt=0
                while self._native.is_task_running(agpid) and (ponfly is None or ponfly.poll() is None):
                    time.sleep(1)
                    cnt+=1
                    if cnt>5: #5 Seconds
                        break
                
                pstipc.close()
                pstipc=None
                time.sleep(1)
                
        except Exception as e:
            f = utils.file_open(u"dwagent.stop", 'wb')
            f.close()
            try:
                if pstipc is not None:
                    pstipc.close()
                    pstipc=None
            except:
                None
            utils.system_changedir(self._current_path)
            self._runWithoutInstallAgentCloseEnd=True
            #If does not start it could be depend by corrupted files
            self._append_log(u"Error: " + utils.exception_to_string(e) + u"\n" + utils.get_stacktrace_string())
            return ui.Message(self._get_message("runWithoutInstallationUnexpectedError").format(utils.path_absname(self._install_path.get())) + "\n\n" + utils.exception_to_string(e))
            
        
        utils.system_changedir(self._current_path)
        self._runWithoutInstallAgentCloseEnd=True
        if self._runWithoutInstallAgentCloseByClient:            
            return ui.Message(self._get_message('runWithoutInstallationEnd'))  
        else:
            self._runWithoutInstallAgentAlive=True
            if runcode_notfound:
                return ui.ErrorDialog(self._get_message('errorInvalidCode'))                
            else:
                chs = ui.Chooser()
                chs.set_key("retryRunOnFly")
                chs.set_message(self._get_message('errorConnectionQuestion'))
                chs.add("configProxy", self._get_message('yes'))
                chs.add("noTryAgain", self._get_message('noTryAgain'))
                chs.set_variable(ui.VarString("noTryAgain"))
                chs.next_step(self.step_runonfly)
                return chs
        
            
    
    def step_install(self, curui):
        if utils.path_exists(self._current_path + utils.path_sep + "ambient.dev"):
            self._ambient="DEV"
        elif utils.path_exists(self._current_path + utils.path_sep + "ambient.qa"):
            self._ambient="QA"
            
        if not self._silent:
            if curui.get_key() is None and curui.get_variable().get()=="no":
                return ui.Message(self._get_message('cancelInstall'))
            
            if curui.get_key() is not None and curui.get_key()=='retryDownload':
                if curui.get_variable().get()=='configProxy':
                    curui.set_key('install')
                    return self.step_configure_proxy_type(curui)
                if curui.get_variable().get()=='skipCertsValidity':
                    self._skipcertsvalidity=True
                    communication.set_cacerts_path("")
        
        if self._runWithoutInstall:
            if self._name is None:
                self._install_path.set(u".." + utils.path_sep + u"dwagentonfly")
            else:
                self._install_path.set(u".." + utils.path_sep + self._name.lower() + u"onfly")
            #load proxy from file
            if self._runWithoutInstallProxySet==False and utils.path_exists(self._install_path.get() + utils.path_sep + u"config.json"):
                self._runWithoutInstallProxySet=True
                prpconf=self.load_prop_json(self._install_path.get() + utils.path_sep + u"config.json")
                if 'proxy_type' in prpconf and prpconf['proxy_type']!="":
                    self._proxy=communication.ProxyInfo()
                    self._proxy.set_type(prpconf['proxy_type'])
                    self._proxy_type.set(prpconf['proxy_type'])
                    if 'proxy_host' in prpconf:
                        self._proxy.set_host(prpconf['proxy_host'])
                        self._proxy_host.set(prpconf['proxy_host'])
                    if 'proxy_port' in prpconf and prpconf['proxy_port']!="":
                        self._proxy.set_port(prpconf['proxy_port'])
                        self._proxy_port.set(str(prpconf['proxy_port']))
                    if 'proxy_user' in prpconf:
                        self._proxy.set_user(prpconf['proxy_user'])
                        self._proxy_user.set(prpconf['proxy_user'])
                    if 'proxy_password' in prpconf and prpconf['proxy_password']!="":
                        self._proxy.set_password(self.read_obfuscated_password(prpconf['proxy_password']))
        
        if self._silent: 
            #SETUP PROXY
            if "proxyType" in self._options:
                self._proxy=communication.ProxyInfo()
                self._proxy.set_type(self._options["proxyType"])
            if self._proxy is not None and "proxyHost" in self._options:
                self._proxy.set_host(self._options["proxyHost"])
            if self._proxy is not None and "proxyPort" in self._options:
                self._proxy.set_port(int(self._options["proxyPort"]))
            if self._proxy is not None and "proxyUser" in self._options:
                self._proxy.set_user(self._options["proxyUser"])
            if self._proxy is not None and "proxyPassword" in self._options:
                self._proxy.set_password(self._options["proxyPassword"])
        
        pth = self._install_path.get()
        if pth.endswith(utils.path_sep) is True:
            pth=pth[0:len(pth)-1]
        
        if not self._bmock:
            if self._runWithoutInstall and not utils.path_exists(pth):
                utils.path_makedir(pth)
                
        #Init log
        if not self._bmock:
            if self._install_log is None:
                try:
                    if self._install_log_path is not None:
                        try:
                            self._install_log = utils.file_open(self._install_log_path, "wb", encoding='utf-8')
                        except:
                            None
                    if self._install_log is None:
                        self._install_log = utils.file_open(u'install.log', "wb", encoding='utf-8')
                except:
                    try:
                        self._install_log = utils.file_open(u".." + utils.path_sep + u'dwagent_install.log', "wb", encoding='utf-8')                    
                    except:
                        None
            
        
        self._install_path.set(utils.str_new(pth))
        #set native path
        self._native.set_install_path(utils.str_new(pth))
        self._native.set_install_log(self._install_log)
            
            
        try:
            #Check admin permission (ONLY if silent else already did previous)
            if self._silent: 
                msg = self._native.check_init_install(True)
                if msg is not None:
                    raise Exception(msg)
                if self._proxy is None:
                    self._append_log(u"Proxy NONE.")
                else:
                    self._append_log(u"Proxy " + self._proxy.get_type() + u" " + self._proxy.get_host() + u":" + str(self._proxy.get_port()) + u".")
        
            
            if not self._runWithoutInstall:
                if curui.get_key()!='retryDownload' and curui.get_key()!='retryDownloadProxy':
                    #Crea cartella
                    self._append_log(u"Make folder " + pth + u"...")
                    self._make_directory(0.01, 0.02)
                    self._append_log(u"Make folder " + pth + u".OK!")
                                        
            #Copy License
            if not self._bmock:
                pthlic = self._install_path.get() + utils.path_sep + u"LICENSES"
                if not utils.path_exists(pthlic):
                    utils.path_makedirs(pthlic)
                    #if not self._runWithoutInstall:
                    utils.path_copy(u"LICENSES" + utils.path_sep + u"README", self._install_path.get() + utils.path_sep + u"README")
                    utils.path_copy(u"LICENSES" + utils.path_sep + u"runtime", pthlic + utils.path_sep + u"runtime")
                    utils.path_copy(u"LICENSES" + utils.path_sep + u"core", pthlic + utils.path_sep + u"core")
                    utils.path_copy(u"LICENSES" + utils.path_sep + u"ui", pthlic + utils.path_sep + u"ui")
            #Download file
            try:
                self._append_log(u"Download files...")
                if not self._runWithoutInstall:
                    self._download_files(0.03, 0.5)
                else:
                    self._download_files(0.01, 0.9)
                self._append_log(u"Download files.OK!")
            except Exception as e:
                se=utils.exception_to_string(e)                
                if se=="#NOTSUPPORTED":
                    raise Exception(self._get_message('installerNotSupported'))                    
                elif se=="#SILENTFORBIDDEN":
                    raise Exception("Silent installation forbidden. Please contact the support.")
                else:                
                    if not self._silent:
                        self._append_log(u"Error Download files: " + se + u"\n" + utils.get_stacktrace_string())
                        chs = ui.Chooser()
                        chs.set_key("retryDownload")
                        if u"CERTIFICATE_VERIFY_FAILED" in se:
                            self._skipcertsvalidity=False
                            communication.set_cacerts_path("cacerts.pem")
                            chs.set_message(self._get_message('skipCertValidation'))
                            chs.add("skipCertsValidity", self._get_message('yes'))
                            chs.add("noTryAgain", self._get_message('noTryAgain'))
                            chs.add("configProxy", self._get_message('configureProxy'))
                            chs.set_variable(ui.VarString("noTryAgain"))
                        else:                        
                            chs.set_message(se + u"\n" + self._get_message('errorConnectionQuestion'))
                            chs.add("configProxy", self._get_message('yes'))
                            chs.add("noTryAgain", self._get_message('noTryAgain'))
                            chs.set_variable(ui.VarString("noTryAgain"))
                        if not self._runWithoutInstall:
                            chs.prev_step(self.step_check_install_path)
                        else:
                            chs.prev_step(self.step_init)
                            self._install_path.set(None)
                        chs.next_step(self.step_install)
                        return chs
                    else:
                        raise Exception(u"Error Download files: " + se + u"\n" + utils.get_stacktrace_string())
            
            if not self._runWithoutInstall:
                self._append_log(u"Copy runtime...")
                self.copy_runtime(0.51, 0.75)
                self._append_log(u"Copy runtime.OK!")
                
                self._append_log(u"Copy native...")
                self.copy_native(0.76, 0.8)           
                self._append_log(u"Copy native.OK!")
                
                self._append_log(u"Prepare file...")
                if not self._bmock:
                    self._native.prepare_file()
                self._append_log(u"Prepare file.OK!")
                
                self._append_log(u"Install service...")
                self._install_service(0.81, 0.85)
                self._append_log(u"Install service.OK!")
                
                self._append_log(u"Install monitor...")
                self._install_monitor(0.86, 0.90)
                self._append_log(u"Install monitor.OK!")
                
                self._append_log(u"Install Shortcuts...")
                self._install_shortcuts(0.91,  1)
                self._append_log(u"Install Shortcuts.OK!")
                
                self._append_log(u"Install Extra OS...")
                if not self._bmock:
                    self._native.install_extra()
                self._append_log(u"Install Extra OS.OK!")
                
                if not self._silent:
                    curui.set_param('firstConfig',True)
                    return self.step_config_init(curui)
                else:
                    curui.set_param('firstConfig',False)
                    if self._proxy is not None:
                        self._send_proxy_config()
                    self._send_password_config()
                    return self.step_config_install_request(curui)
                
            else:
                #Update cacerts.pem
                if not self._bmock:
                    utils.path_copy('cacerts.pem',self._install_path.get() + utils.path_sep + 'cacerts.pem')
                
                self._append_log(u"Copy native...")
                self.copy_native(0.91, 1)
                self._append_log(u"Copy native.OK!")
                
                if "runputcode" in self._options and self._options["runputcode"]:
                    return self.step_runonfly_putcode(curui)
                else:                    
                    return self.step_runonfly(curui)
            
        except Exception as e:
            self._append_log(u"Error Install: " + utils.exception_to_string(e))
            return ui.ErrorDialog(utils.exception_to_string(e)) 
            

class Uninstall:
    def __init__(self):
        self._native = get_native()
        self._uinterface=None
        self._install_path=None
        self._options=None
        #self._install_log_path=None
        self._silent=False;
        self._name=None
    
    def _get_message(self, key):
        smsg = messages.get_message(key)
        if self._name is not None:
            return smsg.replace(u"DWAgent",self._name)
        else:
            return smsg
        
    def start(self, aropts={}):
        self._options=aropts
        #if "logpath" in self._options:
        #    self._install_log_path=self._options["logpath"]
        bgui=True
        if "gui" in self._options:
            bgui=self._options["gui"]
        self._silent=False;
        if "silent" in self._options:
            self._silent=self._options["silent"]
            if self._silent:
                bgui=False
                messages.set_locale(None)     
        
        confjson={}
        try:
            f = utils.file_open("config.json", "rb")
            s=f.read()
            confjson = json.loads(utils.bytes_to_str(s,"utf8"))
            f.close()
        except Exception:
            None
        prmsui={}
        if "name" in confjson:
            self._name=utils.str_new(confjson["name"])
            self._native.set_name(self._name)
        else:
            self._native.set_name(u"DWAgent")
        prmsui["title"]=self._get_message('titleUninstall')
        if "topinfo" in confjson:
            prmsui["topinfo"]=confjson["topinfo"]
        if "topimage" in confjson:
            prmsui["topimage"]=u"ui" + utils.path_sep + u"images" + utils.path_sep + u"custom" + utils.path_sep + confjson["topimage"]
        applg = gdi._get_logo_from_conf(confjson, u"ui" + utils.path_sep + u"images" + utils.path_sep + u"custom" + utils.path_sep)
        if applg != "":
            prmsui["logo"]=applg
        if "leftcolor" in confjson:
            prmsui["leftcolor"]=confjson["leftcolor"]
        self._uinterface = ui.UI(prmsui, self.step_init)
        self._uinterface.start(bgui)
        
        #CHIUDE IL LOG
        try:
            if self._install_log is not None:
                self._install_log.close()
        except:
            None
        
    def step_init(self, curui):
        msg = self._native.check_init_uninstall()
        if msg is not None:
            return ui.Message(msg)
        self._install_path = self._native.get_install_path()
        if self._install_path is None:
            return ui.Message(self._get_message('notInstalled'))
        else:
            if self._silent==False:
                self._install_path = utils.str_new(self._install_path)
                #Conferma disinstallazione
                chs = ui.Chooser()
                chs.set_message(self._get_message('confirmUninstall'))
                chs.add("yes", self._get_message('yes'))
                chs.add("no", self._get_message('no'))
                chs.set_variable(ui.VarString("no"))
                chs.set_accept_key("yes")
                chs.next_step(self.step_remove)
                return chs
            else:
                return self.step_remove(curui)
    
    def _uninstall_monitor(self, pstart, pend):
        msg=self._get_message('uninstallMonitor')
        self._uinterface.wait_message(msg,  None, pstart)
        stop_monitor(self._install_path)
        self._native.remove_auto_run_monitor()
    
    def _uninstall_service(self, pstart, pend):
        msg=self._get_message('uninstallService')
        self._uinterface.wait_message(msg,  None, pstart)
        self._native.stop_service()
        self._native.delete_service()
    
    def _uninstall_shortcuts(self, pstart, pend):
        msg=self._get_message('uninstallShortcuts')
        self._uinterface.wait_message(msg,  None, pstart)
        self._native.remove_shortcuts()
    
    def _append_log(self, txt):
        try:
            if self._install_log is not None:
                self._install_log.write(utils.str_new(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) + u" - " + txt + u"\n")
                self._install_log.flush()
        except:
            None   
    
    def step_remove(self, curui):
        if self._silent==False:
            if curui.get_key() is None and curui.get_variable().get()=="no":
                return ui.Message(self._get_message('cancelUninstall'))
        try:
            #Inizializza log
            try:
                self._install_log = utils.file_open(u"unistall.log", "wb", encoding='utf-8')
            except:
                try:
                    self._install_log = utils.file_open(u".." + utils.path_sep + u"dwagent_unistall.log", "wb", encoding='utf-8')                    
                except:
                    None
            
            self._native.set_install_path(self._install_path)
            self._native.set_install_log(self._install_log)
            
            self._append_log(u"Uninstall monitor...")
            self._uninstall_monitor(0.01, 0.4)
            
            self._append_log(u"Uninstall service...")
            self._uninstall_service(0.41, 0.8)
            
            self._append_log(u"Uninstall shortcuts...")
            self._uninstall_shortcuts(0.81, 1)
    
            #Scrive file per eliminazione della cartella
            f = utils.file_open(self._install_path + utils.path_sep + u"agent.uninstall", "w")
            f.write("\x00")
            f.close()

            self._append_log(u"End Uninstallation.")
            return ui.Message(self._get_message('endUninstall'))
        except Exception as e:
            self._append_log(u"Error Uninstall: " + utils.exception_to_string(e))
            return ui.ErrorDialog(utils.exception_to_string(e))
            

def fmain(args): #SERVE PER MACOS APP
    i = None
    arotps={}
    arotps["gui"]=True
    for arg in args: 
        if arg.lower() == "uninstall":
            i = Uninstall()
        elif arg.lower() == "-console":
            arotps["gui"]=False
        elif arg.lower() == "-silent":
            arotps["silent"]=True
        elif arg.lower().startswith("gotoopt="):
            arotps["gotoopt"]=arg[8:]
        elif arg.lower().startswith("key="):
            arotps["key"]=arg[4:]
        elif arg.lower().startswith("user="):
            arotps["user"]=arg[5:]
        elif arg.lower().startswith("password="):
            arotps["password"]=arg[9:]
        elif arg.lower().startswith("name="):
            arotps["agentName"]=arg[5:]            
        elif arg.lower().startswith("proxytype="):            
            arotps["proxyType"]=arg[10:]
        elif arg.lower().startswith("proxyhost="):            
            arotps["proxyHost"]=arg[10:]
        elif arg.lower().startswith("proxyport="):            
            arotps["proxyPort"]=arg[10:]
        elif arg.lower().startswith("proxyuser="):            
            arotps["proxyUser"]=arg[10:]
        elif arg.lower().startswith("proxypassword="):            
            arotps["proxyPassword"]=arg[14:]
        elif arg.lower().startswith("configpassword="):
            arotps["configPassword"]=arg[15:]
        elif arg.lower().startswith("logpath="):
            arotps["logpath"]=arg[8:]
        elif arg.lower().startswith("lang="):
            try:
                messages.set_locale(arg[5:])
            except:
                None            
    if i is None:
        i = Install()
    i.start(arotps)    
    sys.exit(0)
    
if __name__ == "__main__":
    fmain(sys.argv)    
    
                                                                                                                                                            ui/ui.py                                                                                            0000644 0001750 0001750 00000101765 14337447032 011771  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

try:
    from . import messages
except: #FIX INSTALLER
    import messages
try:
    from . import gdi
except: #FIX INSTALLER
    import gdi
import os
import sys
import threading
import traceback
import utils

_WIDTH=780
_HEIGHT=510
_HEIGHT_BOTTOM=55
_WIDTH_LEFT=90
_CONTENT_WIDTH=_WIDTH-_WIDTH_LEFT
_CONTENT_HEIGHT=_HEIGHT-_HEIGHT_BOTTOM
_GAP_TEXT=20
_BUTTON_WIDTH=140
_BUTTON_HEIGTH=36
_BUTTON_GAP=10

class VarString:
        
    def __init__(self, value = None,  password= False):
        self._value=value
        self._password=password
    
    def is_password(self):
        return self._password
    
    def set(self, v):
        self._value=v
    
    def get(self):
        return self._value

class BaseUI:
    def __init__(self):
        self._cancel=False
        self._prev_step=None
        self._next_step=None
        self._key=None
        self._params={}
  
    def set_key(self,  k):
        self._key=k
        
    def get_key(self):
        return self._key
    
    def set_param(self,  k, v):
        self._params[k]=v
        
    def get_param(self, k, d=None):
        if k in self._params:
            return self._params[k]
        else:
            return d
        
    def is_next_enabled(self):
        return self._next_step is not None
    
    def is_back_enabled(self):
        return self._prev_step is not None
    
    def prev_step(self, np):
        self._prev_step=np
    
    def next_step(self, np):
        self._next_step=np
    
    def fire_prev_step(self):
        if self._prev_step is not None:
            return self._prev_step(self)
        return None
        
    def fire_next_step(self):
        if self._next_step is not None:
            return self._next_step(self)
        return None

class Message(BaseUI):
    def __init__(self, msg=''):
        BaseUI.__init__(self)
        self._message=msg
    
    def set_message(self, msg):
        self._message=msg
        
    def get_message(self):
        return self._message
    
class Inputs(BaseUI):
   
    def __init__(self):
        BaseUI.__init__(self)
        self._message=None
        self._arinputs=[]
    
    def set_message(self, msg):
        self._message=msg
        
    def get_message(self):
        return self._message
    
    def add(self, key, label, variable, mandatory):
        self._arinputs.append({'key':key,  'label':label,  'variable':variable,  'mandatory':mandatory })
    
    def get_inputs(self):
        return self._arinputs
    
    def fire_next_step(self):
        #Verifica mandatory
        for i in range(len(self._arinputs)):
            inp = self._arinputs[i]
            if inp['mandatory'] is True and inp['variable'].get().strip()=="":
                return ErrorDialog(messages.get_message("fieldRequired").format(inp['label']))
        return BaseUI.fire_next_step(self)

    def on_validate(self,e):
        for i in range(len(self._arinputs)):
            inp = self._arinputs[i]
            if inp["key"]==e["source"].get_name():
                inp["variable"].set(e["source"].get_text())
                break
        
class Chooser(BaseUI):
        
    def __init__(self):
        BaseUI.__init__(self)
        self._archooser=[]
        self._selected_key=None
        self._variable=None
        self._message=None
        self._message_hyperlink=[]
        self._message_height=100
        self._accept_key=None
        self._main=None
        self._selected=None
        
        
    def set_message(self, m):
        self._message=m
    
    def add_message_hyperlink(self, ps, ln, url):
        self._message_hyperlink.append({"start":ps, "length":ln, "url": url})
    
    def set_message_height(self, h):
        self._message_height=h
    
    def get_message_height(self):
        return self._message_height
    
    def get_message(self):
        return self._message
    
    def get_message_hyperlinks(self):
        return self._message_hyperlink
    
    def set_accept_key(self, k):
        self._accept_key=k
    
    def get_accept_key(self):
        return self._accept_key
    
    def is_accept_key(self,s):
        if self._accept_key is not None:
            ar = self._accept_key.split(";")
            for i in ar:
                if i==s:
                    return True
        return False
    
    def add(self, key, label):
        self._archooser.append({'key':key,  'label':label})
    
    def get_choices(self):
        return self._archooser
    
    def get_variable(self):
        return self._variable
        
    def set_variable(self, v):
        self._variable=v
    
    def fire_next_step(self):
        #Verifica se selezionato
        bok = False
        for i in range(len(self._archooser)):
            inp = self._archooser[i]
            if self._variable.get()==inp["key"]:
                bok = True
                break
        if not bok:
            return ErrorDialog(messages.get_message("mustSelectOptions"))
        return BaseUI.fire_next_step(self)
    
    def set_main(self, main):
        self._main=main
        self._disble_next_button()

    def on_selected(self,e):
        if e["action"]=="SELECTED":
            self.get_variable().set(e["source"].get_name())
            self._disble_next_button()
    
    def is_next_enabled(self):
        if self._main is not None and self.get_accept_key() is not None:
            if self.is_accept_key(self.get_variable().get()):
                return self._next_step is not None
            else:
                return False
        return self._next_step is not None
    
    def _disble_next_button(self):
        if self._main is not None and self.get_accept_key() is not None:
            if self.is_accept_key(self.get_variable().get()):
                self._main._enable_next_button()
            else:
                self._main._disable_next_button()


class Custom(BaseUI):
        
    def __init__(self):
        BaseUI.__init__(self)
        self._content=None
        
    def set_content(self, cnt):
        self._content=cnt
            
class ErrorDialog():
    
    def __init__(self, msg):
        self._message=msg
    
    def get_message(self):
        return self._message

class AsyncInvoke(threading.Thread):
    def __init__(self, main, func, callback=None):
        threading.Thread.__init__(self, name="User_Interface")
        self._func=func
        self._callback=callback
        self._main=main
    
    def run(self):
        try:
            self._main._wait_ui=None
            self._main.wait_message(messages.get_message("waiting"))
            ret=self._func()  
        except SystemExit:
            self._main._action=None
            self._main.close()
            return         
        except Exception as e:
            msg = e.__class__.__name__
            if e.args is not None and len(e.args)>0 and e.args[0] != '':
                msg = e.args[0]
            ret=ErrorDialog(messages.get_message('unexpectedError').format(msg))
        if self._callback is not None:
            self._callback(ret)

'''
class DialogMessage(gdi.DialogMessage):
    def on_keyboard(self,tp,c,shift,ctrl,alt,meta):
        if alt==1 and tp==u"CHAR" and c==u"o":
            self._ok_action(None)
        if alt==1 and tp==u"CHAR" and c==u"y":
            self._yes_action(None)
        if alt==1 and tp==u"CHAR" and c==u"n":
            self._no_action(None)
        #print(tp + " " + c + " " + str(alt))
        gdi.Window.on_keyboard(self, tp, c, shift, ctrl, alt, meta)

class Window(gdi.Window):
    def setUI(self,v):
        self._ui=v
    
    def on_keyboard(self,tp,c,shift,ctrl,alt,meta):
        if alt==1 and tp==u"CHAR" and c==u"c" and self._ui._cur_step_ui is not None:
            self._ui.close()
            return
        if alt==1 and tp==u"CHAR" and c==u"b" and self._ui._cur_step_ui is not None:
            if self._ui._cur_step_ui.is_back_enabled():
                self._ui.back()
            return
        if alt==1 and tp==u"CHAR" and c==u"n" and self._ui._cur_step_ui is not None:
            if self._ui._cur_step_ui.is_next_enabled():
                if hasattr(self._ui._cur_step_ui,"on_validate"):
                    fc = self.get_focus_component()
                    if fc is not None:
                        self._ui._cur_step_ui.on_validate({"source":fc})
                self._ui.next()
            return
        if alt==1 and tp==u"CHAR" and c==u"u" and self._ui._cur_step_ui is not None:
            if self._ui._cur_step_ui.on_selected:
                cmps = self._ui._pnlmain.get_components();
                for i in range(len(cmps)):
                    if i>=1:
                        rb = cmps[i]
                        if rb.get_selected():
                            if i>1:
                                rb.set_selected(False)
                                cmps[i-1].set_selected(True)
                                self._ui._cur_step_ui.on_selected({"source":cmps[i-1]})
                            break;
        if alt==1 and tp==u"CHAR" and  c==u"d" and self._ui._cur_step_ui is not None:
            if self._ui._cur_step_ui.on_selected:
                cmps = self._ui._pnlmain.get_components();
                for i in range(len(cmps)):
                    if i>=1:
                        rb = cmps[i]
                        if rb.get_selected():
                            if i<len(cmps)-1:
                                rb.set_selected(False)
                                cmps[i+1].set_selected(True)
                                self._ui._cur_step_ui.on_selected({"source":cmps[i+1]})
                            break;
        #print(tp + " " + c + " " + str(alt))
        gdi.Window.on_keyboard(self, tp, c, shift, ctrl, alt, meta)
'''
            
class UI():
    def __init__(self, params, step_init):
        self._title = "DWAgent"
        if "title" in params:
            self._title = utils.str_new(params["title"])
        self._logo = None
        self._topimage = None
        self._topinfo = None
        self._leftcolor = None
        if "logo" in params:
            self._logo = utils.str_new(params["logo"])
        if "topimage" in params:
            self._topimage = utils.str_new(params["topimage"])
        if "topinfo" in params:
            self._topinfo = utils.str_new(params["topinfo"])
        if "leftcolor" in params:
            self._leftcolor = params["leftcolor"]
        self._step_init=step_init
        self._cur_step_ui=None
        self._wait_ui=None
        self._wait_panel_on_destroy=None
        self._action=None
        self._closing=False
        self._is_raw_input=False
        self._gui_enable=False
        self._prev_msg_wait=""
        
    
    def set_action(self,f):
        self._action=f
    
    def is_gui(self):
        return self._gui_enable
    
    def start(self, bgui=True):
        if bgui:
            try:
                if gdi.is_linux():
                    if not "DISPLAY" in os.environ:
                        raise("NODIPLAY") 
                    d = os.environ["DISPLAY"]
                    if d is None or d=="":
                        raise("NODIPLAY")    
                self._gui_enable=True
                self._guimode_start()
            except Exception as e:
                if gdi.is_linux():
                    self._gui_enable=False
                    self._clmode_start()
                else:
                    raise e
        else:
            self._gui_enable=False
            self._clmode_start()
    
    def _prepare_step(self, stp):
        if not self._closing:
            self._prev_msg_wait=""
            self._prepare_buttons(stp)
            func = getattr(self,  '_show_' + stp.__class__.__name__ .lower())
            func(stp)
    
    def next(self):
        if self._gui_enable==True:            
            self._guimode_next(None)
        else:
            self._clmode_next()
            
    def back(self):
        if self._gui_enable==True:
            self._guimode_back(None)
        else:
            self._clmode_back()
    
    def _op_complete(self, app):
        if app is None and self._wait_ui is not None:
            self._prepare_step(self._cur_step_ui)
        elif app.__class__.__name__ .lower()=='errordialog':
            self._show_error(app.get_message())
        else:
            self._cur_step_ui = app
            self._prepare_step(self._cur_step_ui)
            
    def _signal_close(self, signal, frame):
        if self._gui_enable is False:
            print("")
        if self._is_raw_input:
            raise Exception("#EXIT");
        else:
            self.close()
    
    def _printcl(self, msg):
        #print("ENC:" + sys.stdout.encoding)
        if utils.is_py2():
            if sys.stdout.encoding is None:
                print(msg)
            else:
                print(msg.encode(sys.stdout.encoding,'replace'))
        else:
            print(msg)
    
    def _raw_input(self,msg,bpasswd=False):
        try:
            appmsg=msg + u" "
            if utils.is_py2():
                if sys.stdout.encoding is not None:
                    appmsg=appmsg.encode(sys.stdout.encoding,'replace')            
            self._is_raw_input=True
            if not bpasswd:
                if utils.is_py2():
                    sr = raw_input(appmsg)
                else:
                    sr = input(appmsg)
            else:
                import getpass
                sr = getpass.getpass(appmsg)
            if utils.is_py2():
                sr=sr.decode('utf-8','replace')            
            if sr.lower()==u"#exit":
                raise Exception("#EXIT")
            elif sr.lower()==u"#back":
                raise Exception("#BACK")
            self._is_raw_input=False
            return sr
        except Exception as e:
            self._is_raw_input=False
            msg = utils.exception_to_string(e)
            if msg==u"#EXIT":
                self.close()
            elif msg==u"#BACK":
                if self._cur_step_ui.is_back_enabled():
                    self._clmode_back()
                else:
                    return u""
            else:
                self._printcl(u"")
                self._printcl(u"")
                self._printcl(messages.get_message('unexpectedError').format(utils.str_new(traceback.format_exc())))
                self.close()
            return None
        
    
    def close(self):
        self._closing=True
        if self._action is not None:
            self._action({"action":"CLOSE"})
        if self._gui_enable is True:
            self._app.destroy()
                
        
    def _clmode_next(self):
        try:
            self.wait_message(messages.get_message("waiting"))
            ret=self._cur_step_ui.fire_next_step()
        except Exception:
            ret=ErrorDialog(messages.get_message('unexpectedError').format(utils.str_new(traceback.format_exc())))
        self._op_complete(ret)
    
    def _clmode_back(self):
        try:
            self.wait_message(messages.get_message("waiting"))
            ret=self._cur_step_ui.fire_prev_step()
        except Exception:
            ret=ErrorDialog(messages.get_message('unexpectedError').format(utils.str_new(traceback.format_exc())))            
        self._op_complete(ret)
     
    def _clmode_start(self):
        try:
            import signal 
            signal.signal(signal.SIGINT, self._signal_close)
            signal.signal(signal.SIGTERM, self._signal_close)
            signal.signal(signal.SIGQUIT, self._signal_close)
        except:
            None            
        
        self._printcl(u"")
        self._printcl(u"****************************************")
        self._printcl(messages.get_message('commands') + u":")
        self._printcl(u" #BACK <" + messages.get_message('enter')  + "> " + messages.get_message('toBack'))
        self._printcl(u" #EXIT <" + messages.get_message('enter')  + "> " + messages.get_message('toExit'))
        self._printcl(u"****************************************")            
        try:
            self._cur_step_ui=self._step_init(BaseUI())
            if isinstance(self._cur_step_ui,ErrorDialog):
                self._cur_step_ui=Message(self._cur_step_ui.get_message())
        except Exception as e:            
            self._cur_step_ui=Message("Error: " + utils.exception_to_string(e))        
        self._prepare_step(self._cur_step_ui)
        self._printcl(u"")
    
    def _guimode_next(self, e):
        if e["action"]=="PERFORMED":
            self._guimode_execute(self._cur_step_ui.fire_next_step, self._op_complete)
        
    def _guimode_back(self, e):
        if e["action"]=="PERFORMED":
            self._guimode_execute(self._cur_step_ui.fire_prev_step, self._op_complete)
        
    def _guimode_close_action(self, e):
        if e["action"]=="DIALOG_YES":
            self._guimode_execute(self.close)
    
    def _guimode_close(self, e):
        if e["action"]=="PERFORMED":
            if self._cur_step_ui is None or (self._cur_step_ui.is_next_enabled() or self._cur_step_ui.is_back_enabled()) :
                dlgerr = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_YESNO,gdi.DIALOGMESSAGE_LEVEL_INFO,parentwin=self._app, logopath=self._logo)
                dlgerr.set_title(self._title)
                dlgerr.set_message(messages.get_message('confirmExit'))
                dlgerr.set_action(self._guimode_close_action)
                dlgerr.show();
            else:
                self.close()
    
    def _guimode_action(self, e):
        if e["action"]==u"ONCLOSE":
            e["cancel"]=True
            if self._btclose.is_enable():
                self._guimode_close(e)
    
    def _guimode_step_init_start(self):
        self._guimode_execute(self._guimode_step_init, self._guimode_step_init_callback)        
    
    def _guimode_step_init(self):
        ui=None
        try:
            ui=self._step_init(BaseUI())
            if isinstance(ui,ErrorDialog):
                ui=Message(ui.get_message())
        except Exception as e:            
            ui=Message("Error: " + utils.exception_to_string(e))
        return ui
    
    def _guimode_step_init_callback(self,curui):
        self._cur_step_ui=curui
        self._prepare_step(self._cur_step_ui)
    
    
    def _guimode_start(self):
        
        gdi.gdw_lib() #Se non è presente la libreria va in errore quindi in modalita console
                
        self._top_height=0
        if self._topimage is not None:
            self._top_height=gdi.get_image_size(self._topimage)["height"]
        elif self._topinfo is not None:
            self._top_height=(22*len(self._topinfo.split("\n"))) + 10
        
        self._app = gdi.Window(gdi.WINDOW_TYPE_NORMAL_NOT_RESIZABLE, logopath=self._logo)
        #self._app = Window(gdi.WINDOW_TYPE_NORMAL_NOT_RESIZABLE, logopath=self._logo)
        #self._app.setUI(self)
        
        self._app.set_title(self._title)
        self._app.set_size(_WIDTH, _HEIGHT+self._top_height)
        self._app.set_show_position(gdi.WINDOW_POSITION_CENTER_SCREEN)
        self._app.set_action(self._guimode_action)
        
        pnl_left = gdi.Panel();
        pnl_left.set_position(0, self._top_height)
        pnl_left.set_size(_WIDTH_LEFT,_HEIGHT)
        
        if self._leftcolor is not None:
            pnl_left.set_background_gradient(self._leftcolor, "FFFFFF", gdi.GRADIENT_DIRECTION_LEFTRIGHT)
        else:
            pnl_left.set_background_gradient("83e5ff", "FFFFFF", gdi.GRADIENT_DIRECTION_LEFTRIGHT)
        self._app.add_component(pnl_left)
        
        if self._topimage is not None:
            pnl_top = gdi.ImagePanel();
            pnl_top.set_position(0, 0)
            pnl_top.set_filename(self._topimage)
            pnl_top.set_size(_WIDTH,self._top_height)
            self._app.add_component(pnl_top)
        elif self._topinfo is not None:
            pnl_top = gdi.Panel();
            pnl_top.set_position(0, 0)
            pnl_top.set_size(_WIDTH,self._top_height)
            pnl_top.set_background("d9d9d9")
            self._app.add_component(pnl_top)
            
            pnl_top_text = gdi.Label()
            pnl_top_text.set_position(10,0)
            pnl_top_text.set_size(_WIDTH-(2*10),self._top_height)
            pnl_top_text.set_wordwrap(True)
            pnl_top_text.set_foreground("000000")
                        
            pnl_top_text.set_text(self._topinfo)
            pnl_top.add_component(pnl_top_text)
        
        
        pnl_bottom = gdi.Panel();
        pnl_bottom.set_position(0, _CONTENT_HEIGHT+self._top_height)
        pnl_bottom.set_size(_WIDTH,_HEIGHT_BOTTOM)
        self._app.add_component(pnl_bottom)
        
        wbtn=_BUTTON_WIDTH
        hbtn=_BUTTON_HEIGTH
                
        self._btback = gdi.Button();
        self._btback.set_position(_BUTTON_GAP, _BUTTON_GAP)
        self._btback.set_size(wbtn, hbtn)
        self._btback.set_text(messages.get_message('back'))
        self._btback.set_enable(False);
        self._btback.set_action(self._guimode_back)
        pnl_bottom.add_component(self._btback)
                
        self._btnext = gdi.Button();
        self._btnext.set_position(_BUTTON_GAP+wbtn+5, _BUTTON_GAP)
        self._btnext.set_size(wbtn, hbtn)
        self._btnext.set_text(messages.get_message('next'))
        self._btnext.set_enable(False);
        self._btnext.set_action(self._guimode_next)
        pnl_bottom.add_component(self._btnext)
        
        self._btclose = gdi.Button();
        self._btclose.set_position(_WIDTH-wbtn-_BUTTON_GAP, _BUTTON_GAP)
        self._btclose.set_size(wbtn, hbtn)
        self._btclose.set_text(messages.get_message('close'))
        self._btclose.set_enable(False);
        self._btclose.set_action(self._guimode_close)
        pnl_bottom.add_component(self._btclose)
        
        self._pnlmain=None
        self._cur_step_ui=None
        self._step_init_run=False
        
        self._guimode_step_init_start()
        self._app.show()
        gdi.loop()
        
    
    def _guimode_execute(self, func, callback=None):
        ac = AsyncInvoke(self, func, callback)
        ac.start()
   
    def _prepare_main_panel(self):
        if self._gui_enable is True:
            if (self._pnlmain is not None):
                if self._wait_panel_on_destroy is not None:
                    self._wait_panel_on_destroy()
                    #print("self._pnlmain.remove_component(self._wait_panel)")
                    #self._pnlmain.remove_component(self._wait_panel)
                self._wait_panel_on_destroy=None
                self._pnlmain.remove_all_components()
            else:
                self._pnlmain = gdi.Panel();
                self._pnlmain.set_background("ffffff")
                self._pnlmain.set_position(_WIDTH_LEFT, self._top_height)
                self._pnlmain.set_size(_CONTENT_WIDTH,_CONTENT_HEIGHT)
                self._app.add_component(self._pnlmain)

    def _prepare_buttons(self,  curui):
        if self._gui_enable is True:
            self._btnext.set_enable(curui.is_next_enabled())
            self._btback.set_enable(curui.is_back_enabled())
            self._btclose.set_enable(True)
    
    def _disable_next_button(self):
        if self._gui_enable is True:
            self._btnext.set_enable(False)
    
    def _enable_next_button(self):
        if self._gui_enable is True:
            self._btnext.set_enable(True)
    
    def _show_error_gui_ok(self,e):
        if self._wait_ui is not None and e["action"]==u"MOUSECLICK":
            self._prepare_step(self._cur_step_ui)
            
    def _show_error(self,  msg):
        if self._gui_enable is True:
            dlgerr = gdi.DialogMessage(gdi.DIALOGMESSAGE_ACTIONS_OK,gdi.DIALOGMESSAGE_LEVEL_ERROR,parentwin=self._app, logopath=self._logo)
            dlgerr.set_title(self._title)
            dlgerr.set_message(msg)
            dlgerr.set_action(self._show_error_gui_ok)
            dlgerr.show();
        else:
            self._printcl(u"")
            self._printcl(messages.get_message('error') + u": " + msg)
            if self._raw_input(messages.get_message('pressEnter')) is not None:
                self._prepare_step(self._cur_step_ui)
            
    
    def wait_panel(self, pnl, ondestroy, allowclose=False):
        if self._gui_enable is True:
            self._btnext.set_enable(False)
            self._btback.set_enable(False)
            self._btclose.set_enable(allowclose)
            self._prepare_main_panel()
            self._wait_ui=None
            self._wait_panel_on_destroy=ondestroy
            self._pnlmain.add_component(pnl)
        else:
            self._show_error("wait_panel allowed only in gui mode.")
            
    
    def wait_message(self, msg, perc=None, progr=None, allowclose=False):
        if self._gui_enable is True:
            if perc is not None:
                msg=msg + "     (" + str(perc) + "%)"
            self._wait_message_gui(msg, progr, allowclose)
        else:
            if self._prev_msg_wait!=msg:
                self._prev_msg_wait=msg
                if allowclose:
                    msg+=u"\n\nCTRL+C " + messages.get_message('toExit') + u"\n" 
                self._printcl(msg) 
    
    def _wait_message_gui(self, msg, progr=None, allowclose=False):
        if self._wait_ui is None:
            self._btnext.set_enable(False)
            self._btback.set_enable(False)
            self._btclose.set_enable(allowclose)
            self._prepare_main_panel()
            lbl=gdi.Label()
            lbl.set_wordwrap(True)
            lbl.set_position(_GAP_TEXT,(_CONTENT_HEIGHT/2)-60)
            lbl.set_size(_CONTENT_WIDTH-(2*_GAP_TEXT),60)
            lbl.set_text_align(gdi.TEXT_ALIGN_LEFTTOP)
            self._pnlmain.add_component(lbl)
            pbar = gdi.ProgressBar()
            pbar.set_position(_GAP_TEXT,_CONTENT_HEIGHT/2)
            pbar.set_size(_CONTENT_WIDTH-(4*_GAP_TEXT),24)
            self._pnlmain.add_component(pbar)
            self._wait_ui={'label':lbl, 'progress':pbar}
        else:
            self._btclose.set_enable(allowclose)
            lbl=self._wait_ui['label']
            pbar=self._wait_ui['progress']
        
        if 'label_value' not in self._wait_ui or self._wait_ui['label_value'] !=msg:
            lbl.set_text(msg)
        self._wait_ui['label_value']=msg
        if progr is None:
            if 'progress_value' not in self._wait_ui or self._wait_ui['progress_value'] is not None:
                pbar.set_y(-100)
                lbl.set_y(0)
                lbl.set_height(_CONTENT_HEIGHT)
                lbl.set_text_align(gdi.TEXT_ALIGN_LEFTMIDDLE)
            self._wait_ui['progress_value']=None
        else:
            if 'progress_value' not in self._wait_ui  or self._wait_ui['progress_value'] is None or self._wait_ui['progress_value']!=progr:
                lbl.set_y((_CONTENT_HEIGHT/2)-40)
                lbl.set_height(30)
                lbl.set_text_align(gdi.TEXT_ALIGN_LEFTTOP)
                pbar.set_y(_CONTENT_HEIGHT/2)
                pbar.set_percent(progr)                
            self._wait_ui['progress_value']=progr
            
            
        
    def _clmode_read(self, msg,  bpwd=False):
        ui = self._cur_step_ui;
        if not ui.is_next_enabled() and not ui.is_back_enabled():
            self.close()
            return None #Termina Installazione
        if not bpwd:
            return self._raw_input(msg)
        else:
            return self._raw_input(msg,True)
    
    def _show_message(self,  msg):
        if self._gui_enable is True:
            self._prepare_main_panel()
            w=_CONTENT_WIDTH-(2*_GAP_TEXT)
            h=_CONTENT_HEIGHT-(2*_GAP_TEXT)
            
            l = gdi.Label()
            l.set_position(_GAP_TEXT,_GAP_TEXT)
            l.set_size(w,h)
            l.set_wordwrap(True)
            l.set_text(msg.get_message())
            self._pnlmain.add_component(l)
        else:
            self._printcl(u"")
            self._printcl(msg.get_message())
            rd = self._clmode_read(messages.get_message('pressEnter'))
            if rd is not None:
                self._clmode_next()

    def _show_inputs(self,  inps):
        if self._gui_enable is True:
            self._prepare_main_panel()
            w=_CONTENT_WIDTH-(2*_GAP_TEXT)
            h=100
            
            l = gdi.Label()
            l.set_position(_GAP_TEXT,_GAP_TEXT)
            l.set_size(w,h)
            l.set_wordwrap(True)
            l.set_text_align(gdi.TEXT_ALIGN_LEFTTOP)
            l.set_text(inps.get_message())
            self._pnlmain.add_component(l)

            lblw=210
            ar = inps.get_inputs()
            p=120
            for i in range(len(ar)):
                inp=ar[i]
                #LABEL
                l = gdi.Label()
                l.set_position(_GAP_TEXT,p)
                l.set_size(lblw-1,30)
                l.set_text(inp['label'])
                self._pnlmain.add_component(l)
                
                #TEXTBOX
                t = gdi.TextBox()
                t.set_name(inp['key'])
                t.set_position(_GAP_TEXT+lblw,p)
                t.set_size(_CONTENT_WIDTH-(4*_GAP_TEXT)-lblw,30)
                t.set_text(inp['variable'].get())
                if inp['variable'].is_password():
                    t.set_password_mask(True)
                self._pnlmain.add_component(t)
                t.set_validate(inps.on_validate)
                if i==0:
                    t.focus()
                p+=36
        else:
            self._printcl(u"")
            self._printcl(inps.get_message())
            ar = inps.get_inputs()
            for i in range(len(ar)):
                inp=ar[i]
                v=inp['variable'].get()
                if v is None:
                    v=u""
                if v!=u"" and not inp['variable'].is_password():
                    v=u" (" + v + u")"
                rd = self._clmode_read(inp['label']  +  v + u":", inp['variable'].is_password())
                if rd is not None:
                    if rd.strip()!=u"":
                        inp['variable'].set(rd)
                else:
                    return
            self._clmode_next()
                            
               
    def _show_chooser(self,  chs):
        if self._gui_enable is True:
            self._prepare_main_panel()
            h=chs.get_message_height()
            w=_CONTENT_WIDTH-(2*_GAP_TEXT)
            l = gdi.Label() 
            l.set_wordwrap(True)
            l.set_text_align(gdi.TEXT_ALIGN_LEFTTOP)
            l.set_text(chs.get_message())
            
            if len(chs.get_message_hyperlinks())>0:
                for i in range(len(chs.get_message_hyperlinks())):
                    itm=chs.get_message_hyperlinks()[i]
                    l.add_hyperlink("k" + str(i), itm["start"], itm["length"], itm["url"])  
            
            l.set_position(_GAP_TEXT, _GAP_TEXT)
            l.set_size(w, h)
            
            self._pnlmain.add_component(l)
        
            ar = chs.get_choices()
            p=h+_GAP_TEXT
            for i in range(len(ar)):
                inp=ar[i]
                rb = gdi.RadioButton()
                rb.set_text(inp['label'])
                rb.set_position(_GAP_TEXT, p)
                rb.set_size(_CONTENT_WIDTH-(2*_GAP_TEXT), 30)
                rb.set_name(inp['key'])
                rb.set_group("RADIOBUTTON")
                if chs.get_variable().get()==inp['key']:
                    rb.set_selected(True);
                rb.set_action(chs.on_selected)
                self._pnlmain.add_component(rb)
                p+=30
            chs.set_main(self)
        else:
            self._printcl(u"")
            self._printcl(chs.get_message())
            self._printcl(u"")
            ar = chs.get_choices()
            df = u""
            ar_idx_accept=[]
            idx_default=None
            for i in range(len(ar)):
                inp=ar[i]
                self._printcl(str(i+1) + u". " + inp['label'])
                if chs.get_variable().get()==inp['key']:
                    idx_default=i+1
                    df = u" (" + str(idx_default) + u")"
                if chs.is_accept_key(inp['key']):
                    ar_idx_accept.append(i+1)
            rd = self._clmode_read(messages.get_message('option') + df + u":")
            if rd is not None:
                if rd=="":
                    rd=str(idx_default)
                try:
                    ird=int(rd)
                    if (ird>len(ar)):
                        raise Exception("")
                    if len(ar_idx_accept) > 0:
                        serr=[]
                        berr=True
                        for idxcur in ar_idx_accept:
                            serr.append(str(idxcur))
                            if ird==idxcur:
                                berr=False
                        if berr:
                            self._show_error(messages.get_message('mustAccept').format((u" " + messages.get_message('or') + u" ").join(serr)))
                            return
                    inp=ar[ird-1]
                except:
                    self._show_error(messages.get_message('optionNotValid'))
                    return
                chs.get_variable().set(inp['key'])
                self._clmode_next()
               
              ui/gdi.py                                                                                           0000755 0001750 0001750 00000235656 14217125327 012126  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''
try:
    from . import messages
except: #FIX INSTALLER
    import messages
try:
    from . import images
except: #FIX INSTALLER
    import images
import ctypes
import _ctypes
import utils
import platform
import sys
import time
import threading
import struct
import subprocess
import json

WINDOW_TYPE_NORMAL=0
WINDOW_TYPE_NORMAL_NOT_RESIZABLE=1
WINDOW_TYPE_DIALOG=100
WINDOW_TYPE_POPUP=200
WINDOW_TYPE_TOOL=300

WINDOW_POSITION_XY=0
WINDOW_POSITION_CENTER_SCREEN=1

TEXT_ALIGN_LEFTMIDDLE=0
TEXT_ALIGN_LEFTTOP=1
TEXT_ALIGN_CENTERMIDDLE=10
TEXT_ALIGN_RIGHTMIDDLE=20


DIALOGMESSAGE_ACTIONS_OK=0
DIALOGMESSAGE_ACTIONS_YESNO=10

DIALOGMESSAGE_LEVEL_INFO=0
DIALOGMESSAGE_LEVEL_WARN=1
DIALOGMESSAGE_LEVEL_ERROR=2

POPUP_POSITION_BOTTONRIGHT=0
POPUP_POSITION_BOTTONLEFT=1
POPUP_POSITION_TOPRIGHT=10
POPUP_POSITION_TOPLEFT=11

GRADIENT_DIRECTION_LEFTRIGHT=0;
GRADIENT_DIRECTION_RIGHTLEFT=1;
GRADIENT_DIRECTION_TOPBOTTOM=2;
GRADIENT_DIRECTION_BOTTONTOP=3;

_STYLE_WINDOW_BACKGROUND_COLOR="ffffff"
_STYLE_WINDOW_FOREGROUND_COLOR="000000"
_STYLE_COMPONENT_BACKGROUND_COLOR="d9d9d9"
_STYLE_COMPONENT_FOREGROUND_COLOR="000000"
_STYLE_COMPONENT_BORDER_COLOR="a0a0a0"
_STYLE_EDITOR_BACKGROUND_COLOR="ffffff"
_STYLE_EDITOR_FOREGROUND_COLOR="000000"
_STYLE_EDITOR_SELECTION_COLOR="c0c0c0"

_gdimap={}
_gdimap["init"]=False
_gdimap["lock"]=threading.Lock()
_gdimap["cntwin"]=0
_gdimap["cntnfi"]=0
_gdimap["cntfnt"]=0
_gdimap["cntimg"]=0
_gdimap["windows"]={}
_gdimap["notifyicon"]={}
_gdimap["fontmanager"]=None
_gdimap["imagemanager"]=None
_gdimap["sheduler"]=None
_gdimap["postaction"]=[]
_gdimap["screensize"]={"width":0, "height":0, "_lastcheck":0.0}


def is_windows():
    return (platform.system().lower().find("window") > -1)

def is_linux():
    return (platform.system().lower().find("linux") > -1)

def is_mac():
    return (platform.system().lower().find("darwin") > -1)

def is_os_32bit():
    return not sys.maxsize > 2**32

def is_os_64bit():
    return sys.maxsize > 2**32

def check_hw_string(s):
    if s is not None:
        if "raspberry" in s.lower():
            return "RaspberryPi"
        elif "wandboard" in s.lower():
            return "Wandboard"
        elif "pine64" in s.lower() or "rock64" in s.lower():
            return "Pine64"
    return None

def get_hw_name():
    sapp = platform.machine()
    if is_linux() and ((len(sapp)>=3 and sapp[0:3].lower()=="arm") or (len(sapp)>=7 and sapp[0:7].lower()=="aarch64")):
        #VERIFICA SE RASPBERRY
        try:
            if utils.path_exists("/sys/firmware/devicetree/base/model"):
                fin=utils.file_open("/sys/firmware/devicetree/base/model","r")
                appmdl = fin.read()
                fin.close()
                appmdl=check_hw_string(appmdl);
                if appmdl is not None:
                    return appmdl
            appmdl=check_hw_string(platform.node());
            if appmdl is not None:
                return appmdl
        except:
            None
    return None

def _get_logo_from_conf(jocfg, pth):
    if pth is None:
        pth=""
    ret=""
    if not is_linux():
        if "logo16x16" in jocfg:
            ret+=pth + jocfg["logo16x16"]
    else:
        if "logo16x16" in jocfg:
            ret+=pth + jocfg["logo16x16"]+"\n"
        if "logo32x32" in jocfg:
            ret+=pth + jocfg["logo32x32"]+"\n"
        if "logo48x48" in jocfg:
            ret+=pth + jocfg["logo48x48"]+"\n"
    return ret

def is_windows_user_in_admin_group():
    if is_windows():
        return gdw_lib().isUserInAdminGroup()==1
    else:
        raise Exception("invalid os.")

def is_windows_run_as_admin():
    if is_windows():
        return gdw_lib().isRunAsAdmin()==1
    else:
        raise Exception("invalid os.")

def is_windows_process_elevated():
    return gdw_lib().isProcessElevated()==1

def is_windows_task_running(pid):
    bret=gdw_lib().isTaskRunning(pid);
    return bret==1

def gdw_lib():
    if "gdwlib" in _gdimap:
        return _gdimap["gdwlib"]
    else:
        gdwlib=None
        namelib=None
        namelibinst=None
        if is_windows():
            namelib="dwaggdi.dll"
            #Installer Mode
            sapp = platform.machine()
            if sapp is not None and sapp.upper()=="ARM64":
                namelibinst="dwaggdi_x86_32.dll"
            elif is_os_32bit():
                namelibinst="dwaggdi_x86_32.dll"
            elif is_os_64bit():
                namelibinst="dwaggdi_x86_64.dll"
        elif is_linux():
            namelib="dwaggdi.so"
            #Installer Mode            
            hwnm = get_hw_name()
            if hwnm == "RaspberryPi":
                if is_os_64bit():
                    namelibinst="linux_arm64_v1"
                else:
                    namelibinst="linux_armhf_v2"        
            elif hwnm == "Wandboard":
                if is_os_64bit():
                    namelibinst="linux_arm64_v1"
                else:
                    namelibinst="linux_armhf_v1"
            elif hwnm == "Pine64":
                if is_os_64bit():
                    namelibinst="linux_arm64_v1"
                else:
                    namelibinst="linux_armhf_v2"
            else:
                sapp = platform.machine()
                if sapp is not None and len(sapp)>=7 and sapp[0:7].lower()=="aarch64":
                    namelibinst="linux_armhf_v1"
            if namelibinst is None:
                if is_os_32bit():
                    namelibinst="dwaggdi_x86_32.so"
                elif is_os_64bit():
                    namelibinst="dwaggdi_x86_64.so"
        elif is_mac():
            namelib="dwaggdi.dylib"
            #Installer Mode
            sapp = platform.machine()
            if sapp is not None and sapp.upper()=="ARM64":
                namelibinst="dwaggdi_arm64_v1.dylib"
            elif is_os_32bit():
                namelibinst="dwaggdi_x86_32.dylib"
            elif is_os_64bit():
                namelibinst="dwaggdi_x86_64.dylib"
        if not utils.path_exists(".srcmode"):
            if namelibinst is not None and utils.path_exists(namelibinst): #Installer Mode
                gdwlib = ctypes.CDLL("." + utils.path_sep + namelibinst)
            elif utils.path_exists("native" + utils.path_sep + namelib):
                gdwlib = ctypes.CDLL("native" + utils.path_sep + namelib)
        else:
            gdwlib = ctypes.CDLL(".." + utils.path_sep + "make" + utils.path_sep + "native" + utils.path_sep + namelib)
        if gdwlib==None:
            raise Exception("Missing gdi library.")
        
        gdwlib.DWAGDIGetClipboardText.restype = ctypes.c_wchar_p
        _gdimap["gdwlib"]=gdwlib
        return gdwlib 


def getRGBColor(s):
    return struct.unpack('BBB', utils.str_hex_to_bytes(s))

def getHexColor(r, g, b):
    return utils.bytes_to_str_hex(struct.pack('BBB', r, g, b))

def _repaint(sid,x,y,w,h):
    _gdimap["postaction"].append({"name":"REPAINT","id":sid,"x":x,"y":y,"width":w,"height":h})

def _show_window(sid):
    _gdimap["postaction"].append({"name":"SHOW","id":sid})
    
def _update_pos_size(sid):
    _gdimap["postaction"].append({"name":"UPDATEPOSSIZE","id":sid})

def _hide_window(sid):
    _gdimap["postaction"].append({"name":"HIDE","id":sid})
    
def _to_front_window(sid):
    _gdimap["postaction"].append({"name":"TO_FRONT","id":sid})
        
def _init_window(sid,wnd):
    _gdimap["windows"][sid]=wnd;
    _gdimap["postaction"].append({"name":"INIT","id":sid})

def _term_window(sid):    
    _gdimap["postaction"].append({"name":"TERM","id":sid})

def _set_title(sid, title):
    _gdimap["postaction"].append({"name":"SET_TITLE","id":sid,"title":title})

def _create_notify_icon(sid, nfi, iconpath, tooltip):
    _gdimap["notifyicon"][sid]= nfi
    _gdimap["postaction"].append({"name":"CREATE_NOTIFY_ICON","id":sid,"iconpath":iconpath,"tooltip":tooltip})

def _update_notify_icon(sid, iconpath, tooltip):
    _gdimap["postaction"].append({"name":"UPDATE_NOTIFY_ICON","id":sid,"iconpath":iconpath,"tooltip":tooltip})

def _destroy_notify_icon(sid):
    _gdimap["postaction"].append({"name":"DESTROY_NOTIFY_ICON","id":sid})


def mac_nsapp_set_activation_policy(v):
    _gdimap["mac_nsapp_set_activation_policy"]=v
    
CMPFUNCEVENTMESSAGE = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_wchar_p)

@CMPFUNCEVENTMESSAGE 
def cb_func_event_message(smsg):
    okscreensize=False
    if _gdimap["init"]==False:
        okscreensize=True
        _gdimap["init"]=True
        _gdimap["fontmanager"].load("default")
    else:
        elp = time.time() - _gdimap["screensize"]["_lastcheck"]
        if elp>3.0 or elp<0.0:
            okscreensize=True
    if okscreensize:
        sz_array = (ctypes.c_int * 2)()
        gdw_lib().DWAGDIGetScreenSize(sz_array)
        appsz={}
        appsz["width"] = int(sz_array[0])
        appsz["height"] = int(sz_array[1])
        appsz["_lastcheck"] = time.time()
        _gdimap["screensize"]=appsz
            
    gdwlib=gdw_lib()
    
    #SCHEDULER
    _gdimap["sheduler"].run()
    
    #POST ACTION
    while len(_gdimap["postaction"])>0: 
        jopa = _gdimap["postaction"].pop(0)
        if "id" in jopa:
            if jopa["name"]=="INIT":
                wnd=_gdimap["windows"][jopa["id"]]
                logo=wnd._logo_path
                if logo is None:
                    if is_linux():
                        logo=images.get_image(u"logo16x16.bmp") + "\n" + images.get_image(u"logo32x32.bmp") + "\n" + images.get_image(u"logo48x48.bmp")                        
                    else:
                        logo=images.get_image(u"logo16x16.bmp")
                if is_linux():
                    if not "\n" in logo:
                        logo+="\n"
                sx=wnd._x
                sy=wnd._y
                if wnd._show_position==WINDOW_POSITION_CENTER_SCREEN:
                    appsz=_gdimap["screensize"]                    
                    sx=int((appsz["width"]/2)-(wnd._w/2))
                    sy=int((appsz["height"]/2)-(wnd._h/2))
                gdwlib.DWAGDINewWindow(wnd._id, wnd._type, int(sx), int(sy), int(wnd._w), int(wnd._h), logo)
                gdwlib.DWAGDISetTitle(wnd._id,wnd._title)
            elif jopa["name"]=="TERM":
                gdwlib.DWAGDIDestroyWindow(jopa["id"])
                del _gdimap["windows"][jopa["id"]]
                if len(_gdimap["windows"])==0:
                    gdwlib.DWAGDIEndLoop()
                    return
            elif jopa["name"]=="SET_TITLE":
                gdwlib.DWAGDISetTitle(jopa["id"],jopa["title"])
            elif jopa["name"]=="REPAINT":
                gdwlib.DWAGDIRepaint(jopa["id"],int(jopa["x"]),int(jopa["y"]),int(jopa["width"]),int(jopa["height"]));
            elif jopa["name"]=="SHOW":
                wnd=_gdimap["windows"][jopa["id"]]
                sx=wnd._x
                sy=wnd._y
                if wnd._show_position==WINDOW_POSITION_CENTER_SCREEN:
                    appsz=_gdimap["screensize"]
                    sx=int((appsz["width"]/2)-(wnd._w/2))
                    sy=int((appsz["height"]/2)-(wnd._h/2))
                gdwlib.DWAGDIPosSizeWindow(wnd._id, int(sx), int(sy), int(wnd._w), int(wnd._h))
                gdwlib.DWAGDIShow(jopa["id"],0)
                gdwlib.DWAGDIToFront(jopa["id"])
                wnd.on_show()
            elif jopa["name"]=="UPDATEPOSSIZE":
                wnd=_gdimap["windows"][jopa["id"]]
                sx=wnd._x
                sy=wnd._y
                if wnd._show_position==WINDOW_POSITION_CENTER_SCREEN:
                    appsz=_gdimap["screensize"]
                    sx=int((appsz["width"]/2)-(wnd._w/2))
                    sy=int((appsz["height"]/2)-(wnd._h/2))
                gdwlib.DWAGDIPosSizeWindow(wnd._id, int(sx), int(sy), int(wnd._w), int(wnd._h))
            elif jopa["name"]=="HIDE":
                sappid=jopa["id"]
                gdwlib.DWAGDIHide(sappid)
                if sappid in _gdimap["windows"]:                                        
                    wnd=_gdimap["windows"][sappid]
                    wnd.on_hide()
            elif jopa["name"]=="TO_FRONT":
                gdwlib.DWAGDIToFront(jopa["id"])
            elif jopa["name"]=="CREATE_NOTIFY_ICON":
                gdwlib.DWAGDICreateNotifyIcon(jopa["id"],jopa["iconpath"],jopa["tooltip"])
            elif jopa["name"]=="UPDATE_NOTIFY_ICON":
                gdwlib.DWAGDIUpdateNotifyIcon(jopa["id"],jopa["iconpath"],jopa["tooltip"])
            elif jopa["name"]=="DESTROY_NOTIFY_ICON":
                gdwlib.DWAGDIDestroyNotifyIcon(jopa["id"])
                del _gdimap["notifyicon"][jopa["id"]]
    #EVENTS
    if smsg is not None:
        wnd = None
        #print(smsg)
        jo = json.loads(smsg)
        if jo is not None:
            if jo["name"]=="REPAINT":
                if jo["id"] in _gdimap["windows"]:
                    wnd=_gdimap["windows"][jo["id"]]
                    #print("REPAINT: " + str(jo["x"])+ " " + str(jo["y"]) + " " + str(jo["width"]) + " " + str(jo["height"]))                
                    wnd.on_paint(jo["x"],jo["y"],jo["width"],jo["height"]);
            elif jo["name"]=="MOUSE":
                if jo["id"] in _gdimap["windows"]:
                    wnd=_gdimap["windows"][jo["id"]]
                    wnd.on_mouse(jo["action"],jo["x"],jo["y"],jo["button"]);
            elif jo["name"]=="KEYBOARD":
                if jo["id"] in _gdimap["windows"]:
                    wnd=_gdimap["windows"][jo["id"]]
                    wnd.on_keyboard(jo["type"],jo["value"],jo["shift"],jo["ctrl"],jo["alt"],jo["command"]);
            elif jo["name"]=="WINDOW":
                if jo["id"] in _gdimap["windows"]:
                    wnd=_gdimap["windows"][jo["id"]]
                    bret = wnd.on_window(jo["action"]);
                    if jo["action"]=="ONCLOSE":
                        if bret==True:
                            wnd.destroy() 
            elif jo["name"]=="NOTIFY":
                if jo["id"] in _gdimap["notifyicon"]:
                    nfi=_gdimap["notifyicon"][jo["id"]]
                    bret = nfi.on_action(jo["action"]);
    #else:
    #    print("ON TICK: " + str(time.time()))
    
    

def loop():
    gdwlib=gdw_lib()
    _gdimap["fontmanager"]=FontManager()
    _gdimap["imagemanager"]=ImageManager()
    if _gdimap["sheduler"] is None:
        _gdimap["sheduler"]=Sheduler()
    
    
    if "mac_nsapp_set_activation_policy" in _gdimap:    
        gdw_lib().DWAGDINSAppSetActivationPolicy(_gdimap["mac_nsapp_set_activation_policy"])
    
    gdwlib.DWAGDILoop(cb_func_event_message)
    _gdimap["sheduler"].destroy()
    _gdimap["imagemanager"].destroy()
    _gdimap["fontmanager"].destroy()
    _gdimap["sheduler"]=None
    _gdimap["imagemanager"]=None
    _gdimap["fontmanager"]=None
    _gdimap["init"]=False
    if is_windows():
        _ctypes.FreeLibrary(gdwlib._handle)
    else:
        _ctypes.dlclose(gdwlib._handle)        
    del _gdimap["gdwlib"]

def get_mouse_position():
    pos_array = (ctypes.c_int * 2)()
    gdw_lib().DWAGDIGetMousePosition(pos_array)
    return {"x":int(pos_array[0]), "y":int(pos_array[1])}        

def get_screen_size():
    return _gdimap["screensize"]

def add_scheduler(tm, func):
    if _gdimap["sheduler"] is None:
        _gdimap["sheduler"]=Sheduler()
    _gdimap["sheduler"].add(tm, func)

class Sheduler:
    def __init__(self):
        self._list=[]
        
    def add(self, tm, func):
        itm = {"intervall": tm, "time": time.time(), "func": func}
        self._list.append(itm)
        return itm 
    
    def cancel(self, itm):
        self._list.remove(itm)
         
    
    def destroy(self):
        self._list=[]
    
    def run(self):
        if len(self._list)>0:
            ar = self._list[:]
            for itm in ar:
                elps = time.time()-itm["time"]
                if elps<0:
                    itm["time"]=time.time()
                elif elps>itm["intervall"]:
                    self._list.remove(itm)
                    itm["func"]()
                    
            
            
class FontManager:
    
    def __init__(self):
        self._list={}
    
    def load(self, name):
        if name not in self._list:
            i = 0
            with _gdimap["lock"]:
                _gdimap["cntfnt"]+=1
                i=_gdimap["cntfnt"]
            gdw_lib().DWAGDILoadFont(i,name)
            self._list[name]=i
    
    def unload(self, name):
        if name in self._list:
            gdw_lib().DWAGDIUnloadFont(self._list[name])
            del self._list[name]
    
    def destroy(self):
        for name in self._list:
            gdw_lib().DWAGDIUnloadFont(self._list[name])
        self._list={}
    
    def get_id(self, name):
        return self._list[name]


def get_image_size(name):
    sz_array = (ctypes.c_int * 2)()
    gdw_lib().DWAGDIGetImageSize(name,sz_array)
    return {"width":sz_array[0], "height":sz_array[1]} 

class ImageManager:
    
    def __init__(self):
        self._list={}
    
    def load(self, name):
        with _gdimap["lock"]:
            _gdimap["cntimg"]+=1
            i=_gdimap["cntimg"]
        sz_array = (ctypes.c_int * 2)()
        gdw_lib().DWAGDILoadImage(i,name,sz_array)
        itm={"id" : i, "name" : name, "width":sz_array[0], "height":sz_array[1]}
        self._list["K" + str(i)]=itm 
        return itm
    
    def unload(self, itm):
        sid = "K" + str(itm[id]);
        if sid in self._list:
            gdw_lib().DWAGDIUnloadImage(self._list[sid]["id"])
            del self._list[sid]
    
    def destroy(self):
        for sid in self._list:
            gdw_lib().DWAGDIUnloadImage(self._list[sid]["id"])
        self._list={}
    

class Paint:
    def __init__(self,win,offx,offy,clipx,clipy,clipw,cliph):
        self._window=win
        self._offx=offx;
        self._offy=offy;
        self._clipx=clipx;
        self._clipy=clipy;
        self._clipw=clipw;
        self._cliph=cliph;
        self._fontid=_gdimap["fontmanager"].get_id("default")
    
    def pen_color(self, col):
        rgb=getRGBColor(col.upper());
        gdw_lib().DWAGDIPenColor(self._window._id,rgb[0],rgb[1],rgb[2])

    def fill_rectangle(self,x,y,w,h):
        gdw_lib().DWAGDIFillRectangle(self._window._id,int(self._offx+x),int(self._offy+y),int(w),int(h))
        
    def fill_ellipse(self,x,y,w,h):
        gdw_lib().DWAGDIFillEllipse(self._window._id,int(self._offx+x),int(self._offy+y),int(w),int(h))

    def draw_image(self,imgitm,x,y):
        gdw_lib().DWAGDIDrawImage(self._window._id,imgitm["id"],int(self._offx+x),int(self._offy+y))                  
        
    def draw_ellipse(self,x,y,w,h):
        gdw_lib().DWAGDIDrawEllipse(self._window._id,int(self._offx+x),int(self._offy+y),int(w),int(h))
        
    def draw_line(self,x1,y1,x2,y2):
        gdw_lib().DWAGDIDrawLine(self._window._id,int(self._offx+x1),int(self._offy+y1),int(self._offx+x2),int(self._offy+y2))
    
    def get_text_height(self):
        return gdw_lib().DWAGDIGetTextHeight(self._window._id,self._fontid)
    
    def get_text_width(self,s):
        return gdw_lib().DWAGDIGetTextWidth(self._window._id,self._fontid,s)
    
    def draw_text(self,s,x,y):
        gdw_lib().DWAGDIDrawText(self._window._id,self._fontid,s,int(self._offx+x),int(self._offy+y))
    
    def clip_rectangle(self,x,y,w,h):
        appx=self._offx+x
        appy=self._offy+y
        if appx<self._clipx:
            appx=self._clipx
        if appy<self._clipy:
            appy=self._clipy
        if appx+w>self._clipx+self._clipw:
            w=(self._clipx+self._clipw)-appx
        if appy+h>self._clipy+self._cliph:
            h=(self._clipy+self._cliph)-appy
        gdw_lib().DWAGDIClipRectangle(self._window._id,int(appx),int(appy),int(w),int(h))
    
    def clear_clip_rectangle(self):
        gdw_lib().DWAGDIClipRectangle(self._window._id,int(self._clipx),int(self._clipy),int(self._clipw),int(self._cliph))
    

class NotifyIcon:
    def __init__(self,imgpath,tooltip):
        with _gdimap["lock"]:
            _gdimap["cntnfi"]+=1
            self._id=_gdimap["cntnfi"]
        self._imgpath=imgpath
        self._tooltip=tooltip
        self._action=None
        self._object={}
        _create_notify_icon(self._id,self,imgpath,tooltip)
        
    def update(self,imgpath,tooltip):
        self._imgpath=imgpath
        self._tooltip=tooltip
        _update_notify_icon(self._id,imgpath,tooltip)
    
    def _fire_action(self,e):
        if self._action is not None:
            e["source"]=self
            self._action(e)
    
    def set_action(self,f):
        self._action=f
        
    def get_action(self):
        return self._action
    
    def set_object(self,k,v):
        self._object[k]=v
        
    def get_object(self,k):
        return self._object[k] 
    
    def on_action(self, tp):
        if tp=="ACTIVATE":
            self._fire_action({"action":"ACTIVATE"})
        elif tp=="CONTEXTMENU":
            self._fire_action({"action":"CONTEXTMENU"})
        
    def destroy(self):
        _destroy_notify_icon(self._id)
    
class EventMouseDetect:
    def __init__(self, s):
        self._source=s
        self._click_time=None
    
    def check(self,tp,x,y,b):
        if tp=="MOVE":
            self._source._fire_action({"action":"MOUSEMOVE", "x":x, "y":y, "button":b})
        if tp=="BUTTON_DOWN":
            self._source._fire_action({"action":"MOUSEBUTTONDOWN", "x":x, "y":y, "button":b})
            self._click_time=time.time()
        if tp=="BUTTON_UP":
            self._source._fire_action({"action":"MOUSEBUTTONUP", "x":x, "y":y, "button":b})
            if self._click_time is not None:
                self._source._fire_action({"action":"MOUSECLICK", "x":x, "y":y})
                self._click_time=None
        

class Window:
    def __init__(self,tp=WINDOW_TYPE_NORMAL_NOT_RESIZABLE,parentwin=None,logopath=None):
        with _gdimap["lock"]:
            _gdimap["cntwin"]+=1
            self._id=_gdimap["cntwin"]
        self._type=tp
        self._top_windows=[]
        self._title="";
        self._show_position=WINDOW_POSITION_XY
        self._x=0;
        self._y=0;
        self._w=300;
        self._h=200;
        self._logo_path=logopath;
        self._background=_STYLE_WINDOW_BACKGROUND_COLOR
        self._foreground=_STYLE_WINDOW_FOREGROUND_COLOR
        self._components=[]
        self._show=False
        self._activate=False
        self._disable=False
        self._focus_sequence_index_lost=None
        self._focus_sequence_index=None
        self._focus_sequence=[]
        self._mouse_enter_component=None
        self._action=None
        self._object={}
        self._parent_window=parentwin
        self._eventMouseDetect=EventMouseDetect(self)
        if self._parent_window is not None:
            self._parent_window._top_windows.append(self)
            self._title=parentwin.get_title()
        _init_window(self._id,self)
    
    
    def _fire_action(self,e):
        if self._action is not None:
            e["source"]=self
            if "window" not in e:
                e["window"]=self
            self._action(e)
            
    
    def set_action(self,f):
        self._action=f
    
    def get_action(self):
        return self._action
    
    def set_object(self,k,v):
        self._object[k]=v
        
    def get_object(self,k):
        return self._object[k]
    
    def get_x(self):
        return self._x;
    
    def get_y(self):
        return self._y;
    
    def get_width(self):
        return self._w;
    
    def get_height(self):
        return self._h;
    
    def get_logo_path(self):
        return self._logo_path;
    
    def set_foreground(self,c):
        self._foreground=c
    
    def get_foreground(self):
        return self._foreground
    
    def set_background(self,c):
        self._background=c
    
    def get_background(self):
        return self._background    
    
    def set_title(self,t):
        self._title=utils.str_new(t)
        _set_title(self._id,self._title)
    
    def get_title(self):
        return self._title

    def set_show_position(self,p):
        self._show_position=p

    def set_position(self,x,y):
        self._x=x;
        self._y=y;
        if self._show:
            _update_pos_size(self._id)
            #_repaint(self._id,0,0,self._w,self._h)
    
    def set_size(self,w,h):
        self._w=w
        self._h=h
        if self._show:            
            _update_pos_size(self._id)
            _repaint(self._id,0,0,self._w,self._h)
    
    def get_mouse_enter_component(self):
        return self._mouse_enter_component
    
    def get_focus_component(self):
        if self._focus_sequence_index is not None and self._focus_sequence_index<=len(self._focus_sequence)-1:
            return self._focus_sequence[self._focus_sequence_index]
        return  None
    
    def _add_focus_sequence(self, c):
        self._focus_sequence.append(c)
     
    def add_component(self, c):
        c._window=self;
        self._components.append(c)
        self._add_focus_sequence(c)
    
    def get_components(self):
        return self._components
    
    def remove_component(self, crem):
        for c in self._components:
            if c==crem:
                if c._container:
                    c.remove_all_components()
                c._destroy()
                bchangefocus=False
                if self.get_focus_component()==c:
                    self._set_focus_component_byindex(None)
                self._components.remove(c)
                self._focus_sequence.remove(c)
                if bchangefocus:
                    self.next_focus_component()
                _repaint(self._id,c._x,c._y,c._w,c._h)
                break
    
    def get_all_components(self):
        return self._focus_sequence
    
    def repaint(self):
        if self._id is not None:
            _repaint(self._id,0,0,self._w,self._h)
    
    def destroy(self):
        if self._id is not None:
            if self._parent_window is not None and self._parent_window._id is not None:
                self._parent_window._disable=False
                self._parent_window._top_windows.remove(self)
            for w in self._top_windows:
                w.hide()
            _term_window(self._id)
            if self._parent_window is not None and self._parent_window._id is not None:
                if self._parent_window.is_show():
                    self._parent_window.to_front()
    
    def is_show(self):
        return self._show
    
    def show(self):
        if not self._show:
            self._show=True
            if self._parent_window is not None:
                self._parent_window._disable=True
            _show_window(self._id)            
    
    def hide(self):
        if self._show:
            self._show=False
            _hide_window(self._id)            
    
    def to_front(self):        
        _to_front_window(self._id)
        
    def on_show(self):
        self._set_activate()
    
    def on_hide(self):
        self._set_inactivate()
    
    def _set_activate(self):
        if not self._activate:
            self._activate=True
            self.next_focus_component()
    
    def _set_inactivate(self):
        if self._activate:
            self._activate=False    
            self._focus_sequence_index_lost=self._focus_sequence_index
            self._set_focus_component_byindex(None,{"mode":"WINDOW"})
            self._set_mouse_enter_component(None, "", 0, 0, False)
    
    def _set_focus_component(self,c,e):
        if c is not None and c in self._focus_sequence:
            self._set_focus_component_byindex(self._focus_sequence.index(c),e)
        
    def _set_focus_component_byindex(self,idx,e):
        if self._focus_sequence_index==idx:
            return
        oldc=self.get_focus_component()
        self._focus_sequence_index=idx
        if oldc is not None:
            oldc.on_focus_lost(e)
        if self._focus_sequence_index is not None:
            if self._activate:
                newc=self.get_focus_component()
                if newc is not None:
                    newc.on_focus_get(e)
            else:
                self._focus_sequence_index_lost=self._focus_sequence_index
            
    def next_focus_component(self):
        if self._focus_sequence_index_lost is not None:
            self._focus_sequence_index=None            
            self._set_focus_component_byindex(self._focus_sequence_index_lost,{"mode":"WINDOW"})
            self._focus_sequence_index_lost=None
            return
        if self._focus_sequence_index is None:
            if len(self._components)>0:
                for c in self._focus_sequence:
                    if c.is_focusable() and c.is_enable():
                        self._set_focus_component(c,{"mode":"KEYBOARD"})
                        break 
        else:            
            #print("focus NEXT len: " + str(len(self._focus_sequence)) + "  idx: " + str(self._focus_sequence_index))            
            i=self._focus_sequence_index+1;
            while i!=self._focus_sequence_index:
                if i>(len(self._focus_sequence)-1):
                    i=0
                c=self._focus_sequence[i]
                if c.is_focusable() and c.is_enable():
                    self._set_focus_component_byindex(i,{"mode":"KEYBOARD"})
                    break
                i+=1

    def previous_focus_component(self):        
        if self._focus_sequence_index is None:
            if len(self._components)>0:
                for c in reversed(self._focus_sequence):
                    if c.is_focusable() and c.is_enable():
                        self._set_focus_component(c,{"mode":"KEYBOARD"})
                        break 
        else:
            #print("focus PREV len: " + str(len(self._focus_sequence)) + "  idx: " + str(self._focus_sequence_index))            
            i=self._focus_sequence_index-1;
            while i!=self._focus_sequence_index:
                if i<0:
                    i=len(self._focus_sequence)-1
                c=self._focus_sequence[i]
                if c.is_focusable() and c.is_enable():
                    self._set_focus_component_byindex(i,{"mode":"KEYBOARD"})
                    break
                i-=1
    
    def _set_mouse_enter_component(self,c,tp,x,y,b):
        if self._mouse_enter_component==c:
            return
        if self._mouse_enter_component is not None:
            self._mouse_enter_component.on_mouse_leave({})
        self._mouse_enter_component=c;
        if self._mouse_enter_component is not None:
            self._mouse_enter_component.on_mouse_enter({})
    
    def _is_intersect(self,r1,r2):
        if r1["x"] < r2["x"] + r2["w"] and r2["x"] < r1["x"] + r1["w"] and r1["y"] < r2["y"] + r2["h"]:
            return r2["y"] < r1["y"] + r1["h"]
        return False
        
    
    def on_paint(self,x,y,w,h):
        if self._id is not None:
            rgb=getRGBColor(self._background)
            gdw_lib().DWAGDIPenColor(self._id,rgb[0],rgb[1],rgb[2])
            gdw_lib().DWAGDIFillRectangle(self._id,x,y,w,h)
            #print(str("*******************************"))
            for c in self._components:
                self._on_paint_component(c,x,y,w,h,0,0)
                if c._container:
                    self._on_paint_container(c,x,y,w,h,0,0)
    
    def _on_paint_component(self,c,x,y,w,h,offx,offy):
        if c._visible:
            r1={"x":c._x+offx, "y":c._y+offy, "w":c._w, "h":c._h}
            r2={"x":x, "y":y, "w":w, "h":h}
            if self._is_intersect(r1,r2) :
                clipx=c._x+offx
                if x>c._x+offx:
                    clipx=x
                clipw=c._w-(clipx-(c._x+offx))
                if clipw>(x+w)-clipx:
                    clipw=(x+w)-clipx
                clipy=c._y+offy
                if y>c._y+offy:
                    clipy=y
                cliph=c._h-(clipy-(c._y+offy))
                if cliph>(y+h)-clipy:
                    cliph=(y+h)-clipy
                
                gdw_lib().DWAGDIClipRectangle(self._id,int(clipx),int(clipy),int(clipw),int(cliph))
                pobj=Paint(self,c._x+offx,c._y+offy,clipx,clipy,clipw,cliph)
                c.on_paint(pobj) #DA FARE GESTIRE INTERSEZIONE DARE CORDINATE CORRETTE
                gdw_lib().DWAGDIClearClipRectangle(self._id)
                #print(str(c) + " " + str(c._x+offx) + " " + str(c._y+offy) + " CLIP:" + str(clipx) + " " + str(clipy) + " " + str(clipw) + " " + str(cliph))            
        
    def _on_paint_container(self,cnt,x,y,w,h,offx,offy):
        for c in cnt._components:
            self._on_paint_component(c,x,y,w,h,offx+cnt._x,offy+cnt._y)
            if c._container:
                self._on_paint_container(c,x,y,w,h,offx+cnt._x,offy+cnt._y)
    
    
    def on_keyboard(self,tp,c,shift,ctrl,alt,meta):
        if self._disable:
            return
        if self.get_focus_component() is not None:
            self.get_focus_component().on_keyboard(tp,c,shift,ctrl,alt,meta)

    
    def _on_mouse_component(self,c,tp,x,y,b,offx,offy):
        if x>=c._x+offx and y>=c._y+offy and x<c._x+offx+c._w and y<c._y+offy+c._h:
            self._set_mouse_enter_component(c, tp, x, y, b)
            c.on_mouse(tp,x-(c._x+offx),y-(c._y+offy),b)
            return True
        return False
    
    def _on_mouse_container(self,cnt,tp,x,y,b,offx,offy):
        for c in reversed(cnt._components):
            if c._container:
                if self._on_mouse_container(c,tp,x,y,b,offx+cnt._x,offy+cnt._y):
                    return True
                else:
                    if self._on_mouse_component(c,tp,x,y,b,offx+cnt._x,offy+cnt._y):
                        return True
            else:
                if self._on_mouse_component(c,tp,x,y,b,offx+cnt._x,offy+cnt._y):
                    return True
        return False
        
    def on_mouse(self,tp,x,y,b):
        if self._disable:
            return
        self._eventMouseDetect.check(tp, x, y, b)
        #VERIFICA FOCUS
        if tp=="BUTTON_DOWN":
            for c in reversed(self._focus_sequence):
                if c.is_focusable() and c.is_enable():
                    xy = c._get_win_pos()
                    if x>=xy[0] and y>=xy[1] and x<xy[0]+c._w and y<xy[1]+c._h:
                        self._set_focus_component(c,{"mode":"MOUSE","x":x-xy[0],"y":y-xy[1]})
                        break
        benter=False
        for c in reversed(self._components):
            if c._container:
                if self._on_mouse_container(c,tp,x,y,b,0,0):
                    benter=True
                    break
                else:
                    if self._on_mouse_component(c,tp,x,y,b,0,0):
                        benter=True
                        break
            else:       
                if self._on_mouse_component(c,tp,x,y,b,0,0):
                    benter=True
                    break
        if not benter:
            self._set_mouse_enter_component(None, tp, x, y, b)
    
    def on_window(self,tp):
        if tp=="ACTIVE":
            if not self._disable:
                self._set_activate()
            for w in self._top_windows:
                if w.is_show():
                    w.to_front()
        elif tp=="INACTIVE":
            self._set_inactivate()
        elif tp=="ONCLOSE":
            if not self._disable:
                e={"window":self, "action":"ONCLOSE"};                
                self._fire_action(e)
                if "cancel" in e and e["cancel"] == True:
                    return False
            else:
                return False
        return True
 
class DialogMessage(Window):
    
    def __init__(self,act,lv,parentwin=None,logopath=None):
        if parentwin is None:
            Window.__init__(self,WINDOW_TYPE_DIALOG,parentwin=parentwin,logopath=logopath)
        else:
            if parentwin.is_show():
                Window.__init__(self,WINDOW_TYPE_TOOL,parentwin=parentwin,logopath=logopath)
            else:
                Window.__init__(self,WINDOW_TYPE_DIALOG,parentwin=parentwin,logopath=logopath)
        self._actions=act
        self._level=lv
        self._message=u""
        self._action=None        
        
        
        
    def get_message(self):
        return self._message

    def set_message(self, value):
        self._message = utils.str_new(value)

    def _ok_action(self,e):
        if e["action"]=="PERFORMED":
            self._fire_action({"action":"DIALOG_OK"})
            self.destroy()
    
    def _yes_action(self,e):
        if e["action"]=="PERFORMED":
            self._fire_action({"action":"DIALOG_YES"})
            self.destroy()
    
    def _no_action(self,e):
        if e["action"]=="PERFORMED":
            self._fire_action({"action":"DIALOG_NO"})
            self.destroy()
    
    def show(self):
        gapLabel=6
        pnlLeftW=50
        pnlBottomH=55   
        
        self.set_size(300, 180)
        self.set_show_position(WINDOW_POSITION_CENTER_SCREEN)
        
        pnlLeft = Panel()
        pnlLeft.set_position(0, 0)
        pnlLeft.set_size(pnlLeftW,self.get_height())
        col="064f7e"
        if self._level==DIALOGMESSAGE_LEVEL_ERROR:
            col="a61515"
        elif self._level==DIALOGMESSAGE_LEVEL_WARN:
            col="d2d90c"
        pnlLeft.set_background_gradient(col, "FFFFFF", GRADIENT_DIRECTION_LEFTRIGHT)
        self.add_component(pnlLeft)
        
             
        lb = Label()
        lb.set_position(gapLabel+pnlLeftW, gapLabel)
        lb.set_size(self.get_width()-pnlLeft.get_width()-(gapLabel*2), self.get_height()-55-(gapLabel*2))
        lb.set_wordwrap(True)
        lb.set_text(self._message)
        self.add_component(lb)
        
        pnl = Panel()
        pnl.set_position(0, self.get_height()-pnlBottomH)
        pnl.set_size(self.get_width(),pnlBottomH)
        self.add_component(pnl)
        
        if self._actions==DIALOGMESSAGE_ACTIONS_YESNO:
            bty = Button()
            bty.set_position(int((self._w/2)-((bty._w*2)/2))-5, 10)
            bty.set_text(messages.get_message('yes'))
            bty.set_action(self._yes_action)
            pnl.add_component(bty)
            
            btn = Button()
            btn.set_position(bty._x+bty._w+10, 10)
            btn.set_text(messages.get_message('no'))
            btn.set_action(self._no_action)
            pnl.add_component(btn)
        else:
            bt = Button()
            bt.set_position(int((self._w/2)-(bt._w/2)), 10)
            bt.set_text(messages.get_message('ok'))
            bt.set_action(self._ok_action)
            pnl.add_component(bt)
        
        Window.show(self)                 
                

    def on_window(self, tp):
        if tp=="ONCLOSE":
            return False
        return Window.on_window(self, tp)
        

class PopupMenu(Window):
    
    def __init__(self):
        Window.__init__(self,WINDOW_TYPE_POPUP)
        self._w=110;
        self._h=30;
        self._show_position=[POPUP_POSITION_BOTTONRIGHT, POPUP_POSITION_BOTTONLEFT, POPUP_POSITION_TOPRIGHT, POPUP_POSITION_TOPLEFT]
        #self._show_position=[POPUP_POSITION_TOPRIGHT]
        self._list=[]        
    
    def set_show_position(self,p):
        self._show_position=p
        
    def get_show_position(self,p):
        return self._show_position

    def _do_actions(self,e):
        if e["action"]=="MOUSECLICK":
            self.destroy()
            self._fire_action({"action":"PERFORMED", "name":e["source"].get_name()})
    
    def show(self):
        self._h=len(self._list)*30+4        
        pos_array = (ctypes.c_int * 2)()
        gdw_lib().DWAGDIGetMousePosition(pos_array)
        appsz=_gdimap["screensize"]
        self._x=int(pos_array[0])
        self._y=int(pos_array[1])
        for p in self._show_position:
            if p==POPUP_POSITION_BOTTONRIGHT:
                if (pos_array[1]+self._h<appsz["height"]) and (pos_array[0]+self._w<appsz["width"]):                    
                    self._x=int(pos_array[0])
                    self._y=int(pos_array[1])
                    break;
            elif p==POPUP_POSITION_BOTTONLEFT:
                if (pos_array[1]+self._h<appsz["height"]) and (pos_array[0]-self._w>=0):
                    self._x=int(pos_array[0])-self._w
                    self._y=int(pos_array[1])
                    break;
            elif p==POPUP_POSITION_TOPRIGHT:
                if (pos_array[1]-self._h>=0) and (pos_array[0]+self._w<appsz["width"]):
                    self._x=int(pos_array[0])
                    self._y=int(pos_array[1])-self._h
                    break;
            elif p==POPUP_POSITION_TOPLEFT:
                if (pos_array[1]-self._h>=0) and (pos_array[0]-self._w>=0):
                    self._x=int(pos_array[0])-self._w
                    self._y=int(pos_array[1])-self._h
                    break;            
        
        pnl = Panel()
        pnl.set_background("ffffff")
        pnl.set_border(BorderLine())
        pnl.set_position(0, 0)
        pnl.set_size(self._w, self._h)
        self.add_component(pnl)        
        y=2
        for itm in self._list:
            lbl = Label()
            lbl.set_name(itm["key"])
            lbl.set_text(itm["label"])
            lbl.set_highlight(True)
            lbl.set_position(2, y)
            lbl.set_width(self._w-4)
            lbl.set_action(self._do_actions)
            pnl.add_component(lbl)
            y+=30
        
        Window.show(self)
    
    def add_item(self,k,l):
        self._list.append({"key": k, "label": l})
        
    def on_window(self, tp):
        if tp=="INACTIVE":
            self.destroy()
            return True
        return Window.on_window(self, tp)
    
   
class BorderLine:
    
    def __init__(self):
        None
        self._color=_STYLE_COMPONENT_BORDER_COLOR
        self.size_l=1
        self.size_t=1
        self.size_b=1
        self.size_r=1
    
    def set_color(self,c):
        self._color=c
    
    def get_color(self):
        return self.color
            
    def on_paint(self,c,pobj):
        pobj.pen_color(self._color)
        pobj.draw_line(0,0,0,c._h-1) #LEFT
        pobj.draw_line(0,0,c._w-1,0) #TOP       
        pobj.draw_line(c._w-1,0,c._w-1,c._h) #RIGHT 
        pobj.draw_line(0,c._h-1,c._w,c._h-1) #BOTTOM
        

class Component:
    
    def __init__(self):
        self._window=None
        self._x=0;
        self._y=0;
        self._w=0;
        self._h=0;
        self._background=_STYLE_COMPONENT_BACKGROUND_COLOR
        self._foreground=_STYLE_COMPONENT_FOREGROUND_COLOR
        self._name=None
        self._border=None
        self._opaque=True
        self._visible=True
        self._focusable=False
        self._parent=None
        self._container=False
        self._enable=True
        self._components=[]
        self._gradient_background_start=None
        self._gradient_background_end=None
        self._gradient_direction=None
        self._action=None
        self._eventMouseDetect=EventMouseDetect(self)
    
    def _destroy(self):
        self._window=None
    
    def set_action(self,f):
        self._action=f
        
    def get_action(self):
        return self._action
    
    def _fire_action(self, e):
        if self._action is not None:
            e["source"]=self
            if "window" not in e:
                e["window"]=self._window
            self._action(e)
    
    def _set_window_tree(self, c, w):
        if c._window is not None:
            self._window._focus_sequence.remove(c)            
        c._window=w;
        if self._window is not None:
            self._window._add_focus_sequence(c)
        if c._container:
            for appc in c._components:
                self._set_window_tree(appc,w)
    
    def add_component(self, c):
        if self._container:
            c._parent=self;
            self._components.append(c)
            self._set_window_tree(c,self._window)    
            c.repaint()
    
    def remove_component(self, crem):
        if self._container:
            for c in self._components:
                if c==crem:
                    if c._container:
                        c.remove_all_components()
                    c._destroy()
                    bchangefocus=False
                    if self._window is not None and self._window.get_focus_component()==c:
                        self._window._set_focus_component_byindex(None)
                    self._components.remove(c)
                    self._set_window_tree(c, None)
                    if self._window is not None:
                        if bchangefocus:
                            self._window.next_focus_component()
                        xy=self._get_win_pos()
                        _repaint(self._window._id,c._x+xy[0],c._y+xy[1],c._w,c._h)
                    break
    
    def get_components(self):
        return self._components
    
    def remove_all_components(self):
        if self._container:
            while len(self._components)>0:
                c=self._components[0]
                if c._container:
                    c.remove_all_components()
                c._destroy()
                bchangefocus=False
                if self._window is not None and self._window.get_focus_component()==c:
                        self._window._set_focus_component_byindex(None)
                self._components.remove(c)
                if self._window is not None and c in self._window._focus_sequence:
                    self._window._focus_sequence.remove(c)
                if bchangefocus:
                        self._window.next_focus_component()
                xy=self._get_win_pos()
                if self._window is not None:
                    _repaint(self._window._id,c._x+xy[0],c._y+xy[1],c._w,c._h)
    
    def focus(self):
        if self._window:
            self._window._set_focus_component(self,{"mode":"CODE"})
    
    def get_name(self):
        return self._name
    
    def set_name(self,value):
        self._name=value
    
    def set_position(self,x,y):
        if self._x!=x or self._y!=y:
            self._x=x;
            self._y=y;
            self.repaint_parent()
    
    def set_size(self,w,h):
        if self._w!=w or self._h!=h:
            self._w=w;
            self._h=h;
            self.repaint_parent()
    
    def set_x(self,x):
        if self._x!=x:
            self._x=x;
            self.repaint_parent()
    
    def get_x(self):
        return self._x;
    
    def set_y(self,y):
        if self._y!=y:
            self._y=y;
            self.repaint_parent()
    
    def get_y(self):
        return self._y;
    
    def set_width(self,w):
        if self._w!=w:
            self._w=w;
            self.repaint_parent()
    
    def get_width(self):
        return self._w;
    
    def set_height(self,h):
        if self._h!=h:
            self._h=h;
            self.repaint_parent()
    
    def get_height(self):
        return self._h;
    
    
    def set_visible(self,b):
        if self._visible!=b:
            self._visible=b
            self.repaint_parent()
    
    def get_visible(self):
        return self._visible
        
    def set_foreground(self,c):
        self._foreground=c
    
    def get_foreground(self):
        return self._foreground
    
    def set_background(self,c):
        self._background=c
        self.clear_background_gradient()
    
    def get_background(self):
        return self._background
    
    def set_background_gradient(self,cstart,cend,direction): #DA GESTIRE direction al momento fisso sinistra verso destra
        self._gradient_background_start=cstart
        self._gradient_background_end=cend
        self._gradient_direction=direction
        self.repaint()
        
    def is_background_gradient(self):
        return (self._gradient_background_start is not None and self._gradient_background_end is not None and self._gradient_direction is not None)
        
    def clear_background_gradient(self):
        self._gradient_background_start=None
        self._gradient_background_end=None
        self._gradient_direction=None
    
    def set_border(self,b):
        self._border=b;
    
    def get_border(self):
        return self._border;
    
    def set_enable(self,b):
        self._enable=b;
        self.repaint()
    
    def is_enable(self):
        return self._enable
        
    def set_opaque(self,b):
        self._opaque=b;
    
    def is_opaque(self):
        return self._opaque;    
    
    def is_focusable(self):
        return self._focusable
    
    def has_focus(self):
        if self._window:            
            return self._window.get_focus_component()==self
        else:
            return False
    
    def on_focus_get(self,e):
        None
    
    def on_focus_lost(self,e):
        None
    
    def on_mouse_enter(self,e):
        None
    
    def on_mouse_leave(self,e):
        None
        
    def _get_win_pos(self):
        x=self._x;
        y=self._y;
        if self._parent is not None:
            xy=self._parent._get_win_pos()
            return (xy[0]+x,xy[1]+y)
        else:
            return (x,y)
        
        
    def repaint_parent(self):
        if self._parent is not None and self._window is not None and self._window._id is not None:
            #print("repaint_parent")
            self._parent.repaint()
        elif self._window is not None and self._window._id is not None:
            #print("repaint_parent")
            self._window.repaint()
            
    def repaint(self):
        if self._window is not None and self._window._id is not None:
            #print("repaint")
            xy=self._get_win_pos()
            _repaint(self._window._id,xy[0],xy[1],self._w,self._h)            
    
    def repaint_area(self,x,y,w,h):
        if self._window is not None and self._window._id is not None:
            #print(repaint_area")
            xy=self._get_win_pos()
            _repaint(self._window._id,xy[0]+x,xy[1]+y,w,h)            
    
    def _draw_background_gradient(self,pobj,x,y,w,h):
        rgbstart = getRGBColor(self._gradient_background_start)
        rgbend = getRGBColor(self._gradient_background_end)
        rstart=rgbstart[0]
        gstart=rgbstart[1]
        bstart=rgbstart[2]
        rend=rgbend[0]
        gend=rgbend[1]
        bend=rgbend[2]        
        if rstart>rend:
            app=rend
            rend=rstart
            rstart=app
        
        if gstart>gend:
            app=gend
            gend=gstart
            gstart=app
            
        if bstart>bend:
            app=bend
            bend=bstart
            bstart=app        
        if self._gradient_direction==GRADIENT_DIRECTION_LEFTRIGHT:
            rstep = float(rend-rstart)/float(w)
            gstep = float(gend-gstart)/float(w)
            bstep = float(bend-bstart)/float(w)
            for i in range(w):
                hexc=getHexColor(int(rstart),int(gstart),int(bstart))
                pobj.pen_color(hexc)
                pobj.draw_line(i,0,i,h-1)
                rstart+=rstep
                gstart+=gstep
                bstart+=bstep
        elif self._gradient_direction==GRADIENT_DIRECTION_TOPBOTTOM:
            rstep = float(rend-rstart)/float(h)
            gstep = float(gend-gstart)/float(h)
            bstep = float(bend-bstart)/float(h)
            for i in range(h):
                hexc=getHexColor(int(rstart),int(gstart),int(bstart))
                pobj.pen_color(hexc)
                pobj.draw_line(0,i,w-1,i)
                rstart+=rstep
                gstart+=gstep
                bstart+=bstep
        elif self._gradient_direction==GRADIENT_DIRECTION_BOTTONTOP:
            rstep = float(rend-rstart)/float(h)
            gstep = float(gend-gstart)/float(h)
            bstep = float(bend-bstart)/float(h)
            for i in reversed(range(h)):
                hexc=getHexColor(int(rstart),int(gstart),int(bstart))
                pobj.pen_color(hexc)
                pobj.draw_line(0,i,w-1,i)
                rstart+=rstep
                gstart+=gstep
                bstart+=bstep
    
    def on_paint(self,pobj):
        if self._opaque:
            if self.is_background_gradient():
                self._draw_background_gradient(pobj,0,0,self._w,self._h)
            else:
                pobj.pen_color(self._background)
                pobj.fill_rectangle(0, 0,self._w,self._h)
        if self._border is not None:
            self._border.on_paint(self,pobj) 
        pobj.pen_color(self._foreground)
    
    def on_keyboard(self,tp,c,shift,ctrl,alt,meta):
        if tp=="KEY":
            if c=="TAB":
                if shift:
                    self._window.previous_focus_component()
                else:
                    self._window.next_focus_component()
    
    def on_mouse(self,tp,x,y,b):
        if self.is_enable():
            self._eventMouseDetect.check(tp, x, y, b)                
        #print("tp: " + tp + " - x: " + str(x) + " - y: " + str(y) + " - b: " + str(b) + "  " + str(self))

class Panel(Component):
    def __init__(self):
        Component.__init__(self)
        self._border=None;
        self._w=300;
        self._h=200;
        self._focusable=False
        self._opaque=True
        self._container=True
        
class Label(Component):
    
    def __init__(self):
        Component.__init__(self)
        self._background=_STYLE_EDITOR_BACKGROUND_COLOR
        self._foreground=_STYLE_EDITOR_FOREGROUND_COLOR
        self._border=None;
        self._w=150;
        self._h=30;
        self._focusable=False
        self._opaque=False
        self._text=u""
        self._wordwrap=False
        self._text_align=TEXT_ALIGN_LEFTMIDDLE
        self._highlight=False
        self._hyperlinks={}
    
    def _fire_action(self, e):
        Component._fire_action(self, e)
        if e["action"]=="MOUSECLICK":
            for k in self._hyperlinks:
                itm = self._hyperlinks[k]
                for a in itm["clickareas"]:
                    if e["x"]>=a["x1"] and e["x"]<=a["x2"] and e["y"]>=a["y1"] and e["y"]<=a["y2"]:
                        try:
                            import webbrowser
                            webbrowser.open(itm["url"])
                        except:
                            None
                        return
    
    def get_text(self):
        return self._text

    def set_text(self, value):
        self._text = utils.str_new(value)
        self._hyperlinks={}
        self.repaint()
    
    def add_hyperlink(self, key, ps, ln, url):
        self._hyperlinks[key]={"start":ps, "length":ln, "url": url , "clickareas":[]}
        self.repaint()
    
    def del_hyperlink(self, key):
        del self._hyperlinks[key]
        self.repaint()
    
    def get_text_align(self):
        return self._text_align

    def set_text_align(self, value):
        self._text_align = value
        self.repaint()    
        
    def set_wordwrap(self,b):
        self._wordwrap=b
        
    def is_wordwrap(self):
        return self._wordwrap 

    def set_highlight(self,b):
        self._highlight=b
    
    def is_highlight(self):
        return self._highlight

    def on_mouse_enter(self,e):
        if self._enable and self._highlight:
            self.repaint()
    
    def on_mouse_leave(self,e):
        if self._enable and self._highlight:
            self.repaint()
    
    def on_paint(self,pobj):
        if self._enable:
            if self._highlight and self._window.get_mouse_enter_component()==self:
                pobj.pen_color("e2e9ed")
                pobj.fill_rectangle(0,0,self._w,self._h)
                if self._border is not None:
                    self._border.on_paint(self,pobj)     
            else:
                Component.on_paint(self, pobj)
        else:
            Component.on_paint(self, pobj)
        pobj.clip_rectangle(2,2,self._w-4,self._h-4)
        gapw=2;
        s = self._text 
        if s!=u"":
            if self._enable:
                pobj.pen_color(self._foreground)
            else:
                pobj.pen_color("a0a0a0")
            ar=[]
            appar = s.split(u"\n")
            for appsr in appar:
                if not self._wordwrap:
                    ar.append(appsr)
                else:
                    if appsr=="":
                        ar.append("")
                    else:
                        wordar = appsr.split(" ")
                        curs=u""
                        bfirst=True
                        for wsr in wordar:
                            news=None
                            if bfirst:
                                bfirst=False
                                news=wsr
                            else:
                                news=curs + u" " + wsr
                            if pobj.get_text_width(news)>self._w-(gapw*2):
                                ar.append(curs)
                                curs=wsr
                            else:
                                curs=news
                        if curs!=u"":
                            ar.append(curs)                        
            
            
            for k in self._hyperlinks:
                itm = self._hyperlinks[k]
                itm["clickareas"]=[]
            th=pobj.get_text_height()*len(ar)
            ty=2;
            if self._text_align==TEXT_ALIGN_LEFTMIDDLE or self._text_align==TEXT_ALIGN_CENTERMIDDLE or self._text_align==TEXT_ALIGN_RIGHTMIDDLE:
                ty=(self._h/2)-(th/2)            
            cpos=0
            for sr in ar:
                tx=gapw
                srw=pobj.get_text_width(sr)
                srh=pobj.get_text_height()
                if self._text_align==TEXT_ALIGN_CENTERMIDDLE:
                    tx=((self._w-(gapw*2))/2)-(srw/2)
                    if tx<gapw:
                        tx=gapw
                elif self._text_align==TEXT_ALIGN_RIGHTMIDDLE:
                    tx=(self._w-(gapw*2))-srw
                pobj.draw_text(sr,tx,ty)
                
                for k in self._hyperlinks:
                    itm = self._hyperlinks[k]
                    lnpi = cpos
                    lnpe = cpos+len(sr)
                    klpi = itm["start"]
                    klpe = itm["start"]+itm["length"]
                    x1 = -1
                    x2 = -1
                    if klpi>=lnpi and klpi<=lnpe and klpe>=lnpi and klpe<=lnpe: #FULL INSIDE
                        x1 = pobj.get_text_width(sr[0:(klpi-lnpi)])
                        x2 = x1 + pobj.get_text_width(sr[(klpi-lnpi):(klpe-lnpi)])
                    elif klpi>=lnpi and klpi<=lnpe: #START INSIDE
                        x1 = pobj.get_text_width(sr[0:(klpi-lnpi)])
                        x2 = x1 + pobj.get_text_width(sr[(klpi-lnpi):])
                    elif klpe>=lnpi and klpe<=lnpe: #END INSIDE
                        x1 = 0
                        x2 = x1 + pobj.get_text_width(sr[0:(klpe-lnpi)])
                    if x1!=-1 and x2 !=-1:
                        y1 = ty
                        y2 = ty+srh
                        pobj.draw_line(x1+tx,y2,x2+tx,y2)
                        itm["clickareas"].append({"x1":x1+tx,"y1":y1,"x2":x2+tx,"y2":y2})

                cpos+=len(sr)+1                              
                ty+=srh
        pobj.clear_clip_rectangle()

                    

class Button(Component):
    def __init__(self):
        Component.__init__(self)
        self._w=100;
        self._h=36;
        self._focusable=True
        self._opaque=True
        self._text=u""
        self._border=BorderLine()        
        
    
    def get_text(self):
        return self._text

    def set_text(self, value):
        self._text = utils.str_new(value)
        self.repaint() 
    
    def on_mouse_enter(self,e):
        if self._enable:
            self.repaint()
    
    def on_mouse_leave(self,e):
        if self._enable:
            self.repaint()

    def on_paint(self,pobj):
        if self._enable:
            if self._window.get_mouse_enter_component()==self:
                pobj.pen_color("e2e9ed")
                pobj.fill_rectangle(0,0,self._w,self._h)
                if self._border is not None:
                    self._border.on_paint(self,pobj)     
            else:
                Component.on_paint(self, pobj)
        else:
            Component.on_paint(self, pobj)
        pobj.clip_rectangle(2,2,self._w-4,self._h-4)
        s = self._text 
        if s!=u"":
            if self._enable:
                pobj.pen_color(self._foreground)
            else:
                pobj.pen_color("a0a0a0")
            tx=(self._w/2)-(pobj.get_text_width(s)/2)
            ty=(self._h/2)-(pobj.get_text_height()/2)
            pobj.draw_text(s,tx,ty)
        pobj.clear_clip_rectangle()
    
    def on_mouse(self,tp,x,y,b):
        Component.on_mouse(self, tp, x, y, b)
        if self.is_enable():
            if tp=="BUTTON_DOWN":
                self.focus()
            elif tp=="BUTTON_UP":
                if self._enable:
                    self._fire_action({"action":"PERFORMED"})
            

class RadioButton(Component):
    def __init__(self):
        Component.__init__(self)
        self._w=150;
        self._h=30;
        self._focusable=True
        self._opaque=False
        self._text=""
        self._border=None;
        self._selected=False
        self._group=None
            
    def get_text(self):
        return self._text

    def set_text(self, value):
        self._text = utils.str_new(value)
        self.repaint() 
    
    def get_selected(self):
        return self._selected

    def set_selected(self, value):
        self._selected= value
        self.repaint_area(0,0,22,self._h)
    
    def get_group(self):
        return self._group

    def set_group(self, value):
        self._group= value

    def _repaint_check(self):
        self.repaint_area(0,0,22,self._h)
    
    '''def on_mouse_enter(self,e):
        if self._enable:
            self.repaint_area(0,0,22,self._h)
    
    def on_mouse_leave(self,e):
        if self._enable:
            self.repaint_area(0,0,22,self._h)'''

    def on_paint(self,pobj):
        Component.on_paint(self, pobj)
        pobj.clip_rectangle(2,2,self._w-4,self._h-4)
        #if self._window.get_mouse_enter_component()==self:
        #    pobj.pen_color("f8fbfd")
        #else:            
        if self._enable:
            pobj.pen_color(_STYLE_EDITOR_BACKGROUND_COLOR)
        else:
            pobj.pen_color("f2f2f2")
        rsz=18
        ty=int((self._h/2)-(rsz/2))
        pobj.fill_ellipse(2,ty,rsz,rsz)
        pobj.pen_color(_STYLE_COMPONENT_BORDER_COLOR)
        pobj.draw_ellipse(2,ty,rsz,rsz)
        
        if self._selected:
            gap=8
            pobj.pen_color(_STYLE_EDITOR_FOREGROUND_COLOR)
            ty=int((self._h/2)-((rsz-gap)/2))
            pobj.fill_ellipse(2+(gap/2),ty,rsz-gap,rsz-gap)
        
        s = self._text 
        if s!=u"":
            if self._enable:
                pobj.pen_color(self._foreground)
            else:
                pobj.pen_color("a0a0a0")
            ty=(self._h/2)-(pobj.get_text_height()/2)
            pobj.draw_text(s,rsz+8,ty)
        pobj.clear_clip_rectangle()
            
    def on_mouse(self,tp,x,y,b):
        Component.on_mouse(self, tp, x, y, b)
        if self.is_enable():
            if tp=="BUTTON_DOWN":
                self.focus()
                if not self._selected:
                    old_selected=None
                    if self._group is not None and self._window is not None:
                        for c in self._window.get_all_components():
                            if isinstance(c, RadioButton):
                                if c._group is not None:
                                    if self._group==c._group:
                                        if c._selected:
                                            old_selected=c
                                            old_selected._selected=False
                                            old_selected._repaint_check()
                    self._selected=True
                    self._repaint_check()
                    if self._enable:
                        self._fire_action({"action":"SELECTED", "old_selected":old_selected})


class ProgressBar(Component):
    
    def __init__(self):
        Component.__init__(self)
        self._foreground="86a7d4"
        self._border=BorderLine()
        self._w=250;
        self._h=24;
        self._focusable=False
        self._opaque=True
        self._percent=0
    
    def get_percent(self):
        return self._percent

    def set_percent(self, value):
        self._percent = value
        self.repaint() 

    def on_paint(self,pobj):
        Component.on_paint(self, pobj)
        p=self._percent
        if p<0.0:
            p=0.0;
        elif p>1.0:
            p=1.0;
        if self._percent>0.0:
            pobj.pen_color(self._foreground)
            pw=int((self._w-4)*p)
            pobj.fill_rectangle(2,2,pw,self._h-4)

class ImagePanel(Component):
    
    def __init__(self):
        Component.__init__(self)
        self._imgreload=True
        self._imgitm=None
        self._filename=None
        self._w=250;
        self._h=100;
        self._focusable=False
        self._opaque=False
     
    def _destroy(self):
        if self._imgitm is not None:
            _gdimap["imagemanager"].unload(self._imgitm)
            self._imgitm=None
        Component._destroy(self)   
    
    def get_filename(self):
        return self._filename

    def set_filename(self, fn):
        if self._filename != fn:
            self._filename = fn
            self._imgreload = True
            self.repaint() 

    def on_paint(self,pobj):
        Component.on_paint(self, pobj)
        if self._imgreload:
            if self._imgitm is not None:
                _gdimap["imagemanager"].unload(self._imgitm)
                self._imgitm=None
            if utils.path_exists(self._filename):
                self._imgitm = _gdimap["imagemanager"].load(self._filename)
            self._imgreload=False
        
        if self._imgitm is not None:
            pobj.draw_image(self._imgitm,0,0)            
         
                
class TextBox(Component):
    
    def __init__(self):
        Component.__init__(self)
        self._background=_STYLE_EDITOR_BACKGROUND_COLOR
        self._foreground=_STYLE_EDITOR_FOREGROUND_COLOR
        self._border=BorderLine()
        self._focusable=True
        self._w=200;
        self._h=30;
        self._text=u""
        self._cursor_position=0
        self._selection_start=0
        self._selection_end=0
        self._blink=False
        self._blinkitm=None
        self._password_mask=False
        self._validate=None
        self._cursor_x=-1
        self._text_offx=0
    
        
    def set_password_mask(self,value):
        self._password_mask=value
    
    def is_password_mask(self):
        return self._password_mask
   
    def set_validate(self,value):
        self._validate=value
    
    def get_validate(self):
        return self._validate
   
    def get_text(self):
        return self._text

    def set_text(self, value):
        self._text = utils.str_new(value)
        self._cursor_position=len(self._text)
        self._selection_start=self._cursor_position
        self._selection_end=self._cursor_position
        self.repaint()        
              
    def _blinktimer(self):
        self._blink=not self._blink
        self._repaint_cursor()
        self._blinkitm=_gdimap["sheduler"].add(0.5,self._blinktimer)        
    
    def on_focus_get(self,e):
        if e["mode"]=="KEYBOARD":
            self._selection_start=len(self._text)
            self._selection_end=len(self._text)
            self._cursor_position=self._selection_end
        self._blink=True
        self._repaint_text_area()
        self._blinkitm=_gdimap["sheduler"].add(0.5,self._blinktimer)
    
    def on_focus_lost(self,e):
        if self._blinkitm is not None:
            _gdimap["sheduler"].cancel(self._blinkitm)
        self._blinkitm=None
        if self._validate is not None:
            self._validate({"window":self._window, "source": self})
        self._selection_start=0
        self._selection_end=0
        self._blink=False
        self._repaint_text_area()
    
    def _get_cursor_pos_by_x(self,x):
        fontid=_gdimap["fontmanager"].get_id("default")
        x=x
        xi=2
        xf=2
        for i in range(len(self._text)):
            s=self._text[0:i]
            if len(s)!=0:
                xf = gdw_lib().DWAGDIGetTextWidth(self._window._id,fontid,s)+2-self._text_offx
                if x>=xi and x<=xf:
                    return i-1
                xi=xf
        if len(self._text)!=0:
            xf = gdw_lib().DWAGDIGetTextWidth(self._window._id,fontid,self._text)+2-self._text_offx
            if x>=xi and x<=xf:
                return len(self._text)-1
        return len(self._text)
    
    def _repaint_text_area(self):
        self.repaint_area(2, 2, self._w-4, self._h-4)
    
    def _repaint_cursor(self):
        if self._cursor_x!=-1:
            self.repaint_area(self._cursor_x-self._text_offx, 0, 1, self._h)
    
    def on_paint(self,pobj):
        #if self._window.get_mouse_enter_component()==self:
        #    pobj.pen_color("f8fbfd")
        #    pobj.fill_rectangle(x,y,w,h)
        #    if self._border is not None:
        #        self._border.on_paint(self,pobj)     
        #else:
        Component.on_paint(self, pobj)
        pobj.clip_rectangle(2,2,self._w-4,self._h-4)
        s = self._text
        if self._password_mask:
            s=u"*" * len(s)
        self._cursor_x = 2
        if s!=u"":
            wtx=pobj.get_text_width(s)
            #CALCOLA CURSORE
            self._cursor_x += pobj.get_text_width(s[0:self._cursor_position])
            if wtx>self._w-4:
                if self._cursor_x-self._text_offx>self._w-4:
                    self._text_offx=self._cursor_x-(self._w-4)+int(self._w/3)
                elif self._cursor_x-self._text_offx<2:
                    self._text_offx=self._cursor_x-int(self._w/3)
                if self._text_offx>(wtx+2)-(self._w-4):
                    self._text_offx=(wtx+2)-(self._w-4)
                if self._text_offx<0:
                    self._text_offx=0            
            else:
                self._text_offx=0
            #SELECTION
            if self._selection_end>self._selection_start:
                xstart=pobj.get_text_width(s[0:self._selection_start])
                xend=pobj.get_text_width(s[0:self._selection_end])
                pobj.pen_color(_STYLE_EDITOR_SELECTION_COLOR)
                pobj.fill_rectangle(2+xstart-self._text_offx,3,(xend-xstart),self._h-(2*3))
            #TESTO
            pobj.pen_color(self._foreground)
            ty=(self._h/2)-(pobj.get_text_height()/2)
            pobj.draw_text(s,2-self._text_offx,ty)
        else:
            self._text_offx=0
        if self._blink:
            pobj.pen_color(self._foreground)
            pobj.draw_line(self._cursor_x-self._text_offx,3,self._cursor_x-self._text_offx,self._h-4)
        pobj.clear_clip_rectangle()        
    
    def _on_keyboard_char(self,c,shift,ctrl,alt,meta):
        if self._selection_start!=self._selection_end:
            self._text=self._text[0:self._selection_start] + self._text[self._selection_end:]
            self._cursor_position=self._selection_start
        self._text=self._text[0:self._cursor_position] + utils.str_new(c) + self._text[self._cursor_position:]
        self._cursor_position+=len(utils.str_new(c))
        self._selection_start=self._cursor_position
        self._selection_end=self._cursor_position
        self._blink=True
        self._repaint_text_area()
        
    def _on_keyboard_key(self,c,shift,ctrl,alt,meta):
        if c=="BACKSPACE":
            if self._selection_start==self._selection_end: 
                if self._cursor_position>0:
                    self._text=self._text[0:self._cursor_position-1] + self._text[self._cursor_position:]
                    self._cursor_position-=1
            else:
                self._text=self._text[0:self._selection_start] + self._text[self._selection_end:]
                self._cursor_position=self._selection_start
            self._selection_start=self._cursor_position
            self._selection_end=self._cursor_position
            self._blink=True
            self._repaint_text_area()
        elif c=="DELETE":
            if self._selection_start==self._selection_end:
                if self._cursor_position<len(self._text):
                    self._text=self._text[0:self._cursor_position] + self._text[self._cursor_position+1:]
            else:
                self._text=self._text[0:self._selection_start] + self._text[self._selection_end:]
                self._cursor_position=self._selection_start
            self._selection_start=self._cursor_position
            self._selection_end=self._cursor_position
            self._blink=True
            self._repaint_text_area()
        elif c=="LEFT":
            if self._cursor_position>0:
                if shift and self._cursor_position==self._selection_start:
                    self._cursor_position-=1
                    self._selection_start=self._cursor_position
                elif shift and self._cursor_position==self._selection_end:
                    self._cursor_position-=1
                    self._selection_end=self._cursor_position
                else:
                    self._cursor_position-=1
                    self._selection_start=self._cursor_position
                    self._selection_end=self._cursor_position
            elif not shift :
                self._selection_start=self._cursor_position
                self._selection_end=self._cursor_position
            self._blink=True
            self._repaint_text_area()
        elif c=="RIGHT":
            if self._cursor_position<len(self._text):
                if shift and self._cursor_position==self._selection_end:
                    self._cursor_position+=1
                    self._selection_end=self._cursor_position
                elif shift and self._cursor_position==self._selection_start:
                    self._cursor_position+=1
                    self._selection_start=self._cursor_position
                else:
                    self._cursor_position+=1
                    self._selection_start=self._cursor_position
                    self._selection_end=self._cursor_position
            elif not shift :
                self._selection_start=self._cursor_position
                self._selection_end=self._cursor_position
            self._blink=True
            self._repaint_text_area()
        elif c=="HOME":
            if self._cursor_position>0:
                if shift and self._cursor_position==self._selection_start:
                    self._cursor_position=0
                    self._selection_start=0
                elif shift and self._cursor_position==self._selection_end:
                    self._cursor_position=0
                    self._selection_end=self._selection_start
                    self._selection_start=0                        
                else:
                    self._cursor_position=0
                    self._selection_start=self._cursor_position
                    self._selection_end=self._cursor_position
            elif not shift :
                self._selection_start=self._cursor_position
                self._selection_end=self._cursor_position
            self._blink=True
            self._repaint_text_area()
        elif c=="END":
            if self._cursor_position<len(self._text):
                if shift and self._cursor_position==self._selection_end:
                    self._cursor_position=len(self._text)
                    self._selection_end=self._cursor_position
                elif shift and self._cursor_position==self._selection_start:
                    self._cursor_position=len(self._text)
                    self._selection_start=self._selection_end
                    self._selection_end=self._cursor_position
                else:
                    self._cursor_position=len(self._text)
                    self._selection_start=self._cursor_position
                    self._selection_end=self._cursor_position
            elif not shift :
                self._selection_start=self._cursor_position
                self._selection_end=self._cursor_position
            self._blink=True
            self._repaint_text_area()

    def _on_keyboard_command(self,c,shift,ctrl,alt,meta):
        if c=="COPY":
            s=self._text[self._selection_start:self._selection_end]
            if len(s)>0:
                gdw_lib().DWAGDISetClipboardText(s)  
        elif c=="CUT":
            s=self._text[self._selection_start:self._selection_end]
            if len(s)>0:
                gdw_lib().DWAGDISetClipboardText(s) 
            self._on_keyboard_key("DELETE",shift,ctrl,alt,meta)
        elif c=="PASTE":
            s=gdw_lib().DWAGDIGetClipboardText()
            if len(s)>0:
                self._on_keyboard_char(s,shift,ctrl,alt,meta) 

    def on_keyboard(self,tp,c,shift,ctrl,alt,meta):
        Component.on_keyboard(self,tp,c,shift,ctrl,alt,meta)
        if tp=="CHAR":
            self._on_keyboard_char(c,shift,ctrl,alt,meta)
        elif tp=="KEY":
            self._on_keyboard_key(c,shift,ctrl,alt,meta)
        elif tp=="COMMAND":
            self._on_keyboard_command(c,shift,ctrl,alt,meta)
            
               
    def on_mouse(self,tp,x,y,b):
        Component.on_mouse(self, tp, x, y, b)
        if tp=="BUTTON_DOWN":
            self._cursor_position=self._get_cursor_pos_by_x(x)
            self._selection_start=self._cursor_position
            self._selection_end=self._cursor_position
            self._repaint_text_area()


                                                                                  ui/__init__.py                                                                                      0000644 0001750 0001750 00000000342 13422307023 013065  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-

'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''
                                                                                                                                                                                                                                                                                              utils.py                                                                                            0000755 0001750 0001750 00000037133 14407021004 012060  0                                                                                                    ustar   webdel                          webdel                                                                                                                                                                                                                 # -*- coding: utf-8 -*-
'''
This Source Code Form is subject to the terms of the Mozilla
Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''

import sys
import os
import shutil
import codecs
import subprocess
import zipfile
import platform
import traceback
import time
import ctypes
import threading
import logging.handlers
import zlib
import base64

path_sep=os.sep
line_sep=os.linesep

_biswindows=(platform.system().lower().find("window") > -1)
_bislinux=(platform.system().lower().find("linux") > -1)
_bismac=(platform.system().lower().find("darwin") > -1)


def is_py2():
    return sys.version_info[0]==2

if is_py2():    
    import Queue
    import BaseHTTPServer
    import urllib
    import urlparse
    try:
        import cStringIO
        BytesIO = cStringIO.StringIO
    except ImportError:
        import StringIO
        BytesIO = StringIO.StringIO    
    try:
        import cPickle
        Pickler = cPickle.Pickler
        Unpickler = cPickle.Unpickler
    except ImportError:
        import pickle 
        Pickler = pickle.Pickler
        Unpickler = pickle.Unpickler    
    Queue = Queue.Queue
    HTTPServer = BaseHTTPServer.HTTPServer
    BaseHTTPRequestHandler = BaseHTTPServer.BaseHTTPRequestHandler
    nrange=xrange
    sys_maxsize=sys.maxint
    os_getcwd=os.getcwdu        
else:
    import queue
    import http.server
    import urllib
    import io
    import pickle 
    BytesIO = io.BytesIO    
    Pickler = pickle.Pickler
    Unpickler = pickle.Unpickler        
    Queue = queue.Queue
    HTTPServer = http.server.HTTPServer
    BaseHTTPRequestHandler = http.server.BaseHTTPRequestHandler    
    nrange=range
    sys_maxsize=sys.maxsize
    os_getcwd=os.getcwd


def is_windows():
    return _biswindows

def is_linux():
    return _bislinux

def is_mac():
    return _bismac

def exception_to_string(e):
    bamsg=False;
    try:
        if len(e.message)>0:
            bamsg=True;
    except:
        None
    try:
        appmsg=None
        if bamsg:
            appmsg=str_new(e.message)
        else:
            appmsg=str_new(e)
        return appmsg
    except:
        return u"Unexpected error."
    
def get_stacktrace_string():
    try:
        s = traceback.format_exc();
        if s is None:
            return u""
        else:
            return str_new(s)
    except:
        return u"Unexpected error (get_stacktrace_string)."

def get_exception_string(e, tx=u""):
    msg = str_new(tx)
    msg += exception_to_string(e)
    msg += u"\n" + get_stacktrace_string()
    #msg += e.__class__.__name__
    #if e.args is not None and len(e.args)>0 and e.args[0] != '':
    #        msg = e.args[0]
    return msg

def get_exception():
    try:
        ar = sys.exc_info()
        if len(ar)>1 and sys.exc_info()[1] is not None:
            return sys.exc_info()[1]
        else:
            return sys.exc_info()[0]
    except:
        return Exception("Unexpected error (get_exception).")


if is_windows():
    if is_py2():
        get_time=time.clock        
    else:
        get_time=time.perf_counter
else:
    get_time=time.time

def unload_package(pknm):
    mdtorem=[]
    for nm in sys.modules:
        if nm.startswith(pknm):
            mdtorem.append(nm)
    for nm in mdtorem:
        del sys.modules[nm]

def convert_bytes_to_structure(st, byte):
    ctypes.memmove(ctypes.addressof(st), byte, ctypes.sizeof(st))

def convert_struct_to_bytes(st):
    bf = ctypes.create_string_buffer(ctypes.sizeof(st))
    ctypes.memmove(bf, ctypes.addressof(st), ctypes.sizeof(st))
    return bf.raw

##########
# BUFFER #
##########
if is_py2():
    buffer_new=lambda o, p, l: buffer(o,p,l)        
else:
    buffer_new=lambda o, p, l: memoryview(o)[p:p+l]    


#########
# BYTES #
#########
if is_py2():    
    bytes_new=str
    bytes_join=lambda ar: "".join(ar)
    bytes_get=lambda b, i: ord(b[i])
    bytes_to_str_hex=lambda s: s.encode('hex')            
else:
    bytes_new=bytes
    bytes_join=lambda ar: b"".join(ar)
    bytes_get=lambda b, i: b[i]
    bytes_to_str_hex=bytes.hex
bytes_to_str=lambda b, enc="ascii": b.decode(enc, errors="replace")


#######
# STR #
#######
if is_py2():
    def _py2_str_new(o):
        if isinstance(o, unicode):
            return o 
        elif isinstance(o, str):
            return o.decode("utf8", errors="replace")
        else:
            return str(o).decode("utf8", errors="replace")
    str_new=_py2_str_new
    str_is_unicode=lambda s: isinstance(s, unicode) #TO REMOVE
    str_hex_to_bytes=lambda s: s.decode('hex')
else:
    str_new=str
    str_is_unicode=lambda s: isinstance(s, str) #TO REMOVE
    str_hex_to_bytes=bytes.fromhex
str_to_bytes=lambda s, enc="ascii": s.encode(enc, errors="replace")

#######
# URL #
#######
if is_py2():    
    url_parse=urlparse.urlparse
    url_parse_quote_plus=urllib.quote_plus
    url_parse_quote=urllib.quote
    url_parse_qs=urlparse.parse_qs        
else:    
    url_parse=urllib.parse.urlparse
    url_parse_quote_plus=urllib.parse.quote_plus
    url_parse_quote=urllib.parse.quote
    url_parse_qs=urllib.parse.parse_qs
    

##############
# FILESYSTEM #
##############
def _path_fix(pth):
    if not is_py2() or not is_linux() or isinstance(pth, str):
        return pth
    else:
        return pth.encode('utf-8')
            
def path_exists(pth):
    return os.path.exists(_path_fix(pth))

def path_isdir(pth):
    return os.path.isdir(_path_fix(pth))

def path_isfile(pth):
    return os.path.isfile(_path_fix(pth))

def path_makedirs(pth):
    os.makedirs(_path_fix(pth))

def path_makedir(pth):
    os.mkdir(_path_fix(pth))

def path_remove(pth):
    apppt=_path_fix(pth)
    if os.path.isdir(apppt):
        shutil.rmtree(apppt)
    else:
        os.remove(apppt)        

def path_list(pth):
    return os.listdir(_path_fix(pth))

def path_walk(pth):
    return os.walk(_path_fix(pth))

def path_islink(pth):    
    return os.path.islink(_path_fix(pth))
          
def path_readlink(pth):        
    return os.readlink(_path_fix(pth))

def path_symlink(pths,pthd):
    os.symlink(_path_fix(pths), _path_fix(pthd))

def path_copy(pths,pthd):
    shutil.copy2(_path_fix(pths), _path_fix(pthd))
    
def path_move(pths,pthd):
    shutil.move(_path_fix(pths), _path_fix(pthd))

def path_rename(pths,pthd):
    os.rename(_path_fix(pths), _path_fix(pthd))

def path_change_permissions(pth, prms):
    os.chmod(_path_fix(pth),  prms)

def path_change_owner(pth, uid, gid):
    os.chown(_path_fix(pth), uid, gid)

def path_dirname(pth):
    return os.path.dirname(pth)

def path_basename(pth):
    return os.path.basename(pth)

def path_absname(pth):
    return os.path.abspath(pth)

def path_realname(pth):
    return os.path.realpath(pth)

def path_expanduser(pth):
    return os.path.expanduser(pth)

def path_size(pth):
    return os.path.getsize(_path_fix(pth))

def path_time(pth):
    return os.path.getmtime(_path_fix(pth))

def path_stat(pth):
    return os.stat(_path_fix(pth))

########
# FILE #
########
if is_py2():
    def file_open(filename, mode='rb', encoding=None, errors='strict', buffering=1):
        return codecs.open(_path_fix(filename), mode, encoding, errors, buffering)
else:
    def file_open(filename, mode='r', encoding=None, errors='strict', buffering=-1):
        return codecs.open(_path_fix(filename), mode, encoding, errors, buffering)

##########
# SYSTEM #
##########
def system_changedir(pth):
    os.chdir(_path_fix(pth))

def system_call(*popenargs, **kwargs):
    lst = list(popenargs)
    for i in range(len(lst)):
        lst[i]=_path_fix(popenargs[i])
    return subprocess.call(*lst,**kwargs)


###########
# ENCODER #
###########
if is_py2():    
    enc_base64_encode=lambda b: base64.b64encode(buffer(b))
    enc_base64_decode=lambda b: base64.b64decode(buffer(b))    
else:
    enc_base64_encode=lambda b: base64.b64encode(b)
    enc_base64_decode=lambda b: base64.b64decode(b)
    

############
# COMPRESS #
############
def zipfile_open(filename, mode="r", compression=zipfile.ZIP_STORED, allowZip64=False):
    return zipfile.ZipFile(_path_fix(filename),mode, compression, allowZip64)

if is_py2():    
    zlib_decompress=lambda b: zlib.decompress(buffer(b))
    zlib_compress=lambda b: zlib.compress(buffer(b))
else:
    zlib_decompress=lambda b: zlib.decompress(b)
    zlib_compress=lambda b: zlib.compress(b)


##########
# SOCKET #
##########
def socket_sendall(sock, bts):
    count = 0
    amount = len(bts)
    v = sock.send(bts)
    count += v
    while (count < amount):
        v = sock.send(buffer_new(bts,count,amount-count))
        count += v


LOGGER_INFO=logging.INFO
LOGGER_WARN=logging.WARN
LOGGER_CRITICAL=logging.CRITICAL
LOGGER_FATAL=logging.FATAL
LOGGER_DEBUG=logging.DEBUG
LOGGER_ERROR=logging.ERROR

class LoggerStdRedirect(object):
    
    def __init__(self,lg,lv):
        self._logger = lg;
        self._level = lv;
        
    def write(self, data):
        for line in data.rstrip().splitlines():
            self._logger.log(self._level, line.rstrip())
    
    def flush(self):
        None


class Logger():
    
    def __init__(self, conf):
        self._logger = logging.getLogger()
        if "filename" in conf:
            hdlr = logging.handlers.RotatingFileHandler(conf["filename"], 'a', 1000000, 3)
        else:
            hdlr = logging.StreamHandler()
        formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
        hdlr.setFormatter(formatter)
        self._logger.addHandler(hdlr) 
        self._logger.setLevel(logging.INFO)
        #Reindirizza stdout e stderr
        sys.stdout=LoggerStdRedirect(self._logger,logging.DEBUG)
        sys.stderr=LoggerStdRedirect(self._logger,logging.ERROR)
        self._lock = threading.Lock()

    def set_level(self, lv):
        self._logger.setLevel(lv)
    
    def write(self, lv, msg):
        self._lock.acquire()
        try:
            ar = []
            ar.append(str_new(threading.current_thread().name))
            ar.append(str_new(u" "))
            ar.append(str_new(msg))
            self._logger.log(lv, u"".join(ar))
        except:
            e=get_exception()
            print(exception_to_string(e))
        finally:
            self._lock.release()

class DebugProfile():

    def __init__(self, writeobj, conf):
        self._write_obj=writeobj
        self._debug_path = conf["debug_path"]
        self._debug_indentation_max=conf["debug_indentation_max"]
        self._debug_thread_filter=conf["debug_thread_filter"]
        self._debug_class_filter=conf["debug_class_filter"]
        self._debug_info = {}
    
    def _trunc_msg(self, msg, sz):
        smsg="None"
        if msg is not None:
            smsg=u""
            try:
                smsg = str_new(msg)
            except:
                e = get_exception()
                smsg = u"EXCEPTION:" + exception_to_string(e)
            if len(smsg)>sz:
                smsg=smsg[0:sz] + u" ..."
            smsg = smsg.replace("\n", " ").replace("\r", " ").replace("\t", "   ")
        return smsg
    
    def _filter_check(self,nm,flt):
        if flt is not None:
            ar = flt.split(";")
            for f in ar:
                if f.startswith("*") and nm.endswith(f[1:]):
                    return True
                elif f.endswith("*") and nm.startswith(f[0:len(f)-1]):
                    return True
                elif nm==f:
                    return True
            return False
        return False
    
    def get_function(self, frame, event, arg): 
        #sys._getframe(0)
        if event == "call" or event == "return":
            try:
                bshow = True
                fcode = frame.f_code
                flocs = frame.f_locals
                fn = path_absname(str_new(fcode.co_filename))
                if not fcode.co_name.startswith("<") and fn.startswith(self._debug_path):
                    fn = fn[len(self._debug_path):]
                    fn = fn.split(".")[0]
                    fn = fn.replace(path_sep,".")
                    nm = fcode.co_name
                    if flocs is not None and "self" in flocs:
                        flocssf=flocs["self"]
                        nm = flocssf.__class__.__name__ + "." +nm
                    nm=fn + u"." + nm
                    thdn = threading.current_thread().name
                    if thdn not in self._debug_info:
                        self._debug_info[thdn]={}
                        self._debug_info[thdn]["time"]=[]
                        self._debug_info[thdn]["indent"]=0
                    debug_time=self._debug_info[thdn]["time"]
                    debug_indent=self._debug_info[thdn]["indent"]
                    bshow=self._debug_indentation_max==-1 or debug_indent<=self._debug_indentation_max
                    #THREAD NAME
                    if bshow:
                        bshow=self._filter_check(thdn, self._debug_thread_filter)
                    #CLASS NAME
                    if bshow:
                        bshow=self._filter_check(nm, self._debug_class_filter)
                    #VISUALIZZA
                    if bshow:
                        if event == "return":
                            debug_indent -= 1
                        soper=""
                        arpp = []
                        if event == "call":
                            soper="INIT"
                            debug_time.append(int(time.time() * 1000))
                            if flocs is not None:
                                sarg=[]
                                for k in flocs:
                                    if not k == "self":
                                        sarg.append(str_new(k) + u"=" + self._trunc_msg(flocs[k], 20))
                                if len(sarg)>0:
                                    arpp.append(u"args: " + u",".join(sarg))
                            
                        elif event == "return":
                            soper="TERM"
                            tm = debug_time.pop()
                            arpp.append(u"time: " + str(int(time.time() * 1000) - tm) + u" ms")
                            arpp.append(u"return: " + self._trunc_msg(arg, 80))
                                
                        armsg=[]
                        armsg.append(u"   "*debug_indent + nm + u" > " + soper)
                        if len(arpp)>0:
                            armsg.append(u" ")
                            armsg.append(u"; ".join(arpp))
                        self._write_obj.write_debug(u"".join(armsg))
                        if event == "call":
                            debug_indent += 1
                        self._debug_info[thdn]["indent"]=debug_indent
            except:
                e = get_exception()
                self._write_obj.write_except(e)


class Counter:
    
    def __init__(self, v=None):
        self._current_elapsed = 0
        self._current_time = get_time()
        self._time_to_elapsed=v
        self._stopped=False

    def start(self):
        if self._stopped:
            self._current_time = get_time()
            self._stopped=False
    
    def stop(self):
        if not self._stopped:
            self._stopped=True

    def reset(self):
        self._current_elapsed = 0
        self._current_time = get_time()
    
    def is_elapsed(self, v=None):
        if v is None:
            v=self._time_to_elapsed
        return self.get_value()>=v
   
    def get_value(self):
        if self._stopped:
            return self._current_elapsed
        apptm=get_time()
        elp=apptm-self._current_time
        if elp>=0:
            self._current_elapsed+=elp
            self._current_time=apptm
        else:
            self._current_time=get_time()
        #print("self._current_elapsed(" + str(self) + "): " +  str(self._current_elapsed))
        return self._current_elapsed




                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     