From: Stefan Eissing Date: Tue, 14 Dec 2021 11:26:52 +0000 (+0000) Subject: * test: updated pytest test/modules/http2 suite from trunk X-Git-Tag: candidate-2.4.52-rc1~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c5eb284507cab2899507b5d93df9b8925ee57ea;p=thirdparty%2Fapache%2Fhttpd.git * test: updated pytest test/modules/http2 suite from trunk with skips for cases where backports have not been done. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1895945 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/configure.in b/configure.in index 4dcbac82330..831a683b052 100644 --- a/configure.in +++ b/configure.in @@ -844,8 +844,8 @@ if test -d ./test; then APACHE_FAST_OUTPUT(test/Makefile) fi if test -d ./test/modules/http2; then - APACHE_FAST_OUTPUT(test/modules/http2/Makefile) - AC_CONFIG_FILES([test/modules/http2/config.ini]) + APACHE_FAST_OUTPUT(test/Makefile) + AC_CONFIG_FILES([test/pyhttpd/config.ini]) fi dnl ## Finalize the variables diff --git a/test/Makefile.in b/test/Makefile.in index 15d404d208d..d9ad04d5d95 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -18,3 +18,9 @@ test: $(bin_PROGRAMS) # dbu_OBJECTS = dbu.lo # dbu: $(dbu_OBJECTS) # $(LINK) $(dbu_OBJECTS) $(PROGRAM_LDADD) + +clean: + rm -rf gen + +distclean: + rm -f pyhttpd/config.ini \ No newline at end of file diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 00000000000..a5c7c6bffb0 --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,12 @@ +import sys +import os + +sys.path.append(os.path.join(os.path.dirname(__file__), '.')) + +from pyhttpd.env import HttpdTestEnv + +def pytest_report_header(config, startdir): + env = HttpdTestEnv() + return f"[apache httpd: {env.get_httpd_version()}, mpm: {env.mpm_module}, {env.prefix}]" + + diff --git a/test/modules/http2/htdocs/test1/apache.org-files/cse.js b/test/modules/http2/__init__.py similarity index 100% rename from test/modules/http2/htdocs/test1/apache.org-files/cse.js rename to test/modules/http2/__init__.py diff --git a/test/modules/http2/conftest.py b/test/modules/http2/conftest.py index 363abae4c2e..806777439ea 100644 --- a/test/modules/http2/conftest.py +++ b/test/modules/http2/conftest.py @@ -2,14 +2,16 @@ import logging import os import pytest +import sys -from h2_certs import CertificateSpec, H2TestCA -from h2_env import H2TestEnv +sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) + +from .env import H2TestEnv def pytest_report_header(config, startdir): - env = H2TestEnv(setup_dirs=False) - return f"mod_h2 [apache: {env.get_httpd_version()}, mpm: {env.mpm_type}, {env.prefix}]" + env = H2TestEnv() + return f"mod_h2 [apache: {env.get_httpd_version()}, mpm: {env.mpm_module}, {env.prefix}]" def pytest_addoption(parser): @@ -25,7 +27,7 @@ def pytest_generate_tests(metafunc): metafunc.parametrize('repeat', range(count)) -@pytest.fixture(scope="session") +@pytest.fixture(scope="package") def env(pytestconfig) -> H2TestEnv: level = logging.INFO console = logging.StreamHandler() @@ -34,24 +36,17 @@ def env(pytestconfig) -> H2TestEnv: logging.getLogger('').addHandler(console) logging.getLogger('').setLevel(level=level) env = H2TestEnv(pytestconfig=pytestconfig) - cert_specs = [ - CertificateSpec(domains=env.domains, key_type='rsa4096'), - CertificateSpec(domains=env.domains_noh2, key_type='rsa2048'), - ] - ca = H2TestCA.create_root(name=env.http_tld, - store_dir=os.path.join(env.server_dir, 'ca'), key_type="rsa4096") - ca.issue_certs(cert_specs) - env.set_ca(ca) + env.setup_httpd() env.apache_access_log_clear() - env.apache_error_log_clear() + env.httpd_error_log.clear_log() return env -@pytest.fixture(autouse=True, scope="session") +@pytest.fixture(autouse=True, scope="package") def _session_scope(env): yield assert env.apache_stop() == 0 - errors, warnings = env.apache_errors_and_warnings() + errors, warnings = env.httpd_error_log.get_missed() assert (len(errors), len(warnings)) == (0, 0),\ f"apache logged {len(errors)} errors and {len(warnings)} warnings: \n"\ "{0}\n{1}\n".format("\n".join(errors), "\n".join(warnings)) diff --git a/test/modules/http2/data/nghttp-output-100k-1.txt b/test/modules/http2/data/nghttp-output-100k-1.txt deleted file mode 100644 index 1889877e6ec..00000000000 --- a/test/modules/http2/data/nghttp-output-100k-1.txt +++ /dev/null @@ -1,1153 +0,0 @@ -execute: /usr/bin/nghttp -v --header=host: cgi.tests.httpd.apache.org:42002 --data=/home/ylavic/src/apache/mod_h2/test/gen/data-100k https://127.0.0.1:42002//echo.py -stderr: [WARNING] Certificate verification failed: unable to verify the first certificate - -stdout: [ 0.001] Connected -The negotiated protocol: h2 -[ 0.003] send SETTINGS frame - (niv=2) - [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] - [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] -[ 0.003] send PRIORITY frame - (dep_stream_id=0, weight=201, exclusive=0) -[ 0.003] send PRIORITY frame - (dep_stream_id=0, weight=101, exclusive=0) -[ 0.003] send PRIORITY frame - (dep_stream_id=0, weight=1, exclusive=0) -[ 0.003] send PRIORITY frame - (dep_stream_id=7, weight=1, exclusive=0) -[ 0.003] send PRIORITY frame - (dep_stream_id=3, weight=1, exclusive=0) -[ 0.003] send HEADERS frame - ; END_HEADERS | PRIORITY - (padlen=0, dep_stream_id=11, weight=16, exclusive=0) - ; Open new stream - :method: POST - :path: //echo.py - :scheme: https - :authority: 127.0.0.1:42002 - accept: */* - accept-encoding: gzip, deflate - user-agent: nghttp2/1.36.0 - content-length: 100000 - host: cgi.tests.httpd.apache.org:42002 -[ 0.003] send DATA frame -[ 0.003] send DATA frame -[ 0.003] send DATA frame -[ 0.003] send DATA frame -[ 0.006] recv SETTINGS frame - (niv=1) - [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] -[ 0.006] recv SETTINGS frame - ; ACK - (niv=0) -[ 0.006] recv WINDOW_UPDATE frame - (window_size_increment=2147418112) -[ 0.006] send SETTINGS frame - ; ACK - (niv=0) -[ 0.007] recv WINDOW_UPDATE frame - (window_size_increment=65535) -[ 0.007] recv WINDOW_UPDATE frame - (window_size_increment=65536) -[ 0.007] send DATA frame -[ 0.007] send DATA frame -[ 0.007] send DATA frame - ; END_STREAM -[ 0.023] recv (stream_id=13) :status: 200 -[ 0.023] recv (stream_id=13) date: Wed, 13 Feb 2019 17:42:49 GMT -[ 0.023] recv (stream_id=13) server: Apache/2.5.1-dev (Unix) OpenSSL/1.1.1a -[ 0.023] recv (stream_id=13) content-type: application/data -[ 0.023] recv HEADERS frame - ; END_HEADERS - (padlen=0) - ; First response header -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.023] recv DATA frame -12345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.023] recv DATA frame -23456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012[ 0.023] recv DATA frame -34567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123[ 0.023] recv DATA frame -45678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234[ 0.024] recv DATA frame -56789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345[ 0.024] recv DATA frame -67890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456[ 0.024] recv DATA frame -78901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567[ 0.024] recv DATA frame -89012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678[ 0.024] recv DATA frame -90123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789[ 0.024] recv DATA frame -01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0[ 0.024] recv DATA frame -12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.025] recv DATA frame -2345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789012345678901234567890123456789012[ 0.025] recv DATA frame -3456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789012345678901234567890123[ 0.025] recv DATA frame -4567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789012345678901234[ 0.025] recv DATA frame -5678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789012345[ 0.025] recv DATA frame -6789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456[ 0.025] recv DATA frame -7890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567[ 0.025] recv DATA frame -8901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678[ 0.025] recv DATA frame -9012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789[ 0.025] recv DATA frame -0123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890[ 0.025] recv DATA frame -1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01[ 0.025] recv DATA frame -2345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012[ 0.025] recv DATA frame -345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123[ 0.025] recv DATA frame -456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234[ 0.025] recv DATA frame -567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345[ 0.026] recv DATA frame -[ 0.026] send WINDOW_UPDATE frame - (window_size_increment=33566) -[ 0.026] send WINDOW_UPDATE frame - (window_size_increment=33566) -678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456[ 0.026] recv DATA frame -789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567[ 0.026] recv DATA frame -890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678[ 0.026] recv DATA frame -901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789[ 0.026] recv DATA frame -012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890[ 0.026] recv DATA frame -123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901[ 0.026] recv DATA frame -234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012[ 0.026] recv DATA frame -345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123[ 0.026] recv DATA frame -45678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012345678901234[ 0.026] recv DATA frame -56789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012345[ 0.026] recv DATA frame -67890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456[ 0.026] recv DATA frame -78901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567[ 0.026] recv DATA frame -89012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678[ 0.026] recv DATA frame -90123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789[ 0.026] recv DATA frame -01234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890[ 0.026] recv DATA frame -12345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901[ 0.026] recv DATA frame -23456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012[ 0.027] recv DATA frame -34567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123[ 0.027] recv DATA frame -45678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234[ 0.027] recv DATA frame -5678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789012345678901234567890123456789012345[ 0.027] recv DATA frame -6789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789012345678901234567890123456[ 0.027] recv DATA frame -7890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789012345678901234567[ 0.027] recv DATA frame -8901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789012345678[ 0.027] recv DATA frame -9012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234567890123456789[ 0.027] recv DATA frame -0123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345678901234[ 0.028] recv DATA frame -5678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012345[ 0.028] recv DATA frame -6789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456789012[ 0.028] send WINDOW_UPDATE frame - (window_size_increment=33260) -[ 0.028] send WINDOW_UPDATE frame - (window_size_increment=33260) -3456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567890123456[ 0.028] recv DATA frame -7890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -01234567[ 0.028] recv DATA frame -8901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678[ 0.028] recv DATA frame - -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789[ 0.028] recv DATA frame -012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.028] recv DATA frame -123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901[ 0.028] recv DATA frame -234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012[ 0.028] recv DATA frame -345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123[ 0.028] recv DATA frame -456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234[ 0.028] recv DATA frame -567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345[ 0.028] recv DATA frame -678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456[ 0.029] recv DATA frame -789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567[ 0.029] recv DATA frame -890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678[ 0.029] recv DATA frame -901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -[ 0.029] recv DATA frame -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.029] recv DATA frame -12345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.029] recv DATA frame -23456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012[ 0.029] recv DATA frame -34567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123[ 0.029] recv DATA frame -45678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234[ 0.029] recv DATA frame -56789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345[ 0.029] recv DATA frame -67890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456[ 0.029] recv DATA frame -78901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567[ 0.029] recv DATA frame -89012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678[ 0.029] recv DATA frame -90123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789[ 0.029] recv DATA frame -01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0[ 0.029] recv DATA frame -12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -[ 0.029] recv DATA frame - ; END_STREAM -[ 0.029] send GOAWAY frame - (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[]) - diff --git a/test/modules/http2/data/nghttp-output-10k-1.txt b/test/modules/http2/data/nghttp-output-10k-1.txt deleted file mode 100644 index fe19b46fbbe..00000000000 --- a/test/modules/http2/data/nghttp-output-10k-1.txt +++ /dev/null @@ -1,166 +0,0 @@ -stderr: [WARNING] Certificate verification failed: unable to verify the first certificate - -stdout: [ 0.002] Connected -The negotiated protocol: h2 -[ 0.004] send SETTINGS frame - (niv=2) - [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] - [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] -[ 0.004] send PRIORITY frame - (dep_stream_id=0, weight=201, exclusive=0) -[ 0.004] send PRIORITY frame - (dep_stream_id=0, weight=101, exclusive=0) -[ 0.004] send PRIORITY frame - (dep_stream_id=0, weight=1, exclusive=0) -[ 0.004] send PRIORITY frame - (dep_stream_id=7, weight=1, exclusive=0) -[ 0.004] send PRIORITY frame - (dep_stream_id=3, weight=1, exclusive=0) -[ 0.004] send HEADERS frame - ; END_HEADERS | PRIORITY - (padlen=0, dep_stream_id=11, weight=16, exclusive=0) - ; Open new stream - :method: POST - :path: //echo.py - :scheme: https - :authority: 127.0.0.1:42002 - accept: */* - accept-encoding: gzip, deflate - user-agent: nghttp2/1.33.0 - content-length: 10000 - host: cgi.tests.httpd.apache.org:42002 -[ 0.004] send DATA frame - ; END_STREAM -[ 0.005] recv SETTINGS frame - (niv=1) - [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] -[ 0.005] recv SETTINGS frame - ; ACK - (niv=0) -[ 0.005] recv WINDOW_UPDATE frame - (window_size_increment=2147418112) -[ 0.005] send SETTINGS frame - ; ACK - (niv=0) -[ 0.038] recv (stream_id=13) :status: 200 -[ 0.038] recv (stream_id=13) date: Thu, 14 Feb 2019 11:50:20 GMT -[ 0.038] recv (stream_id=13) server: Apache/2.4.39-dev (Unix) OpenSSL/1.1.1 -[ 0.038] recv (stream_id=13) content-type: application/data -[ 0.038] recv HEADERS frame - ; END_HEADERS - (padlen=0) - ; First response header -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.038] recv DATA frame -12345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.038] recv DATA frame -23456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123456789012[ 0.038] recv DATA frame -34567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234567890123[ 0.038] recv DATA frame -45678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345678901234[ 0.038] recv DATA frame -56789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -0123456789012345678901234567890123456789012345[ 0.038] recv DATA frame -67890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567[ 0.038] recv DATA frame -890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678[ 0.039] recv DATA frame -901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -[ 0.039] recv DATA frame -[ 0.039] recv DATA frame - ; END_STREAM -[ 0.039] send GOAWAY frame - (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[]) - diff --git a/test/modules/http2/data/nghttp-output-1k-1.txt b/test/modules/http2/data/nghttp-output-1k-1.txt deleted file mode 100644 index de9964c7ca2..00000000000 --- a/test/modules/http2/data/nghttp-output-1k-1.txt +++ /dev/null @@ -1,68 +0,0 @@ -stderr: [WARNING] Certificate verification failed: unable to verify the first certificate - -stdout: [ 0.002] Connected -The negotiated protocol: h2 -[ 0.004] send SETTINGS frame - (niv=2) - [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] - [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] -[ 0.004] send PRIORITY frame - (dep_stream_id=0, weight=201, exclusive=0) -[ 0.004] send PRIORITY frame - (dep_stream_id=0, weight=101, exclusive=0) -[ 0.004] send PRIORITY frame - (dep_stream_id=0, weight=1, exclusive=0) -[ 0.004] send PRIORITY frame - (dep_stream_id=7, weight=1, exclusive=0) -[ 0.004] send PRIORITY frame - (dep_stream_id=3, weight=1, exclusive=0) -[ 0.004] send HEADERS frame - ; END_HEADERS | PRIORITY - (padlen=0, dep_stream_id=11, weight=16, exclusive=0) - ; Open new stream - :method: POST - :path: //echo.py - :scheme: https - :authority: 127.0.0.1:42002 - accept: */* - accept-encoding: gzip, deflate - user-agent: nghttp2/1.33.0 - content-length: 1000 - host: cgi.tests.httpd.apache.org:42002 -[ 0.004] send DATA frame - ; END_STREAM -[ 0.005] recv SETTINGS frame - (niv=1) - [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] -[ 0.005] recv SETTINGS frame - ; ACK - (niv=0) -[ 0.005] recv WINDOW_UPDATE frame - (window_size_increment=2147418112) -[ 0.005] send SETTINGS frame - ; ACK - (niv=0) -[ 0.048] recv (stream_id=13) :status: 200 -[ 0.048] recv (stream_id=13) date: Thu, 14 Feb 2019 11:48:18 GMT -[ 0.048] recv (stream_id=13) server: Apache/2.4.39-dev (Unix) OpenSSL/1.1.1 -[ 0.048] recv (stream_id=13) content-type: application/data -[ 0.048] recv HEADERS frame - ; END_HEADERS - (padlen=0) - ; First response header -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 -[ 0.048] recv DATA frame -[ 0.048] recv DATA frame - ; END_STREAM -[ 0.048] send GOAWAY frame - (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[]) - diff --git a/test/modules/http2/env.py b/test/modules/http2/env.py new file mode 100644 index 00000000000..f70852dd2ae --- /dev/null +++ b/test/modules/http2/env.py @@ -0,0 +1,141 @@ +import inspect +import logging +import os +import re +import subprocess +from typing import Dict, Any + +from pyhttpd.certs import CertificateSpec +from pyhttpd.conf import HttpdConf +from pyhttpd.env import HttpdTestEnv, HttpdTestSetup + +log = logging.getLogger(__name__) + + +class H2TestSetup(HttpdTestSetup): + + def __init__(self, env: 'HttpdTestEnv'): + super().__init__(env=env) + self.add_source_dir(os.path.dirname(inspect.getfile(H2TestSetup))) + self.add_modules(["http2", "proxy_http2", "cgid", "autoindex", "ssl"]) + + def make(self): + super().make() + self._add_h2test() + self._setup_data_1k_1m() + + def _add_h2test(self): + local_dir = os.path.dirname(inspect.getfile(H2TestSetup)) + p = subprocess.run([self.env.apxs, '-c', 'mod_h2test.c'], + capture_output=True, + cwd=os.path.join(local_dir, 'mod_h2test')) + rv = p.returncode + if rv != 0: + log.error(f"compiling md_h2test failed: {p.stderr}") + raise Exception(f"compiling md_h2test failed: {p.stderr}") + + modules_conf = os.path.join(self.env.server_dir, 'conf/modules.conf') + with open(modules_conf, 'a') as fd: + # load our test module which is not installed + fd.write(f"LoadModule h2test_module \"{local_dir}/mod_h2test/.libs/mod_h2test.so\"\n") + + def _setup_data_1k_1m(self): + s90 = "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\n" + with open(os.path.join(self.env.gen_dir, "data-1k"), 'w') as f: + for i in range(10): + f.write(f"{i:09d}-{s90}") + with open(os.path.join(self.env.gen_dir, "data-10k"), 'w') as f: + for i in range(100): + f.write(f"{i:09d}-{s90}") + with open(os.path.join(self.env.gen_dir, "data-100k"), 'w') as f: + for i in range(1000): + f.write(f"{i:09d}-{s90}") + with open(os.path.join(self.env.gen_dir, "data-1m"), 'w') as f: + for i in range(10000): + f.write(f"{i:09d}-{s90}") + + +class H2TestEnv(HttpdTestEnv): + + def __init__(self, pytestconfig=None): + super().__init__(pytestconfig=pytestconfig) + self.add_httpd_conf([ + "H2MinWorkers 1", + "H2MaxWorkers 64", + "Protocols h2 http/1.1 h2c", + ]) + self.add_httpd_log_modules(["http2", "proxy_http2", "h2test"]) + self.add_cert_specs([ + CertificateSpec(domains=[ + f"push.{self._http_tld}", + f"hints.{self._http_tld}", + f"ssl.{self._http_tld}", + f"pad0.{self._http_tld}", + f"pad1.{self._http_tld}", + f"pad2.{self._http_tld}", + f"pad3.{self._http_tld}", + f"pad8.{self._http_tld}", + ]), + CertificateSpec(domains=[f"noh2.{self.http_tld}"], key_type='rsa2048'), + ]) + + self.httpd_error_log.set_ignored_lognos([ + 'AH02032', + 'AH01276', + 'AH01630', + 'AH00135', + 'AH02261', # Re-negotiation handshake failed (our test_101) + 'AH03490', # scoreboard full, happens on limit tests + ]) + self.httpd_error_log.add_ignored_patterns([ + re.compile(r'.*malformed header from script \'hecho.py\': Bad header: x.*'), + re.compile(r'.*:tls_post_process_client_hello:.*'), + re.compile(r'.*:tls_process_client_certificate:.*'), + re.compile(r'.*have incompatible TLS configurations.'), + ]) + + def setup_httpd(self, setup: HttpdTestSetup = None): + super().setup_httpd(setup=H2TestSetup(env=self)) + + +class H2Conf(HttpdConf): + + def __init__(self, env: HttpdTestEnv, extras: Dict[str, Any] = None): + super().__init__(env=env, extras=HttpdConf.merge_extras(extras, { + f"cgi.{env.http_tld}": [ + "SSLOptions +StdEnvVars", + "AddHandler cgi-script .py", + ] + })) + + def start_vhost(self, domains, port=None, doc_root="htdocs", with_ssl=None, + ssl_module=None, with_certificates=None): + super().start_vhost(domains=domains, port=port, doc_root=doc_root, + with_ssl=with_ssl, ssl_module=ssl_module, + with_certificates=with_certificates) + if f"noh2.{self.env.http_tld}" in domains: + protos = ["http/1.1"] + elif port == self.env.https_port or with_ssl is True: + protos = ["h2", "http/1.1"] + else: + protos = ["h2c", "http/1.1"] + if f"test2.{self.env.http_tld}" in domains: + protos = reversed(protos) + self.add(f"Protocols {' '.join(protos)}") + return self + + def add_vhost_noh2(self): + domains = [f"noh2.{self.env.http_tld}", f"noh2-alias.{self.env.http_tld}"] + self.start_vhost(domains=domains, port=self.env.https_port, doc_root="htdocs/noh2") + self.add(["Protocols http/1.1", "SSLOptions +StdEnvVars"]) + self.end_vhost() + self.start_vhost(domains=domains, port=self.env.http_port, doc_root="htdocs/noh2") + self.add(["Protocols http/1.1", "SSLOptions +StdEnvVars"]) + self.end_vhost() + return self + + def add_vhost_test1(self, proxy_self=False, h2proxy_self=False): + return super().add_vhost_test1(proxy_self=proxy_self, h2proxy_self=h2proxy_self) + + def add_vhost_test2(self): + return super().add_vhost_test2() diff --git a/test/modules/http2/h2_conf.py b/test/modules/http2/h2_conf.py deleted file mode 100644 index 4edfaa2dd0d..00000000000 --- a/test/modules/http2/h2_conf.py +++ /dev/null @@ -1,163 +0,0 @@ -import os - - -class HttpdConf(object): - - def __init__(self, env, path=None): - self.env = env - self._lines = [] - self._has_ssl_vhost = False - - def install(self): - if not self._has_ssl_vhost: - self.add_vhost_test1() - self.env.install_test_conf(self._lines) - - def add(self, line): - if isinstance(line, list): - self._lines.extend(line) - else: - self._lines.append(line) - return self - - def add_vhost(self, port, name, aliases=None, doc_root="htdocs", with_ssl=True): - self.start_vhost(port, name, aliases, doc_root, with_ssl) - self.end_vhost() - return self - - def start_vhost(self, port, name, aliases=None, doc_root="htdocs", with_ssl=True): - server_domain = f"{name}.{self.env.http_tld}" - lines = [ - f"", - f" ServerName {server_domain}" - ] - if aliases: - lines.extend([ - f" ServerAlias {alias}.{self.env.http_tld}" for alias in aliases]) - lines.append(f" DocumentRoot {doc_root}") - if with_ssl: - self._has_ssl_vhost = True - lines.append(" SSLEngine on") - for cred in self.env.get_credentials_for_name(server_domain): - lines.extend([ - f"SSLCertificateFile {cred.cert_file}", - f"SSLCertificateKeyFile {cred.pkey_file}", - ]) - return self.add(lines) - - def end_vhost(self): - self.add("") - return self - - def add_proxies(self, host, proxy_self=False, h2proxy_self=False): - if proxy_self or h2proxy_self: - self.add(" ProxyPreserveHost on") - if proxy_self: - self.add(f""" - ProxyPass /proxy/ http://127.0.0.1:{self.env.http_port}/ - ProxyPassReverse /proxy/ http://{host}.{self.env.http_tld}:{self.env.http_port}/ - """) - if h2proxy_self: - self.add(f""" - ProxyPass /h2proxy/ h2://127.0.0.1:{self.env.https_port}/ - ProxyPassReverse /h2proxy/ https://{host}.{self.env.http_tld}:self.env.https_port/ - """) - return self - - def add_vhost_test1(self, proxy_self=False, h2proxy_self=False, extras=None): - domain = f"test1.{self.env.http_tld}" - if extras and 'base' in extras: - self.add(extras['base']) - self.start_vhost( - self.env.http_port, "test1", aliases=["www1"], doc_root="htdocs/test1", with_ssl=False - ).add( - " Protocols h2c http/1.1" - ).end_vhost() - self.start_vhost( - self.env.https_port, "test1", aliases=["www1"], doc_root="htdocs/test1", with_ssl=True) - self.add(f""" - Protocols h2 http/1.1 - - Options +Indexes - HeaderName /006/header.html - - {extras[domain] if extras and domain in extras else ""} - """) - self.add_proxies("test1", proxy_self, h2proxy_self) - self.end_vhost() - return self - - def add_vhost_test2(self, extras=None): - domain = f"test2.{self.env.http_tld}" - if extras and 'base' in extras: - self.add(extras['base']) - self.start_vhost(self.env.http_port, "test2", aliases=["www2"], doc_root="htdocs/test2", with_ssl=False) - self.add(" Protocols http/1.1 h2c") - self.end_vhost() - self.start_vhost(self.env.https_port, "test2", aliases=["www2"], doc_root="htdocs/test2", with_ssl=True) - self.add(f""" - Protocols http/1.1 h2 - - Options +Indexes - HeaderName /006/header.html - - {extras[domain] if extras and domain in extras else ""} - """) - self.end_vhost() - return self - - def add_vhost_cgi(self, proxy_self=False, h2proxy_self=False, extras=None): - domain = f"cgi.{self.env.http_tld}" - if extras and 'base' in extras: - self.add(extras['base']) - if proxy_self: - self.add_proxy_setup() - if h2proxy_self: - self.add(" SSLProxyEngine on") - self.add(" SSLProxyCheckPeerName off") - self.start_vhost(self.env.https_port, "cgi", aliases=["cgi-alias"], doc_root="htdocs/cgi", with_ssl=True) - self.add(""" - Protocols h2 http/1.1 - SSLOptions +StdEnvVars - AddHandler cgi-script .py - - SetHandler http2-status - """) - self.add_proxies("cgi", proxy_self=proxy_self, h2proxy_self=h2proxy_self) - self.add(" ") - self.add(" SetHandler h2test-echo") - self.add(" ") - self.add(" ") - self.add(" SetHandler h2test-delay") - self.add(" ") - if extras and domain in extras: - self.add(extras[domain]) - self.end_vhost() - self.start_vhost(self.env.http_port, "cgi", aliases=["cgi-alias"], doc_root="htdocs/cgi", with_ssl=False) - self.add(" AddHandler cgi-script .py") - self.add_proxies("cgi", proxy_self=proxy_self, h2proxy_self=h2proxy_self) - if extras and domain in extras: - self.add(extras[domain]) - self.end_vhost() - self.add(" LogLevel proxy:info") - self.add(" LogLevel proxy_http:info") - return self - - def add_vhost_noh2(self): - self.start_vhost(self.env.https_port, "noh2", aliases=["noh2-alias"], doc_root="htdocs/noh2", with_ssl=True) - self.add(f""" - Protocols http/1.1 - SSLOptions +StdEnvVars""") - self.end_vhost() - self.start_vhost(self.env.http_port, "noh2", aliases=["noh2-alias"], doc_root="htdocs/noh2", with_ssl=False) - self.add(" Protocols http/1.1") - self.add(" SSLOptions +StdEnvVars") - self.end_vhost() - return self - - def add_proxy_setup(self): - self.add("ProxyStatus on") - self.add("ProxyTimeout 5") - self.add("SSLProxyEngine on") - self.add("SSLProxyVerify none") - return self diff --git a/test/modules/http2/h2_env.py b/test/modules/http2/h2_env.py deleted file mode 100644 index 7f879870e70..00000000000 --- a/test/modules/http2/h2_env.py +++ /dev/null @@ -1,632 +0,0 @@ -import inspect -import logging -import re -import os -import shutil -import stat -import subprocess -import sys -import time -from datetime import datetime, timedelta -from string import Template -from typing import List - -import requests - -from configparser import ConfigParser, ExtendedInterpolation -from urllib.parse import urlparse - -from h2_certs import Credentials -from h2_nghttp import Nghttp -from h2_result import ExecResult - - -log = logging.getLogger(__name__) - - -class Dummy: - pass - - -class H2TestSetup: - - # the modules we want to load - MODULES = [ - "log_config", - "logio", - "unixd", - "version", - "watchdog", - "authn_core", - "authz_host", - "authz_groupfile", - "authz_user", - "authz_core", - "access_compat", - "auth_basic", - "cache", - "cache_disk", - "cache_socache", - "socache_shmcb", - "dumpio", - "reqtimeout", - "filter", - "mime", - "env", - "headers", - "setenvif", - "slotmem_shm", - "ssl", - "status", - "autoindex", - "cgid", - "dir", - "alias", - "rewrite", - "deflate", - "proxy", - "proxy_http", - "proxy_balancer", - "proxy_hcheck", - ] - - def __init__(self, env: 'H2TestEnv'): - self.env = env - - def make(self): - self._make_dirs() - self._make_conf() - self._make_htdocs() - self._make_h2test() - self._make_modules_conf() - - def _make_dirs(self): - if os.path.exists(self.env.gen_dir): - shutil.rmtree(self.env.gen_dir) - os.makedirs(self.env.gen_dir) - if not os.path.exists(self.env.server_logs_dir): - os.makedirs(self.env.server_logs_dir) - - def _make_conf(self): - conf_src_dir = os.path.join(self.env.test_dir, 'conf') - conf_dest_dir = os.path.join(self.env.server_dir, 'conf') - if not os.path.exists(conf_dest_dir): - os.makedirs(conf_dest_dir) - for name in os.listdir(conf_src_dir): - src_path = os.path.join(conf_src_dir, name) - m = re.match(r'(.+).template', name) - if m: - self._make_template(src_path, os.path.join(conf_dest_dir, m.group(1))) - elif os.path.isfile(src_path): - shutil.copy(src_path, os.path.join(conf_dest_dir, name)) - - def _make_template(self, src, dest): - var_map = dict() - for name, value in self.env.__class__.__dict__.items(): - if isinstance(value, property): - var_map[name] = value.fget(self.env) - t = Template(''.join(open(src).readlines())) - with open(dest, 'w') as fd: - fd.write(t.substitute(var_map)) - - def _make_htdocs(self): - if not os.path.exists(self.env.server_docs_dir): - os.makedirs(self.env.server_docs_dir) - shutil.copytree(os.path.join(self.env.test_dir, 'htdocs'), - os.path.join(self.env.server_dir, 'htdocs'), - dirs_exist_ok=True) - cgi_dir = os.path.join(self.env.server_dir, 'htdocs/cgi') - for name in os.listdir(cgi_dir): - if re.match(r'.+\.py', name): - cgi_file = os.path.join(cgi_dir, name) - st = os.stat(cgi_file) - os.chmod(cgi_file, st.st_mode | stat.S_IEXEC) - - def _make_h2test(self): - p = subprocess.run([self.env.apxs, '-c', 'mod_h2test.c'], - capture_output=True, - cwd=os.path.join(self.env.test_dir, 'mod_h2test')) - rv = p.returncode - if rv != 0: - log.error(f"compiling md_h2test failed: {p.stderr}") - raise Exception(f"compiling md_h2test failed: {p.stderr}") - - def _make_modules_conf(self): - modules_conf = os.path.join(self.env.server_dir, 'conf/modules.conf') - with open(modules_conf, 'w') as fd: - # issue load directives for all modules we want that are shared - for m in self.MODULES: - mod_path = os.path.join(self.env.libexec_dir, f"mod_{m}.so") - if os.path.isfile(mod_path): - fd.write(f"LoadModule {m}_module \"{mod_path}\"\n") - for m in ["http2", "proxy_http2"]: - fd.write(f"LoadModule {m}_module \"{self.env.libexec_dir}/mod_{m}.so\"\n") - # load our test module which is not installed - fd.write(f"LoadModule h2test_module \"{self.env.test_dir}/mod_h2test/.libs/mod_h2test.so\"\n") - - -class H2TestEnv: - - def __init__(self, pytestconfig=None, setup_dirs=True): - our_dir = os.path.dirname(inspect.getfile(Dummy)) - self.config = ConfigParser(interpolation=ExtendedInterpolation()) - self.config.read(os.path.join(our_dir, 'config.ini')) - - self._apxs = self.config.get('global', 'apxs') - self._prefix = self.config.get('global', 'prefix') - self._apachectl = self.config.get('global', 'apachectl') - self._libexec_dir = self.get_apxs_var('LIBEXECDIR') - - self._curl = self.config.get('global', 'curl_bin') - self._nghttp = self.config.get('global', 'nghttp') - self._h2load = self.config.get('global', 'h2load') - self._ca = None - - self._http_port = int(self.config.get('test', 'http_port')) - self._https_port = int(self.config.get('test', 'https_port')) - self._http_tld = self.config.get('test', 'http_tld') - self._test_dir = self.config.get('test', 'test_dir') - self._test_src_dir = self.config.get('test', 'test_src_dir') - self._gen_dir = self.config.get('test', 'gen_dir') - self._server_dir = os.path.join(self._gen_dir, 'apache') - self._server_conf_dir = os.path.join(self._server_dir, "conf") - self._server_docs_dir = os.path.join(self._server_dir, "htdocs") - self._server_logs_dir = os.path.join(self.server_dir, "logs") - self._server_access_log = os.path.join(self._server_logs_dir, "access_log") - self._server_error_log = os.path.join(self._server_logs_dir, "error_log") - - self._dso_modules = self.config.get('global', 'dso_modules').split(' ') - self._domains = [ - f"test1.{self._http_tld}", - f"test2.{self._http_tld}", - f"test3.{self._http_tld}", - f"cgi.{self._http_tld}", - f"push.{self._http_tld}", - f"hints.{self._http_tld}", - f"ssl.{self._http_tld}", - f"pad0.{self._http_tld}", - f"pad1.{self._http_tld}", - f"pad2.{self._http_tld}", - f"pad3.{self._http_tld}", - f"pad8.{self._http_tld}", - ] - self._domains_noh2 = [ - f"noh2.{self._http_tld}", - ] - self._mpm_type = os.environ['MPM'] if 'MPM' in os.environ else 'event' - - self._httpd_addr = "127.0.0.1" - self._http_base = f"http://{self._httpd_addr}:{self.http_port}" - self._https_base = f"https://{self._httpd_addr}:{self.https_port}" - - self._test_conf = os.path.join(self._server_conf_dir, "test.conf") - self._httpd_base_conf = f""" - LoadModule mpm_{self.mpm_type}_module \"{self.libexec_dir}/mod_mpm_{self.mpm_type}.so\" - H2MinWorkers 1 - H2MaxWorkers 64 - SSLSessionCache "shmcb:ssl_gcache_data(32000)" - """ - self._verbosity = pytestconfig.option.verbose if pytestconfig is not None else 0 - if self._verbosity >= 2: - self._httpd_base_conf += f""" - LogLevel http2:trace2 proxy_http2:info h2test:trace2 - LogLevel core:trace5 mpm_{self.mpm_type}:trace5 - """ - elif self._verbosity >= 1: - self._httpd_base_conf += "LogLevel http2:debug proxy_http2:debug h2test:debug" - else: - self._httpd_base_conf += "LogLevel http2:info proxy_http2:info" - - self._verify_certs = False - if setup_dirs: - self._setup = H2TestSetup(env=self) - self._setup.make() - - @property - def apxs(self) -> str: - return self._apxs - - @property - def verbosity(self) -> int: - return self._verbosity - - @property - def prefix(self) -> str: - return self._prefix - - @property - def mpm_type(self) -> str: - return self._mpm_type - - @property - def http_port(self) -> int: - return self._http_port - - @property - def https_port(self) -> int: - return self._https_port - - @property - def http_tld(self) -> str: - return self._http_tld - - @property - def domain_test1(self) -> str: - return self._domains[0] - - @property - def domains(self) -> List[str]: - return self._domains - - @property - def domains_noh2(self) -> List[str]: - return self._domains_noh2 - - @property - def http_base_url(self) -> str: - return self._http_base - - @property - def https_base_url(self) -> str: - return self._https_base - - @property - def gen_dir(self) -> str: - return self._gen_dir - - @property - def test_dir(self) -> str: - return self._test_dir - - @property - def test_src_dir(self) -> str: - return self._test_src_dir - - @property - def server_dir(self) -> str: - return self._server_dir - - @property - def server_logs_dir(self) -> str: - return self._server_logs_dir - - @property - def libexec_dir(self) -> str: - return self._libexec_dir - - @property - def dso_modules(self) -> List[str]: - return self._dso_modules - - @property - def server_conf_dir(self) -> str: - return self._server_conf_dir - - @property - def server_docs_dir(self) -> str: - return self._server_docs_dir - - @property - def httpd_base_conf(self) -> str: - return self._httpd_base_conf - - @property - def h2load(self) -> str: - return self._h2load - - @property - def ca(self) -> Credentials: - return self._ca - - def set_ca(self, ca: Credentials): - self._ca = ca - - def get_credentials_for_name(self, dns_name) -> List['Credentials']: - for domains in [self._domains, self._domains_noh2]: - if dns_name in domains: - return self.ca.get_credentials_for_name(domains[0]) - return [] - - def has_h2load(self): - return self._h2load != "" - - def has_nghttp(self): - return self._nghttp != "" - - def has_nghttp_get_assets(self): - if not self.has_nghttp(): - return False - args = [self._nghttp, "-a"] - p = subprocess.run(args, stderr=subprocess.PIPE, stdout=subprocess.PIPE) - rv = p.returncode - if rv != 0: - return False - return p.stderr == "" - - def get_apxs_var(self, name: str) -> str: - p = subprocess.run([self._apxs, "-q", name], capture_output=True, text=True) - if p.returncode != 0: - return "" - return p.stdout.strip() - - def get_httpd_version(self) -> str: - return self.get_apxs_var("HTTPD_VERSION") - - def mkpath(self, path): - if not os.path.exists(path): - return os.makedirs(path) - - def test_src(self, path): - return os.path.join(self._test_src_dir, path) - - def run(self, args) -> ExecResult: - log.debug("execute: %s", " ".join(args)) - start = datetime.now() - p = subprocess.run(args, stderr=subprocess.PIPE, stdout=subprocess.PIPE) - return ExecResult(exit_code=p.returncode, stdout=p.stdout, stderr=p.stderr, - duration=datetime.now() - start) - - def mkurl(self, scheme, hostname, path='/'): - port = self.https_port if scheme == 'https' else self.http_port - return "%s://%s.%s:%s%s" % (scheme, hostname, self.http_tld, port, path) - - def install_test_conf(self, conf: List[str]): - with open(self._test_conf, 'w') as fd: - fd.write(f"{self.httpd_base_conf}\n") - for line in conf: - fd.write(f"{line}\n") - - def is_live(self, url, timeout: timedelta = None): - s = requests.Session() - if not timeout: - timeout = timedelta(seconds=10) - try_until = datetime.now() + timeout - log.debug("checking reachability of %s", url) - while datetime.now() < try_until: - try: - req = requests.Request('HEAD', url).prepare() - s.send(req, verify=self._verify_certs, timeout=timeout.total_seconds()) - return True - except IOError: - log.debug("connect error: %s", sys.exc_info()[0]) - time.sleep(.2) - except: - log.warning("Unexpected error: %s", sys.exc_info()[0]) - time.sleep(.2) - log.debug(f"Unable to contact '{url}' after {timeout} sec") - return False - - def is_dead(self, url, timeout: timedelta = None): - s = requests.Session() - if not timeout: - timeout = timedelta(seconds=10) - try_until = datetime.now() + timeout - log.debug("checking reachability of %s", url) - while datetime.now() < try_until: - try: - req = requests.Request('HEAD', url).prepare() - s.send(req, verify=self._verify_certs, timeout=int(timeout.total_seconds())) - time.sleep(.2) - except IOError: - return True - log.debug("Server still responding after %d sec", timeout) - return False - - def _run_apachectl(self, cmd): - args = [self._apachectl, - "-d", self.server_dir, - "-f", os.path.join(self._server_dir, 'conf/httpd.conf'), - "-k", cmd] - log.debug("execute: %s", " ".join(args)) - p = subprocess.run(args, capture_output=True, text=True) - rv = p.returncode - if rv != 0: - log.warning(f"exit {rv}, stdout: {p.stdout}, stderr: {p.stderr}") - return rv - - def apache_reload(self): - rv = self._run_apachectl("graceful") - if rv == 0: - timeout = timedelta(seconds=10) - rv = 0 if self.is_live(self._http_base, timeout=timeout) else -1 - return rv - - def apache_restart(self): - self.apache_stop() - rv = self._run_apachectl("start") - if rv == 0: - timeout = timedelta(seconds=10) - rv = 0 if self.is_live(self._http_base, timeout=timeout) else -1 - return rv - - def apache_stop(self): - rv = self._run_apachectl("stop") - if rv == 0: - timeout = timedelta(seconds=10) - rv = 0 if self.is_dead(self._http_base, timeout=timeout) else -1 - log.debug("waited for a apache.is_dead, rv=%d", rv) - return rv - - def apache_access_log_clear(self): - if os.path.isfile(self._server_access_log): - os.remove(self._server_access_log) - - def apache_error_log_clear(self): - if os.path.isfile(self._server_error_log): - os.remove(self._server_error_log) - - RE_APLOGNO = re.compile(r'.*\[(?P[^:]+):(error|warn)].* (?PAH\d+): .+') - RE_SSL_LIB_ERR = re.compile(r'.*\[ssl:error].* SSL Library Error: error:(?P\S+):.+') - RE_ERRLOG_ERROR = re.compile(r'.*\[(?P[^:]+):error].*') - RE_ERRLOG_WARN = re.compile(r'.*\[(?P[^:]+):warn].*') - - def apache_errors_and_warnings(self): - errors = [] - warnings = [] - - if os.path.isfile(self._server_error_log): - for line in open(self._server_error_log): - m = self.RE_APLOGNO.match(line) - if m and m.group('aplogno') in [ - 'AH02032', - 'AH01276', - 'AH01630', - 'AH00135', - 'AH02261', # Re-negotiation handshake failed (our test_101 - ]: - # we know these happen normally in our tests - continue - m = self.RE_SSL_LIB_ERR.match(line) - if m and m.group('errno') in [ - '1417A0C1', # cipher suite mismatch, test_101 - '1417C0C7', # client cert not accepted, test_101 - ]: - # we know these happen normally in our tests - continue - m = self.RE_ERRLOG_ERROR.match(line) - if m and m.group('module') not in ['cgid']: - errors.append(line) - continue - m = self.RE_ERRLOG_WARN.match(line) - if m: - warnings.append(line) - continue - return errors, warnings - - def curl_complete_args(self, urls, timeout, options): - if not isinstance(urls, list): - urls = [urls] - u = urlparse(urls[0]) - assert u.hostname, f"hostname not in url: {urls[0]}" - assert u.port, f"port not in url: {urls[0]}" - headerfile = ("%s/curl.headers" % self.gen_dir) - if os.path.isfile(headerfile): - os.remove(headerfile) - - args = [ - self._curl, - "--cacert", self.ca.cert_file, - "-s", "-D", headerfile, - "--resolve", ("%s:%s:%s" % (u.hostname, u.port, self._httpd_addr)), - "--connect-timeout", ("%d" % timeout), - "--path-as-is" - ] - if options: - args.extend(options) - args += urls - return args, headerfile - - def curl_parse_headerfile(self, headerfile: str, r: ExecResult = None) -> ExecResult: - lines = open(headerfile).readlines() - exp_stat = True - if r is None: - r = ExecResult(exit_code=0, stdout=b'', stderr=b'') - header = {} - for line in lines: - if exp_stat: - log.debug("reading 1st response line: %s", line) - m = re.match(r'^(\S+) (\d+) (.*)$', line) - assert m - r.add_response({ - "protocol": m.group(1), - "status": int(m.group(2)), - "description": m.group(3), - "body": r.outraw - }) - exp_stat = False - header = {} - elif re.match(r'^$', line): - exp_stat = True - else: - log.debug("reading header line: %s", line) - m = re.match(r'^([^:]+):\s*(.*)$', line) - assert m - header[m.group(1).lower()] = m.group(2) - r.response["header"] = header - return r - - def curl_raw(self, urls, timeout, options): - xopt = ['-vvvv'] - if options: - xopt.extend(options) - args, headerfile = self.curl_complete_args(urls, timeout, xopt) - r = self.run(args) - if r.exit_code == 0: - self.curl_parse_headerfile(headerfile, r=r) - if r.json: - r.response["json"] = r.json - return r - - def curl_get(self, url, timeout=5, options=None): - return self.curl_raw([url], timeout=timeout, options=options) - - def curl_upload(self, url, fpath, timeout=5, options=None): - if not options: - options = [] - options.extend([ - "--form", ("file=@%s" % fpath) - ]) - return self.curl_raw([url], timeout, options) - - def curl_post_data(self, url, data="", timeout=5, options=None): - if not options: - options = [] - options.extend(["--data", "%s" % data]) - return self.curl_raw(url, timeout, options) - - def curl_post_value(self, url, key, value, timeout=5, options=None): - if not options: - options = [] - options.extend(["--form", "{0}={1}".format(key, value)]) - return self.curl_raw(url, timeout, options) - - def curl_protocol_version(self, url, timeout=5, options=None): - if not options: - options = [] - options.extend(["-w", "%{http_version}\n", "-o", "/dev/null"]) - r = self.curl_raw(url, timeout=timeout, options=options) - if r.exit_code == 0 and r.response: - return r.response["body"].decode('utf-8').rstrip() - return -1 - - def nghttp(self): - return Nghttp(self._nghttp, connect_addr=self._httpd_addr, tmp_dir=self.gen_dir) - - def h2load_status(self, run: ExecResult): - stats = {} - m = re.search( - r'requests: (\d+) total, (\d+) started, (\d+) done, (\d+) succeeded' - r', (\d+) failed, (\d+) errored, (\d+) timeout', run.stdout) - if m: - stats["requests"] = { - "total": int(m.group(1)), - "started": int(m.group(2)), - "done": int(m.group(3)), - "succeeded": int(m.group(4)) - } - m = re.search(r'status codes: (\d+) 2xx, (\d+) 3xx, (\d+) 4xx, (\d+) 5xx', - run.stdout) - if m: - stats["status"] = { - "2xx": int(m.group(1)), - "3xx": int(m.group(2)), - "4xx": int(m.group(3)), - "5xx": int(m.group(4)) - } - run.add_results({"h2load": stats}) - return run - - def setup_data_1k_1m(self): - s100 = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\n" - with open(os.path.join(self.gen_dir, "data-1k"), 'w') as f: - for i in range(10): - f.write(s100) - with open(os.path.join(self.gen_dir, "data-10k"), 'w') as f: - for i in range(100): - f.write(s100) - with open(os.path.join(self.gen_dir, "data-100k"), 'w') as f: - for i in range(1000): - f.write(s100) - with open(os.path.join(self.gen_dir, "data-1m"), 'w') as f: - for i in range(10000): - f.write(s100) diff --git a/test/modules/http2/htdocs/cgi/echo.py b/test/modules/http2/htdocs/cgi/echo.py index 5ffe6ed8230..58d811c42d4 100644 --- a/test/modules/http2/htdocs/cgi/echo.py +++ b/test/modules/http2/htdocs/cgi/echo.py @@ -9,6 +9,7 @@ for line in sys.stdin: # Just echo what we get print("Status: 200") +print(f"Request-Length: {len(content)}") print("Content-Type: application/data\n") sys.stdout.write(content) diff --git a/test/modules/http2/htdocs/test1/apache.org-files/ant.jpg b/test/modules/http2/htdocs/test1/apache.org-files/ant.jpg deleted file mode 100644 index 2ebd7ad7172..00000000000 Binary files a/test/modules/http2/htdocs/test1/apache.org-files/ant.jpg and /dev/null differ diff --git a/test/modules/http2/htdocs/test1/apache.org-files/asf_logo.png b/test/modules/http2/htdocs/test1/apache.org-files/asf_logo.png deleted file mode 100644 index 07c0113c7bf..00000000000 Binary files a/test/modules/http2/htdocs/test1/apache.org-files/asf_logo.png and /dev/null differ diff --git a/test/modules/http2/htdocs/test1/apache.org-files/async-ads.js b/test/modules/http2/htdocs/test1/apache.org-files/async-ads.js deleted file mode 100644 index eee04abfaf9..00000000000 --- a/test/modules/http2/htdocs/test1/apache.org-files/async-ads.js +++ /dev/null @@ -1,278 +0,0 @@ -if(!window['googleNDT_']){window['googleNDT_']=(new Date()).getTime();}(function() {window.googleAltLoader=4;var version_='3.0';var hash_='1ac79f060b1e0868a225f2a9999fbf89c251fdf3';var module_='ads';var packages_='search';var googleApisBase_='//ajax.googleapis.com/ajax';var serviceBase_='//cse.google.com/uds';var serviceHost_='cse.google.com';var k;var aa=this,ba=function(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null"; -else if("function"==b&&"undefined"==typeof a.call)return"object";return b},ca=function(a){return null!=a},da=function(a){return"string"==typeof a},ea=function(a,b,c){return a.call.apply(a.bind,arguments)},fa=function(a,b,c){if(!a)throw Error();if(2this.Mf&&(Mb("Tried to set int value to a number too large ( "+a+" = "+b+")","sIGVV"),c=this.Mf);0>c&&(Mb("Tried to set int value to a number too small ( "+a+" = "+b+")","sIGVV"),c=0);return c};k.Ga=m(x.prototype.Ga,"fssiGVV");k.Db=function(){return this.value||0};k.Db=m(x.prototype.Db,"fssiTB");k.Ub=function(a){return a};k.Ub=m(x.prototype.Ub,"fssiPFB"); -k.Ra=function(){return this.value+""};k.Ra=m(x.prototype.Ra,"fssiTES");k.Oa=function(a){return parseInt(a,10)};k.Oa=m(x.prototype.Oa,"fssiPES");var Ib=function(){this.lb=this.value=null;this.U=!1},Ib=m(Ib,"fsES");k=Ib.prototype;k.Td=2;k.Ga=function(a,b){return b=b?b.toString():""};k.Ga=m(Ib.prototype.Ga,"fsesGVV");k.Ra=function(){return this.value?encodeURIComponent(this.value):""};k.Ra=m(Ib.prototype.Ra,"fsesTES");k.Oa=function(a){return decodeURIComponent(a)};k.Oa=m(Ib.prototype.Oa,"fsesPES"); -var Lb=[Jb,x,Ib],Nb=function(a){null==Hb&&Kb();return Hb.Qa(a)},Nb=m(Nb,"fsSC"),Pb=function(a,b){null==Hb&&Kb();null==t&&(t={},Ob());a.Ua=b;t[a.sessionId]=a},Pb=m(Pb,"fsLFC"),Ob=function(){window.setInterval(Qb,500);Hb.Ha()},Ob=m(Ob,"fsIL"),Qb=function(){for(var a in t)if(t.hasOwnProperty(a)){var b=t[a];b.Rb()||(b.Ua=null,delete t[a])}},Qb=m(Qb,"fsCDI"),Kb=function(){A.Oe();Hb=A.af?A:ra()?z:B},Kb=m(Kb,"fsLT"),z={Jf:"exists",Qa:function(a){if(!a.U)return!0;for(var b in a.state)if(a.state.hasOwnProperty(b)){var c= -a.state[b];if(c.U&&c.Db){var d=c.Tc,e=c.Db(),f=b+":";z.Md(f+z.Jf);for(var g=0,h=1;g")&&(a=a.replace(ac,">"));-1!=a.indexOf('"')&&(a=a.replace(bc,"""));-1!=a.indexOf("'")&&(a=a.replace(cc,"'"));-1!=a.indexOf("\x00")&&(a=a.replace(dc,"�"));return a},Zb=/&/g,$b=//g,bc=/"/g,cc=/'/g,dc=/\x00/g,Yb=/[\x00&<>"']/, -fc=function(){return Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^ia()).toString(36)},gc=function(a,b){return ab?1:0};var hc=Array.prototype.filter?function(a,b,c){return Array.prototype.filter.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=[],f=0,g=da(a)?a.split(""):a,h=0;h]*>|&[^;]+;/g,kc=function(a,b){return b?a.replace(jc,""):a},lc=RegExp("[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff]"),mc=RegExp("^[^A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff]*[\u0591-\u06ef\u06fa-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc]"),nc=/^http:\/\/.*/,oc=/\s+/,pc=/[\d\u06f0-\u06f9]/;var rc=function(){this.Kj="";this.$h=qc},qc={};var tc=function(){this.df="";this.ai=sc};tc.prototype.ve=function(){return 1};var uc=function(a){return a instanceof tc&&a.constructor===tc&&a.ai===sc?a.df:"type_error:SafeUrl"},sc={};var wc=function(){this.Lj="";this.bi=vc};wc.prototype.ve=function(){return 1};var xc=function(a){return a instanceof wc&&a.constructor===wc&&a.bi===vc?a.Lj:"type_error:TrustedResourceUrl"},vc={};var zc=function(){this.df="";this.Zh=yc;this.Ii=null};zc.prototype.ve=function(){return this.Ii};var yc={};var Ac=function(){return null},Bc=function(a){var b=arguments,c=b.length;return function(){for(var a,e=0;eparseFloat(a))?String(b):a}(),Qc={},Rc=function(a){var b;if(!(b=Qc[a])){b=0;for(var c=Xb(String(Pc)).split("."),d=Xb(String(a)).split("."),e=Math.max(c.length,d.length),f=0;0==b&&f"+b,d.removeChild(d.firstChild)):d.innerHTML=b;if(1==d.childNodes.length)d=d.removeChild(d.firstChild);else{for(c=c.createDocumentFragment();d.firstChild;)c.appendChild(d.firstChild);d=c}return d};Xc.prototype.appendChild=function(a,b){a.appendChild(b)}; -Xc.prototype.contains=function(a,b){if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||Boolean(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a};E&&Rc(8);var ad={},bd={},cd={},dd={},ed={},fd={},gd=function(){throw Error("Do not instantiate directly");};gd.prototype.Ba=null;gd.prototype.toString=function(){return this.content};var hd=function(){gd.call(this)};ja(hd,gd);var id=function(a,b){return null!=a&&a.Ya===b},jd=function(a){if(null!=a)switch(a.Ba){case 1:return 1;case -1:return-1;case 0:return 0}return null},kd=function(){gd.call(this)};ja(kd,gd);kd.prototype.Ya=ad;var G=function(a){return null!=a&&a.Ya===ad?a:a instanceof zc?F(a instanceof zc&&a.constructor===zc&&a.Zh===yc?a.df:"type_error:SafeHtml",a.ve()):F(ec(String(String(a))),jd(a))},ld=function(){gd.call(this)};ja(ld,gd);ld.prototype.Ya={};ld.prototype.Ba=1;var md=function(){gd.call(this)};ja(md,gd); -md.prototype.Ya=bd;md.prototype.Ba=1;var nd=function(){gd.call(this)};ja(nd,gd);nd.prototype.Ya=cd;nd.prototype.Ba=1;var od=function(){gd.call(this)};ja(od,gd);od.prototype.Ya=dd;od.prototype.Ba=1;var pd=function(){gd.call(this)};ja(pd,gd);pd.prototype.Ya=ed;pd.prototype.Ba=1;var qd=function(a,b){this.content=String(a);this.Ba=null!=b?b:null};ja(qd,hd);qd.prototype.Ya=fd; -var rd=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a){return new b(String(a))}},F=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a,d){var e=new b(String(a));void 0!==d&&(e.Ba=d);return e}}(kd);rd(ld);var sd=rd(md);rd(nd); -var td=rd(od),ud=rd(pd),vd=function(a,b){function c(){}c.prototype=a;var d=new c,e;for(e in b)d[e]=b[e];return d},wd=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a){return(a=String(a))?new b(a):""}},xd=function(a){return(a=String(a))?new qd(a,void 0):""},I=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a,d){var e=String(a);if(!e)return"";e=new b(e);void 0!==d&&(e.Ba=d);return e}}(kd);wd(ld);wd(nd);wd(md);wd(od); -var yd=wd(pd),K=function(a){return G(a)},zd=function(a){return a.replace(/<\//g,"<\\/").replace(/\]\]>/g,"]]\\>")},M=function(a){return id(a,ad)?(a=String(a.content).replace(Ad,"").replace(Bd,"<"),String(a).replace(Cd,Dd)):ec(String(a))},Fd=function(a){if(id(a,dd))return a.content.replace(/([^"'\s])$/,"$1 ");a=String(a);a=Ed.test(a)?a:"zSoyz";return a},Id=function(a){return String(a).replace(Gd,Hd)},O=function(a){if(id(a,bd)||id(a,cd))return String(a).replace(Gd,Hd);a instanceof tc?a=Id(uc(a)): -a instanceof wc?a=Id(xc(a)):(a=String(a),a=Jd.test(a)?a.replace(Gd,Hd):"#zSoyz");return a},Ld=function(a){if(id(a,bd)||id(a,cd))return String(a).replace(Gd,Hd);a instanceof tc?a=Id(uc(a)):a instanceof wc?a=Id(xc(a)):(a=String(a),a=Kd.test(a)?a.replace(Gd,Hd):"about:invalid#zSoyz");return a},P=function(a){if(id(a,ed))return zd(a.content);null==a?a="":a instanceof rc?(a=a instanceof rc&&a.constructor===rc&&a.$h===qc?a.Kj:"type_error:SafeStyle",a=zd(a)):(a=String(a),a=Md.test(a)?a:"zSoyz");return a}, -Q=function(a){return id(a,fd)?"zSoyz":a},Nd=function(a){var b=jd(a);if(null==b){var c=b=0,d=!1;a=kc(a+"",id(a,ad)).split(oc);for(var e=0;e":">","`":"`","\u0085":"…", -"\u00a0":" ","\u2028":"
","\u2029":"
"},Dd=function(a){return Od[a]},Pd={"\x00":"%00","\u0001":"%01","\u0002":"%02","\u0003":"%03","\u0004":"%04","\u0005":"%05","\u0006":"%06","\u0007":"%07","\b":"%08","\t":"%09","\n":"%0A","\x0B":"%0B","\f":"%0C","\r":"%0D","\u000e":"%0E","\u000f":"%0F","\u0010":"%10","\u0011":"%11","\u0012":"%12","\u0013":"%13","\u0014":"%14","\u0015":"%15","\u0016":"%16","\u0017":"%17","\u0018":"%18","\u0019":"%19","\u001a":"%1A","\u001b":"%1B","\u001c":"%1C", -"\u001d":"%1D","\u001e":"%1E","\u001f":"%1F"," ":"%20",'"':"%22","'":"%27","(":"%28",")":"%29","<":"%3C",">":"%3E","\\":"%5C","{":"%7B","}":"%7D","\u007f":"%7F","\u0085":"%C2%85","\u00a0":"%C2%A0","\u2028":"%E2%80%A8","\u2029":"%E2%80%A9","\uff01":"%EF%BC%81","\uff03":"%EF%BC%83","\uff04":"%EF%BC%84","\uff06":"%EF%BC%86","\uff07":"%EF%BC%87","\uff08":"%EF%BC%88","\uff09":"%EF%BC%89","\uff0a":"%EF%BC%8A","\uff0b":"%EF%BC%8B","\uff0c":"%EF%BC%8C","\uff0f":"%EF%BC%8F","\uff1a":"%EF%BC%9A","\uff1b":"%EF%BC%9B", -"\uff1d":"%EF%BC%9D","\uff1f":"%EF%BC%9F","\uff20":"%EF%BC%A0","\uff3b":"%EF%BC%BB","\uff3d":"%EF%BC%BD"},Hd=function(a){return Pd[a]},Cd=/[\x00\x22\x27\x3c\x3e]/g,Gd=/[\x00- \x22\x27-\x29\x3c\x3e\\\x7b\x7d\x7f\x85\xa0\u2028\u2029\uff01\uff03\uff04\uff06-\uff0c\uff0f\uff1a\uff1b\uff1d\uff1f\uff20\uff3b\uff3d]/g,Md=/^(?!-*(?:expression|(?:moz-)?binding))(?:[.#]?-?(?:[_a-z0-9-]+)(?:-[_a-z0-9-]+)*-?|-?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[a-z]{1,2}|%)?|!important|)$/i,Jd=/^(?![^#?]*\/(?:\.|%2E){2}(?:[\/?#]|$))(?:(?:https?|mailto):|[^&:\/?#]*(?:[\/?#]|$))/i, -Kd=/^[^&:\/?#]*(?:[\/?#]|$)|^https?:|^data:image\/[a-z0-9+]+;base64,[a-z0-9+\/]+=*$|^blob:/i,Ed=/^(?!on|src|(?:style|action|archive|background|cite|classid|codebase|data|dsync|href|longdesc|usemap)\s*$)(?:[a-z0-9_$:-]*)$/i,Ad=/<(?:!|\/?([a-zA-Z][a-zA-Z0-9:\-]*))(?:[^>'"]|"[^"]*"|'[^']*')*>/g,Bd=/"+G(a.content)+"")};if(window.IS_GOOGLE_AFS_IFRAME_){var Td=1,R=function(){return"e"+Td++},Ud=function(a){this.Cb=a};Ud.prototype.j=function(){return this.Cb};var S=new Ud("");S.G=function(){return[]}};if(window.IS_GOOGLE_AFS_IFRAME_)var Vd=function(a,b,c,d,e,f,g,h,l,r,u,y,C,H,J){this.eb=a;this.za=b;this.xi=c;this.Jb=d;this.me=e;this.Te=f;this.yb=g;this.xk=h;this.f=l;this.A=r;this.yj=u;this.bk=y;this.Y=C;this.ac=H;this.xg=!1;this.sg=J};var Wd=function(a,b){if(a.classList)return a.classList.contains(b);for(var c=a.className.split(" "),d=0;d"+ -a+"";var c;try{c=b.firstChild.firstChild.firstChild}catch(d){return null}return 1==c.nodeType&&"tr"==c.tagName.toLowerCase()?c:null},be=function(a){var b=a.parentNode,c=a.nextSibling,d=document.createElement("div");d.appendChild(a);b&&(c?b.insertBefore(d,c):b.appendChild(d));return d};var U=function(a,b,c){if(a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent)a.attachEvent("on"+b,c);else{var d=a["on"+b];a["on"+b]=null!=d?Bc(c,d):c}},ce=function(a,b){U(a,"mousedown",b);U(a,"mousedown",function(a,b,e){var f=!1;return function(){f||(a.removeEventListener?a.removeEventListener(b,e,!1):a.detachEvent&&a.detachEvent("on"+b,e),f=!0)}}(a,"mousedown",b))};var de=function(a){de[" "](a);return a};de[" "]=function(){};E&&Rc("9");!Mc||Rc("528");Lc&&Rc("1.9b")||E&&Rc("8")||Jc&&Rc("9.5")||Mc&&Rc("528");Lc&&!Rc("8")||E&&Rc("9");var ee=function(a,b,c,d,e,f,g,h){this.Rc=a;this.Ef=b;this.Cf=c;this.Ff=d;this.Df=e;this.Gf=f;this.Rd=g;this.Hf=h};ee.prototype.clone=function(){return new ee(this.Rc,this.Ef,this.Cf,this.Ff,this.Df,this.Gf,this.Rd,this.Hf)}; -var fe=function(a,b){if(0==b)return a.Rc;if(1==b)return a.Rd;var c=Cc(a.Rc,a.Cf,b),d=Cc(a.Cf,a.Df,b),e=Cc(a.Df,a.Rd,b),c=Cc(c,d,b),d=Cc(d,e,b);return Cc(c,d,b)},he=function(a){var b=ge,c=(a-b.Rc)/(b.Rd-b.Rc);if(0>=c)return 0;if(1<=c)return 1;for(var d=0,e=1,f=0;8>f;f++){var g=fe(b,c),h=(fe(b,c+1E-6)-g)/1E-6;if(1E-6>Math.abs(g-a))return c;if(1E-6>Math.abs(h))break;else gf;f++)gNd(a.text),f:a.f}))},ne=function(a){return F(0'+G(a.text)+""+(a.f?"‏":"‎"):"")};var qe=function(a){return F('"+K(oe(a))+"")},re=function(a){return F('
"+K(ne({text:a.Hd,Ia:!1,f:a.f}))+""+(a.mg?' ('+K(pe({text:a.mg,f:a.f}))+")":"")+"
"+(a.Zi?"":''+K(oe(a))+""))},se=function(a){return F('"+K(ne({text:a.text,Ia:!1,f:a.f}))+"")},te=function(a){var b=F,c;c=a.wh;var d=a.xh;a=a.f;var e="";if(d&&0'+G(c)+"")},ue=function(a){return F('"+te(a)+"")},ve=function(a){return F("
"+ -G(a.Ka)+"
"+G(a.La)+"
"+G(a.Ad))},we=function(a){return F("
"+G(a.Ka)+"
"+G(a.La))},xe=function(a){var b,c="",d=b=a.eb,e=typeof d;switch("object"==e&&null!=d||"function"==e?b.toString():b){case 1:c+="oneLine";break;case 2:c+="twoLine";break;case 3:c+="threeLine"}c=xd(c);a=""+('
"+G(a.content)+"
");return F(a)};var ye=function(a){var b=Yc(a),c=new Vc(0,0),d;d=b?Yc(b):document;var e;(e=!E||9<=Uc)||(e="CSS1Compat"==Zc(d).qc.compatMode);if(a==(e?d.documentElement:d.body))return c;var f;a:{try{f=a.getBoundingClientRect()}catch(g){f={left:0,top:0,right:0,bottom:0};break a}E&&a.ownerDocument.body&&(a=a.ownerDocument,f.left-=a.documentElement.clientLeft+a.body.clientLeft,f.top-=a.documentElement.clientTop+a.body.clientTop)}a=Zc(b).qc;b=a.scrollingElement?a.scrollingElement:Mc||"CSS1Compat"!=a.compatMode?a.body|| -a.documentElement:a.documentElement;a=a.parentWindow||a.defaultView;b=E&&Rc("10")&&a.pageYOffset!=b.scrollTop?new Vc(b.scrollLeft,b.scrollTop):new Vc(a.pageXOffset||b.scrollLeft,a.pageYOffset||b.scrollTop);c.x=f.left+b.x;c.y=f.top+b.y;return c};var ze=function(a){return F(""+G(a.text)+"")};if(window.IS_GOOGLE_AFS_IFRAME_){var Ae=function(a,b){this.ki=a;this.D=b||ze};Ae.prototype.j=function(){return this.D({text:this.ki,ca:null})}};var Be=function(a){var b="";a=a.elements;for(var c=a.length,d=0;d';a=a.Jc;for(var c=a.length,d=0;d")};if(window.IS_GOOGLE_AFS_IFRAME_){var Ee=function(a,b){this.F=R();this.qb=a;this.D=b||De};Ee.prototype.j=function(){for(var a=[],b=0;b^<]*>/g,"")},Le=function(a){var b=a.offsetWidth;if(!Ge())return b;var c=document.defaultView||{};c&&c.getComputedStyle?(a=c.getComputedStyle(a,!1),b-=He(a.getPropertyValue("padding-left"))+He(a.getPropertyValue("padding-right"))):(a=a.currentStyle,b-=He(a.paddingLeft)+He(a.paddingRight));return b},Me=function(a){var b=a.cloneNode(!0);b.style.visibility="hidden";b.style.position="absolute";if(ra()){var c=a.ownerDocument.createElement("div"); -c.style.visibility="hidden";c.style.position="relative";c.style.width="9999px";c.appendChild(b);a.parentNode.appendChild(c)}else b.style.top="0",b.style.whiteSpace="nowrap",a.parentNode.appendChild(b);a=new Wc(b.offsetWidth,b.offsetHeight);ra()?c.parentNode.removeChild(c):b.parentNode.removeChild(b);return a},Ne=function(){var a=document.createElement("div");a.innerHTML="";return"http://www.w3.org/2000/svg"==(a.firstChild&&a.firstChild.namespaceURI)};var Oe=/([?|&]{1}nm=)([\d]{1,})/,Pe=/(\?|&)clkt=-?[\d]*/g,Qe=/[&\?]nb=\d/,Re=/(\?|&)nx=-?[\d]+/g,Se=/(\?|&)ny=-?[\d]+/g,Ue=function(a){return function(){for(var b=0;ba.length+b.length&&(a+=b+encodeURIComponent(c),1950'),c=a.Jc,d=c.length,e=0;e'+G(f)+"");b+=""}return F(b)},lf=function(a){var b=F;if("jfkButton"==a.Y){var c=a.ij,d=a.text;a=F(K(Sd({href:a.url,A:a.A,qa:"grayJfkButton",content:I((c?'': -"")+''+G(d)+"")})))}else a='";return b(a)};var mf=function(a){var b=a.rb?"right":"left";a=""+('
'+G(a.Da)+'
'+G(a.Ea)+"
");return F(a)},nf=function(a){var b=a.rb?"right":"left";return a=""+('
'+Q(a.Da)+'
'+Q(a.Ea)+"
")},of=function(a){var b= -a.f?"right":"left";a=""+('
'+G(a.Ea)+''+G(a.Da)+"
");return F(a)};if(window.IS_GOOGLE_AFS_IFRAME_){var pf=function(a,b,c,d,e,f,g,h){this.F=R();this.va=a;this.aj=b;this.jj=c;this.Cb=d;this.ui=e;this.I=f;this.W=g;this.D=h||lf};pf.prototype.j=function(){return this.D({uid:this.F,url:this.va,zg:this.aj,ij:this.jj,text:this.Cb,Y:this.ui,f:this.I,A:this.W})};var qf=function(a,b,c,d,e){"svgIcon"==c&&(c=Ne()?c+"Ctc":"pngIcon");return new pf(a,(window._googCsaAlwaysHttps?"https:":"")+"//www.google.com/images/afs/mobile/button_ctc.png",(window._googCsaAlwaysHttps?"https:": -"")+"//www.google.com/images/afs/mobile/gray_phone_icon.png",b,c,d,e,void 0)},rf=function(a,b,c,d,e){"svgIcon"==c&&(c=Ne()?c+"Ctd":"pngIcon");return new pf(a,(window._googCsaAlwaysHttps?"https:":"")+"//www.google.com/images/afs/mobile/"+(c?"ctd_get_app.png":"ctd-dl-icon.png"),"",b,c,e,d,void 0)},sf=function(a,b){var c=[];a.ctc&&c.push(qf(a.ctc.u,a.ctc.bt,b.Y,b.f,b.A));a.ctd&&c.push(rf(a.u,a.ctd.ps,b.Y,b.f,b.A));!(1<=c.length)||b.Y||a.ctc&&a.ctc.coa||a.ctd||c.push(new pf(a.u,(window._googCsaAlwaysHttps? -"https:":"")+"//www.google.com/images/afs/mobile/button_visit_site.png","",b.xk,"",b.f,b.A,void 0));return c},tf=function(a,b,c,d){this.Nc=a;this.jc=b;this.o=c;this.D=d||of};tf.prototype.j=function(){var a={Da:this.jc.j(),Ea:this.Nc.j(),Z:this.o.ac?60:78,Li:"jfkButton"==this.o.Y?"top":"middle",ga:12,borderColor:"jfkButton"==this.o.Y||this.o.ac?"":"#DDDDDD",f:this.o.f};return this.D(a)};tf.prototype.M=function(a,b){this.Nc.M&&this.Nc.M(a,b);this.jc.M&&this.jc.M(a,b)};tf.prototype.G=function(a){var b= -[];this.Nc.G&&(b=b.concat(this.Nc.G(a)));this.jc.G&&(b=b.concat(this.jc.G(a)));return b};var uf=function(a,b,c){b=sf(b,c);return 1==b.length?new tf(a,b[0],c,void 0):a},vf=function(a,b){var c=sf(a,b);return 1a?b=0:.8a&&(.2>=c&&(g.style.paddingBottom="3px"),.95<=c?g.style.paddingBottom="1px":.85<=c&&(g.style.paddingBottom="2px"));g&&1==c&&(g.style.paddingBottom="");if(window.onresize)window.onresize();f.style.opacity=b},l=function(a){var b=2*(.5-a);.5a&&(c=1);f.style.height=e*c+"px";f.style.opacity=b;if(window.onresize)window.onresize()},r=new ke(350);return function(){r.$a||(Wd(b,"collapsed")?(r.Gb=h,Xd(b,"collapsed"),d&&Xd(d,"collapsed")):(r.Gb=l,Yd(b, -"collapsed"),d&&Yd(d,"collapsed")),le(r))}};var Af=function(a){return F('
'+G(a.Ka)+"
"+yf({content:I('
'+(!a.J||!a.O||a.$&&a.V?"":zf({J:a.J,O:a.O,xd:!0}))+G(a.La)+'
'+G(a.Ad)+"
"),f:a.f,$:a.$,V:a.V,sa:a.sa,ra:a.ra,Z:a.$&&a.V?45:0,ga:0,rb:a.f,J:a.J,O:a.O})+"
")},Bf=function(a){return F('
'+G(a.Ka)+"
"+yf({content:I('
'+ -(!a.J||!a.O||a.$&&a.V?"":zf({J:a.J,O:a.O,xd:!0}))+'
'+G(a.La)+"
"),f:a.f,$:a.$,V:a.V,sa:a.sa,ra:a.ra,Z:a.$&&a.V?45:0,ga:0,rb:a.f,J:a.J,O:a.O})+"
")},Cf=function(a){return F("
"+(a.$&&a.V?'':"")+G(a.nj)+(a.J&&a.O?" "+zf({J:a.J,O:a.O,xd:!0}):"")+G(a.oj)+"
")},yf=function(a){return F(K(mf({Da:I(""+ -(a.$&&a.V?'
'+(a.J&&a.O?zf({J:a.J,O:a.O,xd:!1}):"")+"
":"")),Ea:I(""+G(a.content)),Z:a.Z,ga:a.ga,rb:a.f})))},zf=function(a){return F('
('+ -G(a.O)+")
")};var Df=function(a){return F('')},Ef=function(a){return F('')};if(window.IS_GOOGLE_AFS_IFRAME_){var Gf=function(a){return a.adIconUrl&&"title-right"==a.adIconLocation?new Ff(a.adIconUrl,a.img?Df:Ef):S},Ff=function(a,b){this.ek=a;this.D=b};Ff.prototype.j=function(){return this.D({ya:this.ek})}};var Hf=function(a){return F((a.Ng?F(''):"")+'
'+K(pe({text:a.Hd,f:a.f}))+"
")};if(window.IS_GOOGLE_AFS_IFRAME_){var If=function(a,b,c){this.Ic=a;this.I=b;this.D=c||Hf};If.prototype.j=function(){return this.D({Hd:this.Ic,f:this.I,Ng:!0})}};var Kf=function(a){return""+Jf({text:a.text.c,Ia:a.text.rtl,f:a.f})},Jf=function(a){return''+Q(a.text)+""+(a.f?"‏":"‎")};var Lf=function(a){return F(a.Ne?"
"+K(pe({text:a.Ne,f:a.f}))+"
":"")};if(window.IS_GOOGLE_AFS_IFRAME_){var Mf=function(a,b,c){this.F=R();this.Cb=a;this.I=b;this.D=c||Lf};Mf.prototype.j=function(){return this.D({uid:this.F,Ne:this.Cb,f:this.I})};var Nf=function(a,b){return a.location?new Mf(a.location,b.f):S}};if(window.IS_GOOGLE_AFS_IFRAME_){var Pf=function(a,b,c,d){this.F=R();this.xa=a;this.Ce=b;this.zk=c;this.D=d||Of};Pf.prototype.j=function(){return this.D({uid:this.F,Gd:this.xa,tb:this.Ce,Hh:this.zk})};var Qf=function(a,b){var c=a.gt&&"oh"==a.gt.r&&a.gt.t?a.gt.t:null;return a.oh&&0",c=a.$e,d=c.length,e=0;e"}return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_){var Sf=function(a,b,c,d){this.F=R();this.jk=a;this.W=b;this.I=c;this.D=d||Rf};Sf.prototype.j=function(){return this.D({uid:this.F,$e:this.jk,A:this.W,f:this.I})};var Uf=function(a,b){return a.plus_ones?new Sf(Tf(a),b.A,b.f):S},Tf=function(a){var b=[];if(a.plus_ones)for(var c=0,d=a.plus_ones.length;c  ('+K(Sd({href:a.Mc.u,content:Math.round(10*a.Mc.r)/10,A:a.A,qa:"sr-gt sr-gl"}))+")":"")},Xf=function(a){for(var b='
',c=a.ik,d=c.length,e=0;e ':"LINK_START"==f?'":"LINK_END"==f?"":"NUM_START"==f?'':"NUM_END"== -f?" ":K(pe({text:f,f:a.f})));return F(b+"
")},Vf=function(a){return F('
')};if(window.IS_GOOGLE_AFS_IFRAME_){var Yf=function(a,b,c,d,e,f){this.F=R();this.Cb=a;this.W=b;this.Pa=c;this.va=d;this.I=e;this.D=f||Xf};Yf.prototype.j=function(){return this.D({uid:this.F,ik:this.Cb,A:this.W,r:this.Pa,vk:this.va,f:this.I})};var Zf=function(a,b){if(a.ctd&&a.ctd.r&&a.ctd.nr&&b.ac){var c=a.ctd.r;return new Yf(["NUM_START",c,"NUM_END","RATING"," ","("+a.ctd.nr+")"],!1,c,"",b.f)}return a.sr&&a.sr.nt&&a.sr.r&&a.sr.u?new Yf(a.sr.nt,b.A,a.sr.r,a.sr.u,b.f):S}};var ag=function(a){var b="";if(a.qf&&0'),c=a.qf,d=c.length,e=0;e";c=a.ck;d=c.length;for(e=0;e";if(a.Te&&a.na&&0';c=a.na;d=c.length;for(e=0;e"}}return F(b)}, -$f=function(a){return F("")},bg=function(a){for(var b='")},cg=function(a){return F('")},dg=function(a){return F('
'+cg({uid:a.uid,na:a.na,A:a.A,qh:"sitelinksTruncatedWide",nh:"sitelinksTruncatedNarrow",Ih:"nonSfblSitelinksWrapper"})+ -"
")};if(window.IS_GOOGLE_AFS_IFRAME_){var eg=function(a,b,c,d,e){this.F=R();this.$b=a;this.W=b;this.Qj=c;this.I=d;this.D=e||ag};eg.prototype.j=function(){for(var a=[],b=[],c=0;c',c=a.be,d=c.length,e=0;e'+(0!=e?"· ":"")+K(pe({text:c[e],f:a.f}))+"";b+=""}return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_){var jg=function(a,b,c){this.vi=a;this.I=b;this.D=c||ig};jg.prototype.j=function(){return this.D({be:this.vi,f:this.I})};var kg=function(a,b){return a.cos&&0d&&(c=c.substring(0,d-3)+"...");a.nodeValue=c;return!1}c=a.textContent||a.innerText;if(!c||c.length<=(b?0:4))return a.parentNode.removeChild(a),!0;for(c=lg(a.lastChild,b);c;)c=lg(a.lastChild,c);return!1},mg=function(a,b){if(!(0>=b)){for(var c=a.innerHTML.length;0b;c--)for(var d=a,e=lg(d.lastChild,!1);e;)e=lg(d.lastChild, -e);a.offsetHeight>b&&(a.innerHTML="")}},ng=function(a,b){var c=a.style.whiteSpace,d=a.style.wordWrap;a.style.whiteSpace="nowrap";a.style.wordWrap="normal";var e=a.offsetHeight;a.style.whiteSpace=c;a.style.wordWrap=d;mg(a,e*b+b)},og=function(a,b,c,d,e){var f=a.offsetHeight;if(!(f<=b)){var g=be(a);a=be(g);g.style.overflow="hidden";g.style.position="relative";var h=document.createElement("div");try{h.style.backgroundImage="linear-gradient(to bottom, rgba(255,255,255,0), #ffffff)"}catch(L){}h.style.height= -"30px";h.style.position="absolute";h.style.bottom=0;h.style.width="100%";h.style.pointerEvents="none";g.appendChild(h);var l=document.createElement("div");l.innerHTML=c;l.className="expander";l.style.textAlign="center";l.style.color=e;l.style.cursor="pointer";l.style.fontSize="11px";a.appendChild(l);var r=b-l.offsetHeight;g.style.height=r+"px";var u=f-r,y=document.getElementById("adBlock"),C=function(a){var b=y?y.offsetHeight:null;g.style.height=r+a*u+"px";.8<=a&&(l.innerHTML=d,h.style.background= -"");y&&b&&y.offsetHeight>b&&(y&&.2>=a&&(y.style.paddingBottom="4px"),y&&.98<=a?y.style.paddingBottom="1px":y&&.97<=a?y.style.paddingBottom="2px":y&&.96<=a&&(y.style.paddingBottom="3px"));y&&1==a&&(y.style.paddingBottom="");if(window.onresize)window.onresize()},H=function(a){g.style.height=f-a*u+"px";if(.2>=a)try{h.style.backgroundImage="linear-gradient(to bottom, rgba(255,255,255,0), #ffffff)"}catch(b){}.8<=a&&(l.innerHTML=c);if(window.onresize)window.onresize()},J=new ke(400);U(l,"click",function(){J.$a|| -l.innerHTML!=c?J.$a||(J.Gb=H,le(J)):(J.Gb=C,le(J))})}};if(window.IS_GOOGLE_AFS_IFRAME_){var pg=function(a,b,c){ng(T(a.document,b),2);U(a,"resize",function(){var d=T(a.document,b);d.innerHTML=c;ng(d,2)})},qg=function(a,b,c,d,e,f,g,h,l,r,u,y,C,H){this.F=R();this.P=a;this.T=b;this.ob=R();this.R=c;this.zc=d;this.vb=e;this.oa=f;this.vc=g;this.Dc=h;this.Cc=l;this.Ac=r;this.Pa=u;this.zb=y;this.I=C;this.fa=H||Af;this.Fb=R();this.Ca=R()};qg.prototype.j=function(){var a=Be({elements:[this.oa.j(),this.R.j()]}),b=Be({elements:[this.P.j(),this.vb.j()]}),c=this.zc? -a:this.T.j(),d=this.zc?this.T.j():a,a=this.fa({Ka:b,La:c,Ad:d,Eb:this.F,oc:this.ob,$:this.vc,V:this.Dc,sa:this.Cc,ra:this.Ac,J:this.Pa,O:this.zb,Lc:!1,f:this.I}),b=this.fa({Ka:b,La:c,Ad:d,Eb:this.Fb,oc:this.Ca,J:this.Pa,O:this.zb,Lc:!0,f:this.I});return Be({elements:[a,b]})};qg.prototype.M=function(a){var b=T(a.document,this.ob).innerHTML;pg(a,this.ob,b);this.Ca&&(b=T(a.document,this.Ca).innerHTML,pg(a,this.Ca,b));this.Fb&&U(a,"resize",wf(a,this.F,this.Fb))};qg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a))}; -var rg=function(a,b,c,d,e,f,g,h,l,r,u,y,C){this.F=R();this.P=a;this.T=b;this.ob=R();this.R=c;this.vb=d;this.oa=e;this.vc=f;this.Dc=g;this.Cc=h;this.Ac=l;this.Pa=r;this.zb=u;this.I=y;this.fa=C||Bf;this.Fb=R();this.Ca=R()};rg.prototype.j=function(){var a=Be({elements:[this.P.j(),this.vb.j()]}),b=Be({elements:[this.oa.j()," ",this.R.j()," ",this.T.j()]}),c=this.fa({Ka:a,La:b,Eb:this.F,oc:this.ob,$:this.vc,V:this.Dc,sa:this.Cc,ra:this.Ac,J:this.Pa,O:this.zb,Lc:!1,f:this.I}),a=this.fa({Ka:a,La:b,Eb:this.Fb, -oc:this.Ca,J:this.Pa,O:this.zb,Lc:!0,f:this.I});return Be({elements:[c,a]})};rg.prototype.M=function(a){var b=T(a.document,this.ob).innerHTML;pg(a,this.ob,b);this.Ca&&(b=T(a.document,this.Ca).innerHTML,pg(a,this.Ca,b));this.Fb&&U(a,"resize",wf(a,this.F,this.Fb))};rg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a))};var sg=function(a,b,c,d,e,f,g,h,l,r,u){this.P=a;this.T=b;this.R=c;this.oa=d;this.vc=e;this.Dc=f;this.Cc=g;this.Ac=h;this.Pa=l;this.zb=r;this.fa=u||Cf};sg.prototype.j=function(){var a= -Be({elements:[this.oa.j()," ",this.P.j()," "]}),b=Be({elements:[" ",this.T.j()," ",this.R.j()]});return this.fa({nj:a,oj:b,$:this.vc,V:this.Dc,sa:this.Cc,ra:this.Ac,J:this.Pa,O:this.zb})};sg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a))}};if(window.IS_GOOGLE_AFS_IFRAME_){var yg=function(a,b,c,d,e){this.F=R();this.gc=a;this.caps_=b;this.o=c;this.D=e||tg;d=[];c.Y&&1!=c.eb&&(e=df(a,c),e=new Ee([e,Gf(a)]),d.push(new af(e,a,c)));e=c.Y&&1!=c.eb?S:df(a,c);var f=c.Y&&1!=c.eb?S:Gf(a),g=jf(a,c),h=gf(a,c);if(a.ctd){var l=a.ctd.iu;if(l)var r=a.ctd.ih>a.ctd.iw?"height":"width",u=a.u,y=a.ctd.ir;else y=u=r=void 0;var C=a.ctd.r,H=a.ctd.nr;switch(c.eb){case 1:e=new sg(e,h,g,c.yb,l,r,u,y,C,H);break;case 2:e=new rg(e,h,g,f,c.yb,l,r,u,y,C,H,c.f);break; -default:e=new qg(e,h,g,c.me,f,c.yb,l,r,u,y,C,H,c.f)}}else switch(c.eb){case 1:e=new ug(e,h,g,c.yb);break;case 2:e=new vg(e,h,g,f,c.yb);break;default:e=new wg(e,h,g,a.pn?new If(a.pn,c.f):S,c.me,f,c.yb)}e=new af(e,a,c);b=xg(a,b,c);c.Y?(b=new Ee([e].concat(b)),d.push(uf(b,a,c))):(d.push(uf(e,a,c)),d=d.concat(b));this.$c=new Ee(d);this.Wf=R()};yg.prototype.j=function(){var a={uid:this.F,B:this.gc,A:this.o.A,fi:this.$c.j(),Jb:this.o.za||this.o.Jb,Vf:this.Wf,kk:null,jh:null};return this.D(a)};yg.prototype.M= -function(a,b){var c=this.$c.G(a.document),d=document.getElementById(this.Wf);d&&c.push(new Ze(d,"&nb=18"));for(d=T(a.document,this.F);null!=d&&!Wd(d,"a_");)d=d.parentElement;d&&$e(c,d,T(a.document,"adBlock"),b);this.$c.M&&this.$c.M(a,b)};var wg=function(a,b,c,d,e,f,g,h){this.P=a;this.T=b;this.R=c;this.Ic=d;this.zc=e;this.vb=f;this.oa=g;this.fa=h||ve};wg.prototype.j=function(){var a=Be({elements:[this.oa.j(),this.R.j(),this.Ic.j()]});return this.fa({Ka:Be({elements:[this.P.j(),this.vb.j()]}),La:this.zc? -a:this.T.j(),Ad:this.zc?this.T.j():a})};wg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a).concat(this.T.G(a)))};var vg=function(a,b,c,d,e,f){this.P=a;this.T=b;this.R=c;this.vb=d;this.oa=e;this.fa=f||we};vg.prototype.j=function(){var a=Be({elements:[this.P.j(),this.vb.j()]}),b=Be({elements:[this.oa.j(),this.R.j(),this.T.j()]});return this.fa({Ka:a,La:b})};vg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a).concat(this.T.G(a)))};var ug=function(a,b,c,d){this.P=a;this.T=b; -this.R=c;this.oa=d};ug.prototype.j=function(){return Be({elements:[this.oa.j(),this.P.j(),this.T.j(),F(""),this.R.j()]})};ug.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a).concat(this.T.G(a)))}};var zg=function(a,b,c,d,e){this.gg=a;this.tg=b;this.hh=c;this.Oj=d;this.Nj=e||""};zg.prototype.$j=function(a){var b=new $a("https:"+Ka()+"/afs/gen_204");n(b,"client",this.gg);n(b,"zx",this.tg());n(b,"aqid",this.Nj);n(b,"action",a);this.hh(ab(b))};var Ag={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400", -darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc", -ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a", -lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1", -moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57", -seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};var Fg=function(a){var b={};a=String(a);var c="#"==a.charAt(0)?a:"#"+a;if(Bg.test(c))return b.ud=Cg(c),b.type="hex",b;a:{var d=a.match(Dg);if(d){var c=Number(d[1]),e=Number(d[2]),d=Number(d[3]);if(0<=c&&255>=c&&0<=e&&255>=e&&0<=d&&255>=d){c=[c,e,d];break a}}c=[]}if(c.length)return b.ud=Eg(c[0],c[1],c[2]),b.type="rgb",b;if(Ag&&(c=Ag[a.toLowerCase()]))return b.ud=c,b.type="named",b;throw Error(a+" is not a valid color string");},Gg=/#(.)(.)(.)/,Cg=function(a){if(!Bg.test(a))throw Error("'"+a+"' is not a valid hex color"); -4==a.length&&(a=a.replace(Gg,"#$1$1$2$2$3$3"));return a.toLowerCase()},Eg=function(a,b,c){a=Number(a);b=Number(b);c=Number(c);if(isNaN(a)||0>a||255b||255c||255'+Q(a[d])+"";return b};var Ng=function(a){return F(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&a.B.img?(a.kc?'':"")+''+(a.kc?"":""):"")},Og=function(a){return F(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&!a.B.img?'':"")};var Qg=function(a){var b=F,c='
',d;if(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&a.B.img&&a.B.adIconWidth){d=I(""+K(Ng({B:a.B,kc:a.Jb,A:a.A,Kg:a.Bk})));var e=I(""+Pg(a)),f=a.B.adIconSpacingAfter?a.B.adIconSpacingAfter:12,g=a.f?"right":"left";d=""+('
'+G(d)+''+G(e)+"
");d=F(d);d=G(d)}else d=Pg(a);c=c+d+"
";d=a.expansion;d=F(d&&""!=d?'
'+G(d)+"
":"");return b(c+d+(a.ii?F('
'+(a.Fh?'': -'
')+'
'+(a.Fh?'': -'
')+"
"):"")+"
")},Pg=function(a){return F(G(a.li)+G(a.tk)+(a.Fg&&a.V?K(yf({content:a.eg,f:a.f,$:a.Fg,V:a.V,sa:a.sa,ra:a.ra,Z:45,ga:12,rb:a.f})):'
'+G(a.eg)+"
"))};if(window.IS_GOOGLE_AFS_IFRAME_){var Rg=function(a,b,c,d){this.gc=a;this.F=R();this.lj=R();var e=df(a,c),e=new Ee([e,Gf(a)]);this.Ah=new af(e,a,c);var f=jf(a,c),g=Zf(a,c),e=gf(a,c),f=new Ee([f,g],Ce),e=c.me?new Ee([f,e]):new Ee([e,f]),e=new Ee([new af(e,a,c),kg(a,c)]);this.fg=uf(e,a,c);this.qg=new Ee(xg(a,b,c));this.gj=!c.xg;c.xg=!0;this.o=c;this.Wi=a.ctc||a.ctd;this.Mg="collapse"==c.ac;a.ctd&&(this.Di=a.ctd.iu,this.Fi=a.ctd.ih>a.ctd.iw?"height":"width",this.Ei=a.u,this.fj=a.ctd.ir);this.D=d||Qg}; -Rg.prototype.j=function(){var a={tk:this.Ah.j(),li:this.o.yb.j(),eg:this.fg.j(),expansion:this.qg.j(),Eb:this.F,f:this.o.f,Fg:this.Di,V:this.Fi,sa:this.Ei,ra:this.fj,B:this.gc,Jb:this.o.za||this.o.Jb,A:this.o.A,Vf:this.lj,ii:this.Mg,Fh:Ne()};return this.D(a)};Rg.prototype.M=function(a,b){this.Ah.M(a,b);this.fg.M(a,b);this.qg.M(a,b);var c=T(a.document,this.F),d=c.parentNode;this.Wi||Yd(c,"n_");var e=Zd(c,"a","e_");0'+(a.gd?'':"")+G(a.$d)+(a.gd?"":"")+"":"")},Vg=function(a){return""+(a.Bc?''+Q(a.Bc)+"":"")};var tg=function(a){var b=(a.jh?"":Og(a))+'
'+(a.jh?"":Ng({B:a.B,kc:a.Jb,A:a.A,Kg:a.Vf}))+'
',c;c=a.kk?F('"):"";return b+c+Q(a.fi)+"
"+F(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&!a.B.img?'
': -"")};var Wg=function(a){return F(a.text?'
'+G(a.text)+"
":"")};var Xg=function(a){var b="";if(a.Kd&&0',c=a.Kd,d=c.length,e=0;e'+K(pe(f))+" - "+(f.rh?'"+K(pe({text:f.source,f:f.f}))+"":K(pe({text:f.source,f:f.f})))+"":""),b=b+f;b+=""}else a.tb&&(b+=K(Wg({text:a.tb})));return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_){var Yg=function(a,b,c,d){this.F=R();this.Tj=a;this.Ce=b;this.I=c;this.D=d||Xg};Yg.prototype.j=function(){return this.D({uid:this.F,Kd:this.Tj,tb:this.Ce,f:this.I})};var Zg=function(a,b){var c=a.gt&&"ar"==a.gt.r&&a.gt.t?a.gt.t:null;return a.ar&&0':"");a=a.Gd;for(var c=a.length,d=0;d'+(0!=d?"· ":"")+''+G(a[d].t)+" ";b+=""}else a.tb&&(b+=K(Wg({text:a.tb})));return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_)var xg=function(a,b,c){return b.isHighendMobile?c.ac?[Nf(a,c),hg(a,c)]:b.reviewUnderSellerRating?[kg(a,c),hg(a,c),Zf(a,c),Zg(a,c),Uf(a,c),Nf(a,c),Qf(a,c),vf(a,c)]:[kg(a,c),Zg(a,c),hg(a,c),Zf(a,c),Uf(a,c),Nf(a,c),Qf(a,c),vf(a,c)]:b.reviewUnderSellerRating?[kg(a,c),Uf(a,c),Nf(a,c),hg(a,c),Zf(a,c),Zg(a,c),Qf(a,c)]:[kg(a,c),Zg(a,c),Uf(a,c),Nf(a,c),hg(a,c),Zf(a,c),Qf(a,c)]},ch=function(a,b,c,d,e){var f=Rb(d),g=Sb(d),h=f("type")||"ads",l=a.linkColorSchemeVisUrlLinkColor|| -"#008000",r=a.linkColorSchemeTitleLinkColor||"#0000CC";a.isHighendMobile&&a.mobileUiFormat?(l="#006621",r="#1a0dab"):$g(d,a)&&(r=l="#4272db");var l=f("colorDomainLink",l),r=f("colorTitleLink",r),u=e.adBadgeColor||l,y="0.85em",C=f("fontSizeDomainLink");C&&(y=.85*C+"px");var H;H=(H=d.width)&&"auto"!=H?H:"100%";var J={Qb:!1,Ud:null,ae:null};if(d.verticalSpacing){var L=d.verticalSpacing/2;J.Qb=!0;J.Ud=Math.floor(L);J.ae=Math.ceil(L)}var L=(L=f("colorAdSeparator"))?L:a.isHighendMobile||a.isTablet?"#E6E6E6": -null,ua=f("colorAdBackground"),ka=f("colorAdBorder"),la=f("colorText"),qa=f("colorBackground"),eb=f("colorBorder"),sb=f("colorAttribution"),fb=f("colorPlusOnes"),qk=f("colorKeyword"),rk=f("colorLocation"),sk=f("colorAnnotation"),Qa;Qa=[[0,0,0],[255,255,255]];if(l){var Sc;Sc=Cg(l);Qa=Kg([parseInt(Sc.substr(1,2),16),parseInt(Sc.substr(3,2),16),parseInt(Sc.substr(5,2),16)],Qa);Qa=Eg(Qa[0],Qa[1],Qa[2])}else Qa=null;a={C:a,ti:H,Ta:J,fc:L,Va:ua,S:ka,da:la,mb:r,Mb:l,Lb:qa,Aa:eb,Kb:sb,hd:fb,hg:qk,Wa:rk,N:sk, -yi:u,zi:Qa,fontFamily:f("fontFamily"),qe:f("fontFamilyAttribution"),sb:f("fontSizeTitle"),wa:f("fontSizeDescription"),rc:C,Pb:f("fontSizeAttribution"),qd:f("fontSizePlusOnes"),od:f("fontSizeLocation"),K:f("fontSizeAnnotation"),Ni:y,mk:f("titleBold"),sk:e.titleInlineBlock,Uj:f("rolloverLinkBold"),fh:f("rolloverLinkColor"),eh:f("rolloverLinkBackgroundColor"),Vj:f("rolloverLinkUnderline"),dh:f("rolloverAdBackgroundColor"),Pg:f("noTitleUnderline"),zh:ah(a),Xc:g("adBorderSelections","left"),cc:g("adBorderSelections", -"right"),Yc:g("adBorderSelections","top"),Wc:g("adBorderSelections","bottom"),pi:g("borderSelections","left"),ag:g("borderSelections","right"),ri:g("borderSelections","top"),oi:g("borderSelections","bottom"),za:Tb(d,a),Tb:f("lineHeightTitle"),aa:f("lineHeightDescription"),ab:f("lineHeightDomainLink"),Zf:f("attributionSpacingBelow"),hj:$g(d,a),De:e.hasButtonRight};f("adIconUrl")?(a.Ib=f("adIconWidth"),a.kb=f("adIconHeight"),a.Hb=f("adIconLocation"),a.dc=f("adIconSpacingAbove"),a.ec=f("adIconSpacingBefore"), -a.Uf=f("adIconSpacingAfter"),a.ad=f("adIconSpacingBelow"),a.Vd=!0):f("adIconPageUrl")&&(a.Ib=f("adIconPageWidth"),a.kb=f("adIconPageHeight"),a.Hb=f("adIconPageLocation"),a.dc=f("adIconPageSpacingAbove"),a.ec=f("adIconPageSpacingBefore"),a.Uf=f("adIconPageSpacingAfter"),a.Vd=!1);"relatedsearch"==h&&(a.type="relatedsearch",a.Nb=f("columnSpacing"),a.vd=f("horizontalFlow"),a.ub=f("horizontalAlignment"));var v,h=a.C.isRtl?"right":"left";d=a.C.isRtl?"left":"right";f="";e=""),b,c)},dh=function(a,b,c,d,e,f,g,h,l){a="

"+(f?a?ze({text:a,ca:"rhHeader"})+"
":Ug({$d:c,gd:b,ca:"rhHeader"})+(e?Vg({Bc:e,ca:"rhHeader",id:"megaLabel"}):Vg({Bc:d,ca:"lhHeader",id:"adsLabel"})):a?ze({text:a,ca:"lhHeader"}):(e?Vg({Bc:e,ca:"lhHeader",id:"megaLabel"}):Vg({Bc:d,ca:"rhHeader", -id:"adsLabel"}))+Ug({$d:c,gd:b,ca:"lhHeader"}))+"

";bh(a,g,h)},bh=function(a,b,c){da(a)||(a=a.toString());ra()?b.populate(a):c.appendChild($c(Zc(),a))};if(window.IS_GOOGLE_AFS_IFRAME_)var eh=/^((https?):)?\/\/afs.googleusercontent.com\//,fh=/^\/\/afs.googleusercontent.com\//,gh=function(a,b,c,d,e,f,g){if(!d||eh.test(b))for(var h=0;ha.which:2>a.button)&&Fa(Eb(b))}))}},nh,oh,mh=!1,kh=function(a){mh=!1;a=a.touches;1==a.length&&(a=a[0],nh=a.clientX,oh=a.clientY,mh=!0)},lh=function(a){a=a.touches[0]; -if(10'+G(a.Og)+"":'
')},wh=function(a){return ud(".sb_ {padding-top: 10px; text-align: right; height: 29px; font-size: 12px; color: #666666; line-height: 29px; margin-bottom: 2px;}.tb_ {padding-right: 10px; height: 100%; display: inline-block;}.lb_ {display: inline-block; text-align: center; border-radius: 2px; background: white; border: 1px solid #f3f3f3; cursor: default; white-space: nowrap; text-decoration: none; color: #444444; font-size: 11px; font-weight: bold; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;}.ub_.lb_ {height: 100%; width: 34px; font-size: inherit; position: relative;}.lb_.s_ {border: 1px solid #dcdcdc; background: #f5f5f5; z-index: 10;}.lb_.s_:active {-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1); -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1); box-shadow: inset 0 1px 2px rgba(0,0,0,.1); background: #f8f8f8; color: #333;}.lb_.s_:hover {border: 1px solid #c6c6c6; z-index: 20;}.left.lb_ {border-top-right-radius: 0; border-bottom-right-radius: 0;}.right.lb_ {border-top-left-radius: 0; border-bottom-left-radius: 0; margin-left: -1px;}.vb_ {margin-top: -3px; vertical-align: middle; filter: alpha(opacity=33); opacity: .333;}.lb_.s_:hover > .vb_ {filter: alpha(opacity=90); opacity: .9;}.lb_.s_ > .vb_ {filter: alpha(opacity=55); opacity: .55;}table {font-size: "+ -P(a.fontSize)+"px; border-collapse: collapse; display: inline-table; white-space: normal; margin-right: 10px; vertical-align: top; border-top: 1px solid #ebebeb;}.qb_ {position: relative; overflow: hidden;}.rb_ {white-space: nowrap; position: relative; left: 0px;}.j_ {color: #777777;}")};if(window.IS_GOOGLE_AFS_IFRAME_){var xh=function(a,b,c,d,e){this.xa=a;this.Fj=b;this.ak=c;this.xj=d;this.nb=0;this.Hc=[];this.D=e;this.Yd=new ke(300);this.Qg=R();this.kf=R();this.Sg=R();this.hf=R();this.jf=R();this.Tg=R()};k=xh.prototype;k.j=function(){return this.D({zj:this.Qg,Yj:this.kf,Dj:this.Sg,Wj:this.hf,Xj:this.jf,Ej:this.Tg,Og:0==this.xa.length?this.xj:""})};k.ug=function(a,b){return a==b?this.ak.replace("%1$d",""+a).replace("%2$d",""+this.xa.length):this.Fj.replace("%1$d",""+a).replace("%2$d", -""+b).replace("%3$d",""+this.xa.length)};k.Cj=function(a,b){if(0!=this.xa.length){var c=T(a,this.Qg);b-=c.offsetHeight;var d=T(a,this.kf),c=c.offsetWidth,e=a.createElement("table");e.style.width=c+"px";d.appendChild(e);for(var f=0,g=0;gb){var h=e.removeChild(e.lastChild);0==f&&(b=e.offsetHeight);this.Hc.push(this.ug(f+1,g));e=a.createElement("table");e.style.width=c+"px";d.appendChild(e);e.appendChild(h);f=g}this.Hc.push(this.ug(f+ -1,this.xa.length));this.Eh(a)}};k.cg=function(){return 0
';c='
'+G(a.title)+"
"+(a.ha?'
'+G(a.ha)+"
":"");c=I(c);b+=(a.xb?K(mf({Da:I('
'),Ea:I(""+G(c)),Z:69,ga:10})):G(c))+'
'+G(a.sh)+"
"+G(a.ah)+"
";return F(b)},zh= -function(a){for(var b='
';c='
'+G(a.title)+'
'+G(a.ha)+'
'+G(a.sh)+"
"+G(a.ah)+"
";c=I(c);b+=(a.xb?K(mf({Da:I('
'+ -(a.description?'
'+G(a.description)+"
":"")),Ea:I(""+G(c)),Z:224,ga:20})):G(c))+"
";return F(b)};var Bh=function(a){var b;return F(''+Ah(a)+""+K(null==(b=a.ma)?"":b)+''+G(a.Wb)+"")},Ah=function(a){return F('
'+K(Sd({href:a.Ja,content:a.Ed,A:a.Ma,qa:xd("hb_"),Za:a.Dd}))+"
 
")},Ch=function(a){var b;return F(''+Ah(a)+""+K(null==(b=a.ma)?"":b)+"
"+G(a.Wb)+'
'+ -G(a.ua)+'
'+K(Sd({href:a.Ja,content:"Buy",A:a.Ma,qa:xd("s_ kb_ lb_")}))+"")},Dh=function(a){return ud(".i_ {border-bottom: 1px solid #ebebeb; vertical-align: middle;}.i_ td {padding: 7px 4px 7px 0;}.gb_ {width: 40%;}.i_ .fb_ {text-align: right; padding: 7px 0; font-weight: bold;}.hb_ {text-decoration: none; color: "+P(a.linkColor)+"; display: block; overflow: hidden; text-overflow: ellipsis;}.hb_:hover {text-decoration: underline;}")},Eh=function(a){var b;a=a|| -{};return F(''+Ah(a)+'
'+G(a.Wb)+'
'+K(null==(b=a.ua)?"":b)+'
'+K(null==(b=a.ma)?"":b)+"
")},Fh=function(a){return ud(".i_ {border-bottom: 1px solid #ebebeb; vertical-align: middle;}.i_ td {height: 50px; padding-right: 4px;}.gb_ {width: 40%;}.i_ .jb_ {text-align: right; padding-right: 0;}.kb_.lb_ {padding: 0 8px; min-width: 54px; height: 27px; line-height: 27px;}.hb_ {text-decoration: none; color: "+ -P(a.linkColor)+"; display: block; overflow: hidden; text-overflow: ellipsis;}.hb_:hover {text-decoration: underline;}.ib_ {color: #7d7d7d; font-size: 80%;}")};if(window.IS_GOOGLE_AFS_IFRAME_){var Gh=function(a,b){this.bg=a;this.maxHeight=b},Hh=new Gh(10,350),Ih=new Gh(20,700),Jh=function(a,b,c,d,e,f,g,h,l,r,u,y,C){this.Ee=a;this.P=b;this.T=c;this.pe=d;this.pj=e;this.dk=f;this.wj=g+" \u25bc";this.mj=h+" \u25b2";this.re=l;this.We=r;this.gk=y;this.D=C;this.Ab=u;this.Ab.height=Math.min(this.Ab.height,this.re.maxHeight);this.Ab.width=Math.min(this.Ab.width,1E3);this.yh=R();this.kg=R();this.Sf=R();this.Qf=R();this.yg=R()};Jh.prototype.j=function(){return this.D({xb:this.Ee, -title:this.P,description:this.T,ha:this.pe,sh:this.dk,ah:this.We.j(),si:this.Ab.width,uh:this.gk,Oc:this.yh,Hi:this.kg,Rf:this.Sf,ei:this.Qf,Xi:this.yg})};Jh.prototype.Vi=function(a){return T(a,"adBlock").offsetWidth};Jh.prototype.Mj=function(a){this.uk(a);var b=T(a,this.Sf).offsetHeight,b=b+2*this.re.bg;this.We.Cj(a,this.Ab.height-b);this.We.Zd(a)};Jh.prototype.uk=function(a){var b=T(a,this.yh);ng(b,3);if(b=a.getElementById(this.kg)){var c=Je(T(a,this.Qf)),c=c+2*this.re.bg;Je(T(a,this.yg));og(b, -this.Ab.height-c-50,this.wj,this.mj,this.pj)}};var Kh=function(a,b,c,d){var e,f,g,h=[],l=null,r=a.lc||"#0651cf";switch(a.id){case 1:case "SMALL_FORMAT":e=Bh;f=vh;g=yh;h.push(Dh({linkColor:r}));h.push(ud(wh({fontSize:12})));h.push(ud("#adBlock {font-family: arial; font-size: 0; width: 300px; background: white;}.h_ {font-size: 18px; font-weight: bold; color: #222222; word-wrap: break-word;}.xa_ {padding: 9px; border: 1px solid #e0e0e0;}.ab_ {max-width: 67px; max-height: 67px; vertical-align: middle;}.za_ {width: 67px; height: 67px; border: 1px solid #eeeeee; text-align: center; line-height: 67px;}.bb_ {padding: 10px 0; font-size: 12px; font-weight: bold; color: #222222;}.cb_ {color: #787878; font-size: 13px;}")); -d&&(e=Eh,h.push(ud(".i_ .nb_ {padding: 7px 0; width: 46px;}.i_ .fb_ {text-align: left; padding-right: 4px;}.ib_ {color: #7d7d7d; font-size: 90%; font-weight: normal;}")));l=Hh;break;case 3:case "WIDE_FORMAT":e=Ch;f=vh;g=zh;h.push(Fh({linkColor:r}));h.push(ud(wh({fontSize:14})));h.push(ud("#adBlock {font-family: arial; font-size: 0; background: white;}.xa_ {padding: 19px; border: 1px solid #e0e0e0;}.ab_ {max-width: 222px; max-height: 222px; vertical-align: middle;}.za_ {width: 222px; height: 222px; border: 1px solid #eeeeee; text-align: center; line-height: 222px; margin-bottom: 20px;}.eb_ {font-size: 12px; line-height: 18px; color: #222222; word-wrap: break-word;}.db_ {padding-bottom: 20px;}.h_ {font-size: 18px; font-weight: bold; color: #222222; word-wrap: break-word;}.cb_ {color: #7d7d7d; font-size: 13px;}.bb_ {font-size: 14px; font-weight: bold; color: #222222; padding-bottom: 8px;}")); -l=Ih;break;default:return Na.log({message:"Jackpot block json failed to provide a known format."},"crjc"),null}var u=[];a.offers&&(u=ic(a.offers,function(a){return new uh(a.u,a.m,a.pr,a.s,d&&a.ppu?a.ppu:"",c,e)}));f=new xh(u,b.pt,b.sipt,b.nl,f);return new Jh(a.pd.i,a.pd.t,a.pd.d,d&&a.pd.er?a.pd.er:"",r,b.sl,b.m,b.l,l,f,new Wc(a.mw,a.mh),h,g)}};var Lh=function(a){var b='
',c='
'+K(Sd({href:a.Ja,content:a.title,A:a.Ma,qa:xd("oc_"),Za:a.Oc}))+'
',c=c+('
'+G(a.Wb)+"
"+(a.Id?(a.ma?'
'+G(a.ma)+"
": -"")+(a.ha?'
'+G(a.ha)+"
":"")+(a.ua?'
'+G(a.ua)+"
":""):"")+'
'+K(Sd({href:a.Ja,content:a.Ed,A:a.Ma,qa:xd("sc_"),Za:a.Dd}))+"
"),b=b+K(mf({Da:I("
"+K(Sd({href:a.Ja,content:I('
'+G(a.$f)+"
"),A:a.Ma,qa:xd("lc_"),Za:a.Dg}))+"
"),Ea:I(c),Z:a.Fe,ga:a.xc}));return F(b+"
")},Mh=function(a){return ud(".hc_ {background: white; margin-right: "+ -P(a.yc)+"px; margin-bottom: "+P(a.yc)+"px;"+(a.og?P(Rd({value:yd("1px 2px 1px rgba(0, 0, 0, 0.1)")}))+"border: 1px solid #E0E0E0; box-sizing: border-box; border-radius: 3px;":P(Rd({value:yd("0 2px 1px rgba(0, 0, 0, 0.1), 0 0 1px rgba(0, 0, 0, 0.1)")}))+"border-radius: 2px;")+"width: "+P(a.hi)+"px; height: "+P(a.gi)+"px;"+P(Qd())+"}.ic_ {"+(a.og?"padding: "+P(a.xc-1)+"px;":"padding: "+P(a.xc)+"px;")+"position: relative;}.lc_ {text-decoration: none;}.jc_ {width: "+P(a.Fe)+"px; height: "+P(a.bj)+"px; background-repeat: no-repeat; background-position: center; background-size: contain; cursor: pointer; position: relative;}.mc_ {position: relative; height: "+ -P(a.Bi)+"px;}.oc_ {color: "+P(a.nk)+"; font-size: "+P(a.qk)+"px; text-decoration: none;}.nc_ {width: "+P(a.jd)+"px; word-wrap: break-word;}.mb_ {font-size: "+P(a.Ij)+"px; font-weight: bold; color: "+P(a.Xg)+";}.pc_ {color: "+P(a.Xg)+"; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: "+P(a.jd)+"px;}.sc_ {color: "+P(a.Lg)+"; text-decoration: none;}.rc_ {font-size: "+P(a.tj)+"px; padding-bottom: 2px; color: "+P(a.Lg)+"; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: "+ -P(a.jd)+"px;}.bb_ {font-size: 13px;"+P(Qd())+"text-decoration: none; background-color: #555555; position: absolute; bottom: 1px; left: 1px; padding: 0 3px; color: white; border-radius: 2px;}.qc_ {font-size: 12px; color: #777777; padding-bottom: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: "+P(a.jd)+"px;}")};var Nh=function(a){var b='
'+K(Sd({href:a.Ja,content:I('
'+G(a.$f)+"
"),A:a.Ma,qa:xd("lc_"),Za:a.Dg}))+'
'+K(Sd({href:a.Ja,content:a.title,A:a.Ma,qa:xd("oc_"),Za:a.Oc}))+'
',b=b+('
'+G(a.Wb)+"
"+(a.Id?(a.ma?'
'+G(a.ma)+"
":"")+(a.ha?'
'+G(a.ha)+"
":"")+(a.ua?'
'+G(a.ua)+"
":""):"")+'
'+K(Sd({href:a.Ja,content:a.Ed,A:a.Ma,qa:xd("sc_"),Za:a.Dd}))+"
");return F(b)},Oh=function(a){return ud(P(Mh(a))+".jc_ {margin-bottom: "+ -P(a.xc)+"px;}")};if(window.IS_GOOGLE_AFS_IFRAME_){var Ph=function(a,b,c,d,e,f,g,h,l,r,u,y,C){this.mi=c;this.Me=d;this.P=a.t;this.Qe=a.m;this.cf=a.pr;this.Ee=a.i;this.Nd=a.s;this.Qd=a.ppu;this.pe=a.er;this.Pj=u;this.Yi=b.h;this.yk=b.w;this.Ie=e;this.Hg=f;this.cj=b.ih;this.Eg=b.iw;this.jg=g;this.Ci=h;this.rk=b.ts;this.uj=b.ms;this.Jj=b.ps;this.pk=b.tc;this.sj=b.mc;this.Hj=b.pc;this.Xe=l;this.Ki=r;this.fk=y;this.D=C;this.Ag=R();this.Cg=R();this.vf=R();this.Cd=R();this.Wg=R()};k=Ph.prototype;k.j=function(){return this.D({Ug:this.Ag, -$f:this.mi,Ja:this.Me,xb:this.Ee,Dg:this.Cg,title:this.P,Oc:this.vf,Wb:this.cf,Ed:this.Qe,Dd:this.Cd,Vg:this.Wg,Fe:this.Eg,xc:this.Hg,Yg:this.Ai(),Ma:this.Xe,ma:this.Nd,ua:this.Qd,ha:this.pe,Id:this.Pj})};k.Ui=function(){return this.fk({hi:this.yk,gi:this.Yi,yc:this.Ie,xc:this.Hg,bj:this.cj,Fe:this.Eg,Bi:this.jg,jd:this.Ci,qk:this.rk,tj:this.uj,Ij:this.Jj,nk:this.pk,Lg:this.sj,Xg:this.Hj,og:this.Ki})};k.Ai=function(){return hc([this.Qd,this.Nd],ca).join("\n")};k.Bh=function(a){var b=a.document.getElementById(this.Wg); -b&&mg(a.document.getElementById(this.vf),this.jg-(b.offsetHeight+4));this.ic&&this.ic.Bh(a)};k.Xf=function(a){this.ic&&this.ic.Xf(a)};k.vg=function(a){return T(a,this.Ag)};k.wg=function(a){var b=this.ic?this.ic.wg(a):[];return[new Ze(T(a,this.vf),"&nb=0"),new Ze(T(a,this.Cd),"&nb=1"),new Ze(T(a,this.Cg),"&nb=9")].concat(b)};var Qh=function(a,b,c,d,e,f,g){var h=db(a.u),l=new Wc(b.w,b.h),r=new Wc(b.iw,b.ih),u=Math.floor((l.height-r.height)/2);return new Ph(a,b,c,h,d,u,r.height,l.width-(3*u+r.width), -e,f,g,Mh,Lh)},Rh=function(a,b,c,d,e,f,g){var h=db(a.u),l=new Wc(b.w,b.h),r=new Wc(b.iw,b.ih),u=Math.floor((l.width-r.width)/2);return new Ph(a,b,c,h,d,u,l.height-(3*u+r.height),r.width,e,f,g,Oh,Nh)}};var Sh=function(a){var b='
';a=a.Sj;for(var c=a.length,d=0;d
")};if(window.IS_GOOGLE_AFS_IFRAME_){var Th=function(a,b,c,d,e,f,g){this.Vb=a;this.kh=b;this.Ie=c;this.ni=d;this.Mi=e;this.ej=f;this.D=g};Th.prototype.j=function(){for(var a=[],b=0;b
';for(var d=a.ads,e=d.length,f=0;f"}return b+"
'+(1==a.ads.length?'  ': -''+K(++c)+". ")+' '+Q(g.cleanTitle)+' opens new browser window'+ -Q(g.l1)+" "+Q(g.l2)+' '+Q(g.v)+"
"}, -Vh=function(a){for(var b='
',c=a.ads,d=c.length,e=0;e");return b+="
  -  
'+ -Q(f.l1)+" "+Q(f.l2)+'
"};var Wh=function(a){var b,c=0;b='';for(var d=a.ads,e=d.length,f=0;f"}b+="
'+K(++c)+'.  '+G(g.t)+'
'+ -G(g.l1)+" "+G(g.l2)+' '+G(g.v)+"
";return F(b)},Xh=function(a){for(var b='',c=a.ads,d=c.length,e=0;e");b+="
'+G(f.l1)+" "+G(f.l2)+'
";return F(b)},Yh=function(a){var b;b='';for(var c=a.ads,d=c.length,e=0;e"}b+="
'+ -G(f.l1)+" "+G(f.l2)+' '+G(f.v)+"
";return F(b)},Zh=function(a){for(var b='',c=a.ads,d=c.length,e=0;e");b+="
  -  
'+G(f.l1)+" "+G(f.l2)+'
";return F(b)},$h=function(a){var b,c=0;b='";return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_)var ai=function(a,b){b=b||130;var c=b+Math.max(1.5*b,160),d=a.document.getElementById("wideSfbl"),e=a.document.getElementById("narrowSfbl");d&&e&&(Ie(a.document.body,!1)Ie(f,!1)){for(g=0;h=c[g];g++)h.style.display="none";for(g=0;h=d[g];g++)h.style.display="block"}else{for(g=0;h=c[g];g++)h.style.display="block";for(g=0;h=d[g];g++)h.style.display="none"}};var bi=function(a){return'"+(a.B.pn?Hf({Hd:a.B.pn,f:a.C.isRtl,Ng:!1})+"
":"")+(a.Gg?'
'+Wf({Mc:a.B.sr})+"
":"")},ci=function(a){return""+(a.C.disableSellerFirstFavicon?bi({B:a.B,C:a.C,A:a.A,Gg:a.wd}):nf({Da:'',Ea:""+ -bi({B:a.B,C:a.C,A:a.A,Gg:a.wd}),Z:18,ga:3,rb:a.C.isRtl}))+(a.wd?"":'
'+Wf({Mc:a.B.sr})+"
")},di=function(a){var b='
',c=a.B.l1r,d=a.B.l2r,e=a.C.isRtl,f="";if(d&&d.c)var g=c.rtl||d.rtl,f=f+Jf({Ia:g,f:e,text:Kf({text:c,f:g})+" "+Kf({text:d,f:g})});else f+=Kf({text:c,f:e});b=b+f+"
"+ig({be:a.B.cos, -f:a.C.isRtl})+Xg({Kd:a.B.ar,tb:a.B.gt&&"ar"==a.B.gt.r?a.B.gt.t:null,f:a.C.isRtl})+Rf({$e:a.B.plus_ones,A:a.A})+Lf({Ne:a.B.location,f:a.C.isRtl})+Of({Gd:a.B.oh,tb:a.B.gt&&"oh"==a.B.gt.r?a.B.gt.t:null,Hh:a.C.offerHighlightWithIcon});a=a.B.sls&&0g?e?(e.style.display="none",c?c.style.display="":e.parentNode.style.display="none"):(d.style.display="none",c||(d.parentNode.style.display="none")):e?(e.style.display="",e.parentNode.style.display="",c&&(c.style.display="none")):(d.style.display="",d.parentNode.style.display="")}},Fi=m(Fi,"aH"),Oi=function(a){var b="master-"+Ai(a);a=Di(b,a);b="";if(a)try{b= -a.document.documentElement.lang}catch(c){}return b},Oi=m(Oi,"gMIHL"),Pi=function(a,b){try{if(a&&a.document.getElementsByTagName("html")){var c;(c=a.document.getElementsByTagName("html")[0])&&!c.lang&&(c.lang=b)}}catch(d){}},Pi=m(Pi,"sSIHL"),Ri=function(a,b,c){a=a.document.getElementsByTagName("table");for(var d=a.length,e=0;eMe(a).height},Si=m(Si,"iW"),Ti=function(a){for(;0e.length?e.push(h):"sl-right"==h.className&&3>f.length&&f.push(h);for(d=[];0e){c=Le(d)-15;125>c&&(c=125);for(var f=d.getElementsByTagName("div"),g=0,h=0,l;l=f[h];h++)Me(l).width<=c&&3>g?g++:l.style.display="none";g>e?(Wi(d,"visibility","visible"),a.style.display="none"):d.style.display="none"}else d.style.display="none"}},Vi=m(Vi,"uS"),Ui=function(a,b){var c=b.shift();if(c){for(;0< -b.length;)Ti(b.pop());c[1]&&(Si(c)||(Yd(c[0].firstChild,"l"),Yd(c[1].firstChild,"r"),c[0].innerHTML+=" - "+c[1].innerHTML),c[1].parentNode.removeChild(c[1]),c.pop());a.className="sl-table-ol";c[0].className="sl-left-ol";Si(c[0])&&Ti(c)}},Ui=m(Ui,"hSLS"),Xi=function(a,b){return Le(a)b||"number"==typeof c&&16>c)&&(a=a.document.getElementById("adBlock"))&&""!=a.innerHTML?!0:!1},lj=m(lj,"iCSI"),Ji=function(a,b){for(var c=!1,d=[],e=0;erb)for(a=0;a=f)a=g;else{a=[];for(var h= -0,l=0;l';e=g.length;for(b=0;b'+K(pe({text:a.t,f:f})),d+='
';c=F(d+"")}else{d=""+('");e=g.length;for(b=0;bf||2<=f&&b":"")+'";c=d+"
",l=g.length%f||f,d+='
=g.length-l?" lr":"")+'">'+Og({B:a,kc:!1,qj:"_top"})+ -'
'+Ng({B:a,kc:!1,qj:"_top"})+'
"}return c},uj=m(uj,"cRSN"),gj=function(a,b,c,d,e,f,g,h,l,r,u){if(0>=a.length)return null;var y=Ub(e),C="";c=null;if(u.customAdIcons){var H="https"==window.location.protocol;null!=e.adIconUrl&&0
'+nf({Da:""+ci(vd(a,{B:g,wd:!0})),Ea:""+di(vd(a,{B:g})),Z:null==(qa=a.Zj)?130:qa,ga:10,rb:a.C.isRtl})+"
";y+='";C=y+""}else{c=[];qa=g.ac?Rg:yg;for(y=0;y