From 766d4d0c082cc9bca68d4221f9be21b49475e330 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Wed, 22 Nov 2023 17:00:20 +0100 Subject: [PATCH 01/66] chore: start investigating LTE vs v0.4 See https://github.com/ooni/probe/issues/2628 See https://github.com/ooni/probe/issues/2634 --- internal/experiment/webconnectivitylte/cleartextflow.go | 2 +- internal/experiment/webconnectivitylte/secureflow.go | 8 +++++++- internal/experiment/webconnectivitylte/testkeys.go | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/internal/experiment/webconnectivitylte/cleartextflow.go b/internal/experiment/webconnectivitylte/cleartextflow.go index 8ec7cc663..57650736e 100644 --- a/internal/experiment/webconnectivitylte/cleartextflow.go +++ b/internal/experiment/webconnectivitylte/cleartextflow.go @@ -274,7 +274,7 @@ func (t *CleartextFlow) httpTransaction(ctx context.Context, network, address, a err, finished, ) - t.TestKeys.AppendRequests(ev) + t.TestKeys.PrependRequests(ev) return resp, body, err } diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index 6284eca64..be5800ef6 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -107,6 +107,10 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { // create trace trace := measurexlite.NewTrace(index, t.ZeroTime) + // TODO(bassosimone): the DSL starts measuring for throttling when we start + // fetching the body while here we start immediately. We should come up with + // a consistent policy otherwise data won't be comparable. + // start measuring throttling sampler := throttling.NewSampler(trace) defer func() { @@ -329,7 +333,7 @@ func (t *SecureFlow) httpTransaction(ctx context.Context, network, address, alpn err, finished, ) - t.TestKeys.AppendRequests(ev) + t.TestKeys.PrependRequests(ev) return resp, body, err } @@ -344,6 +348,8 @@ func (t *SecureFlow) maybeFollowRedirects(ctx context.Context, resp *http.Respon if err != nil { return // broken response from server } + // TODO(https://github.com/ooni/probe/issues/2628): we need to handle + // the care where the redirect URL is incomplete t.Logger.Infof("redirect to: %s", location.String()) resolvers := &DNSResolvers{ CookieJar: t.CookieJar, diff --git a/internal/experiment/webconnectivitylte/testkeys.go b/internal/experiment/webconnectivitylte/testkeys.go index dd2e5be31..71ccd711b 100644 --- a/internal/experiment/webconnectivitylte/testkeys.go +++ b/internal/experiment/webconnectivitylte/testkeys.go @@ -217,8 +217,8 @@ func (tk *TestKeys) AppendQueries(v ...*model.ArchivalDNSLookupResult) { tk.mu.Unlock() } -// AppendRequests appends to Requests. -func (tk *TestKeys) AppendRequests(v ...*model.ArchivalHTTPRequestResult) { +// PrependRequests appends to Requests. +func (tk *TestKeys) PrependRequests(v ...*model.ArchivalHTTPRequestResult) { tk.mu.Lock() // Implementation note: append at the front since the most recent // request must be at the beginning of the list. From f3701a0a4f4f846c58f8c43085ffd7e766a0b253 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 10:31:06 +0100 Subject: [PATCH 02/66] document why some QA tests with redirects are broken --- .../webconnectivitylte/analysishttpcore.go | 8 +++++++ .../webconnectivitylte/secureflow.go | 23 ++++++++++++++++++- .../experiment/webconnectivityqa/redirect.go | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/internal/experiment/webconnectivitylte/analysishttpcore.go b/internal/experiment/webconnectivitylte/analysishttpcore.go index 8d7d34c9e..aa7ea46f7 100644 --- a/internal/experiment/webconnectivitylte/analysishttpcore.go +++ b/internal/experiment/webconnectivitylte/analysishttpcore.go @@ -5,6 +5,8 @@ package webconnectivitylte // import ( + "log" + "github.com/ooni/probe-cli/v3/internal/model" "github.com/ooni/probe-cli/v3/internal/netxlite" ) @@ -33,6 +35,12 @@ func (tk *TestKeys) analysisHTTPToplevel(logger model.Logger) { finalRequest := tk.Requests[0] tk.HTTPExperimentFailure = finalRequest.Failure + { + for idx, req := range tk.Requests { + log.Printf("REQUEST STACK: #%d %s", idx, req.Request.URL) + } + } + // don't perform any futher analysis without TH data if tk.Control == nil || tk.ControlRequest == nil { return diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index be5800ef6..c544d957a 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -104,6 +104,27 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { return err } + // TODO(bassosimone): we're missing high-level information about the + // transaction, which implies we are missing failed HTTP requests + // to compare to, which causes netemx integration tests such as this + // + // TestQA/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP + // + // to fail because they cannot find the corresponding request to + // compare to. Therefore, in such a test case, we incorrectly say + // that bit.ly is accessible where instead we should conclude + // there's blocking at the TCP/IP level. + // + // An initial fix for this issue probably relies on making sure + // that we don't conclude there is a success when the actual + // endpoint fails. However, I think there are broader ooni/data + // implications at stake here. The fact that we do not have a + // request violates the assumptions of the analysis code we have + // written, which means, whatever we do, we need to respect the + // previously agreed conventions in some way. + // + // For this reason, any fix for this should be carefully thought out. + // create trace trace := measurexlite.NewTrace(index, t.ZeroTime) @@ -349,7 +370,7 @@ func (t *SecureFlow) maybeFollowRedirects(ctx context.Context, resp *http.Respon return // broken response from server } // TODO(https://github.com/ooni/probe/issues/2628): we need to handle - // the care where the redirect URL is incomplete + // the case where the redirect URL is incomplete t.Logger.Infof("redirect to: %s", location.String()) resolvers := &DNSResolvers{ CookieJar: t.CookieJar, diff --git a/internal/experiment/webconnectivityqa/redirect.go b/internal/experiment/webconnectivityqa/redirect.go index 0f265090f..03b5656f4 100644 --- a/internal/experiment/webconnectivityqa/redirect.go +++ b/internal/experiment/webconnectivityqa/redirect.go @@ -11,7 +11,7 @@ import ( func redirectWithConsistentDNSAndThenConnectionRefusedForHTTP() *TestCase { return &TestCase{ Name: "redirectWithConsistentDNSAndThenConnectionRefusedForHTTP", - Flags: TestCaseFlagNoLTE, // BUG: LTE thinks this website is accessible (WTF?!) + Flags: 0, // BUG: LTE thinks this website is accessible (WTF?!) Input: "https://bit.ly/32447", Configure: func(env *netemx.QAEnv) { From f1cc4bbd73a19b484c5dd6c6d2ac24fdd31dc2b6 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 10:40:57 +0100 Subject: [PATCH 03/66] document more doubts about emmitting events --- internal/experiment/webconnectivitylte/secureflow.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index c544d957a..a5f22493a 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -323,6 +323,11 @@ func (t *SecureFlow) httpTransaction(ctx context.Context, network, address, alpn txp model.HTTPTransport, req *http.Request, trace *measurexlite.Trace) (*http.Response, []byte, error) { const maxbody = 1 << 19 started := trace.TimeSince(trace.ZeroTime()) + // TODO(bassosimone): I am wondering whether we should have the HTTP transaction + // start at the beginning of the flow rather than here. If we start it at the + // beginning this is nicer, but, at the same time, starting it at the beginning + // of the flow means we're not collecting information about DNS. So, I am a + // bit torn about what is the best approach to follow here. t.TestKeys.AppendNetworkEvents(measurexlite.NewAnnotationArchivalNetworkEvent( trace.Index(), started, "http_transaction_start", )) From 0b2203d4dda09ad22087761ee5f1bcbf5623055f Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 10:47:14 +0100 Subject: [PATCH 04/66] document more caveats --- internal/experiment/webconnectivitylte/secureflow.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index a5f22493a..9e0ee3ae6 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -206,6 +206,17 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { netxlite.NewSingleUseTLSDialer(tlsConn), ) + // TODO(bassosimone): the request we're creating here is bound to the httpCtx + // context. So, if we choose to create the request earlier, then we should make + // sure that here we are assigning the correct context to the request. + // + // Additionally, and maybe tangentially, I am wondering whether we should + // separate a request and a response inside the dataset. This would make it + // possible to create the request early and provide the response when it + // becomes available. Though, this means we don't have anymore an HTTP + // structure according to the archival data format and instead we have to + // generate it on the fly, which comes with its own drawbacks. + // create HTTP request const httpTimeout = 10 * time.Second httpCtx, httpCancel := context.WithTimeout(parentCtx, httpTimeout) From 8eb1ba1313a4a4e160d09ac5d79768ac4ec65a16 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 10:47:58 +0100 Subject: [PATCH 05/66] [ci skip] remember to update files in sync --- internal/experiment/webconnectivitylte/secureflow.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index 9e0ee3ae6..adfaf20a3 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -206,6 +206,9 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { netxlite.NewSingleUseTLSDialer(tlsConn), ) + // TODO(bassosimone): whatever changes we apply here, we also need to + // apply the same changes inside the cleartextflow.go file. + // TODO(bassosimone): the request we're creating here is bound to the httpCtx // context. So, if we choose to create the request earlier, then we should make // sure that here we are assigning the correct context to the request. From 92eb7b7cfddf20816c11cc817a01207fe5d6c824 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 11:32:09 +0100 Subject: [PATCH 06/66] doc: document more doubts that I have --- internal/experiment/webconnectivitylte/secureflow.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index adfaf20a3..8cf95150e 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -124,6 +124,13 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { // previously agreed conventions in some way. // // For this reason, any fix for this should be carefully thought out. + // + // I cannot know which is the request that will win the race and + // attempt measuring HTTP/HTTPS. Also, I cannot create records for + // all requests because that would break the fastpath, which assumes + // that requests[0] is the latest request in a linear chain. So, I + // need somehow to introduce a request into the test keys in a different + // way. Yet, how do I know which connection I am going to use? // create trace trace := measurexlite.NewTrace(index, t.ZeroTime) From ea0d3bf2db2f1d92ad2e4264c2c556b3e839200d Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 15:00:29 +0100 Subject: [PATCH 07/66] [ci skip] more documentation on what to do --- internal/experiment/webconnectivitylte/cleartextflow.go | 1 + internal/experiment/webconnectivitylte/secureflow.go | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/internal/experiment/webconnectivitylte/cleartextflow.go b/internal/experiment/webconnectivitylte/cleartextflow.go index 57650736e..55045ee52 100644 --- a/internal/experiment/webconnectivitylte/cleartextflow.go +++ b/internal/experiment/webconnectivitylte/cleartextflow.go @@ -120,6 +120,7 @@ func (t *CleartextFlow) Run(parentCtx context.Context, index int64) error { tcpConn, err := tcpDialer.DialContext(tcpCtx, "tcp", t.Address) t.TestKeys.AppendTCPConnectResults(trace.TCPConnects()...) if err != nil { + // TODO(bassosimone): add failed HTTP request to the heap ol.Stop(err) return err } diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index 8cf95150e..31da071bc 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -97,6 +97,9 @@ func (t *SecureFlow) Start(ctx context.Context) { }() } +// TODO(bassosimone): document the heap-like organization of the +// requests that we plan on adding to webconnectivity. + // Run runs this task in the current goroutine. func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { if err := allowedToConnect(t.Address); err != nil { @@ -159,6 +162,7 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { tcpConn, err := tcpDialer.DialContext(tcpCtx, "tcp", t.Address) t.TestKeys.AppendTCPConnectResults(trace.TCPConnects()...) if err != nil { + // TODO(bassosimone): add failed HTTP request to the heap ol.Stop(err) return err } @@ -189,6 +193,7 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { tlsConn, err := tlsHandshaker.Handshake(tlsCtx, tcpConn, tlsConfig) t.TestKeys.AppendTLSHandshakes(trace.TLSHandshakes()...) if err != nil { + // TODO(bassosimone): add failed HTTP request to the heap ol.Stop(err) return err } @@ -199,6 +204,7 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { // Determine whether we're allowed to fetch the webpage if t.PrioSelector == nil || !t.PrioSelector.permissionToFetch(t.Address) { + // TODO(bassosimone): add failed HTTP request to the heap ol.Stop("stop after TLS handshake") return errNotPermittedToFetch } From fd06406afea22230de41c53fd71cf8922a882d5d Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 15:36:33 +0100 Subject: [PATCH 08/66] feat: progress towards fixing some fundamental issues --- .../webconnectivitylte/analysishttpcore.go | 1 + .../webconnectivitylte/cleartextflow.go | 53 +++++++++---- .../webconnectivitylte/httpfailure.go | 28 +++++++ .../webconnectivitylte/secureflow.go | 76 ++++++++++++++----- .../experiment/webconnectivityqa/redirect.go | 4 +- 5 files changed, 125 insertions(+), 37 deletions(-) create mode 100644 internal/experiment/webconnectivitylte/httpfailure.go diff --git a/internal/experiment/webconnectivitylte/analysishttpcore.go b/internal/experiment/webconnectivitylte/analysishttpcore.go index aa7ea46f7..794bfbd87 100644 --- a/internal/experiment/webconnectivitylte/analysishttpcore.go +++ b/internal/experiment/webconnectivitylte/analysishttpcore.go @@ -58,6 +58,7 @@ func (tk *TestKeys) analysisHTTPToplevel(logger model.Logger) { switch *failure { case netxlite.FailureConnectionReset, netxlite.FailureGenericTimeoutError, + netxlite.FailureConnectionRefused, netxlite.FailureEOFError: tk.BlockingFlags |= analysisFlagHTTPBlocking logger.Warnf( diff --git a/internal/experiment/webconnectivitylte/cleartextflow.go b/internal/experiment/webconnectivitylte/cleartextflow.go index 55045ee52..55b4ef1f4 100644 --- a/internal/experiment/webconnectivitylte/cleartextflow.go +++ b/internal/experiment/webconnectivitylte/cleartextflow.go @@ -8,6 +8,7 @@ package webconnectivitylte import ( "context" + "errors" "io" "net" "net/http" @@ -97,6 +98,18 @@ func (t *CleartextFlow) Run(parentCtx context.Context, index int64) error { return err } + httpReq, err := t.newHTTPRequest() + if err != nil { + if t.Referer == "" { + // when the referer is empty, the failing URL comes from our backend + // or from the user, so it's a fundamental failure. After that, we + // are dealing with websites provided URLs, so we should not flag a + // fundamental failure, because we want to see the measurement submitted. + t.TestKeys.SetFundamentalFailure(err) + } + return err + } + // create trace trace := measurexlite.NewTrace(index, t.ZeroTime) @@ -120,7 +133,15 @@ func (t *CleartextFlow) Run(parentCtx context.Context, index int64) error { tcpConn, err := tcpDialer.DialContext(tcpCtx, "tcp", t.Address) t.TestKeys.AppendTCPConnectResults(trace.TCPConnects()...) if err != nil { - // TODO(bassosimone): add failed HTTP request to the heap + // TODO(bassosimone): document why we're adding a request to the heap here + t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( + trace, + "tcp", + t.Address, + "", + httpReq, + err, + )) ol.Stop(err) return err } @@ -133,6 +154,15 @@ func (t *CleartextFlow) Run(parentCtx context.Context, index int64) error { // Determine whether we're allowed to fetch the webpage if t.PrioSelector == nil || !t.PrioSelector.permissionToFetch(t.Address) { + // TODO(bassosimone): document why we're adding a request to the heap here + t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( + trace, + "tcp", + t.Address, + "", + httpReq, + errors.New("http_request_canceled"), // TODO(bassosimone): define this error + )) ol.Stop("stop after TCP connect") return errNotPermittedToFetch } @@ -147,22 +177,13 @@ func (t *CleartextFlow) Run(parentCtx context.Context, index int64) error { netxlite.NewNullTLSDialer(), ) - // create HTTP request + // create HTTP context const httpTimeout = 10 * time.Second httpCtx, httpCancel := context.WithTimeout(parentCtx, httpTimeout) defer httpCancel() - httpReq, err := t.newHTTPRequest(httpCtx) - if err != nil { - if t.Referer == "" { - // when the referer is empty, the failing URL comes from our backend - // or from the user, so it's a fundamental failure. After that, we - // are dealing with websites provided URLs, so we should not flag a - // fundamental failure, because we want to see the measurement submitted. - t.TestKeys.SetFundamentalFailure(err) - } - ol.Stop(err) - return err - } + + // make sure the request uses the context + httpReq = httpReq.WithContext(httpCtx) // perform HTTP transaction httpResp, httpRespBody, err := t.httpTransaction( @@ -209,7 +230,7 @@ func (t *CleartextFlow) urlHost(scheme string) (string, error) { } // newHTTPRequest creates a new HTTP request. -func (t *CleartextFlow) newHTTPRequest(ctx context.Context) (*http.Request, error) { +func (t *CleartextFlow) newHTTPRequest() (*http.Request, error) { const urlScheme = "http" urlHost, err := t.urlHost(urlScheme) if err != nil { @@ -221,7 +242,7 @@ func (t *CleartextFlow) newHTTPRequest(ctx context.Context) (*http.Request, erro Path: t.URLPath, RawQuery: t.URLRawQuery, } - httpReq, err := http.NewRequestWithContext(ctx, "GET", httpURL.String(), nil) + httpReq, err := http.NewRequest("GET", httpURL.String(), nil) if err != nil { return nil, err } diff --git a/internal/experiment/webconnectivitylte/httpfailure.go b/internal/experiment/webconnectivitylte/httpfailure.go new file mode 100644 index 000000000..4d0ef73cf --- /dev/null +++ b/internal/experiment/webconnectivitylte/httpfailure.go @@ -0,0 +1,28 @@ +package webconnectivitylte + +import ( + "net/http" + + "github.com/ooni/probe-cli/v3/internal/measurexlite" + "github.com/ooni/probe-cli/v3/internal/model" +) + +// TODO(bassosimone): document this func +func newArchivalHTTPRequestResultWithError(trace *measurexlite.Trace, network, address, alpn string, + req *http.Request, err error) *model.ArchivalHTTPRequestResult { + duration := trace.TimeSince(trace.ZeroTime()) + return measurexlite.NewArchivalHTTPRequestResult( + trace.Index(), + duration, + network, + address, + alpn, + network, // TODO(bassosimone): get rid of this duplicate field? + req, + nil, + 0, + nil, + err, + duration, + ) +} diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index 31da071bc..0540ce077 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -9,6 +9,7 @@ package webconnectivitylte import ( "context" "crypto/tls" + "errors" "io" "net" "net/http" @@ -107,6 +108,21 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { return err } + // Create the request early such that we can immediately bail in case + // it's broken and such that we can insert it into the heap in case there + // is a failure when connecting or TLS handshaking. + httpReq, err := t.newHTTPRequest() + if err != nil { + if t.Referer == "" { + // when the referer is empty, the failing URL comes from our backend + // or from the user, so it's a fundamental failure. After that, we + // are dealing with websites provided URLs, so we should not flag a + // fundamental failure, because we want to see the measurement submitted. + t.TestKeys.SetFundamentalFailure(err) + } + return err + } + // TODO(bassosimone): we're missing high-level information about the // transaction, which implies we are missing failed HTTP requests // to compare to, which causes netemx integration tests such as this @@ -162,7 +178,17 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { tcpConn, err := tcpDialer.DialContext(tcpCtx, "tcp", t.Address) t.TestKeys.AppendTCPConnectResults(trace.TCPConnects()...) if err != nil { - // TODO(bassosimone): add failed HTTP request to the heap + // TODO(bassosimone): document why we're adding a request to the heap here + if t.PrioSelector != nil { + t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( + trace, + "tcp", + t.Address, + "", + httpReq, + err, + )) + } ol.Stop(err) return err } @@ -193,7 +219,17 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { tlsConn, err := tlsHandshaker.Handshake(tlsCtx, tcpConn, tlsConfig) t.TestKeys.AppendTLSHandshakes(trace.TLSHandshakes()...) if err != nil { - // TODO(bassosimone): add failed HTTP request to the heap + // TODO(bassosimone): document why we're adding a request to the heap here + if t.PrioSelector != nil { + t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( + trace, + "tcp", + t.Address, + "", + httpReq, + err, + )) + } ol.Stop(err) return err } @@ -204,7 +240,17 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { // Determine whether we're allowed to fetch the webpage if t.PrioSelector == nil || !t.PrioSelector.permissionToFetch(t.Address) { - // TODO(bassosimone): add failed HTTP request to the heap + // TODO(bassosimone): document why we're adding a request to the heap here + if t.PrioSelector != nil { + t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( + trace, + "tcp", + t.Address, + "", + httpReq, + errors.New("http_request_canceled"), // TODO(bassosimone): define this error + )) + } ol.Stop("stop after TLS handshake") return errNotPermittedToFetch } @@ -233,22 +279,13 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { // structure according to the archival data format and instead we have to // generate it on the fly, which comes with its own drawbacks. - // create HTTP request + // create HTTP context const httpTimeout = 10 * time.Second httpCtx, httpCancel := context.WithTimeout(parentCtx, httpTimeout) defer httpCancel() - httpReq, err := t.newHTTPRequest(httpCtx) - if err != nil { - if t.Referer == "" { - // when the referer is empty, the failing URL comes from our backend - // or from the user, so it's a fundamental failure. After that, we - // are dealing with websites provided URLs, so we should not flag a - // fundamental failure, because we want to see the measurement submitted. - t.TestKeys.SetFundamentalFailure(err) - } - ol.Stop(err) - return err - } + + // make sure the context owns the request + httpReq = httpReq.WithContext(httpCtx) // perform HTTP transaction httpResp, httpRespBody, err := t.httpTransaction( @@ -315,7 +352,7 @@ func (t *SecureFlow) urlHost(scheme string) (string, error) { } // newHTTPRequest creates a new HTTP request. -func (t *SecureFlow) newHTTPRequest(ctx context.Context) (*http.Request, error) { +func (t *SecureFlow) newHTTPRequest() (*http.Request, error) { const urlScheme = "https" urlHost, err := t.urlHost(urlScheme) if err != nil { @@ -327,7 +364,7 @@ func (t *SecureFlow) newHTTPRequest(ctx context.Context) (*http.Request, error) Path: t.URLPath, RawQuery: t.URLRawQuery, } - httpReq, err := http.NewRequestWithContext(ctx, "GET", httpURL.String(), nil) + httpReq, err := http.NewRequest("GET", httpURL.String(), nil) if err != nil { return nil, err } @@ -354,7 +391,8 @@ func (t *SecureFlow) httpTransaction(ctx context.Context, network, address, alpn // start at the beginning of the flow rather than here. If we start it at the // beginning this is nicer, but, at the same time, starting it at the beginning // of the flow means we're not collecting information about DNS. So, I am a - // bit torn about what is the best approach to follow here. + // bit torn about what is the best approach to follow here. Maybe it does not + // even matter to emit transaction_start/end events given that we have transaction ID. t.TestKeys.AppendNetworkEvents(measurexlite.NewAnnotationArchivalNetworkEvent( trace.Index(), started, "http_transaction_start", )) diff --git a/internal/experiment/webconnectivityqa/redirect.go b/internal/experiment/webconnectivityqa/redirect.go index 03b5656f4..199314cc6 100644 --- a/internal/experiment/webconnectivityqa/redirect.go +++ b/internal/experiment/webconnectivityqa/redirect.go @@ -11,7 +11,7 @@ import ( func redirectWithConsistentDNSAndThenConnectionRefusedForHTTP() *TestCase { return &TestCase{ Name: "redirectWithConsistentDNSAndThenConnectionRefusedForHTTP", - Flags: 0, // BUG: LTE thinks this website is accessible (WTF?!) + Flags: 0, Input: "https://bit.ly/32447", Configure: func(env *netemx.QAEnv) { @@ -37,7 +37,7 @@ func redirectWithConsistentDNSAndThenConnectionRefusedForHTTP() *TestCase { HTTPExperimentFailure: "connection_refused", XStatus: 8320, // StatusExperimentHTTP | StatusAnomalyConnect XDNSFlags: 0, - XBlockingFlags: 32, // analysisFlagSuccess + XBlockingFlags: 8, // analysisFlagHTTPBlocking Accessible: false, Blocking: "http-failure", }, From ad757147fd9aeca479ef403373cfb6dc64218d6a Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 15:39:27 +0100 Subject: [PATCH 09/66] resolve one more test case --- internal/experiment/webconnectivityqa/redirect.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/experiment/webconnectivityqa/redirect.go b/internal/experiment/webconnectivityqa/redirect.go index 199314cc6..f2c50beb9 100644 --- a/internal/experiment/webconnectivityqa/redirect.go +++ b/internal/experiment/webconnectivityqa/redirect.go @@ -49,7 +49,7 @@ func redirectWithConsistentDNSAndThenConnectionRefusedForHTTP() *TestCase { func redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS() *TestCase { return &TestCase{ Name: "redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS", - Flags: TestCaseFlagNoLTE, // BUG: LTE thinks this website is accessible (WTF?!) + Flags: 0, Input: "https://bit.ly/21645", Configure: func(env *netemx.QAEnv) { @@ -75,7 +75,7 @@ func redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS() *TestCase { HTTPExperimentFailure: "connection_refused", XStatus: 8320, // StatusExperimentHTTP | StatusAnomalyConnect XDNSFlags: 0, - XBlockingFlags: 32, // analysisFlagSuccess + XBlockingFlags: 8, // analysisFlagHTTPBlocking Accessible: false, Blocking: "http-failure", }, From d6cbfd996c13c871f3ecc3cba56108c7b619422c Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 15:59:58 +0100 Subject: [PATCH 10/66] more fixes --- .../experiment/webconnectivityqa/redirect.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/internal/experiment/webconnectivityqa/redirect.go b/internal/experiment/webconnectivityqa/redirect.go index f2c50beb9..248a3c29e 100644 --- a/internal/experiment/webconnectivityqa/redirect.go +++ b/internal/experiment/webconnectivityqa/redirect.go @@ -125,7 +125,7 @@ func redirectWithConsistentDNSAndThenConnectionResetForHTTP() *TestCase { func redirectWithConsistentDNSAndThenConnectionResetForHTTPS() *TestCase { return &TestCase{ Name: "redirectWithConsistentDNSAndThenConnectionResetForHTTPS", - Flags: TestCaseFlagNoLTE, // BUG: LTE thinks this website is accessible (WTF?!) + Flags: 0, Input: "https://bit.ly/21645", Configure: func(env *netemx.QAEnv) { @@ -162,8 +162,12 @@ func redirectWithConsistentDNSAndThenConnectionResetForHTTPS() *TestCase { // works but then there's NXDOMAIN for the URL's domain func redirectWithConsistentDNSAndThenNXDOMAIN() *TestCase { return &TestCase{ - Name: "redirectWithConsistentDNSAndThenNXDOMAIN", - Flags: TestCaseFlagNoLTE, // BUG: LTE thinks this website is accessible (WTF?!) + Name: "redirectWithConsistentDNSAndThenNXDOMAIN", + // TODO(bassosimone): this test case cannot be fixed by providing a suitable HTTP + // response because we do not create any HTTP response during the DNS step. We would + // need to create one in order for this test case to become green. In turn, I think + // to overcome this case, we need to restructure LTE's implementation a bit. + Flags: TestCaseFlagNoLTE, Input: "https://bit.ly/21645", Configure: func(env *netemx.QAEnv) { @@ -232,7 +236,7 @@ func redirectWithConsistentDNSAndThenEOFForHTTP() *TestCase { func redirectWithConsistentDNSAndThenEOFForHTTPS() *TestCase { return &TestCase{ Name: "redirectWithConsistentDNSAndThenEOFForHTTPS", - Flags: TestCaseFlagNoLTE, // BUG: LTE thinks this website is accessible (WTF?!) + Flags: 0, // BUG: LTE thinks this website is accessible (WTF?!) Input: "https://bit.ly/21645", Configure: func(env *netemx.QAEnv) { @@ -258,7 +262,7 @@ func redirectWithConsistentDNSAndThenEOFForHTTPS() *TestCase { HTTPExperimentFailure: "eof_error", XStatus: 8448, // StatusExperimentHTTP | StatusAnomalyReadWrite XDNSFlags: 0, - XBlockingFlags: 32, // analysisFlagSuccess + XBlockingFlags: 8, // analysisFlagHTTPBlocking Accessible: false, Blocking: "http-failure", }, @@ -309,7 +313,7 @@ func redirectWithConsistentDNSAndThenTimeoutForHTTP() *TestCase { func redirectWithConsistentDNSAndThenTimeoutForHTTPS() *TestCase { return &TestCase{ Name: "redirectWithConsistentDNSAndThenTimeoutForHTTPS", - Flags: TestCaseFlagNoLTE, // BUG: LTE thinks this website is accessible (WTF?!) + Flags: 0, // BUG: LTE thinks this website is accessible (WTF?!) Input: "https://bit.ly/21645", LongTest: true, Configure: func(env *netemx.QAEnv) { @@ -336,7 +340,7 @@ func redirectWithConsistentDNSAndThenTimeoutForHTTPS() *TestCase { HTTPExperimentFailure: "generic_timeout_error", XStatus: 8704, // StatusExperimentHTTP | StatusAnomalyUnknown XDNSFlags: 0, - XBlockingFlags: 32, // analysisFlagSuccess + XBlockingFlags: 8, // analysisFlagHTTPBlocking Accessible: false, Blocking: "http-failure", }, From 41fbd3f280215e625fc353278fba42f34f0c0c47 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 16:10:53 +0100 Subject: [PATCH 11/66] doc: explain issues caused by adding HTTP response We're introducing failure modes that do not exist hence it seems this is not the correct way of moving forward. --- internal/experiment/webconnectivityqa/tcpblocking.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/experiment/webconnectivityqa/tcpblocking.go b/internal/experiment/webconnectivityqa/tcpblocking.go index dc568f9d1..9bc89515e 100644 --- a/internal/experiment/webconnectivityqa/tcpblocking.go +++ b/internal/experiment/webconnectivityqa/tcpblocking.go @@ -11,7 +11,11 @@ import ( // where the connection is timed out. func tcpBlockingConnectTimeout() *TestCase { return &TestCase{ - Name: "tcpBlockingConnectTimeout", + Name: "tcpBlockingConnectTimeout", + // TODO(bassosimone): this test case transitions from 2 (TCP/IP blocking) to + // 10 (both TCP/IP blocking and HTTP blocking). The reason why this happens is + // that we're now adding an HTTP request to the mix. This is unfortunate. We + // should not flag HTTP failures here inside of the bitmask. Flags: 0, Input: "https://www.example.com/", Configure: func(env *netemx.QAEnv) { From e5e4c3756bdcbc200d3f282bbf03263a38b341bf Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Thu, 23 Nov 2023 23:36:43 +0100 Subject: [PATCH 12/66] try to sketch out an ooni/data-inspired pipeline I'm doing this mainly to explore whether we could have more robust webconnectivity v0.5 analysis code --- internal/pipeline/canonical.go | 42 ++++ internal/pipeline/db.go | 185 ++++++++++++++++ internal/pipeline/dns.go | 78 +++++++ internal/pipeline/headers.go | 12 + internal/pipeline/qa_test.go | 39 ++++ internal/pipeline/testdata/youtube.json | 1 + internal/pipeline/testdata/youtube_db.json | 1 + internal/pipeline/th.go | 152 +++++++++++++ internal/pipeline/web.go | 246 +++++++++++++++++++++ 9 files changed, 756 insertions(+) create mode 100644 internal/pipeline/canonical.go create mode 100644 internal/pipeline/db.go create mode 100644 internal/pipeline/dns.go create mode 100644 internal/pipeline/headers.go create mode 100644 internal/pipeline/qa_test.go create mode 100644 internal/pipeline/testdata/youtube.json create mode 100644 internal/pipeline/testdata/youtube_db.json create mode 100644 internal/pipeline/th.go create mode 100644 internal/pipeline/web.go diff --git a/internal/pipeline/canonical.go b/internal/pipeline/canonical.go new file mode 100644 index 000000000..39fe839a5 --- /dev/null +++ b/internal/pipeline/canonical.go @@ -0,0 +1,42 @@ +package pipeline + +import ( + "github.com/ooni/probe-cli/v3/internal/model" + "github.com/ooni/probe-cli/v3/internal/optional" +) + +// CanonicalMeasurement is the canonical measurement structure assumed +// by the probe-engine data processing pipeline. +type CanonicalMeasurement struct { + // Input contains the input we measured. + Input string `json:"input"` + + // TestKeys contains the test-specific measurements. + TestKeys optional.Value[*CanonicalTestKeys] `json:"test_keys"` +} + +// CanonicalTestKeys is the canonical container for observations +// generated by most OONI experiments. This is the data format ingested +// by this package for generating, e.g., [*WebEndpointObservations] +type CanonicalTestKeys struct { + // Control contains the OPTIONAL TH response. + Control optional.Value[*model.THResponse] `json:"control"` + + // NetworkEvents contains I/O events. + NetworkEvents []*model.ArchivalNetworkEvent `json:"network_events"` + + // Queries contains the DNS queries results. + Queries []*model.ArchivalDNSLookupResult `json:"queries"` + + // Requests contains HTTP request results. + Requests []*model.ArchivalHTTPRequestResult `json:"requests"` + + // TCPConnect contains the TCP connect results. + TCPConnect []*model.ArchivalTCPConnectResult `json:"tcp_connect"` + + // TLSHandshakes contains the TLS handshakes results. + TLSHandshakes []*model.ArchivalTLSOrQUICHandshakeResult `json:"tls_handshakes"` + + // QUICHandshakes contains the QUIC handshakes results. + QUICHandshakes []*model.ArchivalTLSOrQUICHandshakeResult `json:"quic_handshakes"` +} diff --git a/internal/pipeline/db.go b/internal/pipeline/db.go new file mode 100644 index 000000000..b13a7ef67 --- /dev/null +++ b/internal/pipeline/db.go @@ -0,0 +1,185 @@ +package pipeline + +import ( + "errors" + "net/url" + + "github.com/ooni/probe-cli/v3/internal/optional" +) + +// DB is a database containing observations. +// +// This struct is not goroutine safe. The zero value is invalid. Use the +// [NewDB] to construct a valid instance. +type DB struct { + dnsByTxID map[int64]*DNSObservation + thDNSAddrs map[string]bool + thDNSFailure *string + thEpntByEpnt map[string]*EndpointObservationTH + thWeb optional.Value[*WebObservationTH] + urlHostname string + webByTxID map[int64]*WebEndpointObservation + webFinalRequest optional.Value[*WebEndpointObservation] +} + +// NewObservationsDB constructs a new [*DB] instance. +func NewDB() *DB { + return &DB{ + dnsByTxID: map[int64]*DNSObservation{}, + thDNSAddrs: map[string]bool{}, + thDNSFailure: nil, + thEpntByEpnt: map[string]*EndpointObservationTH{}, + thWeb: optional.None[*WebObservationTH](), + urlHostname: "", + webByTxID: map[int64]*WebEndpointObservation{}, + webFinalRequest: optional.None[*WebEndpointObservation](), + } +} + +// Ingest ingests measurement results and populates the database. +func (db *DB) Ingest(m *CanonicalMeasurement) error { + // Extra the hostname from the input URL + URL, err := url.Parse(m.Input) + if err != nil { + return err + } + db.urlHostname = URL.Hostname() + + // Obtain the test keys or stop early + tk := m.TestKeys.UnwrapOr(nil) + if tk == nil { + return nil + } + + // Build knowledge about existing TCP endpoints + if err := db.addNetworkEventsTCPConnect(tk.NetworkEvents...); err != nil { + return err + } + if err := db.addTLSHandshakeEvents(tk.TLSHandshakes...); err != nil { + return err + } + + // Build knowledge about QUIC endpoints + if err := db.addQUICHandshakeEvents(tk.QUICHandshakes...); err != nil { + return err + } + + // Enrich dataset with HTTP round trips information + if err := db.addHTTPRoundTrips(tk.Requests...); err != nil { + return err + } + + // Build knowledge about DNS lookups. + if err := db.addDNSLookups(tk.Queries...); err != nil { + return err + } + + // Process a control response if available + if thResp := tk.Control.UnwrapOr(nil); thResp != nil { + // Add DNS results first + if err := db.thAddDNS(thResp); err != nil { + return err + } + + // Then create TCP connect entries + if err := db.thAddTCPConnect(thResp); err != nil { + return err + } + + // Then extend information using TLS + if err := db.thAddTLSHandshake(thResp); err != nil { + return err + } + + // Finally, add information about HTTP + if err := db.thAddHTTPResponse(thResp); err != nil { + return err + } + } + + // Cross reference data structures. + db.buildXrefsDNS() + db.buildXrefTH() + if err := db.maybeFindFinalRequest(); err != nil { + return err + } + + return nil +} + +func (db *DB) buildXrefsDNS() { + // map addresses to who resolved them + addrToGetaddrinfo := make(map[string][]*DNSObservation) + addrToUDP := make(map[string][]*DNSObservation) + addrToHTTPS := make(map[string][]*DNSObservation) + for _, dobs := range db.dnsByTxID { + switch dobs.Engine { + case "system", "getaddrinfo", "golang_net_resolver", "go": + for _, addr := range dobs.IPAddrs { + addrToGetaddrinfo[addr] = append(addrToGetaddrinfo[addr], dobs) + } + + case "udp": + for _, addr := range dobs.IPAddrs { + addrToUDP[addr] = append(addrToUDP[addr], dobs) + } + + case "doh": + for _, addr := range dobs.IPAddrs { + addrToHTTPS[addr] = append(addrToHTTPS[addr], dobs) + } + } + } + + // create cross references inside the endpoints + for _, wobs := range db.webByTxID { + wobs.DNSLookupGetaddrinfoXref = addrToGetaddrinfo[wobs.IPAddress] + wobs.DNSLookupUDPXref = addrToUDP[wobs.IPAddress] + wobs.DNSLookupHTTPSXref = addrToHTTPS[wobs.IPAddress] + } +} + +func (db *DB) buildXrefTH() { + for _, wobs := range db.webByTxID { + // create cross references with TH DNS lookups + _, ok := db.thDNSAddrs[wobs.IPAddress] + wobs.DNSLookupTHXref = ok + + // create cross references with TH endpoints + if xref, ok := db.thEpntByEpnt[wobs.Endpoint]; ok { + wobs.THEndpointXref = optional.Some(xref) + } + } +} + +var errMultipleFinalRequests = errors.New("analysis: multiple final requests") + +func (db *DB) maybeFindFinalRequest() error { + // find all the possible final request candidates + var finals []*WebEndpointObservation + for _, wobs := range db.webByTxID { + switch code := wobs.HTTPResponseStatusCode.UnwrapOr(0); code { + case 0, 301, 302, 307, 308: + // this is a redirect or a nonexisting response in the case of zero + + default: + // found candidate + finals = append(finals, wobs) + } + } + + // Implementation note: the final request is a request that is not a redirect and + // we expect to see just one of them. This code is written assuming we will have + // more than a final request in the future and to fail in such a case. + switch { + case len(finals) > 1: + return errMultipleFinalRequests + + case len(finals) == 1: + db.webFinalRequest = optional.Some(finals[0]) + return nil + + default: + return nil + } +} diff --git a/internal/pipeline/dns.go b/internal/pipeline/dns.go new file mode 100644 index 000000000..55638ee0b --- /dev/null +++ b/internal/pipeline/dns.go @@ -0,0 +1,78 @@ +package pipeline + +import ( + "github.com/ooni/probe-cli/v3/internal/model" +) + +// DNSObservation is a DNS observation made by the probe. +// +// Optional values represent data that may not be there if we do not +// find the expected events. Non-optional data should always be there. +// +// This type is inspired by and adapted from https://github.com/ooni/data +// and adapts the WebObservation type to probe-engine. +type DNSObservation struct { + // TransactionID is the ID of the transaction. + TransactionID int64 + + // QueryType is the DNS query type (e.g., "A"). + QueryType string + + // Failure is the failure that occurred. + Failure *string + + // Engine is the engined used by the probe to lookup. + Engine string + + // ResolverAddress contains the resolver endpoint address. + ResolverAddress string + + // IPAddrs contains the resolved IP addresses. + IPAddrs []string + + // T0 is when we started performing the lookup. + T0 float64 + + // T is when the lookup completed. + T float64 +} + +func (db *DB) addDNSLookups(evs ...*model.ArchivalDNSLookupResult) error { + for _, ev := range evs { + dobs, err := db.newDNSObservation(ev.TransactionID) + if err != nil { + return err + } + dobs.QueryType = ev.QueryType + dobs.Failure = ev.Failure + dobs.Engine = ev.Engine + dobs.ResolverAddress = ev.ResolverAddress + dobs.T0 = ev.T0 + dobs.T = ev.T + + for _, ans := range ev.Answers { + switch ans.AnswerType { + case "A": + dobs.IPAddrs = append(dobs.IPAddrs, ans.IPv4) + + case "AAAA": + dobs.IPAddrs = append(dobs.IPAddrs, ans.IPv6) + + default: + // nothing + } + } + } + return nil +} + +func (db *DB) newDNSObservation(txid int64) (*DNSObservation, error) { + if _, good := db.webByTxID[txid]; good { + return nil, errTransactionAlreadyExists + } + dobs := &DNSObservation{ + TransactionID: txid, + } + db.dnsByTxID[txid] = dobs + return dobs, nil +} diff --git a/internal/pipeline/headers.go b/internal/pipeline/headers.go new file mode 100644 index 000000000..1a838efdc --- /dev/null +++ b/internal/pipeline/headers.go @@ -0,0 +1,12 @@ +package pipeline + +// HeaderOrigin indicates the header origin +type HeaderOrigin int64 + +const ( + // HeaderOriginProbe indicates that the header was seen by the probe + HeaderOriginProbe = HeaderOrigin(1 << iota) + + // HeaderOriginTH indicates that the header was seen by the TH + HeaderOriginTH +) diff --git a/internal/pipeline/qa_test.go b/internal/pipeline/qa_test.go new file mode 100644 index 000000000..466938979 --- /dev/null +++ b/internal/pipeline/qa_test.go @@ -0,0 +1,39 @@ +package pipeline + +import ( + "fmt" + "path/filepath" + + "github.com/ooni/probe-cli/v3/internal/must" + "github.com/ooni/probe-cli/v3/internal/optional" + "github.com/ooni/probe-cli/v3/internal/runtimex" +) + +type flatDB struct { + XdnsByTxID map[int64]*DNSObservation + XthEpntByEpnt map[string]*EndpointObservationTH + XthWeb optional.Value[*WebObservationTH] + XwebByTxID map[int64]*WebEndpointObservation +} + +func Example() { + rawJSON := must.ReadFile(filepath.Join("testdata", "youtube.json")) + var meas CanonicalMeasurement + must.UnmarshalJSON(rawJSON, &meas) + + db := NewDB() + runtimex.Try0(db.Ingest(&meas)) + + fdb := &flatDB{ + XdnsByTxID: db.dnsByTxID, + XthEpntByEpnt: db.thEpntByEpnt, + XthWeb: db.thWeb, + XwebByTxID: db.webByTxID, + } + rawDB := must.MarshalJSON(fdb) + must.WriteFile(filepath.Join("testdata", "youtube_db.json"), rawDB, 0600) + + fmt.Printf("true\n") + // Output: + // true +} diff --git a/internal/pipeline/testdata/youtube.json b/internal/pipeline/testdata/youtube.json new file mode 100644 index 000000000..f19a0cfea --- /dev/null +++ b/internal/pipeline/testdata/youtube.json @@ -0,0 +1 @@ +{"annotations":{"architecture":"arm64","engine_name":"ooniprobe-engine","engine_version":"3.20.0-alpha","go_version":"go1.20.11","platform":"macos","vcs_modified":"true","vcs_revision":"41fbd3f280215e625fc353278fba42f34f0c0c47","vcs_time":"2023-11-23T15:10:53Z","vcs_tool":"git"},"data_format_version":"0.2.0","extensions":{"dnst":0,"httpt":0,"netevents":0,"tcpconnect":0,"tlshandshake":0,"tunnel":0},"input":"https://www.youtube.com/","measurement_start_time":"2023-11-23 18:26:42","probe_asn":"AS30722","probe_cc":"IT","probe_ip":"127.0.0.1","probe_network_name":"Vodafone Italia S.p.A.","report_id":"20231123T182642Z_webconnectivity_IT_30722_n1_KHv4e5lLWrluBMke","resolver_asn":"AS30722","resolver_ip":"91.80.36.88","resolver_network_name":"Vodafone Italia S.p.A.","software_name":"miniooni","software_version":"3.20.0-alpha","test_helpers":{"backend":{"address":"https://2.th.ooni.org","type":"https"}},"test_keys":{"agent":"redirect","client_resolver":"","retries":null,"socksproxy":null,"network_events":[{"address":"216.58.209.46:443","failure":null,"operation":"connect","proto":"tcp","t0":0.396053,"t":0.411923,"transaction_id":7},{"failure":null,"operation":"tls_handshake_start","t0":0.411989,"t":0.411989,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.412338,"t":0.412402,"transaction_id":7},{"address":"142.251.209.46:443","failure":null,"operation":"connect","proto":"tcp","t0":0.395832,"t":0.413203,"transaction_id":6},{"failure":null,"operation":"tls_handshake_start","t0":0.41324,"t":0.41324,"transaction_id":6},{"address":"142.251.209.46:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.413554,"t":0.41359,"transaction_id":6},{"address":"[2a00:1450:4002:402::200e]:443","failure":null,"operation":"connect","proto":"tcp","t0":0.395951,"t":0.415468,"transaction_id":13},{"failure":null,"operation":"tls_handshake_start","t0":0.415515,"t":0.415515,"transaction_id":13},{"address":"142.250.180.174:443","failure":null,"operation":"connect","proto":"tcp","t0":0.39635,"t":0.41553,"transaction_id":4},{"failure":null,"operation":"tls_handshake_start","t0":0.415573,"t":0.415573,"transaction_id":4},{"address":"[2a00:1450:4002:402::200e]:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.415824,"t":0.415886,"transaction_id":13},{"address":"142.250.180.174:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.415893,"t":0.415931,"transaction_id":4},{"address":"[2a00:1450:4002:403::200e]:443","failure":null,"operation":"connect","proto":"tcp","t0":0.396408,"t":0.416441,"transaction_id":9},{"failure":null,"operation":"tls_handshake_start","t0":0.416468,"t":0.416468,"transaction_id":9},{"address":"[2a00:1450:4002:416::200e]:443","failure":null,"operation":"connect","proto":"tcp","t0":0.396461,"t":0.416484,"transaction_id":11},{"failure":null,"operation":"tls_handshake_start","t0":0.416512,"t":0.416512,"transaction_id":11},{"address":"[2a00:1450:4002:403::200e]:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.416766,"t":0.416797,"transaction_id":9},{"address":"[2a00:1450:4002:416::200e]:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.416866,"t":0.416917,"transaction_id":11},{"address":"[2a00:1450:4002:410::200e]:443","failure":null,"operation":"connect","proto":"tcp","t0":0.396471,"t":0.417629,"transaction_id":10},{"failure":null,"operation":"tls_handshake_start","t0":0.417656,"t":0.417656,"transaction_id":10},{"address":"[2a00:1450:4002:410::200e]:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.417959,"t":0.417998,"transaction_id":10},{"address":"142.250.180.142:443","failure":null,"operation":"connect","proto":"tcp","t0":0.396707,"t":0.418861,"transaction_id":15},{"failure":null,"operation":"tls_handshake_start","t0":0.418894,"t":0.418894,"transaction_id":15},{"address":"[2a00:1450:4002:414::200e]:443","failure":null,"operation":"connect","proto":"tcp","t0":0.396723,"t":0.418956,"transaction_id":12},{"failure":null,"operation":"tls_handshake_start","t0":0.419044,"t":0.419044,"transaction_id":12},{"address":"142.250.180.142:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.419204,"t":0.41925,"transaction_id":15},{"address":"[2a00:1450:4002:414::200e]:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.419413,"t":0.419449,"transaction_id":12},{"address":"216.58.204.142:443","failure":null,"operation":"connect","proto":"tcp","t0":0.395722,"t":0.419464,"transaction_id":8},{"address":"142.251.209.14:443","failure":null,"operation":"connect","proto":"tcp","t0":0.395747,"t":0.41948,"transaction_id":14},{"failure":null,"operation":"tls_handshake_start","t0":0.419487,"t":0.419487,"transaction_id":8},{"failure":null,"operation":"tls_handshake_start","t0":0.419504,"t":0.419504,"transaction_id":14},{"address":"142.251.209.14:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.41981,"t":0.419836,"transaction_id":14},{"address":"216.58.204.142:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.419801,"t":0.419839,"transaction_id":8},{"address":"216.58.205.46:443","failure":null,"operation":"connect","proto":"tcp","t0":0.395701,"t":0.421933,"transaction_id":5},{"failure":null,"operation":"tls_handshake_start","t0":0.421961,"t":0.421961,"transaction_id":5},{"address":"216.58.205.46:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":0.422255,"t":0.422299,"transaction_id":5},{"address":"216.58.209.46:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.412412,"t":0.444687,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2224,"operation":"read","proto":"tcp","t0":0.445023,"t":0.445031,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":3969,"operation":"read","proto":"tcp","t0":0.445033,"t":0.446059,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.452279,"t":0.452314,"transaction_id":7},{"failure":null,"operation":"tls_handshake_done","t0":0.452334,"t":0.452334,"transaction_id":7},{"address":"[2a00:1450:4002:402::200e]:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.415892,"t":0.45237,"transaction_id":13},{"address":"142.251.209.46:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.413594,"t":0.452384,"transaction_id":6},{"failure":null,"operation":"http_transaction_start","t0":0.452397,"t":0.452397,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":86,"operation":"write","proto":"tcp","t0":0.452463,"t":0.452487,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":199,"operation":"write","proto":"tcp","t0":0.452536,"t":0.452557,"transaction_id":7},{"address":"[2a00:1450:4002:402::200e]:443","failure":null,"num_bytes":632,"operation":"read","proto":"tcp","t0":0.452644,"t":0.452651,"transaction_id":13},{"address":"142.251.209.46:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":0.452634,"t":0.452664,"transaction_id":6},{"address":"142.250.180.174:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.415939,"t":0.453985,"transaction_id":4},{"address":"142.250.180.174:443","failure":null,"num_bytes":6195,"operation":"read","proto":"tcp","t0":0.454166,"t":0.454201,"transaction_id":4},{"address":"[2a00:1450:4002:416::200e]:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.416924,"t":0.455605,"transaction_id":11},{"address":"[2a00:1450:4002:410::200e]:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.418002,"t":0.455612,"transaction_id":10},{"address":"[2a00:1450:4002:403::200e]:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.416801,"t":0.455612,"transaction_id":9},{"address":"[2a00:1450:4002:402::200e]:443","failure":null,"num_bytes":5563,"operation":"read","proto":"tcp","t0":0.452654,"t":0.455644,"transaction_id":13},{"address":"[2a00:1450:4002:416::200e]:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":0.455781,"t":0.455817,"transaction_id":11},{"address":"[2a00:1450:4002:410::200e]:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":0.455829,"t":0.455856,"transaction_id":10},{"address":"[2a00:1450:4002:403::200e]:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":0.45582,"t":0.455856,"transaction_id":9},{"address":"142.251.209.14:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.419839,"t":0.457647,"transaction_id":14},{"address":"142.250.180.142:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.419255,"t":0.457651,"transaction_id":15},{"address":"142.251.209.14:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":0.458566,"t":0.458591,"transaction_id":14},{"address":"142.250.180.142:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":0.459027,"t":0.459351,"transaction_id":15},{"address":"216.58.205.46:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.422303,"t":0.459863,"transaction_id":5},{"address":"216.58.205.46:443","failure":null,"num_bytes":6193,"operation":"read","proto":"tcp","t0":0.460035,"t":0.460066,"transaction_id":5},{"address":"142.251.209.46:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.460464,"t":0.460497,"transaction_id":6},{"failure":null,"operation":"tls_handshake_done","t0":0.460508,"t":0.460508,"transaction_id":6},{"address":"216.58.204.142:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.419846,"t":0.460664,"transaction_id":8},{"address":"216.58.204.142:443","failure":null,"num_bytes":824,"operation":"read","proto":"tcp","t0":0.460844,"t":0.460847,"transaction_id":8},{"address":"142.250.180.174:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.461245,"t":0.461271,"transaction_id":4},{"failure":null,"operation":"tls_handshake_done","t0":0.461278,"t":0.461278,"transaction_id":4},{"address":"216.58.204.142:443","failure":null,"num_bytes":5370,"operation":"read","proto":"tcp","t0":0.460849,"t":0.461315,"transaction_id":8},{"address":"[2a00:1450:4002:416::200e]:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.462249,"t":0.462299,"transaction_id":11},{"failure":null,"operation":"tls_handshake_done","t0":0.462307,"t":0.462307,"transaction_id":11},{"address":"[2a00:1450:4002:414::200e]:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.41947,"t":0.462355,"transaction_id":12},{"address":"[2a00:1450:4002:410::200e]:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.462465,"t":0.462498,"transaction_id":10},{"failure":null,"operation":"tls_handshake_done","t0":0.462505,"t":0.462505,"transaction_id":10},{"address":"[2a00:1450:4002:414::200e]:443","failure":null,"num_bytes":6195,"operation":"read","proto":"tcp","t0":0.462549,"t":0.462605,"transaction_id":12},{"address":"[2a00:1450:4002:403::200e]:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.462844,"t":0.462876,"transaction_id":9},{"failure":null,"operation":"tls_handshake_done","t0":0.46288,"t":0.46288,"transaction_id":9},{"address":"[2a00:1450:4002:402::200e]:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.463203,"t":0.463226,"transaction_id":13},{"failure":null,"operation":"tls_handshake_done","t0":0.463236,"t":0.463236,"transaction_id":13},{"address":"142.251.209.14:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.464897,"t":0.464921,"transaction_id":14},{"failure":null,"operation":"tls_handshake_done","t0":0.464932,"t":0.464932,"transaction_id":14},{"address":"142.250.180.142:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.464975,"t":0.464999,"transaction_id":15},{"failure":null,"operation":"tls_handshake_done","t0":0.465008,"t":0.465008,"transaction_id":15},{"address":"216.58.205.46:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.465288,"t":0.465319,"transaction_id":5},{"failure":null,"operation":"tls_handshake_done","t0":0.465331,"t":0.465331,"transaction_id":5},{"address":"216.58.204.142:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.46631,"t":0.46633,"transaction_id":8},{"failure":null,"operation":"tls_handshake_done","t0":0.466341,"t":0.466341,"transaction_id":8},{"address":"[2a00:1450:4002:414::200e]:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":0.467377,"t":0.467396,"transaction_id":12},{"failure":null,"operation":"tls_handshake_done","t0":0.467401,"t":0.467401,"transaction_id":12},{"address":"216.58.209.46:443","failure":null,"num_bytes":62,"operation":"read","proto":"tcp","t0":0.452619,"t":0.469035,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":31,"operation":"write","proto":"tcp","t0":0.46905,"t":0.46907,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":31,"operation":"read","proto":"tcp","t0":0.469075,"t":0.469857,"transaction_id":7},{"address":"142.251.209.46:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.470765,"t":0.470787,"transaction_id":6},{"address":"142.251.209.46:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.470819,"t":0.470819,"transaction_id":6},{"address":"142.250.180.174:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.471495,"t":0.471518,"transaction_id":4},{"address":"142.250.180.174:443","failure":null,"num_bytes":6771,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.471544,"t":0.471544,"transaction_id":4},{"address":"[2a00:1450:4002:416::200e]:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.47244,"t":0.472467,"transaction_id":11},{"address":"[2a00:1450:4002:416::200e]:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.472493,"t":0.472493,"transaction_id":11},{"address":"[2a00:1450:4002:410::200e]:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.472618,"t":0.472642,"transaction_id":10},{"address":"[2a00:1450:4002:410::200e]:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.47267,"t":0.47267,"transaction_id":10},{"address":"[2a00:1450:4002:403::200e]:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.472952,"t":0.472964,"transaction_id":9},{"address":"[2a00:1450:4002:403::200e]:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.472984,"t":0.472984,"transaction_id":9},{"address":"[2a00:1450:4002:402::200e]:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.47339,"t":0.473421,"transaction_id":13},{"address":"[2a00:1450:4002:402::200e]:443","failure":null,"num_bytes":6771,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.473447,"t":0.473447,"transaction_id":13},{"address":"142.251.209.14:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.475056,"t":0.47508,"transaction_id":14},{"address":"142.250.180.142:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.475067,"t":0.475087,"transaction_id":15},{"address":"142.251.209.14:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.475109,"t":0.475109,"transaction_id":14},{"address":"142.250.180.142:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.47512,"t":0.47512,"transaction_id":15},{"address":"216.58.205.46:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.475455,"t":0.475478,"transaction_id":5},{"address":"216.58.205.46:443","failure":null,"num_bytes":6769,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.475508,"t":0.475508,"transaction_id":5},{"address":"216.58.204.142:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.476528,"t":0.47655,"transaction_id":8},{"address":"216.58.204.142:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.476573,"t":0.476573,"transaction_id":8},{"address":"[2a00:1450:4002:414::200e]:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.477592,"t":0.477617,"transaction_id":12},{"address":"[2a00:1450:4002:414::200e]:443","failure":null,"num_bytes":6771,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.477641,"t":0.477641,"transaction_id":12},{"address":"216.58.209.46:443","failure":null,"num_bytes":6862,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.502822,"t":0.502822,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":8192,"operation":"read","proto":"tcp","t0":0.469863,"t":0.534912,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":504,"operation":"read","proto":"tcp","t0":0.53522,"t":0.535257,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2690,"operation":"read","proto":"tcp","t0":0.535265,"t":0.53574,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.535801,"t":0.535843,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":5600,"operation":"read","proto":"tcp","t0":0.535786,"t":0.561208,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":7000,"operation":"read","proto":"tcp","t0":0.561284,"t":0.562438,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":4200,"operation":"read","proto":"tcp","t0":0.562472,"t":0.563639,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.563724,"t":0.563774,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.563801,"t":0.563831,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":4200,"operation":"read","proto":"tcp","t0":0.563704,"t":0.564835,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":4200,"operation":"read","proto":"tcp","t0":0.564858,"t":0.566079,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":5600,"operation":"read","proto":"tcp","t0":0.566098,"t":0.566918,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":1400,"operation":"read","proto":"tcp","t0":0.566941,"t":0.567762,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":1400,"operation":"read","proto":"tcp","t0":0.567775,"t":0.56907,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.569145,"t":0.569186,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.569213,"t":0.569244,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":6792,"operation":"read","proto":"tcp","t0":0.569133,"t":0.57154,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":1608,"operation":"read","proto":"tcp","t0":0.571585,"t":0.571604,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":6506,"operation":"read","proto":"tcp","t0":0.571612,"t":0.574505,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":494,"operation":"read","proto":"tcp","t0":0.574528,"t":0.574557,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":4200,"operation":"read","proto":"tcp","t0":0.574566,"t":0.57568,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.575751,"t":0.575794,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.575815,"t":0.575845,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2306,"operation":"read","proto":"tcp","t0":0.575735,"t":0.579153,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":3294,"operation":"read","proto":"tcp","t0":0.579177,"t":0.579211,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2800,"operation":"read","proto":"tcp","t0":0.579224,"t":0.580004,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":1538,"operation":"read","proto":"tcp","t0":0.580021,"t":0.580636,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2662,"operation":"read","proto":"tcp","t0":0.580647,"t":0.580678,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":1400,"operation":"read","proto":"tcp","t0":0.580692,"t":0.581548,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2938,"operation":"read","proto":"tcp","t0":0.581562,"t":0.582381,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2662,"operation":"read","proto":"tcp","t0":0.582396,"t":0.582428,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.582462,"t":0.582501,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.582518,"t":0.582549,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2800,"operation":"read","proto":"tcp","t0":0.582452,"t":0.583348,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":1400,"operation":"read","proto":"tcp","t0":0.583363,"t":0.583458,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":1400,"operation":"read","proto":"tcp","t0":0.583469,"t":0.584424,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2800,"operation":"read","proto":"tcp","t0":0.58444,"t":0.584746,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2800,"operation":"read","proto":"tcp","t0":0.58476,"t":0.585533,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":7138,"operation":"read","proto":"tcp","t0":0.585547,"t":0.586687,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":1262,"operation":"read","proto":"tcp","t0":0.586727,"t":0.586759,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.586773,"t":0.586853,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.586906,"t":0.586939,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2800,"operation":"read","proto":"tcp","t0":0.586763,"t":0.587878,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2800,"operation":"read","proto":"tcp","t0":0.587893,"t":0.588024,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":1252,"operation":"read","proto":"tcp","t0":0.588039,"t":0.589145,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":4348,"operation":"read","proto":"tcp","t0":0.589157,"t":0.589184,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":2652,"operation":"read","proto":"tcp","t0":0.589201,"t":0.59016,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":148,"operation":"read","proto":"tcp","t0":0.590189,"t":0.590215,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.590239,"t":0.590267,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":35,"operation":"write","proto":"tcp","t0":0.590286,"t":0.590324,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":6852,"operation":"read","proto":"tcp","t0":0.590219,"t":0.591835,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":382486,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.802681,"t":0.802681,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":382486,"operation":"bytes_received_cumulative","proto":"tcp","t0":0.907738,"t":0.907738,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":382486,"operation":"bytes_received_cumulative","proto":"tcp","t0":1.183284,"t":1.183284,"transaction_id":7},{"failure":null,"operation":"http_transaction_done","t0":1.492867,"t":1.492867,"transaction_id":7},{"address":"216.58.209.46:443","failure":null,"num_bytes":599313,"operation":"bytes_received_cumulative","proto":"tcp","t0":1.493554,"t":1.493554,"transaction_id":7},{"address":"142.250.200.46:443","failure":null,"operation":"connect","proto":"tcp","t0":1.8941940000000002,"t":1.9308939999999999,"transaction_id":23},{"failure":null,"operation":"tls_handshake_start","t0":1.930963,"t":1.930963,"transaction_id":23},{"address":"[2a00:1450:4009:81e::200e]:443","failure":null,"operation":"connect","proto":"tcp","t0":1.894023,"t":1.930973,"transaction_id":25},{"failure":null,"operation":"tls_handshake_start","t0":1.9310070000000001,"t":1.9310070000000001,"transaction_id":25},{"address":"[2a00:1450:4009:81e::200e]:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.931243,"t":1.93128,"transaction_id":25},{"address":"142.250.200.46:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.9312390000000001,"t":1.9312909999999999,"transaction_id":23},{"address":"142.250.179.238:443","failure":null,"operation":"connect","proto":"tcp","t0":1.89411,"t":1.931396,"transaction_id":22},{"failure":null,"operation":"tls_handshake_start","t0":1.9314230000000001,"t":1.9314230000000001,"transaction_id":22},{"address":"142.250.179.238:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.931644,"t":1.9316719999999998,"transaction_id":22},{"address":"142.250.200.14:443","failure":null,"operation":"connect","proto":"tcp","t0":1.8946960000000002,"t":1.93338,"transaction_id":20},{"failure":null,"operation":"tls_handshake_start","t0":1.9334069999999999,"t":1.9334069999999999,"transaction_id":20},{"address":"142.250.200.14:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.9336,"t":1.93364,"transaction_id":20},{"address":"216.58.204.78:443","failure":null,"operation":"connect","proto":"tcp","t0":1.89452,"t":1.9342679999999999,"transaction_id":21},{"failure":null,"operation":"tls_handshake_start","t0":1.934302,"t":1.934302,"transaction_id":21},{"address":"216.58.204.78:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.934499,"t":1.934532,"transaction_id":21},{"address":"[2a00:1450:4009:815::200e]:443","failure":null,"operation":"connect","proto":"tcp","t0":1.8944800000000002,"t":1.935353,"transaction_id":31},{"failure":null,"operation":"tls_handshake_start","t0":1.935376,"t":1.935376,"transaction_id":31},{"address":"[2a00:1450:4009:815::200e]:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.935548,"t":1.935583,"transaction_id":31},{"address":"216.58.212.238:443","failure":null,"operation":"connect","proto":"tcp","t0":1.894834,"t":1.936283,"transaction_id":28},{"failure":null,"operation":"tls_handshake_start","t0":1.936303,"t":1.936303,"transaction_id":28},{"address":"142.250.187.238:443","failure":null,"operation":"connect","proto":"tcp","t0":1.894889,"t":1.936306,"transaction_id":26},{"failure":null,"operation":"tls_handshake_start","t0":1.936323,"t":1.936323,"transaction_id":26},{"address":"142.250.187.238:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.936543,"t":1.936576,"transaction_id":26},{"address":"216.58.212.238:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.936541,"t":1.9365839999999999,"transaction_id":28},{"address":"[2a00:1450:4009:81f::200e]:443","failure":null,"operation":"connect","proto":"tcp","t0":1.89456,"t":1.938354,"transaction_id":27},{"failure":null,"operation":"tls_handshake_start","t0":1.9384000000000001,"t":1.9384000000000001,"transaction_id":27},{"address":"[2a00:1450:4009:81f::200e]:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.938599,"t":1.938638,"transaction_id":27},{"address":"172.217.169.14:443","failure":null,"operation":"connect","proto":"tcp","t0":1.89481,"t":1.939539,"transaction_id":16},{"failure":null,"operation":"tls_handshake_start","t0":1.939556,"t":1.939556,"transaction_id":16},{"address":"142.250.187.206:443","failure":null,"operation":"connect","proto":"tcp","t0":1.895168,"t":1.939568,"transaction_id":18},{"failure":null,"operation":"tls_handshake_start","t0":1.939584,"t":1.939584,"transaction_id":18},{"address":"142.250.178.14:443","failure":null,"operation":"connect","proto":"tcp","t0":1.8953090000000001,"t":1.939593,"transaction_id":30},{"failure":null,"operation":"tls_handshake_start","t0":1.939614,"t":1.939614,"transaction_id":30},{"address":"216.58.201.110:443","failure":null,"operation":"connect","proto":"tcp","t0":1.895193,"t":1.939627,"transaction_id":24},{"failure":null,"operation":"tls_handshake_start","t0":1.9396879999999999,"t":1.9396879999999999,"transaction_id":24},{"address":"172.217.169.14:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.939737,"t":1.9397630000000001,"transaction_id":16},{"address":"142.250.187.206:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.939755,"t":1.939785,"transaction_id":18},{"address":"142.250.178.14:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.9398,"t":1.939824,"transaction_id":30},{"address":"216.58.201.110:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.939873,"t":1.939894,"transaction_id":24},{"address":"142.250.180.14:443","failure":null,"operation":"connect","proto":"tcp","t0":1.895467,"t":1.940271,"transaction_id":29},{"failure":null,"operation":"tls_handshake_start","t0":1.94029,"t":1.94029,"transaction_id":29},{"address":"172.217.16.238:443","failure":null,"operation":"connect","proto":"tcp","t0":1.895386,"t":1.940296,"transaction_id":19},{"failure":null,"operation":"tls_handshake_start","t0":1.9403190000000001,"t":1.9403190000000001,"transaction_id":19},{"address":"[2a00:1450:4009:820::200e]:443","failure":null,"operation":"connect","proto":"tcp","t0":1.895162,"t":1.940325,"transaction_id":17},{"failure":null,"operation":"tls_handshake_start","t0":1.940346,"t":1.940346,"transaction_id":17},{"address":"142.250.180.14:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.940475,"t":1.940496,"transaction_id":29},{"address":"172.217.16.238:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.940503,"t":1.940525,"transaction_id":19},{"address":"[2a00:1450:4009:820::200e]:443","failure":null,"num_bytes":281,"operation":"write","proto":"tcp","t0":1.9405350000000001,"t":1.940571,"transaction_id":17},{"address":"142.250.200.14:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.933643,"t":1.976154,"transaction_id":20},{"address":"142.250.200.14:443","failure":null,"num_bytes":6193,"operation":"read","proto":"tcp","t0":1.976648,"t":1.9766979999999998,"transaction_id":20},{"address":"142.250.200.14:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.983985,"t":1.984023,"transaction_id":20},{"failure":null,"operation":"tls_handshake_done","t0":1.984044,"t":1.984044,"transaction_id":20},{"address":"[2a00:1450:4009:815::200e]:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.935586,"t":1.9841069999999998,"transaction_id":31},{"address":"216.58.204.78:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.934535,"t":1.984108,"transaction_id":21},{"address":"216.58.212.238:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.9365860000000001,"t":1.9841090000000001,"transaction_id":28},{"address":"[2a00:1450:4009:81e::200e]:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.931286,"t":1.984115,"transaction_id":25},{"address":"142.250.200.46:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.931297,"t":1.984118,"transaction_id":23},{"address":"216.58.212.238:443","failure":null,"num_bytes":6193,"operation":"read","proto":"tcp","t0":1.984326,"t":1.98435,"transaction_id":28},{"address":"216.58.204.78:443","failure":null,"num_bytes":6193,"operation":"read","proto":"tcp","t0":1.9843250000000001,"t":1.9843549999999999,"transaction_id":21},{"address":"[2a00:1450:4009:815::200e]:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":1.984329,"t":1.984356,"transaction_id":31},{"address":"[2a00:1450:4009:81e::200e]:443","failure":null,"num_bytes":6193,"operation":"read","proto":"tcp","t0":1.984346,"t":1.984372,"transaction_id":25},{"address":"142.250.200.46:443","failure":null,"num_bytes":6193,"operation":"read","proto":"tcp","t0":1.984343,"t":1.984378,"transaction_id":23},{"address":"142.250.179.238:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.931675,"t":1.984474,"transaction_id":22},{"address":"142.250.187.238:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.936579,"t":1.984495,"transaction_id":26},{"address":"142.250.179.238:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":1.984677,"t":1.98469,"transaction_id":22},{"address":"142.250.187.238:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":1.984672,"t":1.984693,"transaction_id":26},{"address":"[2a00:1450:4009:81f::200e]:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.938641,"t":1.987439,"transaction_id":27},{"address":"142.250.187.206:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.939787,"t":1.987447,"transaction_id":18},{"address":"[2a00:1450:4009:81f::200e]:443","failure":null,"num_bytes":1840,"operation":"read","proto":"tcp","t0":1.987971,"t":1.9879769999999999,"transaction_id":27},{"address":"216.58.201.110:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.939897,"t":1.988016,"transaction_id":24},{"address":"142.250.187.206:443","failure":null,"num_bytes":3624,"operation":"read","proto":"tcp","t0":1.988113,"t":1.988134,"transaction_id":18},{"address":"142.250.178.14:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.939827,"t":1.9881760000000002,"transaction_id":30},{"address":"216.58.201.110:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":1.988208,"t":1.9882300000000002,"transaction_id":24},{"address":"142.250.178.14:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":1.988361,"t":1.9883769999999998,"transaction_id":30},{"address":"[2a00:1450:4009:81f::200e]:443","failure":null,"num_bytes":4354,"operation":"read","proto":"tcp","t0":1.987992,"t":1.989522,"transaction_id":27},{"address":"142.250.187.206:443","failure":null,"num_bytes":2569,"operation":"read","proto":"tcp","t0":1.988138,"t":1.9896150000000001,"transaction_id":18},{"address":"142.250.200.46:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.990264,"t":1.990305,"transaction_id":23},{"failure":null,"operation":"tls_handshake_done","t0":1.990323,"t":1.990323,"transaction_id":23},{"address":"142.250.179.238:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.9907460000000001,"t":1.990774,"transaction_id":22},{"failure":null,"operation":"tls_handshake_done","t0":1.990783,"t":1.990783,"transaction_id":22},{"address":"216.58.204.78:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.9908860000000002,"t":1.990907,"transaction_id":21},{"failure":null,"operation":"tls_handshake_done","t0":1.990915,"t":1.990915,"transaction_id":21},{"address":"142.250.180.14:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.940499,"t":1.991041,"transaction_id":29},{"address":"142.250.180.14:443","failure":null,"num_bytes":2224,"operation":"read","proto":"tcp","t0":1.991276,"t":1.991357,"transaction_id":29},{"address":"172.217.169.14:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.939765,"t":1.992352,"transaction_id":16},{"address":"172.217.169.14:443","failure":null,"num_bytes":824,"operation":"read","proto":"tcp","t0":1.992518,"t":1.9925220000000001,"transaction_id":16},{"address":"142.250.180.14:443","failure":null,"num_bytes":2800,"operation":"read","proto":"tcp","t0":1.991362,"t":1.992548,"transaction_id":29},{"address":"216.58.212.238:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.992723,"t":1.992742,"transaction_id":28},{"failure":null,"operation":"tls_handshake_done","t0":1.992747,"t":1.992747,"transaction_id":28},{"address":"172.217.169.14:443","failure":null,"num_bytes":5371,"operation":"read","proto":"tcp","t0":1.992523,"t":1.992777,"transaction_id":16},{"address":"[2a00:1450:4009:81e::200e]:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.993441,"t":1.993474,"transaction_id":25},{"failure":null,"operation":"tls_handshake_done","t0":1.993483,"t":1.993483,"transaction_id":25},{"address":"172.217.16.238:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.940528,"t":1.993511,"transaction_id":19},{"address":"172.217.16.238:443","failure":null,"num_bytes":6195,"operation":"read","proto":"tcp","t0":1.993694,"t":1.993715,"transaction_id":19},{"address":"142.250.187.238:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.993968,"t":1.993989,"transaction_id":26},{"failure":null,"operation":"tls_handshake_done","t0":1.993995,"t":1.993995,"transaction_id":26},{"address":"142.250.180.14:443","failure":null,"num_bytes":1170,"operation":"read","proto":"tcp","t0":1.99255,"t":1.99403,"transaction_id":29},{"address":"[2a00:1450:4009:815::200e]:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.994164,"t":1.9941900000000001,"transaction_id":31},{"failure":null,"operation":"tls_handshake_done","t0":1.994195,"t":1.994195,"transaction_id":31},{"address":"216.58.201.110:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.9949569999999999,"t":1.994982,"transaction_id":24},{"failure":null,"operation":"tls_handshake_done","t0":1.994988,"t":1.994988,"transaction_id":24},{"address":"[2a00:1450:4009:820::200e]:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":1.940574,"t":1.995034,"transaction_id":17},{"address":"142.250.200.14:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":1.9951940000000001,"t":1.9952239999999999,"transaction_id":20},{"address":"142.250.200.14:443","failure":null,"num_bytes":6769,"operation":"bytes_received_cumulative","proto":"tcp","t0":1.9952670000000001,"t":1.9952670000000001,"transaction_id":20},{"address":"142.250.178.14:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.995417,"t":1.9954420000000002,"transaction_id":30},{"failure":null,"operation":"tls_handshake_done","t0":1.995451,"t":1.995451,"transaction_id":30},{"address":"[2a00:1450:4009:820::200e]:443","failure":null,"num_bytes":6194,"operation":"read","proto":"tcp","t0":1.995412,"t":1.995458,"transaction_id":17},{"address":"142.250.187.206:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.995847,"t":1.995884,"transaction_id":18},{"failure":null,"operation":"tls_handshake_done","t0":1.995897,"t":1.995897,"transaction_id":18},{"address":"[2a00:1450:4009:81f::200e]:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.997795,"t":1.997819,"transaction_id":27},{"failure":null,"operation":"tls_handshake_done","t0":1.99783,"t":1.99783,"transaction_id":27},{"address":"172.217.169.14:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.998415,"t":1.9984410000000001,"transaction_id":16},{"failure":null,"operation":"tls_handshake_done","t0":1.99845,"t":1.99845,"transaction_id":16},{"address":"142.250.180.14:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.999146,"t":1.999161,"transaction_id":29},{"failure":null,"operation":"tls_handshake_done","t0":1.999167,"t":1.999167,"transaction_id":29},{"address":"172.217.16.238:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":1.999348,"t":1.999368,"transaction_id":19},{"failure":null,"operation":"tls_handshake_done","t0":1.9993750000000001,"t":1.9993750000000001,"transaction_id":19},{"address":"[2a00:1450:4009:820::200e]:443","failure":null,"num_bytes":64,"operation":"write","proto":"tcp","t0":2.000586,"t":2.000607,"transaction_id":17},{"failure":null,"operation":"tls_handshake_done","t0":2.00063,"t":2.00063,"transaction_id":17},{"address":"142.250.200.46:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.000695,"t":2.000711,"transaction_id":23},{"address":"142.250.200.46:443","failure":null,"num_bytes":6769,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.000737,"t":2.000737,"transaction_id":23},{"address":"142.250.179.238:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.001029,"t":2.001043,"transaction_id":22},{"address":"216.58.204.78:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.001035,"t":2.001054,"transaction_id":21},{"address":"142.250.179.238:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.001071,"t":2.001071,"transaction_id":22},{"address":"216.58.204.78:443","failure":null,"num_bytes":6769,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.001078,"t":2.001078,"transaction_id":21},{"address":"216.58.212.238:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.003056,"t":2.003073,"transaction_id":28},{"address":"216.58.212.238:443","failure":null,"num_bytes":6769,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.0031,"t":2.0031,"transaction_id":28},{"address":"[2a00:1450:4009:81e::200e]:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.003621,"t":2.003639,"transaction_id":25},{"address":"[2a00:1450:4009:81e::200e]:443","failure":null,"num_bytes":6769,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.003663,"t":2.003663,"transaction_id":25},{"address":"142.250.187.238:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.004128,"t":2.004144,"transaction_id":26},{"address":"142.250.187.238:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.004166,"t":2.004166,"transaction_id":26},{"address":"[2a00:1450:4009:815::200e]:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.004277,"t":2.004289,"transaction_id":31},{"address":"[2a00:1450:4009:815::200e]:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.004306,"t":2.004306,"transaction_id":31},{"address":"216.58.201.110:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.005157,"t":2.005184,"transaction_id":24},{"address":"216.58.201.110:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.005205,"t":2.005205,"transaction_id":24},{"address":"142.250.178.14:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.005556,"t":2.005576,"transaction_id":30},{"address":"142.250.178.14:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.005597,"t":2.005597,"transaction_id":30},{"address":"142.250.187.206:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.00602,"t":2.00604,"transaction_id":18},{"address":"142.250.187.206:443","failure":null,"num_bytes":6769,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.006062,"t":2.006062,"transaction_id":18},{"address":"[2a00:1450:4009:81f::200e]:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.008148,"t":2.008177,"transaction_id":27},{"address":"[2a00:1450:4009:81f::200e]:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.008211,"t":2.008211,"transaction_id":27},{"address":"172.217.169.14:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.008565,"t":2.008587,"transaction_id":16},{"address":"172.217.169.14:443","failure":null,"num_bytes":6771,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.008611,"t":2.008611,"transaction_id":16},{"address":"142.250.180.14:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.009316,"t":2.009331,"transaction_id":29},{"address":"142.250.180.14:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.009349,"t":2.009349,"transaction_id":29},{"address":"172.217.16.238:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.009435,"t":2.009456,"transaction_id":19},{"address":"172.217.16.238:443","failure":null,"num_bytes":6771,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.009476,"t":2.009476,"transaction_id":19},{"address":"[2a00:1450:4009:820::200e]:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":2.010851,"t":2.010875,"transaction_id":17},{"address":"[2a00:1450:4009:820::200e]:443","failure":null,"num_bytes":6770,"operation":"bytes_received_cumulative","proto":"tcp","t0":2.010897,"t":2.010897,"transaction_id":17}],"x_dns_whoami":{"system_v4":[{"address":"91.80.36.88"}],"udp_v4":{"8.8.4.4:53":[{"address":"91.80.36.88"}]}},"x_doh":{"network_events":[{"failure":null,"operation":"resolve_start","t0":0.000609,"t":0.000609,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"operation":"connect","proto":"tcp","t0":0.023728,"t":0.052115,"transaction_id":2},{"failure":null,"operation":"tls_handshake_start","t0":0.052202,"t":0.052202,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":279,"operation":"write","proto":"tcp","t0":0.052485,"t":0.052546,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":576,"operation":"read","proto":"tcp","t0":0.052553,"t":0.08022,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":2304,"operation":"read","proto":"tcp","t0":0.080671,"t":0.080683,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":620,"operation":"read","proto":"tcp","t0":0.080687,"t":0.08123,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":80,"operation":"write","proto":"tcp","t0":0.085338,"t":0.085383,"transaction_id":2},{"failure":null,"operation":"tls_handshake_done","t0":0.085411,"t":0.085411,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":86,"operation":"write","proto":"tcp","t0":0.085494,"t":0.085519,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":164,"operation":"write","proto":"tcp","t0":0.085616,"t":0.085639,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":159,"operation":"write","proto":"tcp","t0":0.085651,"t":0.085668,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":38,"operation":"write","proto":"tcp","t0":0.085687,"t":0.085712,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":159,"operation":"write","proto":"tcp","t0":0.085718,"t":0.085738,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":1140,"operation":"read","proto":"tcp","t0":0.085574,"t":0.393895,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":31,"operation":"write","proto":"tcp","t0":0.393976,"t":0.394027,"transaction_id":2},{"failure":null,"operation":"resolve_done","t0":0.394471,"t":0.394471,"transaction_id":2},{"address":"149.112.112.112:443","failure":null,"num_bytes":24,"operation":"write","proto":"tcp","t0":0.394499,"t":0.394539,"transaction_id":2},{"address":"149.112.112.112:443","failure":"connection_already_closed","operation":"read","proto":"tcp","t0":0.394165,"t":0.394637,"transaction_id":2}],"queries":[{"answers":[{"asn":19281,"as_org_name":"Quad9","answer_type":"AAAA","ipv6":"2620:fe::fe","ttl":null},{"asn":19281,"as_org_name":"Quad9","answer_type":"AAAA","ipv6":"2620:fe::9","ttl":null},{"asn":19281,"as_org_name":"Quad9","answer_type":"A","ipv4":"149.112.112.112","ttl":null},{"asn":19281,"as_org_name":"Quad9","answer_type":"A","ipv4":"9.9.9.9","ttl":null},{"answer_type":"CNAME","hostname":"dns.quad9.net.","ttl":null}],"engine":"getaddrinfo","failure":null,"hostname":"dns.quad9.net","query_type":"ANY","resolver_hostname":null,"resolver_port":null,"resolver_address":"","t0":0.000792,"t":0.022736,"tags":[],"transaction_id":2}],"requests":[],"tcp_connect":[{"ip":"149.112.112.112","port":443,"status":{"failure":null,"success":true},"t0":0.023728,"t":0.052115,"tags":[],"transaction_id":2}],"tls_handshakes":[{"network":"tcp","address":"149.112.112.112:443","cipher_suite":"TLS_AES_256_GCM_SHA384","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIGyDCCBk6gAwIBAgIQDQsh8YVJ+5rl2I/Z0i4MlzAKBggqhkjOPQQDAzBWMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMTAwLgYDVQQDEydEaWdpQ2VydCBUTFMgSHlicmlkIEVDQyBTSEEzODQgMjAyMCBDQTEwHhcNMjMwNzMxMDAwMDAwWhcNMjQwODA2MjM1OTU5WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMIQmVya2VsZXkxDjAMBgNVBAoTBVF1YWQ5MRQwEgYDVQQDDAsqLnF1YWQ5Lm5ldDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH2L1x0DhQ0YJbM0HCmhJ9SsASVIiqDx6gK52FEsCGqsclbs+j2moJ9JCVWOrP65cxdcAvt4zCSRlG9DI4kOHWajggT3MIIE8zAfBgNVHSMEGDAWgBQKvAgpF4ylOW16Ds4zxy6z7fvDejAdBgNVHQ4EFgQUf6kSpdfGi0gCxz0qRW5AHkBg9JcwggGNBgNVHREEggGEMIIBgIILKi5xdWFkOS5uZXSCCXF1YWQ5Lm5ldIcECQkJCYcECQkJCocECQkJC4cECQkJDIcECQkJDYcECQkJDocECQkJD4cElXBwCYcElXBwCocElXBwC4cElXBwDIcElXBwDYcElXBwDocElXBwD4cElXBwcIcQJiAA/gAAAAAAAAAAAAAACYcQJiAA/gAAAAAAAAAAAAAAEIcQJiAA/gAAAAAAAAAAAAAAEYcQJiAA/gAAAAAAAAAAAAAAEocQJiAA/gAAAAAAAAAAAAAAE4cQJiAA/gAAAAAAAAAAAAAAFIcQJiAA/gAAAAAAAAAAAAAAFYcQJiAA/gAAAAAAAAAAAAAA/ocQJiAA/gAAAAAAAAAAAP4ACYcQJiAA/gAAAAAAAAAAAP4AEIcQJiAA/gAAAAAAAAAAAP4AEYcQJiAA/gAAAAAAAAAAAP4AEocQJiAA/gAAAAAAAAAAAP4AE4cQJiAA/gAAAAAAAAAAAP4AFIcQJiAA/gAAAAAAAAAAAP4AFTAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMIGbBgNVHR8EgZMwgZAwRqBEoEKGQGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRMU0h5YnJpZEVDQ1NIQTM4NDIwMjBDQTEtMS5jcmwwRqBEoEKGQGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRMU0h5YnJpZEVDQ1NIQTM4NDIwMjBDQTEtMS5jcmwwPgYDVR0gBDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGFBggrBgEFBQcBAQR5MHcwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEFBQcwAoZDaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTSHlicmlkRUNDU0hBMzg0MjAyMENBMS0xLmNydDAJBgNVHRMEAjAAMIIBfgYKKwYBBAHWeQIEAgSCAW4EggFqAWgAdgDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYmtrLxjAAAEAwBHMEUCIQCAWtmgTRnZsqjxZ7jdiDq0EEfxBB4kMj7oaZPv+URihQIgUJxBXliHw3ic/24+0NilFj/WfEcV1kNRARUhXS6xn08AdwBIsONr2qZHNA/lagL6nTDrHFIBy1bdLIHZu7+rOdiEcwAAAYmtrLxLAAAEAwBIMEYCIQClQbGksPNEGkRsO930WOdpYDBhFWVD44nw9ks9uyawJAIhAPypE9SPFDDkOgrOw+K++guz486lzdjaAfVzdyO6sw80AHUA2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0vaQ9MEjX+6sAAAGJray8FwAABAMARjBEAiBMmvofeflmsV3JoyFVid5GiJaPHkH9fDWkS93eP9fgEQIgfkTwCbSFNKnF47riYP4MJow7haBO+pFwRW5WAEC1AQQwCgYIKoZIzj0EAwMDaAAwZQIwOOsRrmNqg61CQTVH/6I6W1ZKb+5efJZpgZLVhCirpay7lyiuNyC1QkF6jfTAh+nGAjEAoRSNqC4pY/1GUJ3ygEjSOkUKlFnpXSxYIxJz9yJ43z05faF/uL+mrpAV9GXi2cpt","format":"base64"},{"data":"MIIEFzCCAv+gAwIBAgIQB/LzXIeod6967+lHmTUlvTANBgkqhkiG9w0BAQwFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaMFYxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMDAuBgNVBAMTJ0RpZ2lDZXJ0IFRMUyBIeWJyaWQgRUNDIFNIQTM4NCAyMDIwIENBMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMEbxppbmNmkKaDp1AS12+umsmxVwP/tmMZJLwYnUcu/cMEFesOxnYeJuq20ExfJqLSDyLiQ0cx0NTY8g3KwtdD3ImnI8YDEe0CPz2iHJlw5ifFNkU3aiYvkA8ND5b8vc6OCAYIwggF+MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAq8CCkXjKU5bXoOzjPHLrPt+8N6MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDA9BgNVHSAENjA0MAsGCWCGSAGG/WwCATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgGBmeBDAECAzANBgkqhkiG9w0BAQwFAAOCAQEAR1mBf9QbH7Bx9phdGLqYR5iwfnYr6v8ai6wms0KNMeZK6BnQ79oU59cUkqGS8qcuLa/7Hfb7U7CKP/zYFgrpsC62pQsYkDUmotr2qLcy/JUjS8ZFucTP5Hzu5sn4kL1y45nDHQsFfGqXbbKrAjbYwrwsAZI/BKOLdRHHuSm8EdCGupK8JvllyDfNJvaGEwwEqonleLHBTnm8dqMLUeTF0J5q/hosVq4GNiejcxwIfZMy0MJEGdqN9A57HSgDKwmKdsp33Id6rHtSJlWncg+d0ohP/rEhxRqhqjn1VtvChMQ1H3Dau0bwhr9kAMQ+959GG50jBbl9s08PqUU643QwmA==","format":"base64"}],"server_name":"dns.quad9.net","t0":0.052202,"t":0.085411,"tags":[],"tls_version":"TLSv1.3","transaction_id":2}]},"x_do53":{"network_events":[{"failure":null,"operation":"resolve_start","t0":0.000432,"t":0.000432,"transaction_id":1},{"address":"8.8.4.4:53","failure":null,"num_bytes":33,"operation":"write","proto":"udp","t0":0.000832,"t":0.000895,"transaction_id":1},{"address":"8.8.4.4:53","failure":null,"num_bytes":33,"operation":"write","proto":"udp","t0":0.000832,"t":0.000895,"transaction_id":1},{"address":"8.8.4.4:53","failure":null,"num_bytes":179,"operation":"read","proto":"udp","t0":0.000928,"t":0.017995,"transaction_id":1},{"address":"8.8.4.4:53","failure":null,"num_bytes":179,"operation":"read","proto":"udp","t0":0.001442,"t":0.019744,"transaction_id":1},{"failure":null,"operation":"resolve_done","t0":0.020228,"t":0.020228,"transaction_id":1}],"queries":[]},"x_dns_duplicate_responses":[],"queries":[{"answers":[{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.250.180.142","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.250.180.174","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.251.209.14","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.251.209.46","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"216.58.209.46","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"216.58.204.142","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"216.58.205.46","ttl":null},{"answer_type":"CNAME","hostname":"youtube-ui.l.google.com.","ttl":null}],"engine":"udp","failure":null,"hostname":"www.youtube.com","query_type":"A","raw_response":"xGOBgAABAAgAAAAAA3d3dwd5b3V0dWJlA2NvbQAAAQABwAwABQABAAABAAAWCnlvdXR1YmUtdWkBbAZnb29nbGXAGMAtAAEAAQAAAEUABI76tI7ALQABAAEAAABFAASO+rSuwC0AAQABAAAARQAEjvvRDsAtAAEAAQAAAEUABI770S7ALQABAAEAAABFAATYOtEuwC0AAQABAAAARQAE2DrMjsAtAAEAAQAAAEUABNg6zS4=","resolver_hostname":null,"resolver_port":null,"resolver_address":"8.8.4.4:53","t0":0.000601,"t":0.018049,"tags":[],"transaction_id":1},{"answers":[{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:402::200e","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:403::200e","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:410::200e","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:416::200e","ttl":null},{"answer_type":"CNAME","hostname":"youtube-ui.l.google.com.","ttl":null}],"engine":"udp","failure":null,"hostname":"www.youtube.com","query_type":"AAAA","raw_response":"z3uBgAABAAUAAAAAA3d3dwd5b3V0dWJlA2NvbQAAHAABwAwABQABAAAA/wAWCnlvdXR1YmUtdWkBbAZnb29nbGXAGMAtABwAAQAAAPUAECoAFFBAAgQCAAAAAAAAIA7ALQAcAAEAAAD1ABAqABRQQAIEAwAAAAAAACAOwC0AHAABAAAA9QAQKgAUUEACBBAAAAAAAAAgDsAtABwAAQAAAPUAECoAFFBAAgQWAAAAAAAAIA4=","resolver_hostname":null,"resolver_port":null,"resolver_address":"8.8.4.4:53","t0":0.000471,"t":0.019782,"tags":[],"transaction_id":1},{"answers":[{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:402::200e","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:403::200e","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:410::200e","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:416::200e","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.250.180.174","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"216.58.205.46","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.251.209.14","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.251.209.46","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"216.58.209.46","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"216.58.204.142","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.250.180.142","ttl":null},{"answer_type":"CNAME","hostname":"youtube-ui.l.google.com.","ttl":null}],"engine":"getaddrinfo","failure":null,"hostname":"www.youtube.com","query_type":"ANY","resolver_hostname":null,"resolver_port":null,"resolver_address":"","t0":0.000966,"t":0.020698,"tags":[],"transaction_id":3},{"answers":[{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:402::200e","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:403::200e","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:414::200e","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"AAAA","ipv6":"2a00:1450:4002:416::200e","ttl":null},{"answer_type":"CNAME","hostname":"youtube-ui.l.google.com.","ttl":null}],"engine":"doh","failure":null,"hostname":"www.youtube.com","query_type":"AAAA","raw_response":"CSKBgAABAAUAAAABA3d3dwd5b3V0dWJlA2NvbQAAHAABwAwABQABAAAAYgAWCnlvdXR1YmUtdWkBbAZnb29nbGXAGMAtABwAAQAAAR8AECoAFFBAAgQCAAAAAAAAIA7ALQAcAAEAAAEfABAqABRQQAIEAwAAAAAAACAOwC0AHAABAAABHwAQKgAUUEACBBQAAAAAAAAgDsAtABwAAQAAAR8AECoAFFBAAgQWAAAAAAAAIA4AACkE0AAAgAAAAA==","resolver_hostname":null,"resolver_port":null,"resolver_address":"https://dns.quad9.net/dns-query","t0":0.000636,"t":0.394265,"tags":[],"transaction_id":2},{"answers":[{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.250.180.142","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.250.180.174","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.251.209.14","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"216.58.205.46","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"142.251.209.46","ttl":null},{"asn":15169,"as_org_name":"Google LLC","answer_type":"A","ipv4":"216.58.204.142","ttl":null},{"answer_type":"CNAME","hostname":"youtube-ui.l.google.com.","ttl":null}],"engine":"doh","failure":null,"hostname":"www.youtube.com","query_type":"A","raw_response":"TD2BgAABAAcAAAABA3d3dwd5b3V0dWJlA2NvbQAAAQABwAwABQABAAAA5QAWCnlvdXR1YmUtdWkBbAZnb29nbGXAGMAtAAEAAQAAAOUABI76tI7ALQABAAEAAADlAASO+rSuwC0AAQABAAAA5QAEjvvRDsAtAAEAAQAAAOUABNg6zS7ALQABAAEAAADlAASO+9EuwC0AAQABAAAA5QAE2DrMjgAAKQIAAACAAAAA","resolver_hostname":null,"resolver_port":null,"resolver_address":"https://dns.quad9.net/dns-query","t0":0.00128,"t":0.394264,"tags":[],"transaction_id":2}],"requests":[{"network":"tcp","address":"[2a00:1450:4009:820::200e]:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.010828,"t":2.010828,"tags":[],"transaction_id":17},{"network":"tcp","address":"172.217.16.238:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.009412,"t":2.009412,"tags":[],"transaction_id":19},{"network":"tcp","address":"142.250.180.14:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.009293,"t":2.009293,"tags":[],"transaction_id":29},{"network":"tcp","address":"172.217.169.14:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.00854,"t":2.00854,"tags":[],"transaction_id":16},{"network":"tcp","address":"[2a00:1450:4009:81f::200e]:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.008112,"t":2.008112,"tags":[],"transaction_id":27},{"network":"tcp","address":"142.250.187.206:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.005986,"t":2.005986,"tags":[],"transaction_id":18},{"network":"tcp","address":"142.250.178.14:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.005533,"t":2.005533,"tags":[],"transaction_id":30},{"network":"tcp","address":"216.58.201.110:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.005133,"t":2.005133,"tags":[],"transaction_id":24},{"network":"tcp","address":"[2a00:1450:4009:815::200e]:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.00425,"t":2.00425,"tags":[],"transaction_id":31},{"network":"tcp","address":"142.250.187.238:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.004097,"t":2.004097,"tags":[],"transaction_id":26},{"network":"tcp","address":"[2a00:1450:4009:81e::200e]:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.003596,"t":2.003596,"tags":[],"transaction_id":25},{"network":"tcp","address":"216.58.212.238:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.003031,"t":2.003031,"tags":[],"transaction_id":28},{"network":"tcp","address":"216.58.204.78:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.001008,"t":2.001008,"tags":[],"transaction_id":21},{"network":"tcp","address":"142.250.179.238:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.000965,"t":2.000965,"tags":[],"transaction_id":22},{"network":"tcp","address":"142.250.200.46:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":2.000627,"t":2.000627,"tags":[],"transaction_id":23},{"network":"tcp","address":"142.250.200.14:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Cookie","YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Cookie":"YSC=Fz-8xRP8Jo0; __Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; CONSENT=PENDING+074","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":1.995113,"t":1.995113,"tags":[],"transaction_id":20},{"network":"tcp","address":"216.58.209.46:443","alpn":"h2","failure":null,"request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"\u003c!DOCTYPE html\u003e\u003chtml style=\"font-size: 10px;font-family: Roboto, Arial, sans-serif;\" lang=\"en\" darker-dark-theme darker-dark-theme-deprecate system-icons typography typography-spacing\u003e\u003chead\u003e\u003cscript data-id=\"_gd\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003ewindow.WIZ_global_data = {\"MuJWjd\":true,\"nQyAE\":{},\"oxN3nb\":{\"1\":false}};\u003c/script\u003e\u003cmeta http-equiv=\"origin-trial\" content=\"ApvK67ociHgr2egd6c2ZjrfPuRs8BHcvSggogIOPQNH7GJ3cVlyJ1NOq/COCdj0+zxskqHt9HgLLETc8qqD+vwsAAABteyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJQcml2YWN5U2FuZGJveEFkc0FQSXMiLCJleHBpcnkiOjE2OTUxNjc5OTksImlzU3ViZG9tYWluIjp0cnVlfQ==\"/\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003evar ytcfg={d:function(){return window.yt\u0026\u0026yt.config_||ytcfg.data_||(ytcfg.data_={})},get:function(k,o){return k in ytcfg.d()?ytcfg.d()[k]:o},set:function(){var a=arguments;if(a.length\u003e1)ytcfg.d()[a[0]]=a[1];else{var k;for(k in a[0])ytcfg.d()[k]=a[0][k]}}};\nwindow.ytcfg.set('EMERGENCY_BASE_URL', '\\/error_204?t\\x3djserror\\x26level\\x3dERROR\\x26client.name\\x3d1\\x26client.version\\x3d2.20231121.08.00');\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e(function(){window.yterr=window.yterr||true;window.unhandledErrorMessages={};window.unhandledErrorCount=0;\nwindow.onerror=function(msg,url,line,columnNumber,error){var err;if(error)err=error;else{err=new Error;err.stack=\"\";err.message=msg;err.fileName=url;err.lineNumber=line;if(!isNaN(columnNumber))err[\"columnNumber\"]=columnNumber}var message=String(err.message);if(!err.message||message in window.unhandledErrorMessages||window.unhandledErrorCount\u003e=5)return;window.unhandledErrorCount+=1;window.unhandledErrorMessages[message]=true;var img=new Image;window.emergencyTimeoutImg=img;img.onload=img.onerror=function(){delete window.emergencyTimeoutImg};\nvar combinedLineAndColumn=err.lineNumber;if(!isNaN(err[\"columnNumber\"]))combinedLineAndColumn=combinedLineAndColumn+(\":\"+err[\"columnNumber\"]);var stack=err.stack||\"\";var values={\"msg\":message,\"type\":err.name,\"client.params\":\"unhandled window error\",\"file\":err.fileName,\"line\":combinedLineAndColumn,\"stack\":stack.substr(0,500)};var thirdPartyScript=!err.fileName||err.fileName===\"\u003canonymous\u003e\"||stack.indexOf(\"extension://\")\u003e=0;var replaced=stack.replace(/https:\\/\\/www.youtube.com\\//g,\"\");if(replaced.match(/https?:\\/\\/[^/]+\\//))thirdPartyScript=\ntrue;else if(stack.indexOf(\"trapProp\")\u003e=0\u0026\u0026stack.indexOf(\"trapChain\")\u003e=0)thirdPartyScript=true;else if(message.indexOf(\"redefine non-configurable\")\u003e=0)thirdPartyScript=true;var baseUrl=window[\"ytcfg\"].get(\"EMERGENCY_BASE_URL\",\"https://www.youtube.com/error_204?t=jserror\u0026level=ERROR\");var unsupported=message.indexOf(\"window.customElements is undefined\")\u003e=0;if(thirdPartyScript||unsupported)baseUrl=baseUrl.replace(\"level=ERROR\",\"level=WARNING\");var parts=[baseUrl];var key;for(key in values){var value=\nvalues[key];if(value)parts.push(key+\"=\"+encodeURIComponent(value))}img.src=parts.join(\"\u0026\")};\n(function(){function _getExtendedNativePrototype(tag){var p=this._nativePrototypes[tag];if(!p){p=Object.create(this.getNativePrototype(tag));var p$=Object.getOwnPropertyNames(window[\"Polymer\"].Base);var i=0;var n=void 0;for(;i\u003cp$.length\u0026\u0026(n=p$[i]);i++)if(!window[\"Polymer\"].BaseDescriptors[n])try{p[n]=window[\"Polymer\"].Base[n]}catch(e){throw new Error(\"Error while copying property: \"+n+\". Tag is \"+tag);}try{Object.defineProperties(p,window[\"Polymer\"].BaseDescriptors)}catch(e){throw new Error(\"Polymer define property failed for \"+\nObject.keys(p));}this._nativePrototypes[tag]=p}return p}function handlePolymerError(msg){window.onerror(msg,window.location.href,0,0,new Error(Array.prototype.join.call(arguments,\",\")))}var origPolymer=window[\"Polymer\"];var newPolymer=function(config){if(!origPolymer._ytIntercepted\u0026\u0026window[\"Polymer\"].Base){origPolymer._ytIntercepted=true;window[\"Polymer\"].Base._getExtendedNativePrototype=_getExtendedNativePrototype;window[\"Polymer\"].Base._error=handlePolymerError;window[\"Polymer\"].Base._warn=handlePolymerError}return origPolymer.apply(this,\narguments)};var origDescriptor=Object.getOwnPropertyDescriptor(window,\"Polymer\");Object.defineProperty(window,\"Polymer\",{set:function(p){if(origDescriptor\u0026\u0026origDescriptor.set\u0026\u0026origDescriptor.get){origDescriptor.set(p);origPolymer=origDescriptor.get()}else origPolymer=p;if(typeof origPolymer===\"function\")Object.defineProperty(window,\"Polymer\",{value:origPolymer,configurable:true,enumerable:true,writable:true})},get:function(){return typeof origPolymer===\"function\"?newPolymer:origPolymer},configurable:true,\nenumerable:true})})();}).call(this);\n\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003ewindow.Polymer=window.Polymer||{};window.Polymer.legacyOptimizations=true;window.Polymer.setPassiveTouchGestures=true;window.ShadyDOM={force:true,preferPerformance:true,noPatch:true};\nwindow.polymerSkipLoadingFontRoboto = true;window.ShadyCSS = {disableRuntime: true};\u003c/script\u003e\u003clink rel=\"shortcut icon\" href=\"https://www.youtube.com/s/desktop/bd3558ba/img/favicon.ico\" type=\"image/x-icon\"\u003e\u003clink rel=\"icon\" href=\"https://www.youtube.com/s/desktop/bd3558ba/img/favicon_32x32.png\" sizes=\"32x32\"\u003e\u003clink rel=\"icon\" href=\"https://www.youtube.com/s/desktop/bd3558ba/img/favicon_48x48.png\" sizes=\"48x48\"\u003e\u003clink rel=\"icon\" href=\"https://www.youtube.com/s/desktop/bd3558ba/img/favicon_96x96.png\" sizes=\"96x96\"\u003e\u003clink rel=\"icon\" href=\"https://www.youtube.com/s/desktop/bd3558ba/img/favicon_144x144.png\" sizes=\"144x144\"\u003e\u003ctitle\u003eYouTube\u003c/title\u003e\u003clink rel=\"canonical\" href=\"https://www.youtube.com/\"\u003e\u003clink rel=\"alternate\" media=\"handheld\" href=\"https://m.youtube.com/\"\u003e\u003clink rel=\"alternate\" media=\"only screen and (max-width: 640px)\" href=\"https://m.youtube.com/\"\u003e\u003cmeta property=\"og:image\" content=\"https://www.youtube.com/img/desktop/yt_1200.png\"\u003e\u003cmeta property=\"fb:app_id\" content=\"87741124305\"\u003e\u003clink rel=\"alternate\" href=\"android-app://com.google.android.youtube/http/www.youtube.com/\"\u003e\u003clink rel=\"alternate\" href=\"ios-app://544007664/vnd.youtube/www.youtube.com/\"\u003e\u003cmeta name=\"description\" content=\"Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.\"\u003e\u003cmeta name=\"keywords\" content=\"video, sharing, camera phone, video phone, free, upload\"\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif ('undefined' == typeof Symbol || 'undefined' == typeof Symbol.iterator) {delete Array.prototype.entries;}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003evar ytcsi={gt:function(n){n=(n||\"\")+\"data_\";return ytcsi[n]||(ytcsi[n]={tick:{},info:{},gel:{preLoggedGelInfos:[]}})},now:window.performance\u0026\u0026window.performance.timing\u0026\u0026window.performance.now\u0026\u0026window.performance.timing.navigationStart?function(){return window.performance.timing.navigationStart+window.performance.now()}:function(){return(new Date).getTime()},tick:function(l,t,n){var ticks=ytcsi.gt(n).tick;var v=t||ytcsi.now();if(ticks[l]){ticks[\"_\"+l]=ticks[\"_\"+l]||[ticks[l]];ticks[\"_\"+l].push(v)}ticks[l]=\nv},info:function(k,v,n){ytcsi.gt(n).info[k]=v},infoGel:function(p,n){ytcsi.gt(n).gel.preLoggedGelInfos.push(p)},setStart:function(t,n){ytcsi.tick(\"_start\",t,n)}};\n(function(w,d){function isGecko(){if(!w.navigator)return false;try{if(w.navigator.userAgentData\u0026\u0026w.navigator.userAgentData.brands\u0026\u0026w.navigator.userAgentData.brands.length){var brands=w.navigator.userAgentData.brands;var i=0;for(;i\u003cbrands.length;i++)if(brands[i]\u0026\u0026brands[i].brand===\"Firefox\")return true;return false}}catch(e){setTimeout(function(){throw e;})}if(!w.navigator.userAgent)return false;var ua=w.navigator.userAgent;return ua.indexOf(\"Gecko\")\u003e0\u0026\u0026ua.toLowerCase().indexOf(\"webkit\")\u003c0\u0026\u0026ua.indexOf(\"Edge\")\u003c\n0\u0026\u0026ua.indexOf(\"Trident\")\u003c0\u0026\u0026ua.indexOf(\"MSIE\")\u003c0}ytcsi.setStart(w.performance?w.performance.timing.responseStart:null);var isPrerender=(d.visibilityState||d.webkitVisibilityState)==\"prerender\";var vName=!d.visibilityState\u0026\u0026d.webkitVisibilityState?\"webkitvisibilitychange\":\"visibilitychange\";if(isPrerender){var startTick=function(){ytcsi.setStart();d.removeEventListener(vName,startTick)};d.addEventListener(vName,startTick,false)}if(d.addEventListener)d.addEventListener(vName,function(){ytcsi.tick(\"vc\")},\nfalse);if(isGecko()){var isHidden=(d.visibilityState||d.webkitVisibilityState)==\"hidden\";if(isHidden)ytcsi.tick(\"vc\")}var slt=function(el,t){setTimeout(function(){var n=ytcsi.now();el.loadTime=n;if(el.slt)el.slt()},t)};w.__ytRIL=function(el){if(!el.getAttribute(\"data-thumb\"))if(w.requestAnimationFrame)w.requestAnimationFrame(function(){slt(el,0)});else slt(el,16)}})(window,document);\n\u003c/script\u003e\u003clink rel=\"preload\" href=\"https://i.ytimg.com/generate_204\" as=\"fetch\"\u003e\u003clink as=\"script\" rel=\"preload\" href=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/desktop_polymer.vflset/desktop_polymer.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003cscript src=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/web-animations-next-lite.min.vflset/web-animations-next-lite.min.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003c/script\u003e\u003cscript src=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/custom-elements-es5-adapter.vflset/custom-elements-es5-adapter.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003c/script\u003e\u003cscript src=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/webcomponents-sd.vflset/webcomponents-sd.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003c/script\u003e\u003cscript src=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/intersection-observer.min.vflset/intersection-observer.min.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('lpcs', null, '');}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e(function() {window.ytplayer={};\nytcfg.set({\"CLIENT_CANARY_STATE\":\"none\",\"DEVICE\":\"cbr\\u003dChrome\\u0026cbrver\\u003d116.0.0.0\\u0026ceng\\u003dWebKit\\u0026cengver\\u003d537.36\\u0026cos\\u003dWindows\\u0026cosver\\u003d10.0\\u0026cplatform\\u003dDESKTOP\",\"DISABLE_YT_IMG_DELAY_LOADING\":false,\"ELEMENT_POOL_DEFAULT_CAP\":75,\"EVENT_ID\":\"YJlfZfWJK47D6dsPx9yqiAg\",\"EXPERIMENT_FLAGS\":{\"H5_enable_full_pacf_logging\":true,\"H5_use_async_logging\":true,\"ab_det_apb_b\":true,\"ab_det_fet_wr\":true,\"ab_det_fet_wr_en\":true,\"ab_det_gen_re\":true,\"action_companion_center_align_description\":true,\"allow_skip_networkless\":true,\"att_web_record_metrics\":true,\"autoescape_tempdata_url\":true,\"browse_next_continuations_migration_playlist\":true,\"c3_watch_page_component\":true,\"cache_utc_offset_minutes_in_pref_cookie\":true,\"cancel_pending_navs\":true,\"check_user_lact_at_prompt_shown_time_on_web\":true,\"clear_user_partitioned_ls\":true,\"client_respect_autoplay_switch_button_renderer\":true,\"cold_missing_history\":true,\"compress_gel\":true,\"csi_on_gel\":true,\"decorate_autoplay_renderer\":true,\"defer_menus\":true,\"defer_overlays\":true,\"defer_rendering_outside_visible_area\":true,\"deprecate_csi_has_info\":true,\"deprecate_pair_servlet_enabled\":true,\"desktop_add_to_playlist_renderer_dialog_popup\":true,\"desktop_animate_miniplayer\":true,\"desktop_client_release\":true,\"desktop_delay_player_resizing\":true,\"desktop_enable_dmpanel_click_drag_scroll\":true,\"desktop_enable_dmpanel_scroll\":true,\"desktop_enable_dmpanel_wheel_scroll\":true,\"desktop_image_cta_no_background\":true,\"desktop_keyboard_capture_keydown_killswitch\":true,\"desktop_log_img_click_location\":true,\"desktop_mix_use_sampled_color_for_bottom_bar\":true,\"desktop_mix_use_sampled_color_for_bottom_bar_search\":true,\"desktop_mix_use_sampled_color_for_bottom_bar_watch_next\":true,\"desktop_notification_high_priority_ignore_push\":true,\"desktop_notification_set_title_bar\":true,\"desktop_search_no_spacing_pos_zero\":true,\"desktop_search_prominent_thumbs\":true,\"desktop_sparkles_light_cta_button\":true,\"desktop_swipeable_guide\":true,\"desktop_themeable_vulcan\":true,\"desktop_use_new_history_manager\":true,\"disable_banner_collapsing_when_hidden\":true,\"disable_child_node_auto_formatted_strings\":true,\"disable_dependency_injection\":true,\"disable_features_for_supex\":true,\"disable_legacy_desktop_remote_queue\":true,\"disable_pacf_logging_for_memory_limited_tv\":true,\"disable_simple_mixed_direction_formatted_strings\":true,\"disable_super_chat_buy_button\":true,\"disable_thumbnail_preloading\":true,\"embeds_web_nwl_disable_nocookie\":true,\"enable_ab_report_on_errorscreen\":true,\"enable_ab_rp_int\":true,\"enable_ads_web_ep_buenos_aires_and_padding_fix\":true,\"enable_ata_dialog_all_web\":true,\"enable_browser_cookie_status_monitoring\":true,\"enable_buenos_aires_page_header_mini_app_dest\":true,\"enable_button_behavior_reuse\":true,\"enable_call_to_action_clarification_renderer_bottom_section_conditions\":true,\"enable_channel_page_header_profile_section\":true,\"enable_channel_page_modern_profile_section\":true,\"enable_cinematic_blur_desktop_loading\":true,\"enable_client_sli_logging\":true,\"enable_client_streamz_web\":true,\"enable_container_wiz_migration_refactor\":true,\"enable_desktop_amsterdam_info_panels\":true,\"enable_dismiss_loading_manually\":true,\"enable_dma_web_toast\":true,\"enable_docked_chat_messages\":true,\"enable_dsa_compliant_banner_image_ad_renderer\":true,\"enable_dsa_one_click_ata_translators_infeed_elements\":true,\"enable_exit_confirmation_dialog\":true,\"enable_exit_confirmation_dialog_web\":true,\"enable_filling_splash_screen_view_model\":true,\"enable_first_frame_ready_csi_logging\":true,\"enable_first_user_action_csi_logging\":true,\"enable_flow_logging_p4e\":true,\"enable_free_preview_timer\":true,\"enable_game_info_dialog\":true,\"enable_gel_log_commands\":true,\"enable_get_account_switcher_endpoint_on_webfe\":true,\"enable_google_payment_billing_command_client_support\":true,\"enable_handle_search_on_channel_switcher\":true,\"enable_handles_account_menu_switcher\":true,\"enable_handles_in_mention_suggest_posts\":true,\"enable_high_frequency_cookie_rotation\":true,\"enable_hlp_client_icon_pick\":true,\"enable_horizontal_list_renderer_scroll_based_on_items_visibility\":true,\"enable_image_poll_post_creation\":true,\"enable_inline_shorts_on_wn\":true,\"enable_interstitial_entity_check\":true,\"enable_lcr_emoji_fountain\":true,\"enable_loggingcontext_trackingparams\":true,\"enable_masthead_quartile_ping_fix\":true,\"enable_memberships_and_purchases\":true,\"enable_mentions_in_reposts\":true,\"enable_microformat_data\":true,\"enable_mini_app_microformats\":true,\"enable_mixed_direction_formatted_strings\":true,\"enable_multi_image_post_creation\":true,\"enable_names_handles_account_switcher\":true,\"enable_new_channel_creation_for_id4all\":true,\"enable_offer_suppression\":true,\"enable_on_yt_command_executor_command_to_navigate\":true,\"enable_pacf_slot_asde_infeed_h5\":true,\"enable_pacf_slot_asde_player_byte_h5\":true,\"enable_pacf_slot_asde_player_byte_h5_TV\":true,\"enable_pacf_through_ybfe_tv\":true,\"enable_pacf_through_ybfe_tv_for_page_top_formats\":true,\"enable_pacf_through_ysfe_tv\":true,\"enable_pass_sdc_get_accounts_list\":true,\"enable_persistent_page_type_listener\":true,\"enable_pl_r_c\":true,\"enable_pl_r_c_s\":true,\"enable_pl_r_si_fa\":true,\"enable_play_state_logging\":true,\"enable_playables_shelf_dismissal\":true,\"enable_playables_url_resolution\":true,\"enable_player_param_truncation_before_navigation_on_web\":true,\"enable_player_param_truncation_before_navigation_on_web_on_search\":true,\"enable_poll_choice_border_on_web\":true,\"enable_polymer_resin\":true,\"enable_polymer_resin_migration\":true,\"enable_populate_att_psd_in_abe_feedback\":true,\"enable_populate_psd_in_abe_feedback\":true,\"enable_post_cct_links\":true,\"enable_post_scheduling\":true,\"enable_ppp_url_param_search\":true,\"enable_premium_voluntary_pause\":true,\"enable_programmed_playlist_color_sample\":true,\"enable_programmed_playlist_redesign\":true,\"enable_purchase_activity_in_paid_memberships\":true,\"enable_quiz_creation\":true,\"enable_reel_watch_sequence\":true,\"enable_resume_on_exit_confirmation_dismissed\":true,\"enable_scrolling_fix\":true,\"enable_sdf_midroll_postroll_player_bytes_video_h5\":true,\"enable_sdf_preroll_player_bytes_video_h5\":true,\"enable_sdf_preroll_player_bytes_video_tv\":true,\"enable_section_list_scroll_to_item_section_web\":true,\"enable_seedless_shorts_url\":true,\"enable_server_stitched_dai\":true,\"enable_service_ajax_csn\":true,\"enable_servlet_errors_streamz\":true,\"enable_servlet_streamz\":true,\"enable_sfv_audio_pivot_url\":true,\"enable_sfv_effect_pivot_microformat\":true,\"enable_sfv_effect_pivot_url\":true,\"enable_shorts_singleton_channel_web\":true,\"enable_shorts_tab_page\":true,\"enable_showing_genre_data\":true,\"enable_signals\":true,\"enable_skip_ad_guidance_prompt\":true,\"enable_skippable_ads_for_unplugged_ad_pod\":true,\"enable_smearing_expansion_dai\":true,\"enable_sparkles_web_clickable_description\":true,\"enable_splash_screen_loading_messages\":true,\"enable_squiffle_gif_handles_landing_page\":true,\"enable_streamline_repost_flow\":true,\"enable_structured_description_shorts_web_mweb\":true,\"enable_tectonic_ad_ux_for_halftime\":true,\"enable_third_party_info\":true,\"enable_time_out_messages\":true,\"enable_topsoil_wta_for_halftime_live_infra\":true,\"enable_true_inline_for_desktop_home_feed_vac\":true,\"enable_unavailable_videos_watch_page\":true,\"enable_unified_cancellation_for_premium\":true,\"enable_unknown_lact_fix_on_html5\":true,\"enable_watch_next_pause_autoplay_lact\":true,\"enable_web_gpay_command_spinner\":true,\"enable_web_ketchup_hero_animation\":true,\"enable_web_poster_hover_animation\":true,\"enable_web_shorts_audio_pivot\":true,\"enable_web_tiered_gel\":true,\"enable_window_constrained_buy_flow_dialog\":true,\"enable_wiz_next_lp2_msof\":true,\"enable_yoodle\":true,\"enable_ypc_spinners\":true,\"enable_yt_ata_iframe_authuser\":true,\"enable_ytc_refunds_submit_form_signal_action\":true,\"enable_ytc_self_serve_refunds\":true,\"endpoint_handler_logging_cleanup_killswitch\":true,\"err_on_pl_r_c\":true,\"export_networkless_options\":true,\"external_fullscreen\":true,\"external_fullscreen_with_edu\":true,\"fetch_bid_for_dclk_status\":true,\"fill_single_video_with_notify_to_lasr\":true,\"gcf_config_store_enabled\":true,\"gcf_music_innertube\":true,\"gda_enable_playlist_download\":true,\"global_spacebar_pause\":true,\"gpa_sparkles_ten_percent_layer\":true,\"h5_companion_enable_adcpn_macro_substitution_for_click_pings\":true,\"h5_enable_generic_error_logging_event\":true,\"h5_inplayer_enable_adcpn_macro_substitution_for_click_pings\":true,\"h5_reset_cache_and_filter_before_update_masthead\":true,\"handles_in_mention_suggest_posts\":true,\"hide_endpoint_overflow_on_ytd_display_ad_renderer\":true,\"html5_enable_ads_client_monitoring_log_tv\":true,\"html5_enable_single_video_vod_ivar_on_pacf\":true,\"html5_log_trigger_events_with_debug_data\":true,\"html5_recognize_predict_start_cue_point\":true,\"html5_server_stitched_dai_group\":true,\"il_use_view_model_logging_context\":true,\"imp_cache_player_requests\":true,\"include_autoplay_count_in_playlists\":true,\"is_browser_support_for_webcam_streaming\":true,\"is_part_of_any_user_engagement_experiment\":true,\"json_condensed_response\":true,\"kev_adb_pg\":true,\"kevlar_app_shortcuts\":true,\"kevlar_appbehavior_attach_startup_tasks\":true,\"kevlar_appshell_service_worker\":true,\"kevlar_autofocus_menu_on_keyboard_nav\":true,\"kevlar_autonav_popup_filtering\":true,\"kevlar_av_eliminate_polling\":true,\"kevlar_cache_cold_load_response\":true,\"kevlar_cache_on_ttl_player\":true,\"kevlar_cache_on_ttl_search\":true,\"kevlar_calculate_grid_collapsible\":true,\"kevlar_cancel_scheduled_comment_jobs_on_navigate\":true,\"kevlar_channel_creation_form_resolver\":true,\"kevlar_channel_trailer_multi_attach\":true,\"kevlar_chapters_list_view_seek_by_chapter\":true,\"kevlar_clear_duplicate_pref_cookie\":true,\"kevlar_clear_non_displayable_url_params\":true,\"kevlar_client_side_screens\":true,\"kevlar_command_handler\":true,\"kevlar_command_handler_clicks\":true,\"kevlar_command_handler_formatted_string\":true,\"kevlar_command_url\":true,\"kevlar_continue_playback_without_player_response\":true,\"kevlar_decorate_endpoint_with_onesie_config\":true,\"kevlar_delay_watch_initial_data\":true,\"kevlar_disable_background_prefetch\":true,\"kevlar_disable_pending_command\":true,\"kevlar_dragdrop_fast_scroll\":true,\"kevlar_dropdown_fix\":true,\"kevlar_droppable_prefetchable_requests\":true,\"kevlar_early_popup_close\":true,\"kevlar_enable_download_upsell_type_a\":true,\"kevlar_enable_editable_playlists\":true,\"kevlar_enable_em_offlineable_discovery\":true,\"kevlar_enable_reorderable_playlists\":true,\"kevlar_enable_shorts_prefetch_in_sequence\":true,\"kevlar_enable_shorts_response_chunking\":true,\"kevlar_enable_up_arrow\":true,\"kevlar_exit_fullscreen_leaving_watch\":true,\"kevlar_fill_offline_availability_type_for_gda\":true,\"kevlar_fix_playlist_continuation\":true,\"kevlar_flexible_menu\":true,\"kevlar_fluid_touch_scroll\":true,\"kevlar_frontend_queue_recover\":true,\"kevlar_gel_error_routing\":true,\"kevlar_guide_refresh\":true,\"kevlar_help_use_locale\":true,\"kevlar_hide_playlist_playback_status\":true,\"kevlar_hide_pp_url_param\":true,\"kevlar_hide_time_continue_url_param\":true,\"kevlar_home_skeleton\":true,\"kevlar_js_fixes\":true,\"kevlar_keyboard_button_focus\":true,\"kevlar_larger_three_dot_tap\":true,\"kevlar_lazy_list_resume_for_autofill\":true,\"kevlar_local_innertube_response\":true,\"kevlar_macro_markers_keyboard_shortcut\":true,\"kevlar_masthead_store\":true,\"kevlar_mealbar_above_player\":true,\"kevlar_miniplayer\":true,\"kevlar_miniplayer_expand_top\":true,\"kevlar_miniplayer_play_pause_on_scrim\":true,\"kevlar_miniplayer_queue_user_activation\":true,\"kevlar_mix_handle_first_endpoint_different\":true,\"kevlar_modern_sd\":true,\"kevlar_modern_sd_v2\":true,\"kevlar_next_cold_on_auth_change_detected\":true,\"kevlar_nitrate_driven_tooltips\":true,\"kevlar_no_autoscroll_on_playlist_hover\":true,\"kevlar_op_infra\":true,\"kevlar_op_warm_pages\":true,\"kevlar_pandown_polyfill\":true,\"kevlar_passive_event_listeners\":true,\"kevlar_playback_associated_queue\":true,\"kevlar_player_cached_load_config\":true,\"kevlar_player_check_ad_state_on_stop\":true,\"kevlar_player_load_player_no_op\":true,\"kevlar_player_new_bootstrap_adoption\":true,\"kevlar_player_playlist_use_local_index\":true,\"kevlar_player_watch_endpoint_navigation\":true,\"kevlar_playlist_drag_handles\":true,\"kevlar_playlist_use_x_close_button\":true,\"kevlar_prefetch\":true,\"kevlar_prevent_polymer_dynamic_font_load\":true,\"kevlar_queue_use_update_api\":true,\"kevlar_refresh_gesture\":true,\"kevlar_rendererstamper_event_listener\":true,\"kevlar_replace_short_to_short_history_state\":true,\"kevlar_request_sequencing\":true,\"kevlar_resolve_command_for_confirm_dialog\":true,\"kevlar_response_command_processor_page\":true,\"kevlar_scroll_chips_on_touch\":true,\"kevlar_scrollbar_rework\":true,\"kevlar_service_command_check\":true,\"kevlar_set_internal_player_size\":true,\"kevlar_shell_for_downloads_page\":true,\"kevlar_shorts_seedless_retry_initial_load\":true,\"kevlar_should_maintain_stable_list\":true,\"kevlar_show_em_dl_btn\":true,\"kevlar_show_em_dl_menu_item\":true,\"kevlar_show_em_dl_settings_tab\":true,\"kevlar_show_playlist_dl_btn\":true,\"kevlar_startup_lifecycle\":true,\"kevlar_structured_description_content_inline\":true,\"kevlar_system_icons\":true,\"kevlar_tabs_gesture\":true,\"kevlar_text_inline_expander_formatted_snippet\":true,\"kevlar_three_dot_ink\":true,\"kevlar_thumbnail_fluid\":true,\"kevlar_toast_manager\":true,\"kevlar_topbar_logo_fallback_home\":true,\"kevlar_touch_feedback\":true,\"kevlar_touch_gesture_ves\":true,\"kevlar_transcript_engagement_panel\":true,\"kevlar_tuner_run_default_comments_delay\":true,\"kevlar_tuner_should_defer_detach\":true,\"kevlar_typography_spacing_update\":true,\"kevlar_typography_update\":true,\"kevlar_unified_errors_init\":true,\"kevlar_use_response_ttl_to_invalidate_cache\":true,\"kevlar_use_vimio_behavior\":true,\"kevlar_use_wil_icons\":true,\"kevlar_use_ytd_player\":true,\"kevlar_variable_youtube_sans\":true,\"kevlar_vimio_use_shared_monitor\":true,\"kevlar_voice_logging_fix\":true,\"kevlar_voice_search_use_yt_endpoint\":true,\"kevlar_watch_cinematics\":true,\"kevlar_watch_color_update\":true,\"kevlar_watch_comments_ep_disable_theater\":true,\"kevlar_watch_contents_data_provider\":true,\"kevlar_watch_contents_data_provider_persistent\":true,\"kevlar_watch_disable_legacy_metadata_updates\":true,\"kevlar_watch_drag_handles\":true,\"kevlar_watch_flexy_fullscreen_manager\":true,\"kevlar_watch_flexy_loading_state_manager\":true,\"kevlar_watch_flexy_miniplayer_manager\":true,\"kevlar_watch_flexy_navigation_manager\":true,\"kevlar_watch_flexy_player_loop_manager\":true,\"kevlar_watch_flexy_scroll_manager\":true,\"kevlar_watch_flexy_title_manager\":true,\"kevlar_watch_flexy_use_controller\":true,\"kevlar_watch_focus_on_engagement_panels\":true,\"kevlar_watch_gesture_pandown\":true,\"kevlar_watch_hide_comments_teaser\":true,\"kevlar_watch_hide_comments_while_panel_open\":true,\"kevlar_watch_js_panel_height\":true,\"kevlar_watch_metadata_refresh\":true,\"kevlar_watch_metadata_refresh_attached_subscribe\":true,\"kevlar_watch_metadata_refresh_clickable_description\":true,\"kevlar_watch_metadata_refresh_compact_view_count\":true,\"kevlar_watch_metadata_refresh_description_info_dedicated_line\":true,\"kevlar_watch_metadata_refresh_description_inline_expander\":true,\"kevlar_watch_metadata_refresh_description_primary_color\":true,\"kevlar_watch_metadata_refresh_for_live_killswitch\":true,\"kevlar_watch_metadata_refresh_full_width_description\":true,\"kevlar_watch_metadata_refresh_left_aligned_video_actions\":true,\"kevlar_watch_metadata_refresh_lower_case_video_actions\":true,\"kevlar_watch_metadata_refresh_narrower_item_wrap\":true,\"kevlar_watch_metadata_refresh_no_old_secondary_data\":true,\"kevlar_watch_metadata_refresh_relative_date\":true,\"kevlar_watch_metadata_refresh_top_aligned_actions\":true,\"kevlar_watch_modern_metapanel\":true,\"kevlar_watch_modern_panels\":true,\"kevlar_watch_panel_height_matches_player\":true,\"kevlar_woffle\":true,\"kevlar_woffle_fallback_image\":true,\"kevlar_woffle_log_thumbnail_failure_ve\":true,\"kevlar_ytb_live_badges\":true,\"killswitch_toggle_button_behavior_resolve_command\":true,\"live_chat_banner_expansion_fix\":true,\"live_chat_emoji_picker_toggle_state\":true,\"live_chat_enable_command_handler_resolver_map\":true,\"live_chat_enable_qna_banner_overflow_menu_actions\":true,\"live_chat_enable_qna_channel\":true,\"live_chat_enable_rta_manager\":true,\"live_chat_enable_send_button_in_slow_mode\":true,\"live_chat_filter_emoji_suggestions\":true,\"live_chat_increased_min_height\":true,\"live_chat_over_playlist\":true,\"live_chat_unclickable_message\":true,\"live_chat_use_toggle_for_mod_activity\":true,\"live_chat_use_toggle_for_timestamps\":true,\"live_chat_web_enable_command_handler\":true,\"live_chat_web_input_update\":true,\"live_chat_web_use_emoji_manager_singleton\":true,\"live_chat_whole_message_clickable\":true,\"log_errors_through_nwl_on_retry\":true,\"log_gel_compression_latency\":true,\"log_heartbeat_with_lifecycles\":true,\"log_vis_on_tab_change\":true,\"log_web_endpoint_to_layer\":true,\"main_app_controller_extraction_batch_1\":true,\"main_app_controller_extraction_batch_10\":true,\"main_app_controller_extraction_batch_11\":true,\"main_app_controller_extraction_batch_12\":true,\"main_app_controller_extraction_batch_13\":true,\"main_app_controller_extraction_batch_14\":true,\"main_app_controller_extraction_batch_2\":true,\"main_app_controller_extraction_batch_3\":true,\"main_app_controller_extraction_batch_4\":true,\"main_app_controller_extraction_batch_6\":true,\"main_app_controller_extraction_batch_7\":true,\"main_app_controller_extraction_batch_8\":true,\"mdx_enable_privacy_disclosure_ui\":true,\"mdx_load_cast_api_bootstrap_script\":true,\"migrate_events_to_ts\":true,\"migrate_remaining_web_ad_badges_to_innertube\":true,\"move_vss_away_from_login_info_cookie\":true,\"music_on_main_open_playlist_recommended_videos_in_miniplayer\":true,\"mweb_actions_command_handler\":true,\"mweb_command_handler\":true,\"mweb_deprecate_skip_ve_logging\":true,\"mweb_disable_set_autonav_state_in_player\":true,\"mweb_enable_keto_batch_s3\":true,\"mweb_enable_search_big_thumbs\":true,\"mweb_logo_use_home_page_ve\":true,\"mweb_render_crawler_description\":true,\"mweb_stop_truncating_meta_tags\":true,\"networkless_gel\":true,\"networkless_logging\":true,\"new_csn_storage_design\":true,\"no_sub_count_on_sub_button\":true,\"nwl_send_fast_on_unload\":true,\"nwl_send_from_memory_when_online\":true,\"offline_error_handling\":true,\"pageid_as_header_web\":true,\"pause_ad_video_on_desktop_engagement_panel_click\":true,\"pdg_enable_flow_logging_for_super_chat\":true,\"pdg_enable_flow_logging_for_super_stickers\":true,\"player_allow_autonav_after_playlist\":true,\"player_bootstrap_method\":true,\"player_doubletap_to_seek\":true,\"player_enable_playback_playlist_change\":true,\"polymer_bad_build_labels\":true,\"polymer_enable_controller_extraction\":true,\"polymer_enable_sink_wrapper\":true,\"polymer_task_manager_proxied_promise\":true,\"polymer_verifiy_app_state\":true,\"polymer_video_renderer_defer_menu\":true,\"polymer_ytdi_enable_global_injector\":true,\"problem_walkthrough_sd\":true,\"qoe_send_and_write\":true,\"record_app_crashed_web\":true,\"reduce_emoji_size_to_20\":true,\"reels_web_show_mini_guide_on_shorts\":true,\"register_web_smartimations_component\":true,\"reload_without_polymer_innertube\":true,\"remove_web_comment_id_cache\":true,\"remove_yt_simple_endpoint_from_desktop_display_ad_title\":true,\"replace_closure_window_with_updated_ytwindow_in_studio\":true,\"rich_grid_resize_observer\":true,\"rich_grid_resize_observer_only\":true,\"rich_grid_watch_disable_miniplayer\":true,\"rich_grid_watch_hide_rows_above\":true,\"scheduler_use_raf_by_default\":true,\"search_ui_enable_pve_buy_button\":true,\"search_ui_official_cards_enable_paid_virtual_event_buy_button\":true,\"searchbox_reporting\":true,\"serve_pdp_at_canonical_url\":true,\"service_worker_enabled\":true,\"service_worker_push_enabled\":true,\"service_worker_push_home_page_prompt\":true,\"service_worker_push_watch_page_prompt\":true,\"service_worker_subscribe_with_vapid_key\":true,\"shell_load_gcf\":true,\"shorts_controller_retrieve_seedless_sequence\":true,\"shorts_desktop_watch_while_p2\":true,\"shorts_desktop_watch_while_sdp\":true,\"shorts_in_playlists_web\":true,\"shorts_overlay_reshuffle\":true,\"shorts_profile_header_c3po\":true,\"should_clear_video_data_on_player_cued_unstarted\":true,\"show_civ_reminder_on_web\":true,\"show_pom_role_on_web\":true,\"skip_invalid_ytcsi_ticks\":true,\"skip_ls_gel_retry\":true,\"skip_setting_info_in_csi_data_object\":true,\"smartimation_background\":true,\"sponsorships_free_creator_gifting\":true,\"st_skip_debug_params\":true,\"start_client_gcf\":true,\"start_client_gcf_for_player\":true,\"start_sending_config_hash\":true,\"suppress_error_204_logging\":true,\"suppress_excessive_ad_like_unit_on_web\":true,\"transport_use_scheduler\":true,\"trigger_impression_pings_on_view_search_desktop\":true,\"update_log_event_config\":true,\"update_ytWindow_library_use_closure_window_library\":true,\"use_ads_engagement_panel_desktop_footer_cta\":true,\"use_better_post_dismissals\":true,\"use_border_and_grid_wrapping_on_desktop_panel_tiles\":true,\"use_color_palettes_modern_collections_v2\":true,\"use_core_sm\":true,\"use_csi_stp_handler\":true,\"use_new_cml\":true,\"use_new_in_memory_storage\":true,\"use_new_nwl_initialization\":true,\"use_new_nwl_saw\":true,\"use_new_nwl_stw\":true,\"use_new_nwl_wts\":true,\"use_not_now_dl_upsell_dismiss_cta\":true,\"use_player_abuse_bg_library\":true,\"use_profilepage_event_label_in_carousel_playbacks\":true,\"use_request_time_ms_header\":true,\"use_session_based_sampling\":true,\"use_ts_visibilitylogger\":true,\"use_watch_fragments2\":true,\"vss_final_ping_send_and_write\":true,\"vss_playback_use_send_and_write\":true,\"warm_load_nav_start_web\":true,\"warm_op_csn_cleanup\":true,\"web_always_load_chat_support\":true,\"web_amsterdam_playlists\":true,\"web_amsterdam_post_mvp_playlists\":true,\"web_animated_actions\":true,\"web_animated_like\":true,\"web_animated_like_lazy_load\":true,\"web_api_url\":true,\"web_appshell_purge_trigger\":true,\"web_appshell_refresh_trigger\":true,\"web_autonav_allow_off_by_default\":true,\"web_button_rework\":true,\"web_button_rework_with_live\":true,\"web_cinematic_masthead\":true,\"web_collect_offline_state\":true,\"web_csi_action_sampling_enabled\":true,\"web_csi_debug_sample_enabled\":true,\"web_darker_dark_theme\":true,\"web_darker_dark_theme_deprecate\":true,\"web_darker_dark_theme_live_chat\":true,\"web_dedupe_ve_grafting\":true,\"web_defer_shorts_ui\":true,\"web_defer_shorts_ui_phase2\":true,\"web_deprecate_service_ajax_map_dependency\":true,\"web_disable_animated_thumbs_when_inline_is_disabled\":true,\"web_disable_channels_chapter_entrypoint\":true,\"web_disable_vertical_scroll_chips\":true,\"web_dont_log_hidden_rich_item_state_changed\":true,\"web_enable_ab_em_rsp\":true,\"web_enable_ab_rsp_cl\":true,\"web_enable_abd_ref\":true,\"web_enable_adaptive_appl_signal\":true,\"web_enable_dynamic_metadata\":true,\"web_enable_error_204\":true,\"web_enable_history_cache_map\":true,\"web_enable_pdp_mini_player\":true,\"web_enable_reel_item_badges\":true,\"web_enable_shorts_shelf_inline_playback\":true,\"web_enable_voz_audio_feedback\":true,\"web_enable_youtab\":true,\"web_engagement_panel_show_description\":true,\"web_fill_shorts_inline_playback_endpoint\":true,\"web_filled_subscribed_button\":true,\"web_fix_fine_scrubbing_drag\":true,\"web_forward_command_on_pbj\":true,\"web_gel_timeout_cap\":true,\"web_guide_entry_role_is_link\":true,\"web_guide_ui_refresh\":true,\"web_header_eu_about_these_results\":true,\"web_hide_autonav_keyline\":true,\"web_horizontal_list_focus_bugfix\":true,\"web_inline_player_enabled\":true,\"web_kevlar_enable_adaptive_signals\":true,\"web_localized_cc_icon\":true,\"web_log_memory_total_kbytes\":true,\"web_log_player_watch_next_ticks\":true,\"web_log_reels_ticks\":true,\"web_logging_max_batch_hard_limit\":true,\"web_memoize_inflight_requests\":true,\"web_modern_ads\":true,\"web_modern_buttons\":true,\"web_modern_buttons_bl_survey\":true,\"web_modern_chips\":true,\"web_modern_collections\":true,\"web_modern_collections_v2\":true,\"web_modern_dialogs\":true,\"web_modern_player_settings_quality_bottom\":true,\"web_modern_playlists\":true,\"web_modern_subscribe\":true,\"web_modern_tabs\":true,\"web_modern_typography\":true,\"web_move_autoplay_video_under_chip\":true,\"web_one_platform_error_handling\":true,\"web_persist_server_autonav_state_on_client\":true,\"web_player_add_ve_conversion_logging_to_outbound_links\":true,\"web_player_always_enable_auto_translation\":true,\"web_player_autonav_empty_suggestions_fix\":true,\"web_player_autonav_toggle_always_listen\":true,\"web_player_autonav_use_server_provided_state\":true,\"web_player_disable_inline_scrubbing\":true,\"web_player_enable_cultural_moment_overlay\":true,\"web_player_enable_early_warning_snackbar\":true,\"web_player_enable_info_button_in_banner_on_desktop\":true,\"web_player_enable_premium_hbr_in_h5_api\":true,\"web_player_enable_premium_hbr_playback_cap\":true,\"web_player_enable_vod_featured_product_banner_on_desktop\":true,\"web_player_entities_middleware\":true,\"web_player_log_click_before_generating_ve_conversion_params\":true,\"web_player_move_autonav_toggle\":true,\"web_player_should_honor_include_asr_setting\":true,\"web_player_small_hbp_settings_menu\":true,\"web_player_topify_subtitles_for_shorts\":true,\"web_player_touch_mode_improvements\":true,\"web_player_use_heartbeat_poll_delay_ms\":true,\"web_player_use_new_api_for_quality_pullback\":true,\"web_player_ve_conversion_fixes_for_channel_info\":true,\"web_prefetch_preload_video\":true,\"web_prs_testing_mode_killswitch\":true,\"web_replace_thumbnail_with_image\":true,\"web_resizable_advertiser_banner_on_masthead\":true,\"web_rich_shelf_show_less_button\":true,\"web_rich_shelf_show_less_button_overlapping_divider\":true,\"web_rich_shelf_show_more_button\":true,\"web_rich_shelf_show_more_button_overlapping_divider\":true,\"web_rounded_thumbnails\":true,\"web_scheduler_auto_init\":true,\"web_search_big_shorts_thumbnails\":true,\"web_segmented_like_dislike_button\":true,\"web_sheets_ui_refresh\":true,\"web_shorts_inline_playback_log_as_reels\":true,\"web_shorts_progress_bar\":true,\"web_shorts_shelf_on_search\":true,\"web_shorts_skip_loading_same_index\":true,\"web_shorts_surveys\":true,\"web_snackbar_ui_refresh\":true,\"web_speedmaster_spacebar_control\":true,\"web_structured_description_show_more\":true,\"web_suggestion_box_bolder\":true,\"web_suggestion_box_restyle\":true,\"web_supports_animations_api\":true,\"web_use_cache_for_image_fallback\":true,\"web_watch_chips_mask_fade\":true,\"web_watch_cinematics_preferred_reduced_motion_default_disabled\":true,\"web_watch_rounded_player_large\":true,\"web_watch_updated_metadata_server_initial_delay\":true,\"web_yt_config_context\":true,\"webfe_disable_ab_em_plb\":true,\"wil_icon_render_when_idle\":true,\"wiz_use_generic_logging_infra\":true,\"woffle_clean_up_after_entity_migration\":true,\"woffle_enable_download_status\":true,\"woffle_orchestration\":true,\"woffle_playlist_only_show_completed\":true,\"woffle_playlist_optimization\":true,\"woffle_used_state_report\":true,\"your_data_entrypoint\":true,\"yt_network_manager_component_to_lib_killswitch\":true,\"ytidb_clear_embedded_player\":true,\"ytidb_fetch_datasync_ids_for_data_cleanup\":true,\"H5_async_logging_delay_ms\":30000.0,\"addto_ajax_log_warning_fraction\":0.1,\"autoplay_pause_by_lact_sampling_fraction\":0.0,\"browse_ajax_log_warning_fraction\":1.0,\"cinematic_watch_effect_opacity\":0.4,\"dynamic_metadata_update_interaction_delay_period_sec\":5.0,\"formatted_description_log_warning_fraction\":0.01,\"kevlar_tuner_clamp_device_pixel_ratio\":2.0,\"kevlar_tuner_thumbnail_factor\":1.0,\"kevlar_unified_player_logging_threshold\":1.0,\"live_reactions_desktop_opacity\":1.0,\"log_window_onerror_fraction\":0.1,\"polymer_property_access_logging_percent\":0.0,\"polymer_report_client_url_requested_rate\":0.001,\"polymer_report_missing_web_navigation_endpoint_rate\":0.001,\"prefetch_coordinator_error_logging_sampling_rate\":1.0,\"tv_pacf_logging_sample_rate\":0.01,\"web_shorts_error_logging_threshold\":0.001,\"web_shorts_intersection_observer_threshold_override\":0.0,\"web_system_health_fraction\":0.01,\"ytidb_transaction_ended_event_rate_limit\":0.02,\"ytidb_transaction_ended_event_rate_limit_session\":0.2,\"ytidb_transaction_ended_event_rate_limit_transaction\":0.1,\"active_time_update_interval_ms\":10000,\"autoplay_pause_by_lact_sec\":0,\"autoplay_time\":8000,\"autoplay_time_for_fullscreen\":3000,\"autoplay_time_for_music_content\":3000,\"botguard_async_snapshot_timeout_ms\":3000,\"check_navigator_accuracy_timeout_ms\":0,\"cinematic_watch_css_filter_blur_strength\":40,\"cinematic_watch_fade_out_duration\":500,\"client_streamz_web_flush_count\":100,\"client_streamz_web_flush_interval_seconds\":60,\"close_webview_delay_ms\":100,\"cloud_save_game_data_rate_limit_ms\":3000,\"compression_disable_point\":10,\"compression_performance_threshold\":250,\"desktop_fountain_emoji_size_px\":20,\"desktop_search_suggestion_tap_target\":0,\"enable_dismiss_loader_ms\":0,\"external_fullscreen_button_click_threshold\":2,\"external_fullscreen_button_shown_threshold\":10,\"gel_min_batch_size\":3,\"gel_queue_timeout_max_ms\":300000,\"get_async_timeout_ms\":60000,\"hide_cta_for_home_web_video_ads_animate_in_time\":2,\"high_priority_flyout_frequency\":3,\"initial_gel_batch_timeout\":2000,\"innertube_request_limit_ms\":3000,\"kevlar_lockup_hover_delay\":32,\"kevlar_mini_guide_width_threshold\":791,\"kevlar_persistent_guide_width_threshold\":1312,\"kevlar_time_caching_end_threshold\":15,\"kevlar_time_caching_start_threshold\":15,\"kevlar_tooltip_impression_cap\":2,\"kevlar_tuner_default_comments_delay\":1000,\"kevlar_tuner_scheduler_soft_state_timer_ms\":800,\"kevlar_tuner_visibility_time_between_jobs_ms\":100,\"kevlar_watch_flexy_metadata_height\":136,\"kevlar_watch_grid_below_player_value\":0,\"kevlar_watch_metadata_refresh_description_lines\":3,\"live_chat_chunk_rendering\":0,\"live_chat_emoji_picker_restyle_bottom_px\":0,\"live_chat_emoji_picker_restyle_height_percent\":0,\"live_chat_emoji_picker_restyle_height_px\":0,\"live_chat_emoji_picker_restyle_width_px\":0,\"live_chat_max_chunk_size\":5,\"live_chat_min_chunk_interval_ms\":300,\"live_reactions_desktop_fab_relocation_mode\":0,\"live_reactions_desktop_opacity_mode\":0,\"log_web_meta_interval_ms\":0,\"max_body_size_to_compress\":500000,\"max_duration_to_consider_mouseover_as_hover\":600000,\"max_prefetch_window_sec_for_livestream_optimization\":10,\"min_mouse_still_duration\":100,\"min_prefetch_offset_sec_for_livestream_optimization\":20,\"minimum_duration_to_consider_mouseover_as_hover\":500,\"mweb_history_manager_cache_size\":100,\"mweb_history_manager_w2w_ttl\":0,\"network_polling_interval\":30000,\"pacf_logging_delay_milliseconds_through_ybfe_tv\":30000,\"pbj_navigate_limit\":-1,\"play_click_interval_ms\":30000,\"play_ping_interval_ms\":10000,\"post_type_icons_rearrange\":1,\"prefetch_comments_ms_after_video\":0,\"prefetch_coordinator_command_timeout_ms\":60000,\"prefetch_coordinator_max_inflight_requests\":1,\"rich_grid_max_item_width\":500,\"rich_grid_min_item_width\":310,\"send_config_hash_timer\":0,\"service_worker_push_logged_out_prompt_watches\":-1,\"service_worker_push_prompt_cap\":-1,\"service_worker_push_prompt_delay_microseconds\":3888000000000,\"slow_compressions_before_abandon_count\":4,\"user_engagement_experiments_rate_limit_ms\":86400000,\"user_mention_suggestions_edu_impression_cap\":10,\"visibility_time_between_jobs_ms\":100,\"web_cold_open_animation_initial_delay\":2000,\"web_emulated_idle_callback_delay\":0,\"web_foreground_heartbeat_interval_ms\":28000,\"web_gel_debounce_ms\":60000,\"web_inline_player_triggering_delay\":1000,\"web_logging_max_batch\":150,\"web_player_caption_language_preference_stickiness_duration\":30,\"web_search_inline_player_triggering_delay\":0,\"web_search_shorts_inline_playback_duration_ms\":5000,\"web_shorts_inline_playback_preview_ms\":5000,\"web_smoothness_test_duration_ms\":0,\"web_smoothness_test_method\":0,\"wil_icon_max_concurrent_fetches\":9999,\"wn_grid_max_item_width\":0,\"wn_grid_min_item_width\":0,\"yoodle_end_time_utc\":0,\"yoodle_start_time_utc\":0,\"ytidb_remake_db_retries\":3,\"ytidb_reopen_db_retries\":3,\"WebClientReleaseProcessCritical__youtube_web_client_version_override\":\"\",\"comment_input_box_triggering_strategy\":\"NEVER\",\"debug_forced_internalcountrycode\":\"\",\"desktop_search_bigger_thumbs_style\":\"DEFAULT\",\"desktop_searchbar_style\":\"default\",\"embeds_web_synth_ch_headers_banned_urls_regex\":\"\",\"il_payload_scraping\":\"\",\"kevlar_duplicate_pref_cookie_domain_override\":\"\",\"kevlar_link_capturing_mode\":\"\",\"live_chat_unicode_emoji_json_url\":\"https://www.gstatic.com/youtube/img/emojis/emojis-svg-9.json\",\"polymer_task_manager_status\":\"production\",\"reels_action_justified_content\":\"flex-start\",\"reels_metadata_justified_content\":\"flex-start\",\"service_worker_push_force_notification_prompt_tag\":\"1\",\"service_worker_scope\":\"/\",\"web_async_context_processor_impl\":\"standalone\",\"web_client_version_override\":\"\",\"web_home_feed_reload_experience\":\"none\",\"web_modern_subscribe_style\":\"filled\",\"web_shorts_expanded_overlay_type\":\"DEFAULT\",\"web_shorts_overlay_vertical_orientation\":\"bottom\",\"yoodle_base_url\":\"\",\"yoodle_webp_base_url\":\"\",\"conditional_lab_ids\":[],\"guide_business_info_countries\":[\"KR\"],\"guide_legal_footer_enabled_countries\":[\"NL\",\"ES\"],\"kevlar_command_handler_command_banlist\":[],\"kevlar_page_service_url_prefix_carveouts\":[],\"web_op_signal_type_banlist\":[]},\"GAPI_HINT_PARAMS\":\"m;/_/scs/abc-static/_/js/k\\u003dgapi.gapi.en.CzrNRWo3AFk.O/d\\u003d1/rs\\u003dAHpOoo8xPbrtpW2bPUIcgU2adGqIEpV82Q/m\\u003d__features__\",\"GAPI_HOST\":\"https://apis.google.com\",\"GAPI_LOCALE\":\"en_US\",\"GL\":\"IT\",\"GOOGLE_FEEDBACK_PRODUCT_ID\":\"59\",\"GOOGLE_FEEDBACK_PRODUCT_DATA\":{\"polymer\":\"active\",\"polymer2\":\"active\",\"accept_language\":\"en-US,en;q\\u003d0.9\"},\"HL\":\"en\",\"HTML_DIR\":\"ltr\",\"HTML_LANG\":\"en\",\"INNERTUBE_API_KEY\":\"AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\",\"INNERTUBE_API_VERSION\":\"v1\",\"INNERTUBE_CLIENT_NAME\":\"WEB\",\"INNERTUBE_CLIENT_VERSION\":\"2.20231121.08.00\",\"INNERTUBE_CONTEXT\":{\"client\":{\"hl\":\"en\",\"gl\":\"IT\",\"remoteHost\":\"[scrubbed]\",\"deviceMake\":\"\",\"deviceModel\":\"\",\"visitorData\":\"CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36,gzip(gfe)\",\"clientName\":\"WEB\",\"clientVersion\":\"2.20231121.08.00\",\"osName\":\"Windows\",\"osVersion\":\"10.0\",\"originalUrl\":\"https://www.youtube.com/\",\"platform\":\"DESKTOP\",\"clientFormFactor\":\"UNKNOWN_FORM_FACTOR\",\"configInfo\":{\"appInstallData\":\"COCy_qoGEMeDsAUQpoGwBRCU-v4SEOno_hIQ1-mvBRCIh7AFEIjjrwUQ1KGvBRDQ4q8FENuvrwUQ95ewBRDrk64FEPaOsAUQ_IWwBRCp968FEJaDsAUQsYewBRCa8K8FEL_3rwUQp_evBRCyxq8FENnJrwUQuIuuBRC9tq4FEK7U_hIQ3ej-EhCrgrAFEKy3rwUQ4divBRCei7AFEKKBsAUQ1YiwBRC3768FEOHyrwUQzN-uBRD6vq8FEOb9_hIQ7qKvBRDi1K4FEL6KsAUQqIGwBRDUkrAFELfq_hIQvPmvBRDnuq8FEK-HsAUQmZGwBRD1-a8FEMyu_hIQpcL-EhDb2K8FEOvo_hIQyfevBRDj2K8FEKuHsAUQrYewBRDf2K8FEKKSsAUQ3IKwBRD1-_4SEL75rwUQ6sOvBRCZlLAFENPhrwUQ6pawBRDks_4SEInorgUQyv-vBRDRiLAF\"},\"userInterfaceTheme\":\"USER_INTERFACE_THEME_LIGHT\",\"browserName\":\"Chrome\",\"browserVersion\":\"[scrubbed]\",\"acceptHeader\":\"text/html,application/xhtml+xml,application/xml;q\\u003d0.9,*/*;q\\u003d0.8\",\"deviceExperimentId\":\"ChxOek13TkRjeU5UYzFPVGd4TURneU5qWXlOUT09EOCy_qoGGOCy_qoG\"},\"user\":{\"lockedSafetyMode\":false},\"request\":{\"useSsl\":true},\"clickTracking\":{\"clickTrackingParams\":\"IhMI9bnv0N/aggMVjmF6BR1HrgqB\"}},\"INNERTUBE_CONTEXT_CLIENT_NAME\":1,\"INNERTUBE_CONTEXT_CLIENT_VERSION\":\"2.20231121.08.00\",\"INNERTUBE_CONTEXT_GL\":\"IT\",\"INNERTUBE_CONTEXT_HL\":\"en\",\"LATEST_ECATCHER_SERVICE_TRACKING_PARAMS\":{\"client.name\":\"WEB\"},\"LOGGED_IN\":false,\"PAGE_BUILD_LABEL\":\"youtube.desktop.web_20231121_08_RC00\",\"PAGE_CL\":584454497,\"scheduler\":{\"useRaf\":true,\"timeout\":20},\"SERVER_NAME\":\"WebFE\",\"SESSION_INDEX\":\"\",\"SIGNIN_URL\":\"https://accounts.google.com/ServiceLogin?service\\u003dyoutube\\u0026uilel\\u003d3\\u0026passive\\u003dtrue\\u0026continue\\u003dhttps%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3Dhttps%253A%252F%252Fwww.youtube.com%252F%26feature%3D__FEATURE__\\u0026hl\\u003den\",\"WEB_PLAYER_CONTEXT_CONFIGS\":{\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH\":{\"transparentBackground\":true,\"showMiniplayerButton\":true,\"externalFullscreen\":true,\"showMiniplayerUiWhenMinimized\":true,\"rootElementId\":\"movie_player\",\"jsUrl\":\"/s/player/63e90c30/player_ias.vflset/en_US/base.js\",\"cssUrl\":\"/s/player/63e90c30/www-player.css\",\"contextId\":\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH\",\"eventLabel\":\"detailpage\",\"contentRegion\":\"IT\",\"hl\":\"en_US\",\"hostLanguage\":\"en\",\"playerStyle\":\"desktop-polymer\",\"innertubeApiKey\":\"AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\",\"innertubeApiVersion\":\"v1\",\"innertubeContextClientVersion\":\"2.20231121.08.00\",\"device\":{\"brand\":\"\",\"model\":\"\",\"browser\":\"Chrome\",\"browserVersion\":\"[scrubbed]\",\"os\":\"Windows\",\"osVersion\":\"10.0\",\"platform\":\"DESKTOP\",\"interfaceName\":\"WEB\",\"interfaceVersion\":\"2.20231121.08.00\"},\"serializedExperimentIds\":\"23983296,23986028,24004644,24007246,24080738,24135310,24208765,24371398,24371779,24385728,24439361,24524098,24543193,24543197,24543199,24543201,24549786,24550458,24559327,24560416,24566293,24566687,24699899,51006181,51010235,51012165,51017346,51026715,51027535,51028271,51030311,51035166,51037540,51038399,51038805,51039199,51039493,51039699,51041809,51044150,51044152,51044154,51044158,51046164,51047619,51049006,51054675,51055917,51056050,51057534,51060161,51067339,51069001\",\"serializedExperimentFlags\":\"H5_async_logging_delay_ms\\u003d30000.0\\u0026H5_enable_full_pacf_logging\\u003dtrue\\u0026H5_use_async_logging\\u003dtrue\\u0026ab_det_apb_b\\u003dtrue\\u0026ab_det_fet_wr\\u003dtrue\\u0026ab_det_fet_wr_en\\u003dtrue\\u0026ab_det_gen_re\\u003dtrue\\u0026action_companion_center_align_description\\u003dtrue\\u0026ad_pod_disable_companion_persist_ads_quality\\u003dtrue\\u0026addto_ajax_log_warning_fraction\\u003d0.1\\u0026align_ad_to_video_player_lifecycle_for_bulleit\\u003dtrue\\u0026allow_drm_override\\u003dtrue\\u0026allow_live_autoplay\\u003dtrue\\u0026allow_poltergust_autoplay\\u003dtrue\\u0026allow_skip_networkless\\u003dtrue\\u0026allow_vp9_1080p_mq_enc\\u003dtrue\\u0026att_web_record_metrics\\u003dtrue\\u0026autoplay_time\\u003d8000\\u0026autoplay_time_for_fullscreen\\u003d3000\\u0026autoplay_time_for_music_content\\u003d3000\\u0026bg_vm_reinit_threshold\\u003d7200000\\u0026blocked_packages_for_sps\\u003d[]\\u0026botguard_async_snapshot_timeout_ms\\u003d3000\\u0026captions_url_add_ei\\u003dtrue\\u0026check_ad_ui_status_for_mweb_safari\\u003dtrue\\u0026check_navigator_accuracy_timeout_ms\\u003d0\\u0026clear_user_partitioned_ls\\u003dtrue\\u0026client_respect_autoplay_switch_button_renderer\\u003dtrue\\u0026compress_gel\\u003dtrue\\u0026compression_disable_point\\u003d10\\u0026compression_performance_threshold\\u003d250\\u0026csi_on_gel\\u003dtrue\\u0026dash_manifest_version\\u003d5\\u0026debug_bandaid_hostname\\u003d\\u0026debug_sherlog_username\\u003d\\u0026delay_ads_gvi_call_on_bulleit_living_room_ms\\u003d0\\u0026deprecate_csi_has_info\\u003dtrue\\u0026deprecate_delay_ping\\u003dtrue\\u0026deprecate_pair_servlet_enabled\\u003dtrue\\u0026desktop_image_cta_no_background\\u003dtrue\\u0026desktop_log_img_click_location\\u003dtrue\\u0026desktop_sparkles_light_cta_button\\u003dtrue\\u0026disable_channel_id_check_for_suspended_channels\\u003dtrue\\u0026disable_child_node_auto_formatted_strings\\u003dtrue\\u0026disable_defer_admodule_on_advertiser_video\\u003dtrue\\u0026disable_features_for_supex\\u003dtrue\\u0026disable_inline_preview_scrubbing_for_vac_ads_on_web\\u003dtrue\\u0026disable_legacy_desktop_remote_queue\\u003dtrue\\u0026disable_mdx_connection_in_mdx_module_for_music_web\\u003dtrue\\u0026disable_new_pause_state3\\u003dtrue\\u0026disable_pacf_logging_for_memory_limited_tv\\u003dtrue\\u0026disable_rounding_ad_notify\\u003dtrue\\u0026disable_simple_mixed_direction_formatted_strings\\u003dtrue\\u0026disable_ssdai_on_errors\\u003dtrue\\u0026disable_tabbing_before_flyout_ad_elements_appear\\u003dtrue\\u0026disable_thumbnail_preloading\\u003dtrue\\u0026edge_encryption_fill_primary_key_version\\u003dtrue\\u0026embeds_add_player_mode_to_ad_events\\u003dtrue\\u0026embeds_disable_progress_bar_context_menu_handling\\u003dtrue\\u0026embeds_enable_muted_autoplay\\u003dtrue\\u0026embeds_web_enable_autoplay_not_supported_logging_fix\\u003dtrue\\u0026embeds_web_enable_host_flags_client_permissions\\u003dtrue\\u0026embeds_web_enable_host_flags_innertube\\u003dtrue\\u0026embeds_web_enable_lite_logging\\u003dtrue\\u0026embeds_web_enable_load_player_from_page_show\\u003dtrue\\u0026embeds_web_enable_log_splay_as_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_dtts\\u003dtrue\\u0026embeds_web_enable_modestbranding_deprecation\\u003dtrue\\u0026embeds_web_enable_pause_overlay_wn_update\\u003dtrue\\u0026embeds_web_enable_pfp_unbranded_el_deprecation\\u003dtrue\\u0026embeds_web_enable_rcat_allowlist\\u003dtrue\\u0026embeds_web_enable_scripted_playback_blocked_logging_fix\\u003dtrue\\u0026embeds_web_enable_smallmode_fullscreen_button_fix\\u003dtrue\\u0026embeds_web_enable_ve_conversion_logging_tracking_no_allow_list\\u003dtrue\\u0026embeds_web_hide_unfilled_more_videos_suggestions\\u003dtrue\\u0026embeds_web_lite_mode\\u003d1\\u0026embeds_web_move_preload_by_player_vars_to_public\\u003dtrue\\u0026embeds_web_nwl_disable_nocookie\\u003dtrue\\u0026embeds_web_shopping_overlay_no_wait_for_paid_content_overlay\\u003dtrue\\u0026embeds_web_synth_ch_headers_banned_urls_regex\\u003d\\u0026enable_ab_report_on_errorscreen\\u003dtrue\\u0026enable_ab_rp_int\\u003dtrue\\u0026enable_ad_cpn_macro_substitution_for_click_pings\\u003dtrue\\u0026enable_app_promo_endcap_eml_on_tablet\\u003dtrue\\u0026enable_ata_dialog_all_web\\u003dtrue\\u0026enable_cast_for_web_unplugged\\u003dtrue\\u0026enable_cast_on_music_web\\u003dtrue\\u0026enable_client_page_id_header_for_first_party_pings\\u003dtrue\\u0026enable_client_sli_logging\\u003dtrue\\u0026enable_cta_banner_on_unplugged_lr\\u003dtrue\\u0026enable_dark_mode_style_endcap\\u003dtrue\\u0026enable_dark_mode_style_endcap_timed_pie_countdown\\u003dtrue\\u0026enable_discrete_live_precise_embargos\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_android\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_ios\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_compliant_banner_image_ad_renderer\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_mobile\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_one_click_ata_translators_infeed_elements\\u003dtrue\\u0026enable_error_corrections_infocard\\u003dtrue\\u0026enable_error_corrections_infocard_web_client\\u003dtrue\\u0026enable_error_corrections_infocard_web_client_check\\u003dtrue\\u0026enable_error_corrections_infocards_icon_web\\u003dtrue\\u0026enable_eviction_protection_for_bulleit\\u003dtrue\\u0026enable_flow_logging_p4e\\u003dtrue\\u0026enable_free_preview_timer\\u003dtrue\\u0026enable_gel_log_commands\\u003dtrue\\u0026enable_h5_player_ad_block_status_logging\\u003dtrue\\u0026enable_h5_player_ad_block_status_piping\\u003dtrue\\u0026enable_handles_account_menu_switcher\\u003dtrue\\u0026enable_high_frequency_cookie_rotation\\u003dtrue\\u0026enable_kabuki_comments_on_shorts\\u003ddisabled\\u0026enable_live_ad_serving_context\\u003dtrue\\u0026enable_live_premiere_web_player_indicator\\u003dtrue\\u0026enable_loggingcontext_trackingparams\\u003dtrue\\u0026enable_lr_home_infeed_ads_inline_playback_progress_pings\\u003dtrue\\u0026enable_mixed_direction_formatted_strings\\u003dtrue\\u0026enable_modern_skip_button_on_web\\u003dtrue\\u0026enable_multiple_heatseeker_decorations\\u003dtrue\\u0026enable_mweb_endcap_clickable_icon_description\\u003dtrue\\u0026enable_mweb_endcap_dark_mode_action_button\\u003dtrue\\u0026enable_mweb_livestream_ui_update\\u003dtrue\\u0026enable_new_paid_product_placement\\u003dtrue\\u0026enable_out_of_stock_text_all_surfaces\\u003dtrue\\u0026enable_pacf_slot_asde_infeed_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5_TV\\u003dtrue\\u0026enable_pacf_through_ybfe_tv\\u003dtrue\\u0026enable_pacf_through_ybfe_tv_for_page_top_formats\\u003dtrue\\u0026enable_pacf_through_ysfe_tv\\u003dtrue\\u0026enable_pass_sdc_get_accounts_list\\u003dtrue\\u0026enable_pl_r_c\\u003dtrue\\u0026enable_pl_r_c_s\\u003dtrue\\u0026enable_pl_r_si_fa\\u003dtrue\\u0026enable_player_param_truncation_before_navigation_on_web_on_search\\u003dtrue\\u0026enable_populate_att_psd_in_abe_feedback\\u003dtrue\\u0026enable_populate_psd_in_abe_feedback\\u003dtrue\\u0026enable_post_ad_perception_survey_fix_on_tvhtml5\\u003dtrue\\u0026enable_post_ad_perception_survey_in_tvhtml5\\u003dtrue\\u0026enable_sdf_midroll_postroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_main\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_misc\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_tv\\u003dtrue\\u0026enable_server_stitched_dai\\u003dtrue\\u0026enable_set_endcap_thumbnail_from_layout\\u003dtrue\\u0026enable_shorts_player\\u003dtrue\\u0026enable_skip_ad_guidance_prompt\\u003dtrue\\u0026enable_skippable_ads_for_unplugged_ad_pod\\u003dtrue\\u0026enable_small_endcap_action_button_for_mweb\\u003dtrue\\u0026enable_smearing_expansion_dai\\u003dtrue\\u0026enable_tectonic_ad_ux_for_halftime\\u003dtrue\\u0026enable_third_party_info\\u003dtrue\\u0026enable_topsoil_wta_for_halftime_live_infra\\u003dtrue\\u0026enable_unknown_lact_fix_on_html5\\u003dtrue\\u0026enable_web_media_session_metadata_fix\\u003dtrue\\u0026enable_web_tiered_gel\\u003dtrue\\u0026enable_wn_infocards\\u003dtrue\\u0026enable_yt_ata_iframe_authuser\\u003dtrue\\u0026err_on_pl_r_c\\u003dtrue\\u0026error_message_for_gsuite_network_restrictions\\u003dtrue\\u0026export_networkless_options\\u003dtrue\\u0026external_fullscreen_with_edu\\u003dtrue\\u0026fetch_att_independently\\u003dtrue\\u0026fetch_bid_for_dclk_status\\u003dtrue\\u0026fill_single_video_with_notify_to_lasr\\u003dtrue\\u0026filter_vp9_for_csdai\\u003dtrue\\u0026fix_ads_tracking_for_swf_config_deprecation_mweb\\u003dtrue\\u0026fix_h5_toggle_button_a11y\\u003dtrue\\u0026fix_survey_color_contrast_on_destop\\u003dtrue\\u0026fix_toggle_button_role_for_ad_components\\u003dtrue\\u0026fix_web_instream_survey_question_aria_label\\u003dtrue\\u0026gcf_config_store_enabled\\u003dtrue\\u0026gcf_music_innertube\\u003dtrue\\u0026gel_min_batch_size\\u003d3\\u0026gel_queue_timeout_max_ms\\u003d300000\\u0026gpa_sparkles_ten_percent_layer\\u003dtrue\\u0026gvi_channel_client_screen\\u003dtrue\\u0026h5_companion_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_enable_generic_error_logging_event\\u003dtrue\\u0026h5_enable_unified_csi_preroll\\u003dtrue\\u0026h5_inplayer_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_reset_cache_and_filter_before_update_masthead\\u003dtrue\\u0026heatseeker_decoration_threshold\\u003d0.8\\u0026hfr_dropped_framerate_fallback_threshold\\u003d0\\u0026hide_cta_for_home_web_video_ads_animate_in_time\\u003d2\\u0026hide_endpoint_overflow_on_ytd_display_ad_renderer\\u003dtrue\\u0026html5_ad_timeout_ms\\u003d0\\u0026html5_adaptation_step_count\\u003d0\\u0026html5_add_dai_smearing_to_qoe\\u003dtrue\\u0026html5_add_drm_formats_to_test_format\\u003dtrue\\u0026html5_ads_preroll_lock_timeout_delay_ms\\u003d15000\\u0026html5_allow_video_keyframe_without_audio\\u003dtrue\\u0026html5_apply_min_failures\\u003dtrue\\u0026html5_apply_start_time_within_ads_for_ssdai_transitions\\u003dtrue\\u0026html5_atr_disable_force_fallback\\u003dtrue\\u0026html5_attach_num_random_bytes_to_bandaid\\u003d0\\u0026html5_attach_po_token_to_bandaid\\u003dtrue\\u0026html5_autonav_cap_idle_secs\\u003d0\\u0026html5_autonav_quality_cap\\u003d720\\u0026html5_autoplay_default_quality_cap\\u003d0\\u0026html5_block_pip_safari_delay\\u003d0\\u0026html5_bypass_contention_secs\\u003d0.0\\u0026html5_cache_request_key\\u003d\\u0026html5_check_for_idle_network_interval_ms\\u003d-1\\u0026html5_check_video_data_errors_before_playback_start\\u003dtrue\\u0026html5_cobalt_default_buffer_size_in_bytes\\u003d0\\u0026html5_cobalt_max_size_for_immed_job\\u003d0\\u0026html5_cobalt_min_processor_cnt_to_offload_algo\\u003d0\\u0026html5_cobalt_override_quic\\u003d0\\u0026html5_consume_media_bytes_slice_infos\\u003dtrue\\u0026html5_continuous_goodput_probe_interval_ms\\u003d0\\u0026html5_de_dupe_content_video_loads_in_lifecycle_api\\u003dtrue\\u0026html5_debug_data_log_probability\\u003d0.1\\u0026html5_decode_to_texture_cap\\u003dtrue\\u0026html5_default_ad_gain\\u003d0.5\\u0026html5_default_quality_cap\\u003d0\\u0026html5_defer_fetch_att_ms\\u003d1000\\u0026html5_delayed_retry_count\\u003d1\\u0026html5_delayed_retry_delay_ms\\u003d5000\\u0026html5_deprecate_adservice\\u003dtrue\\u0026html5_deprecate_video_tag_pool\\u003dtrue\\u0026html5_desktop_vr180_allow_panning\\u003dtrue\\u0026html5_df_downgrade_thresh\\u003d0.6\\u0026html5_disable_csi_for_bulleit\\u003dtrue\\u0026html5_disable_move_pssh_to_moov\\u003dtrue\\u0026html5_disable_non_contiguous\\u003dtrue\\u0026html5_displayed_frame_rate_downgrade_threshold\\u003d45\\u0026html5_drm_byterate_soft_cap\\u003d0\\u0026html5_drm_check_all_key_error_states\\u003dtrue\\u0026html5_drm_cpi_license_key\\u003dtrue\\u0026html5_drm_live_byterate_soft_cap\\u003d0\\u0026html5_enable_ac3\\u003dtrue\\u0026html5_enable_ads_client_monitoring_log_tv\\u003dtrue\\u0026html5_enable_caption_changes_for_mosaic\\u003dtrue\\u0026html5_enable_client_hints_override\\u003dtrue\\u0026html5_enable_composite_embargo\\u003dtrue\\u0026html5_enable_eac3\\u003dtrue\\u0026html5_enable_embedded_player_visibility_signals\\u003dtrue\\u0026html5_enable_non_notify_composite_vod_lsar_pacf\\u003dtrue\\u0026html5_enable_oduc\\u003dtrue\\u0026html5_enable_pp_proxima_eligible\\u003dtrue\\u0026html5_enable_single_video_vod_ivar_on_pacf\\u003dtrue\\u0026html5_enable_tvos_dash\\u003dtrue\\u0026html5_enable_tvos_encrypted_vp9\\u003dtrue\\u0026html5_enable_widevine_for_alc\\u003dtrue\\u0026html5_enable_widevine_for_fast_linear\\u003dtrue\\u0026html5_encourage_array_coalescing\\u003dtrue\\u0026html5_gapless_ended_transition_buffer_ms\\u003d200\\u0026html5_gapless_handoff_close_end_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_close_end_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_handoff_started_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_started_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_loop_seek_offset_in_milli\\u003d0\\u0026html5_generate_session_po_token\\u003dtrue\\u0026html5_gl_fps_threshold\\u003d0\\u0026html5_hdcp_probing_stream_url\\u003d\\u0026html5_head_miss_secs\\u003d0.0\\u0026html5_hfr_quality_cap\\u003d0\\u0026html5_high_res_logging_percent\\u003d0.01\\u0026html5_honor_caption_availabilities_in_audio_track\\u003dtrue\\u0026html5_hopeless_secs\\u003d0\\u0026html5_idle_rate_limit_ms\\u003d0\\u0026html5_ignore_interruptive_ads_for_server_stitched\\u003dtrue\\u0026html5_ignore_stall_from_no_data_timeouts\\u003dtrue\\u0026html5_innertube_heartbeats_for_fairplay\\u003dtrue\\u0026html5_innertube_heartbeats_for_playready\\u003dtrue\\u0026html5_innertube_heartbeats_for_widevine\\u003dtrue\\u0026html5_ios4_seek_above_zero\\u003dtrue\\u0026html5_ios7_force_play_on_stall\\u003dtrue\\u0026html5_ios_force_seek_to_zero_on_stop\\u003dtrue\\u0026html5_jumbo_mobile_subsegment_readahead_target\\u003d3.0\\u0026html5_jumbo_ull_nonstreaming_mffa_ms\\u003d4000\\u0026html5_jumbo_ull_subsegment_readahead_target\\u003d1.3\\u0026html5_license_constraint_delay\\u003d5000\\u0026html5_live_abr_head_miss_fraction\\u003d0.0\\u0026html5_live_abr_repredict_fraction\\u003d0.0\\u0026html5_live_chunk_readahead_proxima_override\\u003d0\\u0026html5_live_head_playable\\u003dtrue\\u0026html5_live_low_latency_bandwidth_window\\u003d0.0\\u0026html5_live_normal_latency_bandwidth_window\\u003d0.0\\u0026html5_live_quality_cap\\u003d0\\u0026html5_live_ultra_low_latency_bandwidth_window\\u003d0.0\\u0026html5_liveness_drift_chunk_override\\u003d0\\u0026html5_liveness_drift_proxima_override\\u003d0\\u0026html5_log_audio_abr\\u003dtrue\\u0026html5_log_audio_switch_metrics\\u003dtrue\\u0026html5_log_experiment_id_from_player_response_to_ctmp\\u003d\\u0026html5_log_first_ssdai_requests_killswitch\\u003dtrue\\u0026html5_log_rebuffer_events\\u003d5\\u0026html5_log_trigger_events_with_debug_data\\u003dtrue\\u0026html5_long_rebuffer_jiggle_cmt_delay_ms\\u003d0\\u0026html5_long_rebuffer_threshold_ms\\u003d30000\\u0026html5_manifestless_unplugged\\u003dtrue\\u0026html5_manifestless_vp9_otf\\u003dtrue\\u0026html5_max_buffer_health_for_downgrade_prop\\u003d-1.0\\u0026html5_max_buffer_health_for_downgrade_secs\\u003d0.0\\u0026html5_max_byterate\\u003d0\\u0026html5_max_drift_per_track_secs\\u003d0.0\\u0026html5_max_headm_for_streaming_xhr\\u003d0\\u0026html5_max_live_dvr_window_plus_margin_secs\\u003d46800.0\\u0026html5_max_readbehind_secs\\u003d0\\u0026html5_max_redirect_response_length\\u003d8192\\u0026html5_max_selectable_quality_ordinal\\u003d0\\u0026html5_max_source_buffer_append_size_in_bytes\\u003d0\\u0026html5_maximum_readahead_seconds\\u003d0.0\\u0026html5_media_fullscreen\\u003dtrue\\u0026html5_mffa_ms_proxima_override\\u003d0\\u0026html5_mfl_extend_max_request_time\\u003dtrue\\u0026html5_min_failures_to_delay_retry\\u003d3\\u0026html5_min_media_duration_for_append_prop\\u003d0.0\\u0026html5_min_media_duration_for_cabr_slice\\u003d0.0\\u0026html5_min_progress_event_interval_ms\\u003d10\\u0026html5_min_quality_ordinal\\u003d0\\u0026html5_min_readbehind_cap_secs\\u003d60\\u0026html5_min_readbehind_secs\\u003d0\\u0026html5_min_seconds_between_format_selections\\u003d0.0\\u0026html5_min_selectable_quality_ordinal\\u003d0\\u0026html5_min_startup_buffered_ad_media_duration_secs\\u003d1.2\\u0026html5_min_startup_buffered_media_duration_secs\\u003d1.2\\u0026html5_min_startup_duration_live_secs\\u003d0.25\\u0026html5_min_upgrade_health_secs\\u003d0.0\\u0026html5_minimum_readahead_seconds\\u003d0.0\\u0026html5_mock_content_binding_for_session_token\\u003d\\u0026html5_no_placeholder_rollbacks\\u003dtrue\\u0026html5_non_network_rebuffer_duration_ms\\u003d0\\u0026html5_non_onesie_attach_po_token\\u003dtrue\\u0026html5_normal_latency_mffa_ms\\u003d0\\u0026html5_not_register_disposables_when_core_listens\\u003dtrue\\u0026html5_oduc_transfer_logging\\u003dtrue\\u0026html5_offline_failure_retry_limit\\u003d2\\u0026html5_offline_prevent_redownload_downloaded_video\\u003dtrue\\u0026html5_onesie_defer_content_loader_ms\\u003d0\\u0026html5_onesie_live_ttl_secs\\u003d8\\u0026html5_onesie_notify_cuepoint_manager_on_completion\\u003dtrue\\u0026html5_onesie_prewarm_interval_ms\\u003d0\\u0026html5_onesie_prewarm_max_lact_ms\\u003d0\\u0026html5_onesie_redirector_timeout\\u003dtrue\\u0026html5_onesie_redirector_timeout_ms\\u003d0\\u0026html5_onesie_request_timeout_ms\\u003d1000\\u0026html5_pause_on_nonforeground_platform_errors\\u003dtrue\\u0026html5_peak_shave\\u003dtrue\\u0026html5_perf_cap_override_sticky\\u003dtrue\\u0026html5_performance_cap_floor\\u003d360\\u0026html5_performance_impact_profiling_timer_ms\\u003d0\\u0026html5_perserve_av1_perf_cap\\u003dtrue\\u0026html5_platform_minimum_readahead_seconds\\u003d0.0\\u0026html5_platform_whitelisted_for_frame_accurate_seeks\\u003dtrue\\u0026html5_player_autonav_logging\\u003dtrue\\u0026html5_player_dynamic_bottom_gradient\\u003dtrue\\u0026html5_player_min_build_cl\\u003d-1\\u0026html5_player_preload_ad_fix\\u003dtrue\\u0026html5_post_interrupt_readahead\\u003d20\\u0026html5_prefer_server_bwe3\\u003dtrue\\u0026html5_preload_wait_time_secs\\u003d0.0\\u0026html5_probe_primary_delay_base_ms\\u003d0\\u0026html5_process_all_encrypted_events\\u003dtrue\\u0026html5_ps4_shorts_1080p_soft_cap\\u003dtrue\\u0026html5_qoe_lh_max_report_count\\u003d0\\u0026html5_qoe_lh_min_duration_ms\\u003d0\\u0026html5_qoe_proto_mock_length\\u003d0\\u0026html5_query_sw_secure_crypto_for_android\\u003dtrue\\u0026html5_random_playback_cap\\u003d0\\u0026html5_recognize_predict_start_cue_point\\u003dtrue\\u0026html5_remove_command_triggered_companions\\u003dtrue\\u0026html5_remove_not_servable_check_killswitch\\u003dtrue\\u0026html5_rename_apbs\\u003dtrue\\u0026html5_report_fatal_drm_restricted_error_killswitch\\u003dtrue\\u0026html5_report_slow_ads_as_error\\u003dtrue\\u0026html5_repredict_interval_ms\\u003d0\\u0026html5_request_only_hdr_or_sdr_keys\\u003dtrue\\u0026html5_request_size_max_kb\\u003d0\\u0026html5_request_size_min_kb\\u003d0\\u0026html5_request_sizing_multiplier\\u003d0.8\\u0026html5_resource_bad_status_delay_scaling\\u003d1.5\\u0026html5_restore_time_after_unpause\\u003dtrue\\u0026html5_restore_time_after_unpause_redux\\u003dtrue\\u0026html5_restrict_streaming_xhr_on_sqless_requests\\u003dtrue\\u0026html5_retry_quota_exceeded_via_seek\\u003dtrue\\u0026html5_safari_desktop_eme_min_version\\u003d0\\u0026html5_samsung_kant_limit_max_bitrate\\u003d0\\u0026html5_seek_again_after_time_jump_cfl\\u003dtrue\\u0026html5_seek_jiggle_cmt_delay_ms\\u003d8000\\u0026html5_seek_new_elem_delay_ms\\u003d12000\\u0026html5_seek_new_elem_shorts_delay_ms\\u003d2000\\u0026html5_seek_new_media_element_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_element_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_new_media_source_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_source_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_set_cmt_delay_ms\\u003d2000\\u0026html5_seek_timeout_delay_ms\\u003d20000\\u0026html5_server_stitched_dai_decorated_url_retry_limit\\u003d5\\u0026html5_server_stitched_dai_group\\u003dtrue\\u0026html5_session_po_token_interval_time_ms\\u003d900000\\u0026html5_set_video_data_to_stale\\u003dtrue\\u0026html5_shorts_gapless_next_buffer_in_seconds\\u003d0\\u0026html5_skip_slow_ad_delay_ms\\u003d15000\\u0026html5_slow_start_no_media_source_delay_ms\\u003d0\\u0026html5_slow_start_timeout_delay_ms\\u003d20000\\u0026html5_ssdai_adfetch_dynamic_timeout_ms\\u003d5000\\u0026html5_ssdai_enable_new_seek_logic\\u003dtrue\\u0026html5_ssdai_failure_retry_limit\\u003d0\\u0026html5_stall_factor\\u003d0.0\\u0026html5_stall_window_size_ct\\u003d20\\u0026html5_stateful_audio_min_adjustment_value\\u003d0\\u0026html5_static_abr_resolution_shelf\\u003d0\\u0026html5_store_xhr_headers_readable\\u003dtrue\\u0026html5_streaming_xhr_time_based_consolidation_ms\\u003d0\\u0026html5_subsegment_readahead_load_speed_check_interval\\u003d0.5\\u0026html5_subsegment_readahead_min_buffer_health_secs\\u003d0.25\\u0026html5_subsegment_readahead_min_buffer_health_secs_on_timeout\\u003d0.1\\u0026html5_subsegment_readahead_min_load_speed\\u003d1.5\\u0026html5_subsegment_readahead_seek_latency_fudge\\u003d0.5\\u0026html5_subsegment_readahead_target_buffer_health_secs\\u003d0.5\\u0026html5_subsegment_readahead_timeout_secs\\u003d2.0\\u0026html5_top_shelf_format_byterate_factor\\u003d1.5\\u0026html5_track_overshoot\\u003dtrue\\u0026html5_transfer_processing_logs_interval\\u003d1000\\u0026html5_ugc_live_audio_51\\u003dtrue\\u0026html5_ugc_vod_audio_51\\u003dtrue\\u0026html5_unreported_seek_reseek_delay_ms\\u003d0\\u0026html5_unrestricted_layer_high_res_logging_percent\\u003d0.0\\u0026html5_update_time_on_seeked\\u003dtrue\\u0026html5_use_jsonformatter_to_parse_player_response\\u003dtrue\\u0026html5_use_post_for_media\\u003dtrue\\u0026html5_use_target_duration\\u003dtrue\\u0026html5_use_ump\\u003dtrue\\u0026html5_use_video_transition_endpoint_heartbeat\\u003dtrue\\u0026html5_video_tbd_min_kb\\u003d0\\u0026html5_viewport_undersend_maximum\\u003d0.0\\u0026html5_volume_slider_tooltip\\u003dtrue\\u0026html5_web_po_experiment_ids\\u003d[]\\u0026html5_webpo_idle_priority_job\\u003dtrue\\u0026html5_woffle_resume\\u003dtrue\\u0026html5_workaround_delay_trigger\\u003dtrue\\u0026ignore_overlapping_cue_points_on_endemic_live_html5\\u003dtrue\\u0026il_payload_scraping\\u003d\\u0026il_use_view_model_logging_context\\u003dtrue\\u0026initial_gel_batch_timeout\\u003d2000\\u0026injected_license_handler_error_code\\u003d0\\u0026injected_license_handler_license_status\\u003d0\\u0026itdrm_enable_revocation_reporting\\u003dtrue\\u0026itdrm_injected_license_service_error_code\\u003d0\\u0026itdrm_widevine_hardened_vmp_mode\\u003dlog\\u0026json_condensed_response\\u003dtrue\\u0026kev_adb_pg\\u003dtrue\\u0026kevlar_command_handler_command_banlist\\u003d[]\\u0026kevlar_dropdown_fix\\u003dtrue\\u0026kevlar_gel_error_routing\\u003dtrue\\u0026kevlar_miniplayer\\u003dtrue\\u0026kevlar_miniplayer_expand_top\\u003dtrue\\u0026kevlar_miniplayer_play_pause_on_scrim\\u003dtrue\\u0026kevlar_playback_associated_queue\\u003dtrue\\u0026kevlar_queue_use_update_api\\u003dtrue\\u0026kevlar_use_wil_icons\\u003dtrue\\u0026kevlar_vimio_use_shared_monitor\\u003dtrue\\u0026kevlar_woffle\\u003dtrue\\u0026kids_web_client_log_screen_associated\\u003dtrue\\u0026live_chat_enable_rta_manager\\u003dtrue\\u0026live_chunk_readahead\\u003d3\\u0026live_fresca_v2\\u003dtrue\\u0026log_errors_through_nwl_on_retry\\u003dtrue\\u0026log_gel_compression_latency\\u003dtrue\\u0026log_heartbeat_with_lifecycles\\u003dtrue\\u0026log_web_endpoint_to_layer\\u003dtrue\\u0026log_window_onerror_fraction\\u003d0.1\\u0026manifestless_post_live\\u003dtrue\\u0026manifestless_post_live_ufph\\u003dtrue\\u0026max_body_size_to_compress\\u003d500000\\u0026max_prefetch_window_sec_for_livestream_optimization\\u003d10\\u0026max_resolution_for_white_noise\\u003d360\\u0026mdx_enable_privacy_disclosure_ui\\u003dtrue\\u0026mdx_load_cast_api_bootstrap_script\\u003dtrue\\u0026migrate_events_to_ts\\u003dtrue\\u0026migrate_remaining_web_ad_badges_to_innertube\\u003dtrue\\u0026min_prefetch_offset_sec_for_livestream_optimization\\u003d20\\u0026move_survey_ad_renderer_ve_asde\\u003dtrue\\u0026move_vss_away_from_login_info_cookie\\u003dtrue\\u0026music_enable_shared_audio_tier_logic\\u003dtrue\\u0026mweb_c3_endscreen\\u003dtrue\\u0026mweb_deprecate_skip_ve_logging\\u003dtrue\\u0026mweb_enable_custom_control_shared\\u003dtrue\\u0026mweb_enable_skippables_on_jio_phone\\u003dtrue\\u0026mweb_native_control_in_faux_fullscreen_shared\\u003dtrue\\u0026network_polling_interval\\u003d30000\\u0026networkless_gel\\u003dtrue\\u0026networkless_logging\\u003dtrue\\u0026new_codecs_string_api_uses_legacy_style\\u003dtrue\\u0026new_csn_storage_design\\u003dtrue\\u0026nwl_send_fast_on_unload\\u003dtrue\\u0026nwl_send_from_memory_when_online\\u003dtrue\\u0026offline_error_handling\\u003dtrue\\u0026override_drm_required_playback_policy_channels\\u003d[]\\u0026pacf_logging_delay_milliseconds_through_ybfe_tv\\u003d30000\\u0026pageid_as_header_web\\u003dtrue\\u0026partial_rewind_buffer_seconds\\u003d0\\u0026player_ads_set_adformat_on_client\\u003dtrue\\u0026player_allow_autonav_after_playlist\\u003dtrue\\u0026player_bootstrap_method\\u003dtrue\\u0026player_destroy_old_version\\u003dtrue\\u0026player_doubletap_to_seek\\u003dtrue\\u0026player_enable_playback_playlist_change\\u003dtrue\\u0026player_underlay_min_player_width\\u003d768.0\\u0026player_underlay_video_width_fraction\\u003d0.6\\u0026player_web_canary_stage\\u003d0\\u0026playready_first_play_expiration\\u003d-1\\u0026polymer_bad_build_labels\\u003dtrue\\u0026polymer_verifiy_app_state\\u003dtrue\\u0026populate_author_with_podcast_name_in_video_details\\u003dtrue\\u0026preskip_button_style_ads_backend\\u003dcountdown_next_to_thumbnail\\u0026qoe_nwl_downloads\\u003dtrue\\u0026qoe_send_and_write\\u003dtrue\\u0026record_app_crashed_web\\u003dtrue\\u0026reject_live_ott_h264_clear_240p\\u003dtrue\\u0026reject_live_vp9_mq_clear_with_no_abr_ladder\\u003dtrue\\u0026replace_closure_window_with_updated_ytwindow_in_studio\\u003dtrue\\u0026replace_playability_retriever_in_watch\\u003dtrue\\u0026scheduler_use_raf_by_default\\u003dtrue\\u0026self_podding_header_string_template\\u003dself_podding_interstitial_message\\u0026self_podding_highlight_non_default_button\\u003dtrue\\u0026self_podding_midroll_choice_string_template\\u003dself_podding_midroll_choice\\u0026send_config_hash_timer\\u003d0\\u0026set_interstitial_advertisers_question_text\\u003dtrue\\u0026set_mock_id_as_expected_content_binding\\u003d\\u0026shell_load_gcf\\u003dtrue\\u0026short_start_time_prefer_publish_in_watch_log\\u003dtrue\\u0026shorts_mode_to_player_api\\u003dtrue\\u0026should_clear_video_data_on_player_cued_unstarted\\u003dtrue\\u0026simply_embedded_enable_botguard\\u003dtrue\\u0026skip_inline_muted_license_service_check\\u003dtrue\\u0026skip_invalid_ytcsi_ticks\\u003dtrue\\u0026skip_ls_gel_retry\\u003dtrue\\u0026skip_setting_info_in_csi_data_object\\u003dtrue\\u0026slow_compressions_before_abandon_count\\u003d4\\u0026speedmaster_cancellation_movement_dp\\u003d10\\u0026speedmaster_playback_rate\\u003d2.0\\u0026speedmaster_touch_activation_ms\\u003d500\\u0026st_skip_debug_params\\u003dtrue\\u0026start_client_gcf\\u003dtrue\\u0026start_client_gcf_for_player\\u003dtrue\\u0026start_sending_config_hash\\u003dtrue\\u0026streaming_data_emergency_itag_blacklist\\u003d[]\\u0026substitute_ad_cpn_macro_in_ssdai\\u003dtrue\\u0026suppress_error_204_logging\\u003dtrue\\u0026transport_use_scheduler\\u003dtrue\\u0026trigger_impression_pings_on_view_search_desktop\\u003dtrue\\u0026tv_pacf_logging_sample_rate\\u003d0.01\\u0026tvhtml5_unplugged_preload_cache_size\\u003d5\\u0026unplugged_dai_live_chunk_readahead\\u003d3\\u0026unplugged_tvhtml5_video_preload_on_focus_delay_ms\\u003d0\\u0026update_log_event_config\\u003dtrue\\u0026use_accessibility_data_on_desktop_player_button\\u003dtrue\\u0026use_color_palettes_modern_collections_v2\\u003dtrue\\u0026use_core_sm\\u003dtrue\\u0026use_csi_stp_handler\\u003dtrue\\u0026use_inlined_player_rpc\\u003dtrue\\u0026use_new_cml\\u003dtrue\\u0026use_new_in_memory_storage\\u003dtrue\\u0026use_new_nwl_initialization\\u003dtrue\\u0026use_new_nwl_saw\\u003dtrue\\u0026use_new_nwl_stw\\u003dtrue\\u0026use_new_nwl_wts\\u003dtrue\\u0026use_player_abuse_bg_library\\u003dtrue\\u0026use_player_cue_range_set\\u003dtrue\\u0026use_profilepage_event_label_in_carousel_playbacks\\u003dtrue\\u0026use_request_time_ms_header\\u003dtrue\\u0026use_session_based_sampling\\u003dtrue\\u0026use_shared_notf_vp9_360p_format_filter_rules\\u003dtrue\\u0026use_ts_visibilitylogger\\u003dtrue\\u0026validate_el_adunit_usage_mweb\\u003d0.1\\u0026variable_buffer_timeout_ms\\u003d0\\u0026vp9_drm_live\\u003dtrue\\u0026vss_final_ping_send_and_write\\u003dtrue\\u0026vss_pings_using_networkless\\u003dtrue\\u0026vss_playback_use_send_and_write\\u003dtrue\\u0026web_api_url\\u003dtrue\\u0026web_async_context_processor_impl\\u003dstandalone\\u0026web_big_boards\\u003dtrue\\u0026web_big_boards_enable_in_inline\\u003dtrue\\u0026web_big_boards_enable_in_miniplayer\\u003dtrue\\u0026web_cinematic_watch_settings\\u003dtrue\\u0026web_client_version_override\\u003d\\u0026web_collect_offline_state\\u003dtrue\\u0026web_csi_action_sampling_enabled\\u003dtrue\\u0026web_csi_debug_sample_enabled\\u003dtrue\\u0026web_dedupe_ve_grafting\\u003dtrue\\u0026web_deprecate_service_ajax_map_dependency\\u003dtrue\\u0026web_disable_channels_chapter_entrypoint\\u003dtrue\\u0026web_enable_ab_em_rsp\\u003dtrue\\u0026web_enable_ab_rsp_cl\\u003dtrue\\u0026web_enable_abd_ref\\u003dtrue\\u0026web_enable_error_204\\u003dtrue\\u0026web_enable_speedmaster\\u003dtrue\\u0026web_enable_voz_audio_feedback\\u003dtrue\\u0026web_fix_fine_scrubbing_drag\\u003dtrue\\u0026web_foreground_heartbeat_interval_ms\\u003d28000\\u0026web_forward_command_on_pbj\\u003dtrue\\u0026web_gel_debounce_ms\\u003d60000\\u0026web_gel_timeout_cap\\u003dtrue\\u0026web_heat_map_v2\\u003dtrue\\u0026web_key_moments_markers\\u003dtrue\\u0026web_l3_storyboard\\u003dtrue\\u0026web_log_memory_total_kbytes\\u003dtrue\\u0026web_logging_max_batch\\u003d150\\u0026web_logging_max_batch_hard_limit\\u003dtrue\\u0026web_modern_ads\\u003dtrue\\u0026web_modern_buttons\\u003dtrue\\u0026web_modern_buttons_bl_survey\\u003dtrue\\u0026web_modern_player_settings_quality_bottom\\u003dtrue\\u0026web_modern_subscribe\\u003dtrue\\u0026web_modern_subscribe_style\\u003dfilled\\u0026web_new_autonav_countdown\\u003dtrue\\u0026web_one_platform_error_handling\\u003dtrue\\u0026web_op_signal_type_banlist\\u003d[]\\u0026web_playback_associated_log_ctt\\u003dtrue\\u0026web_playback_associated_ve\\u003dtrue\\u0026web_player_add_ve_conversion_logging_to_outbound_links\\u003dtrue\\u0026web_player_always_enable_auto_translation\\u003dtrue\\u0026web_player_api_logging_fraction\\u003d0.01\\u0026web_player_autonav_empty_suggestions_fix\\u003dtrue\\u0026web_player_autonav_toggle_always_listen\\u003dtrue\\u0026web_player_autonav_use_server_provided_state\\u003dtrue\\u0026web_player_caption_language_preference_stickiness_duration\\u003d30\\u0026web_player_disable_inline_scrubbing\\u003dtrue\\u0026web_player_enable_cultural_moment_overlay\\u003dtrue\\u0026web_player_enable_early_warning_snackbar\\u003dtrue\\u0026web_player_enable_info_button_in_banner_on_desktop\\u003dtrue\\u0026web_player_enable_premium_hbr_in_h5_api\\u003dtrue\\u0026web_player_enable_premium_hbr_playback_cap\\u003dtrue\\u0026web_player_enable_vod_featured_product_banner_on_desktop\\u003dtrue\\u0026web_player_innertube_playlist_update\\u003dtrue\\u0026web_player_ipp_canary_type_for_logging\\u003d\\u0026web_player_log_click_before_generating_ve_conversion_params\\u003dtrue\\u0026web_player_move_autonav_toggle\\u003dtrue\\u0026web_player_music_visualizer_treatment\\u003dfake\\u0026web_player_nitrate_promo_tooltip\\u003dtrue\\u0026web_player_offline_playlist_auto_refresh\\u003dtrue\\u0026web_player_seek_chapters_by_shortcut\\u003dtrue\\u0026web_player_sentinel_is_uniplayer\\u003dtrue\\u0026web_player_should_honor_include_asr_setting\\u003dtrue\\u0026web_player_show_music_in_this_video_graphic\\u003dvideo_thumbnail\\u0026web_player_small_hbp_settings_menu\\u003dtrue\\u0026web_player_ss_dai_ad_fetching_timeout_ms\\u003d15000\\u0026web_player_ss_media_time_offset\\u003dtrue\\u0026web_player_topify_subtitles_for_shorts\\u003dtrue\\u0026web_player_touch_mode_improvements\\u003dtrue\\u0026web_player_transfer_timeout_threshold_ms\\u003d10800000\\u0026web_player_use_cinematic_label_2\\u003dtrue\\u0026web_player_use_heartbeat_poll_delay_ms\\u003dtrue\\u0026web_player_use_new_api_for_quality_pullback\\u003dtrue\\u0026web_player_ve_conversion_fixes_for_channel_info\\u003dtrue\\u0026web_prefetch_preload_video\\u003dtrue\\u0026web_rounded_thumbnails\\u003dtrue\\u0026web_scheduler_auto_init\\u003dtrue\\u0026web_settings_menu_icons\\u003dtrue\\u0026web_smoothness_test_duration_ms\\u003d0\\u0026web_smoothness_test_method\\u003d0\\u0026web_speedmaster_spacebar_control\\u003dtrue\\u0026web_speedmaster_updated_edu\\u003dtrue\\u0026web_yt_config_context\\u003dtrue\\u0026webfe_disable_ab_em_plb\\u003dtrue\\u0026wil_icon_max_concurrent_fetches\\u003d9999\\u0026wil_icon_render_when_idle\\u003dtrue\\u0026wiz_use_generic_logging_infra\\u003dtrue\\u0026woffle_clean_up_after_entity_migration\\u003dtrue\\u0026woffle_enable_download_status\\u003dtrue\\u0026woffle_orchestration\\u003dtrue\\u0026woffle_playlist_optimization\\u003dtrue\\u0026woffle_used_state_report\\u003dtrue\\u0026ytidb_clear_embedded_player\\u003dtrue\\u0026ytidb_fetch_datasync_ids_for_data_cleanup\\u003dtrue\\u0026ytidb_remake_db_retries\\u003d3\\u0026ytidb_reopen_db_retries\\u003d3\\u0026ytidb_transaction_ended_event_rate_limit\\u003d0.02\\u0026ytidb_transaction_ended_event_rate_limit_session\\u003d0.2\\u0026ytidb_transaction_ended_event_rate_limit_transaction\\u003d0.1\",\"cspNonce\":\"xW_SWKdw4-d_OLdvn29m6Q\",\"canaryState\":\"none\",\"enableCsiLogging\":true,\"csiPageType\":\"watch\",\"datasyncId\":\"Vc2a81ef1||\",\"allowWoffleManagement\":true,\"cinematicSettingsAvailable\":true,\"canaryStage\":\"\"},\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_CHANNEL_TRAILER\":{\"rootElementId\":\"c4-player\",\"jsUrl\":\"/s/player/63e90c30/player_ias.vflset/en_US/base.js\",\"cssUrl\":\"/s/player/63e90c30/www-player.css\",\"contextId\":\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_CHANNEL_TRAILER\",\"eventLabel\":\"profilepage\",\"contentRegion\":\"IT\",\"hl\":\"en_US\",\"hostLanguage\":\"en\",\"playerStyle\":\"desktop-polymer\",\"innertubeApiKey\":\"AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\",\"innertubeApiVersion\":\"v1\",\"innertubeContextClientVersion\":\"2.20231121.08.00\",\"device\":{\"brand\":\"\",\"model\":\"\",\"browser\":\"Chrome\",\"browserVersion\":\"[scrubbed]\",\"os\":\"Windows\",\"osVersion\":\"10.0\",\"platform\":\"DESKTOP\",\"interfaceName\":\"WEB\",\"interfaceVersion\":\"2.20231121.08.00\"},\"serializedExperimentIds\":\"23983296,23986028,24004644,24007246,24080738,24135310,24208765,24371398,24371779,24385728,24439361,24524098,24543193,24543197,24543199,24543201,24549786,24550458,24559327,24560416,24566293,24566687,24699899,51006181,51010235,51012165,51017346,51026715,51027535,51028271,51030311,51035166,51037540,51038399,51038805,51039199,51039493,51039699,51041809,51044150,51044152,51044154,51044158,51046164,51047619,51049006,51054675,51055917,51056050,51057534,51060161,51067339,51069001\",\"serializedExperimentFlags\":\"H5_async_logging_delay_ms\\u003d30000.0\\u0026H5_enable_full_pacf_logging\\u003dtrue\\u0026H5_use_async_logging\\u003dtrue\\u0026ab_det_apb_b\\u003dtrue\\u0026ab_det_fet_wr\\u003dtrue\\u0026ab_det_fet_wr_en\\u003dtrue\\u0026ab_det_gen_re\\u003dtrue\\u0026action_companion_center_align_description\\u003dtrue\\u0026ad_pod_disable_companion_persist_ads_quality\\u003dtrue\\u0026addto_ajax_log_warning_fraction\\u003d0.1\\u0026align_ad_to_video_player_lifecycle_for_bulleit\\u003dtrue\\u0026allow_drm_override\\u003dtrue\\u0026allow_live_autoplay\\u003dtrue\\u0026allow_poltergust_autoplay\\u003dtrue\\u0026allow_skip_networkless\\u003dtrue\\u0026allow_vp9_1080p_mq_enc\\u003dtrue\\u0026att_web_record_metrics\\u003dtrue\\u0026autoplay_time\\u003d8000\\u0026autoplay_time_for_fullscreen\\u003d3000\\u0026autoplay_time_for_music_content\\u003d3000\\u0026bg_vm_reinit_threshold\\u003d7200000\\u0026blocked_packages_for_sps\\u003d[]\\u0026botguard_async_snapshot_timeout_ms\\u003d3000\\u0026captions_url_add_ei\\u003dtrue\\u0026check_ad_ui_status_for_mweb_safari\\u003dtrue\\u0026check_navigator_accuracy_timeout_ms\\u003d0\\u0026clear_user_partitioned_ls\\u003dtrue\\u0026client_respect_autoplay_switch_button_renderer\\u003dtrue\\u0026compress_gel\\u003dtrue\\u0026compression_disable_point\\u003d10\\u0026compression_performance_threshold\\u003d250\\u0026csi_on_gel\\u003dtrue\\u0026dash_manifest_version\\u003d5\\u0026debug_bandaid_hostname\\u003d\\u0026debug_sherlog_username\\u003d\\u0026delay_ads_gvi_call_on_bulleit_living_room_ms\\u003d0\\u0026deprecate_csi_has_info\\u003dtrue\\u0026deprecate_delay_ping\\u003dtrue\\u0026deprecate_pair_servlet_enabled\\u003dtrue\\u0026desktop_image_cta_no_background\\u003dtrue\\u0026desktop_log_img_click_location\\u003dtrue\\u0026desktop_sparkles_light_cta_button\\u003dtrue\\u0026disable_channel_id_check_for_suspended_channels\\u003dtrue\\u0026disable_child_node_auto_formatted_strings\\u003dtrue\\u0026disable_defer_admodule_on_advertiser_video\\u003dtrue\\u0026disable_features_for_supex\\u003dtrue\\u0026disable_inline_preview_scrubbing_for_vac_ads_on_web\\u003dtrue\\u0026disable_legacy_desktop_remote_queue\\u003dtrue\\u0026disable_mdx_connection_in_mdx_module_for_music_web\\u003dtrue\\u0026disable_new_pause_state3\\u003dtrue\\u0026disable_pacf_logging_for_memory_limited_tv\\u003dtrue\\u0026disable_rounding_ad_notify\\u003dtrue\\u0026disable_simple_mixed_direction_formatted_strings\\u003dtrue\\u0026disable_ssdai_on_errors\\u003dtrue\\u0026disable_tabbing_before_flyout_ad_elements_appear\\u003dtrue\\u0026disable_thumbnail_preloading\\u003dtrue\\u0026edge_encryption_fill_primary_key_version\\u003dtrue\\u0026embeds_add_player_mode_to_ad_events\\u003dtrue\\u0026embeds_disable_progress_bar_context_menu_handling\\u003dtrue\\u0026embeds_enable_muted_autoplay\\u003dtrue\\u0026embeds_web_enable_autoplay_not_supported_logging_fix\\u003dtrue\\u0026embeds_web_enable_host_flags_client_permissions\\u003dtrue\\u0026embeds_web_enable_host_flags_innertube\\u003dtrue\\u0026embeds_web_enable_lite_logging\\u003dtrue\\u0026embeds_web_enable_load_player_from_page_show\\u003dtrue\\u0026embeds_web_enable_log_splay_as_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_dtts\\u003dtrue\\u0026embeds_web_enable_modestbranding_deprecation\\u003dtrue\\u0026embeds_web_enable_pause_overlay_wn_update\\u003dtrue\\u0026embeds_web_enable_pfp_unbranded_el_deprecation\\u003dtrue\\u0026embeds_web_enable_rcat_allowlist\\u003dtrue\\u0026embeds_web_enable_scripted_playback_blocked_logging_fix\\u003dtrue\\u0026embeds_web_enable_smallmode_fullscreen_button_fix\\u003dtrue\\u0026embeds_web_enable_ve_conversion_logging_tracking_no_allow_list\\u003dtrue\\u0026embeds_web_hide_unfilled_more_videos_suggestions\\u003dtrue\\u0026embeds_web_lite_mode\\u003d1\\u0026embeds_web_move_preload_by_player_vars_to_public\\u003dtrue\\u0026embeds_web_nwl_disable_nocookie\\u003dtrue\\u0026embeds_web_shopping_overlay_no_wait_for_paid_content_overlay\\u003dtrue\\u0026embeds_web_synth_ch_headers_banned_urls_regex\\u003d\\u0026enable_ab_report_on_errorscreen\\u003dtrue\\u0026enable_ab_rp_int\\u003dtrue\\u0026enable_ad_cpn_macro_substitution_for_click_pings\\u003dtrue\\u0026enable_app_promo_endcap_eml_on_tablet\\u003dtrue\\u0026enable_ata_dialog_all_web\\u003dtrue\\u0026enable_cast_for_web_unplugged\\u003dtrue\\u0026enable_cast_on_music_web\\u003dtrue\\u0026enable_client_page_id_header_for_first_party_pings\\u003dtrue\\u0026enable_client_sli_logging\\u003dtrue\\u0026enable_cta_banner_on_unplugged_lr\\u003dtrue\\u0026enable_dark_mode_style_endcap\\u003dtrue\\u0026enable_dark_mode_style_endcap_timed_pie_countdown\\u003dtrue\\u0026enable_discrete_live_precise_embargos\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_android\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_ios\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_compliant_banner_image_ad_renderer\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_mobile\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_one_click_ata_translators_infeed_elements\\u003dtrue\\u0026enable_error_corrections_infocard\\u003dtrue\\u0026enable_error_corrections_infocard_web_client\\u003dtrue\\u0026enable_error_corrections_infocard_web_client_check\\u003dtrue\\u0026enable_error_corrections_infocards_icon_web\\u003dtrue\\u0026enable_eviction_protection_for_bulleit\\u003dtrue\\u0026enable_flow_logging_p4e\\u003dtrue\\u0026enable_free_preview_timer\\u003dtrue\\u0026enable_gel_log_commands\\u003dtrue\\u0026enable_h5_player_ad_block_status_logging\\u003dtrue\\u0026enable_h5_player_ad_block_status_piping\\u003dtrue\\u0026enable_handles_account_menu_switcher\\u003dtrue\\u0026enable_high_frequency_cookie_rotation\\u003dtrue\\u0026enable_kabuki_comments_on_shorts\\u003ddisabled\\u0026enable_live_ad_serving_context\\u003dtrue\\u0026enable_live_premiere_web_player_indicator\\u003dtrue\\u0026enable_loggingcontext_trackingparams\\u003dtrue\\u0026enable_lr_home_infeed_ads_inline_playback_progress_pings\\u003dtrue\\u0026enable_mixed_direction_formatted_strings\\u003dtrue\\u0026enable_modern_skip_button_on_web\\u003dtrue\\u0026enable_multiple_heatseeker_decorations\\u003dtrue\\u0026enable_mweb_endcap_clickable_icon_description\\u003dtrue\\u0026enable_mweb_endcap_dark_mode_action_button\\u003dtrue\\u0026enable_mweb_livestream_ui_update\\u003dtrue\\u0026enable_new_paid_product_placement\\u003dtrue\\u0026enable_out_of_stock_text_all_surfaces\\u003dtrue\\u0026enable_pacf_slot_asde_infeed_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5_TV\\u003dtrue\\u0026enable_pacf_through_ybfe_tv\\u003dtrue\\u0026enable_pacf_through_ybfe_tv_for_page_top_formats\\u003dtrue\\u0026enable_pacf_through_ysfe_tv\\u003dtrue\\u0026enable_pass_sdc_get_accounts_list\\u003dtrue\\u0026enable_pl_r_c\\u003dtrue\\u0026enable_pl_r_c_s\\u003dtrue\\u0026enable_pl_r_si_fa\\u003dtrue\\u0026enable_player_param_truncation_before_navigation_on_web_on_search\\u003dtrue\\u0026enable_populate_att_psd_in_abe_feedback\\u003dtrue\\u0026enable_populate_psd_in_abe_feedback\\u003dtrue\\u0026enable_post_ad_perception_survey_fix_on_tvhtml5\\u003dtrue\\u0026enable_post_ad_perception_survey_in_tvhtml5\\u003dtrue\\u0026enable_sdf_midroll_postroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_main\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_misc\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_tv\\u003dtrue\\u0026enable_server_stitched_dai\\u003dtrue\\u0026enable_set_endcap_thumbnail_from_layout\\u003dtrue\\u0026enable_shorts_player\\u003dtrue\\u0026enable_skip_ad_guidance_prompt\\u003dtrue\\u0026enable_skippable_ads_for_unplugged_ad_pod\\u003dtrue\\u0026enable_small_endcap_action_button_for_mweb\\u003dtrue\\u0026enable_smearing_expansion_dai\\u003dtrue\\u0026enable_tectonic_ad_ux_for_halftime\\u003dtrue\\u0026enable_third_party_info\\u003dtrue\\u0026enable_topsoil_wta_for_halftime_live_infra\\u003dtrue\\u0026enable_unknown_lact_fix_on_html5\\u003dtrue\\u0026enable_web_media_session_metadata_fix\\u003dtrue\\u0026enable_web_tiered_gel\\u003dtrue\\u0026enable_wn_infocards\\u003dtrue\\u0026enable_yt_ata_iframe_authuser\\u003dtrue\\u0026err_on_pl_r_c\\u003dtrue\\u0026error_message_for_gsuite_network_restrictions\\u003dtrue\\u0026export_networkless_options\\u003dtrue\\u0026external_fullscreen_with_edu\\u003dtrue\\u0026fetch_att_independently\\u003dtrue\\u0026fetch_bid_for_dclk_status\\u003dtrue\\u0026fill_single_video_with_notify_to_lasr\\u003dtrue\\u0026filter_vp9_for_csdai\\u003dtrue\\u0026fix_ads_tracking_for_swf_config_deprecation_mweb\\u003dtrue\\u0026fix_h5_toggle_button_a11y\\u003dtrue\\u0026fix_survey_color_contrast_on_destop\\u003dtrue\\u0026fix_toggle_button_role_for_ad_components\\u003dtrue\\u0026fix_web_instream_survey_question_aria_label\\u003dtrue\\u0026gcf_config_store_enabled\\u003dtrue\\u0026gcf_music_innertube\\u003dtrue\\u0026gel_min_batch_size\\u003d3\\u0026gel_queue_timeout_max_ms\\u003d300000\\u0026gpa_sparkles_ten_percent_layer\\u003dtrue\\u0026gvi_channel_client_screen\\u003dtrue\\u0026h5_companion_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_enable_generic_error_logging_event\\u003dtrue\\u0026h5_enable_unified_csi_preroll\\u003dtrue\\u0026h5_inplayer_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_reset_cache_and_filter_before_update_masthead\\u003dtrue\\u0026heatseeker_decoration_threshold\\u003d0.8\\u0026hfr_dropped_framerate_fallback_threshold\\u003d0\\u0026hide_cta_for_home_web_video_ads_animate_in_time\\u003d2\\u0026hide_endpoint_overflow_on_ytd_display_ad_renderer\\u003dtrue\\u0026html5_ad_timeout_ms\\u003d0\\u0026html5_adaptation_step_count\\u003d0\\u0026html5_add_dai_smearing_to_qoe\\u003dtrue\\u0026html5_add_drm_formats_to_test_format\\u003dtrue\\u0026html5_ads_preroll_lock_timeout_delay_ms\\u003d15000\\u0026html5_allow_video_keyframe_without_audio\\u003dtrue\\u0026html5_apply_min_failures\\u003dtrue\\u0026html5_apply_start_time_within_ads_for_ssdai_transitions\\u003dtrue\\u0026html5_atr_disable_force_fallback\\u003dtrue\\u0026html5_attach_num_random_bytes_to_bandaid\\u003d0\\u0026html5_attach_po_token_to_bandaid\\u003dtrue\\u0026html5_autonav_cap_idle_secs\\u003d0\\u0026html5_autonav_quality_cap\\u003d720\\u0026html5_autoplay_default_quality_cap\\u003d0\\u0026html5_block_pip_safari_delay\\u003d0\\u0026html5_bypass_contention_secs\\u003d0.0\\u0026html5_cache_request_key\\u003d\\u0026html5_check_for_idle_network_interval_ms\\u003d-1\\u0026html5_check_video_data_errors_before_playback_start\\u003dtrue\\u0026html5_cobalt_default_buffer_size_in_bytes\\u003d0\\u0026html5_cobalt_max_size_for_immed_job\\u003d0\\u0026html5_cobalt_min_processor_cnt_to_offload_algo\\u003d0\\u0026html5_cobalt_override_quic\\u003d0\\u0026html5_consume_media_bytes_slice_infos\\u003dtrue\\u0026html5_continuous_goodput_probe_interval_ms\\u003d0\\u0026html5_de_dupe_content_video_loads_in_lifecycle_api\\u003dtrue\\u0026html5_debug_data_log_probability\\u003d0.1\\u0026html5_decode_to_texture_cap\\u003dtrue\\u0026html5_default_ad_gain\\u003d0.5\\u0026html5_default_quality_cap\\u003d0\\u0026html5_defer_fetch_att_ms\\u003d1000\\u0026html5_delayed_retry_count\\u003d1\\u0026html5_delayed_retry_delay_ms\\u003d5000\\u0026html5_deprecate_adservice\\u003dtrue\\u0026html5_deprecate_video_tag_pool\\u003dtrue\\u0026html5_desktop_vr180_allow_panning\\u003dtrue\\u0026html5_df_downgrade_thresh\\u003d0.6\\u0026html5_disable_csi_for_bulleit\\u003dtrue\\u0026html5_disable_move_pssh_to_moov\\u003dtrue\\u0026html5_disable_non_contiguous\\u003dtrue\\u0026html5_displayed_frame_rate_downgrade_threshold\\u003d45\\u0026html5_drm_byterate_soft_cap\\u003d0\\u0026html5_drm_check_all_key_error_states\\u003dtrue\\u0026html5_drm_cpi_license_key\\u003dtrue\\u0026html5_drm_live_byterate_soft_cap\\u003d0\\u0026html5_enable_ac3\\u003dtrue\\u0026html5_enable_ads_client_monitoring_log_tv\\u003dtrue\\u0026html5_enable_caption_changes_for_mosaic\\u003dtrue\\u0026html5_enable_client_hints_override\\u003dtrue\\u0026html5_enable_composite_embargo\\u003dtrue\\u0026html5_enable_eac3\\u003dtrue\\u0026html5_enable_embedded_player_visibility_signals\\u003dtrue\\u0026html5_enable_non_notify_composite_vod_lsar_pacf\\u003dtrue\\u0026html5_enable_oduc\\u003dtrue\\u0026html5_enable_pp_proxima_eligible\\u003dtrue\\u0026html5_enable_single_video_vod_ivar_on_pacf\\u003dtrue\\u0026html5_enable_tvos_dash\\u003dtrue\\u0026html5_enable_tvos_encrypted_vp9\\u003dtrue\\u0026html5_enable_widevine_for_alc\\u003dtrue\\u0026html5_enable_widevine_for_fast_linear\\u003dtrue\\u0026html5_encourage_array_coalescing\\u003dtrue\\u0026html5_gapless_ended_transition_buffer_ms\\u003d200\\u0026html5_gapless_handoff_close_end_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_close_end_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_handoff_started_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_started_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_loop_seek_offset_in_milli\\u003d0\\u0026html5_generate_session_po_token\\u003dtrue\\u0026html5_gl_fps_threshold\\u003d0\\u0026html5_hdcp_probing_stream_url\\u003d\\u0026html5_head_miss_secs\\u003d0.0\\u0026html5_hfr_quality_cap\\u003d0\\u0026html5_high_res_logging_percent\\u003d0.01\\u0026html5_honor_caption_availabilities_in_audio_track\\u003dtrue\\u0026html5_hopeless_secs\\u003d0\\u0026html5_idle_rate_limit_ms\\u003d0\\u0026html5_ignore_interruptive_ads_for_server_stitched\\u003dtrue\\u0026html5_ignore_stall_from_no_data_timeouts\\u003dtrue\\u0026html5_innertube_heartbeats_for_fairplay\\u003dtrue\\u0026html5_innertube_heartbeats_for_playready\\u003dtrue\\u0026html5_innertube_heartbeats_for_widevine\\u003dtrue\\u0026html5_ios4_seek_above_zero\\u003dtrue\\u0026html5_ios7_force_play_on_stall\\u003dtrue\\u0026html5_ios_force_seek_to_zero_on_stop\\u003dtrue\\u0026html5_jumbo_mobile_subsegment_readahead_target\\u003d3.0\\u0026html5_jumbo_ull_nonstreaming_mffa_ms\\u003d4000\\u0026html5_jumbo_ull_subsegment_readahead_target\\u003d1.3\\u0026html5_license_constraint_delay\\u003d5000\\u0026html5_live_abr_head_miss_fraction\\u003d0.0\\u0026html5_live_abr_repredict_fraction\\u003d0.0\\u0026html5_live_chunk_readahead_proxima_override\\u003d0\\u0026html5_live_head_playable\\u003dtrue\\u0026html5_live_low_latency_bandwidth_window\\u003d0.0\\u0026html5_live_normal_latency_bandwidth_window\\u003d0.0\\u0026html5_live_quality_cap\\u003d0\\u0026html5_live_ultra_low_latency_bandwidth_window\\u003d0.0\\u0026html5_liveness_drift_chunk_override\\u003d0\\u0026html5_liveness_drift_proxima_override\\u003d0\\u0026html5_log_audio_abr\\u003dtrue\\u0026html5_log_audio_switch_metrics\\u003dtrue\\u0026html5_log_experiment_id_from_player_response_to_ctmp\\u003d\\u0026html5_log_first_ssdai_requests_killswitch\\u003dtrue\\u0026html5_log_rebuffer_events\\u003d5\\u0026html5_log_trigger_events_with_debug_data\\u003dtrue\\u0026html5_long_rebuffer_jiggle_cmt_delay_ms\\u003d0\\u0026html5_long_rebuffer_threshold_ms\\u003d30000\\u0026html5_manifestless_unplugged\\u003dtrue\\u0026html5_manifestless_vp9_otf\\u003dtrue\\u0026html5_max_buffer_health_for_downgrade_prop\\u003d-1.0\\u0026html5_max_buffer_health_for_downgrade_secs\\u003d0.0\\u0026html5_max_byterate\\u003d0\\u0026html5_max_drift_per_track_secs\\u003d0.0\\u0026html5_max_headm_for_streaming_xhr\\u003d0\\u0026html5_max_live_dvr_window_plus_margin_secs\\u003d46800.0\\u0026html5_max_readbehind_secs\\u003d0\\u0026html5_max_redirect_response_length\\u003d8192\\u0026html5_max_selectable_quality_ordinal\\u003d0\\u0026html5_max_source_buffer_append_size_in_bytes\\u003d0\\u0026html5_maximum_readahead_seconds\\u003d0.0\\u0026html5_media_fullscreen\\u003dtrue\\u0026html5_mffa_ms_proxima_override\\u003d0\\u0026html5_mfl_extend_max_request_time\\u003dtrue\\u0026html5_min_failures_to_delay_retry\\u003d3\\u0026html5_min_media_duration_for_append_prop\\u003d0.0\\u0026html5_min_media_duration_for_cabr_slice\\u003d0.0\\u0026html5_min_progress_event_interval_ms\\u003d10\\u0026html5_min_quality_ordinal\\u003d0\\u0026html5_min_readbehind_cap_secs\\u003d60\\u0026html5_min_readbehind_secs\\u003d0\\u0026html5_min_seconds_between_format_selections\\u003d0.0\\u0026html5_min_selectable_quality_ordinal\\u003d0\\u0026html5_min_startup_buffered_ad_media_duration_secs\\u003d1.2\\u0026html5_min_startup_buffered_media_duration_secs\\u003d1.2\\u0026html5_min_startup_duration_live_secs\\u003d0.25\\u0026html5_min_upgrade_health_secs\\u003d0.0\\u0026html5_minimum_readahead_seconds\\u003d0.0\\u0026html5_mock_content_binding_for_session_token\\u003d\\u0026html5_no_placeholder_rollbacks\\u003dtrue\\u0026html5_non_network_rebuffer_duration_ms\\u003d0\\u0026html5_non_onesie_attach_po_token\\u003dtrue\\u0026html5_normal_latency_mffa_ms\\u003d0\\u0026html5_not_register_disposables_when_core_listens\\u003dtrue\\u0026html5_oduc_transfer_logging\\u003dtrue\\u0026html5_offline_failure_retry_limit\\u003d2\\u0026html5_offline_prevent_redownload_downloaded_video\\u003dtrue\\u0026html5_onesie_defer_content_loader_ms\\u003d0\\u0026html5_onesie_live_ttl_secs\\u003d8\\u0026html5_onesie_notify_cuepoint_manager_on_completion\\u003dtrue\\u0026html5_onesie_prewarm_interval_ms\\u003d0\\u0026html5_onesie_prewarm_max_lact_ms\\u003d0\\u0026html5_onesie_redirector_timeout\\u003dtrue\\u0026html5_onesie_redirector_timeout_ms\\u003d0\\u0026html5_onesie_request_timeout_ms\\u003d1000\\u0026html5_pause_on_nonforeground_platform_errors\\u003dtrue\\u0026html5_peak_shave\\u003dtrue\\u0026html5_perf_cap_override_sticky\\u003dtrue\\u0026html5_performance_cap_floor\\u003d360\\u0026html5_performance_impact_profiling_timer_ms\\u003d0\\u0026html5_perserve_av1_perf_cap\\u003dtrue\\u0026html5_platform_minimum_readahead_seconds\\u003d0.0\\u0026html5_platform_whitelisted_for_frame_accurate_seeks\\u003dtrue\\u0026html5_player_autonav_logging\\u003dtrue\\u0026html5_player_dynamic_bottom_gradient\\u003dtrue\\u0026html5_player_min_build_cl\\u003d-1\\u0026html5_player_preload_ad_fix\\u003dtrue\\u0026html5_post_interrupt_readahead\\u003d20\\u0026html5_prefer_server_bwe3\\u003dtrue\\u0026html5_preload_wait_time_secs\\u003d0.0\\u0026html5_probe_primary_delay_base_ms\\u003d0\\u0026html5_process_all_encrypted_events\\u003dtrue\\u0026html5_ps4_shorts_1080p_soft_cap\\u003dtrue\\u0026html5_qoe_lh_max_report_count\\u003d0\\u0026html5_qoe_lh_min_duration_ms\\u003d0\\u0026html5_qoe_proto_mock_length\\u003d0\\u0026html5_query_sw_secure_crypto_for_android\\u003dtrue\\u0026html5_random_playback_cap\\u003d0\\u0026html5_recognize_predict_start_cue_point\\u003dtrue\\u0026html5_remove_command_triggered_companions\\u003dtrue\\u0026html5_remove_not_servable_check_killswitch\\u003dtrue\\u0026html5_rename_apbs\\u003dtrue\\u0026html5_report_fatal_drm_restricted_error_killswitch\\u003dtrue\\u0026html5_report_slow_ads_as_error\\u003dtrue\\u0026html5_repredict_interval_ms\\u003d0\\u0026html5_request_only_hdr_or_sdr_keys\\u003dtrue\\u0026html5_request_size_max_kb\\u003d0\\u0026html5_request_size_min_kb\\u003d0\\u0026html5_request_sizing_multiplier\\u003d0.8\\u0026html5_resource_bad_status_delay_scaling\\u003d1.5\\u0026html5_restore_time_after_unpause\\u003dtrue\\u0026html5_restore_time_after_unpause_redux\\u003dtrue\\u0026html5_restrict_streaming_xhr_on_sqless_requests\\u003dtrue\\u0026html5_retry_quota_exceeded_via_seek\\u003dtrue\\u0026html5_safari_desktop_eme_min_version\\u003d0\\u0026html5_samsung_kant_limit_max_bitrate\\u003d0\\u0026html5_seek_again_after_time_jump_cfl\\u003dtrue\\u0026html5_seek_jiggle_cmt_delay_ms\\u003d8000\\u0026html5_seek_new_elem_delay_ms\\u003d12000\\u0026html5_seek_new_elem_shorts_delay_ms\\u003d2000\\u0026html5_seek_new_media_element_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_element_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_new_media_source_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_source_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_set_cmt_delay_ms\\u003d2000\\u0026html5_seek_timeout_delay_ms\\u003d20000\\u0026html5_server_stitched_dai_decorated_url_retry_limit\\u003d5\\u0026html5_server_stitched_dai_group\\u003dtrue\\u0026html5_session_po_token_interval_time_ms\\u003d900000\\u0026html5_set_video_data_to_stale\\u003dtrue\\u0026html5_shorts_gapless_next_buffer_in_seconds\\u003d0\\u0026html5_skip_slow_ad_delay_ms\\u003d15000\\u0026html5_slow_start_no_media_source_delay_ms\\u003d0\\u0026html5_slow_start_timeout_delay_ms\\u003d20000\\u0026html5_ssdai_adfetch_dynamic_timeout_ms\\u003d5000\\u0026html5_ssdai_enable_new_seek_logic\\u003dtrue\\u0026html5_ssdai_failure_retry_limit\\u003d0\\u0026html5_stall_factor\\u003d0.0\\u0026html5_stall_window_size_ct\\u003d20\\u0026html5_stateful_audio_min_adjustment_value\\u003d0\\u0026html5_static_abr_resolution_shelf\\u003d0\\u0026html5_store_xhr_headers_readable\\u003dtrue\\u0026html5_streaming_xhr_time_based_consolidation_ms\\u003d0\\u0026html5_subsegment_readahead_load_speed_check_interval\\u003d0.5\\u0026html5_subsegment_readahead_min_buffer_health_secs\\u003d0.25\\u0026html5_subsegment_readahead_min_buffer_health_secs_on_timeout\\u003d0.1\\u0026html5_subsegment_readahead_min_load_speed\\u003d1.5\\u0026html5_subsegment_readahead_seek_latency_fudge\\u003d0.5\\u0026html5_subsegment_readahead_target_buffer_health_secs\\u003d0.5\\u0026html5_subsegment_readahead_timeout_secs\\u003d2.0\\u0026html5_top_shelf_format_byterate_factor\\u003d1.5\\u0026html5_track_overshoot\\u003dtrue\\u0026html5_transfer_processing_logs_interval\\u003d1000\\u0026html5_ugc_live_audio_51\\u003dtrue\\u0026html5_ugc_vod_audio_51\\u003dtrue\\u0026html5_unreported_seek_reseek_delay_ms\\u003d0\\u0026html5_unrestricted_layer_high_res_logging_percent\\u003d0.0\\u0026html5_update_time_on_seeked\\u003dtrue\\u0026html5_use_jsonformatter_to_parse_player_response\\u003dtrue\\u0026html5_use_post_for_media\\u003dtrue\\u0026html5_use_target_duration\\u003dtrue\\u0026html5_use_ump\\u003dtrue\\u0026html5_use_video_transition_endpoint_heartbeat\\u003dtrue\\u0026html5_video_tbd_min_kb\\u003d0\\u0026html5_viewport_undersend_maximum\\u003d0.0\\u0026html5_volume_slider_tooltip\\u003dtrue\\u0026html5_web_po_experiment_ids\\u003d[]\\u0026html5_webpo_idle_priority_job\\u003dtrue\\u0026html5_woffle_resume\\u003dtrue\\u0026html5_workaround_delay_trigger\\u003dtrue\\u0026ignore_overlapping_cue_points_on_endemic_live_html5\\u003dtrue\\u0026il_payload_scraping\\u003d\\u0026il_use_view_model_logging_context\\u003dtrue\\u0026initial_gel_batch_timeout\\u003d2000\\u0026injected_license_handler_error_code\\u003d0\\u0026injected_license_handler_license_status\\u003d0\\u0026itdrm_enable_revocation_reporting\\u003dtrue\\u0026itdrm_injected_license_service_error_code\\u003d0\\u0026itdrm_widevine_hardened_vmp_mode\\u003dlog\\u0026json_condensed_response\\u003dtrue\\u0026kev_adb_pg\\u003dtrue\\u0026kevlar_command_handler_command_banlist\\u003d[]\\u0026kevlar_dropdown_fix\\u003dtrue\\u0026kevlar_gel_error_routing\\u003dtrue\\u0026kevlar_miniplayer\\u003dtrue\\u0026kevlar_miniplayer_expand_top\\u003dtrue\\u0026kevlar_miniplayer_play_pause_on_scrim\\u003dtrue\\u0026kevlar_playback_associated_queue\\u003dtrue\\u0026kevlar_queue_use_update_api\\u003dtrue\\u0026kevlar_use_wil_icons\\u003dtrue\\u0026kevlar_vimio_use_shared_monitor\\u003dtrue\\u0026kevlar_woffle\\u003dtrue\\u0026kids_web_client_log_screen_associated\\u003dtrue\\u0026live_chat_enable_rta_manager\\u003dtrue\\u0026live_chunk_readahead\\u003d3\\u0026live_fresca_v2\\u003dtrue\\u0026log_errors_through_nwl_on_retry\\u003dtrue\\u0026log_gel_compression_latency\\u003dtrue\\u0026log_heartbeat_with_lifecycles\\u003dtrue\\u0026log_web_endpoint_to_layer\\u003dtrue\\u0026log_window_onerror_fraction\\u003d0.1\\u0026manifestless_post_live\\u003dtrue\\u0026manifestless_post_live_ufph\\u003dtrue\\u0026max_body_size_to_compress\\u003d500000\\u0026max_prefetch_window_sec_for_livestream_optimization\\u003d10\\u0026max_resolution_for_white_noise\\u003d360\\u0026mdx_enable_privacy_disclosure_ui\\u003dtrue\\u0026mdx_load_cast_api_bootstrap_script\\u003dtrue\\u0026migrate_events_to_ts\\u003dtrue\\u0026migrate_remaining_web_ad_badges_to_innertube\\u003dtrue\\u0026min_prefetch_offset_sec_for_livestream_optimization\\u003d20\\u0026move_survey_ad_renderer_ve_asde\\u003dtrue\\u0026move_vss_away_from_login_info_cookie\\u003dtrue\\u0026music_enable_shared_audio_tier_logic\\u003dtrue\\u0026mweb_c3_endscreen\\u003dtrue\\u0026mweb_deprecate_skip_ve_logging\\u003dtrue\\u0026mweb_enable_custom_control_shared\\u003dtrue\\u0026mweb_enable_skippables_on_jio_phone\\u003dtrue\\u0026mweb_native_control_in_faux_fullscreen_shared\\u003dtrue\\u0026network_polling_interval\\u003d30000\\u0026networkless_gel\\u003dtrue\\u0026networkless_logging\\u003dtrue\\u0026new_codecs_string_api_uses_legacy_style\\u003dtrue\\u0026new_csn_storage_design\\u003dtrue\\u0026nwl_send_fast_on_unload\\u003dtrue\\u0026nwl_send_from_memory_when_online\\u003dtrue\\u0026offline_error_handling\\u003dtrue\\u0026override_drm_required_playback_policy_channels\\u003d[]\\u0026pacf_logging_delay_milliseconds_through_ybfe_tv\\u003d30000\\u0026pageid_as_header_web\\u003dtrue\\u0026partial_rewind_buffer_seconds\\u003d0\\u0026player_ads_set_adformat_on_client\\u003dtrue\\u0026player_allow_autonav_after_playlist\\u003dtrue\\u0026player_bootstrap_method\\u003dtrue\\u0026player_destroy_old_version\\u003dtrue\\u0026player_doubletap_to_seek\\u003dtrue\\u0026player_enable_playback_playlist_change\\u003dtrue\\u0026player_underlay_min_player_width\\u003d768.0\\u0026player_underlay_video_width_fraction\\u003d0.6\\u0026player_web_canary_stage\\u003d0\\u0026playready_first_play_expiration\\u003d-1\\u0026polymer_bad_build_labels\\u003dtrue\\u0026polymer_verifiy_app_state\\u003dtrue\\u0026populate_author_with_podcast_name_in_video_details\\u003dtrue\\u0026preskip_button_style_ads_backend\\u003dcountdown_next_to_thumbnail\\u0026qoe_nwl_downloads\\u003dtrue\\u0026qoe_send_and_write\\u003dtrue\\u0026record_app_crashed_web\\u003dtrue\\u0026reject_live_ott_h264_clear_240p\\u003dtrue\\u0026reject_live_vp9_mq_clear_with_no_abr_ladder\\u003dtrue\\u0026replace_closure_window_with_updated_ytwindow_in_studio\\u003dtrue\\u0026replace_playability_retriever_in_watch\\u003dtrue\\u0026scheduler_use_raf_by_default\\u003dtrue\\u0026self_podding_header_string_template\\u003dself_podding_interstitial_message\\u0026self_podding_highlight_non_default_button\\u003dtrue\\u0026self_podding_midroll_choice_string_template\\u003dself_podding_midroll_choice\\u0026send_config_hash_timer\\u003d0\\u0026set_interstitial_advertisers_question_text\\u003dtrue\\u0026set_mock_id_as_expected_content_binding\\u003d\\u0026shell_load_gcf\\u003dtrue\\u0026short_start_time_prefer_publish_in_watch_log\\u003dtrue\\u0026shorts_mode_to_player_api\\u003dtrue\\u0026should_clear_video_data_on_player_cued_unstarted\\u003dtrue\\u0026simply_embedded_enable_botguard\\u003dtrue\\u0026skip_inline_muted_license_service_check\\u003dtrue\\u0026skip_invalid_ytcsi_ticks\\u003dtrue\\u0026skip_ls_gel_retry\\u003dtrue\\u0026skip_setting_info_in_csi_data_object\\u003dtrue\\u0026slow_compressions_before_abandon_count\\u003d4\\u0026speedmaster_cancellation_movement_dp\\u003d10\\u0026speedmaster_playback_rate\\u003d2.0\\u0026speedmaster_touch_activation_ms\\u003d500\\u0026st_skip_debug_params\\u003dtrue\\u0026start_client_gcf\\u003dtrue\\u0026start_client_gcf_for_player\\u003dtrue\\u0026start_sending_config_hash\\u003dtrue\\u0026streaming_data_emergency_itag_blacklist\\u003d[]\\u0026substitute_ad_cpn_macro_in_ssdai\\u003dtrue\\u0026suppress_error_204_logging\\u003dtrue\\u0026transport_use_scheduler\\u003dtrue\\u0026trigger_impression_pings_on_view_search_desktop\\u003dtrue\\u0026tv_pacf_logging_sample_rate\\u003d0.01\\u0026tvhtml5_unplugged_preload_cache_size\\u003d5\\u0026unplugged_dai_live_chunk_readahead\\u003d3\\u0026unplugged_tvhtml5_video_preload_on_focus_delay_ms\\u003d0\\u0026update_log_event_config\\u003dtrue\\u0026use_accessibility_data_on_desktop_player_button\\u003dtrue\\u0026use_color_palettes_modern_collections_v2\\u003dtrue\\u0026use_core_sm\\u003dtrue\\u0026use_csi_stp_handler\\u003dtrue\\u0026use_inlined_player_rpc\\u003dtrue\\u0026use_new_cml\\u003dtrue\\u0026use_new_in_memory_storage\\u003dtrue\\u0026use_new_nwl_initialization\\u003dtrue\\u0026use_new_nwl_saw\\u003dtrue\\u0026use_new_nwl_stw\\u003dtrue\\u0026use_new_nwl_wts\\u003dtrue\\u0026use_player_abuse_bg_library\\u003dtrue\\u0026use_player_cue_range_set\\u003dtrue\\u0026use_profilepage_event_label_in_carousel_playbacks\\u003dtrue\\u0026use_request_time_ms_header\\u003dtrue\\u0026use_session_based_sampling\\u003dtrue\\u0026use_shared_notf_vp9_360p_format_filter_rules\\u003dtrue\\u0026use_ts_visibilitylogger\\u003dtrue\\u0026validate_el_adunit_usage_mweb\\u003d0.1\\u0026variable_buffer_timeout_ms\\u003d0\\u0026vp9_drm_live\\u003dtrue\\u0026vss_final_ping_send_and_write\\u003dtrue\\u0026vss_pings_using_networkless\\u003dtrue\\u0026vss_playback_use_send_and_write\\u003dtrue\\u0026web_api_url\\u003dtrue\\u0026web_async_context_processor_impl\\u003dstandalone\\u0026web_big_boards\\u003dtrue\\u0026web_big_boards_enable_in_inline\\u003dtrue\\u0026web_big_boards_enable_in_miniplayer\\u003dtrue\\u0026web_cinematic_watch_settings\\u003dtrue\\u0026web_client_version_override\\u003d\\u0026web_collect_offline_state\\u003dtrue\\u0026web_csi_action_sampling_enabled\\u003dtrue\\u0026web_csi_debug_sample_enabled\\u003dtrue\\u0026web_dedupe_ve_grafting\\u003dtrue\\u0026web_deprecate_service_ajax_map_dependency\\u003dtrue\\u0026web_disable_channels_chapter_entrypoint\\u003dtrue\\u0026web_enable_ab_em_rsp\\u003dtrue\\u0026web_enable_ab_rsp_cl\\u003dtrue\\u0026web_enable_abd_ref\\u003dtrue\\u0026web_enable_error_204\\u003dtrue\\u0026web_enable_speedmaster\\u003dtrue\\u0026web_enable_voz_audio_feedback\\u003dtrue\\u0026web_fix_fine_scrubbing_drag\\u003dtrue\\u0026web_foreground_heartbeat_interval_ms\\u003d28000\\u0026web_forward_command_on_pbj\\u003dtrue\\u0026web_gel_debounce_ms\\u003d60000\\u0026web_gel_timeout_cap\\u003dtrue\\u0026web_heat_map_v2\\u003dtrue\\u0026web_key_moments_markers\\u003dtrue\\u0026web_l3_storyboard\\u003dtrue\\u0026web_log_memory_total_kbytes\\u003dtrue\\u0026web_logging_max_batch\\u003d150\\u0026web_logging_max_batch_hard_limit\\u003dtrue\\u0026web_modern_ads\\u003dtrue\\u0026web_modern_buttons\\u003dtrue\\u0026web_modern_buttons_bl_survey\\u003dtrue\\u0026web_modern_player_settings_quality_bottom\\u003dtrue\\u0026web_modern_subscribe\\u003dtrue\\u0026web_modern_subscribe_style\\u003dfilled\\u0026web_new_autonav_countdown\\u003dtrue\\u0026web_one_platform_error_handling\\u003dtrue\\u0026web_op_signal_type_banlist\\u003d[]\\u0026web_playback_associated_log_ctt\\u003dtrue\\u0026web_playback_associated_ve\\u003dtrue\\u0026web_player_add_ve_conversion_logging_to_outbound_links\\u003dtrue\\u0026web_player_always_enable_auto_translation\\u003dtrue\\u0026web_player_api_logging_fraction\\u003d0.01\\u0026web_player_autonav_empty_suggestions_fix\\u003dtrue\\u0026web_player_autonav_toggle_always_listen\\u003dtrue\\u0026web_player_autonav_use_server_provided_state\\u003dtrue\\u0026web_player_caption_language_preference_stickiness_duration\\u003d30\\u0026web_player_disable_inline_scrubbing\\u003dtrue\\u0026web_player_enable_cultural_moment_overlay\\u003dtrue\\u0026web_player_enable_early_warning_snackbar\\u003dtrue\\u0026web_player_enable_info_button_in_banner_on_desktop\\u003dtrue\\u0026web_player_enable_premium_hbr_in_h5_api\\u003dtrue\\u0026web_player_enable_premium_hbr_playback_cap\\u003dtrue\\u0026web_player_enable_vod_featured_product_banner_on_desktop\\u003dtrue\\u0026web_player_innertube_playlist_update\\u003dtrue\\u0026web_player_ipp_canary_type_for_logging\\u003d\\u0026web_player_log_click_before_generating_ve_conversion_params\\u003dtrue\\u0026web_player_move_autonav_toggle\\u003dtrue\\u0026web_player_music_visualizer_treatment\\u003dfake\\u0026web_player_nitrate_promo_tooltip\\u003dtrue\\u0026web_player_offline_playlist_auto_refresh\\u003dtrue\\u0026web_player_seek_chapters_by_shortcut\\u003dtrue\\u0026web_player_sentinel_is_uniplayer\\u003dtrue\\u0026web_player_should_honor_include_asr_setting\\u003dtrue\\u0026web_player_show_music_in_this_video_graphic\\u003dvideo_thumbnail\\u0026web_player_small_hbp_settings_menu\\u003dtrue\\u0026web_player_ss_dai_ad_fetching_timeout_ms\\u003d15000\\u0026web_player_ss_media_time_offset\\u003dtrue\\u0026web_player_topify_subtitles_for_shorts\\u003dtrue\\u0026web_player_touch_mode_improvements\\u003dtrue\\u0026web_player_transfer_timeout_threshold_ms\\u003d10800000\\u0026web_player_use_cinematic_label_2\\u003dtrue\\u0026web_player_use_heartbeat_poll_delay_ms\\u003dtrue\\u0026web_player_use_new_api_for_quality_pullback\\u003dtrue\\u0026web_player_ve_conversion_fixes_for_channel_info\\u003dtrue\\u0026web_prefetch_preload_video\\u003dtrue\\u0026web_rounded_thumbnails\\u003dtrue\\u0026web_scheduler_auto_init\\u003dtrue\\u0026web_settings_menu_icons\\u003dtrue\\u0026web_smoothness_test_duration_ms\\u003d0\\u0026web_smoothness_test_method\\u003d0\\u0026web_speedmaster_spacebar_control\\u003dtrue\\u0026web_speedmaster_updated_edu\\u003dtrue\\u0026web_yt_config_context\\u003dtrue\\u0026webfe_disable_ab_em_plb\\u003dtrue\\u0026wil_icon_max_concurrent_fetches\\u003d9999\\u0026wil_icon_render_when_idle\\u003dtrue\\u0026wiz_use_generic_logging_infra\\u003dtrue\\u0026woffle_clean_up_after_entity_migration\\u003dtrue\\u0026woffle_enable_download_status\\u003dtrue\\u0026woffle_orchestration\\u003dtrue\\u0026woffle_playlist_optimization\\u003dtrue\\u0026woffle_used_state_report\\u003dtrue\\u0026ytidb_clear_embedded_player\\u003dtrue\\u0026ytidb_fetch_datasync_ids_for_data_cleanup\\u003dtrue\\u0026ytidb_remake_db_retries\\u003d3\\u0026ytidb_reopen_db_retries\\u003d3\\u0026ytidb_transaction_ended_event_rate_limit\\u003d0.02\\u0026ytidb_transaction_ended_event_rate_limit_session\\u003d0.2\\u0026ytidb_transaction_ended_event_rate_limit_transaction\\u003d0.1\",\"cspNonce\":\"xW_SWKdw4-d_OLdvn29m6Q\",\"canaryState\":\"none\",\"enableCsiLogging\":true,\"csiPageType\":\"channels\",\"datasyncId\":\"Vc2a81ef1||\",\"canaryStage\":\"\"},\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_PLAYLIST_OVERVIEW\":{\"rootElementId\":\"c4-player\",\"jsUrl\":\"/s/player/63e90c30/player_ias.vflset/en_US/base.js\",\"cssUrl\":\"/s/player/63e90c30/www-player.css\",\"contextId\":\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_PLAYLIST_OVERVIEW\",\"eventLabel\":\"playlistoverview\",\"contentRegion\":\"IT\",\"hl\":\"en_US\",\"hostLanguage\":\"en\",\"playerStyle\":\"desktop-polymer\",\"innertubeApiKey\":\"AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\",\"innertubeApiVersion\":\"v1\",\"innertubeContextClientVersion\":\"2.20231121.08.00\",\"device\":{\"brand\":\"\",\"model\":\"\",\"browser\":\"Chrome\",\"browserVersion\":\"[scrubbed]\",\"os\":\"Windows\",\"osVersion\":\"10.0\",\"platform\":\"DESKTOP\",\"interfaceName\":\"WEB\",\"interfaceVersion\":\"2.20231121.08.00\"},\"serializedExperimentIds\":\"23983296,23986028,24004644,24007246,24080738,24135310,24208765,24371398,24371779,24385728,24439361,24524098,24543193,24543197,24543199,24543201,24549786,24550458,24559327,24560416,24566293,24566687,24699899,51006181,51010235,51012165,51017346,51026715,51027535,51028271,51030311,51035166,51037540,51038399,51038805,51039199,51039493,51039699,51041809,51044150,51044152,51044154,51044158,51046164,51047619,51049006,51054675,51055917,51056050,51057534,51060161,51067339,51069001\",\"serializedExperimentFlags\":\"H5_async_logging_delay_ms\\u003d30000.0\\u0026H5_enable_full_pacf_logging\\u003dtrue\\u0026H5_use_async_logging\\u003dtrue\\u0026ab_det_apb_b\\u003dtrue\\u0026ab_det_fet_wr\\u003dtrue\\u0026ab_det_fet_wr_en\\u003dtrue\\u0026ab_det_gen_re\\u003dtrue\\u0026action_companion_center_align_description\\u003dtrue\\u0026ad_pod_disable_companion_persist_ads_quality\\u003dtrue\\u0026addto_ajax_log_warning_fraction\\u003d0.1\\u0026align_ad_to_video_player_lifecycle_for_bulleit\\u003dtrue\\u0026allow_drm_override\\u003dtrue\\u0026allow_live_autoplay\\u003dtrue\\u0026allow_poltergust_autoplay\\u003dtrue\\u0026allow_skip_networkless\\u003dtrue\\u0026allow_vp9_1080p_mq_enc\\u003dtrue\\u0026att_web_record_metrics\\u003dtrue\\u0026autoplay_time\\u003d8000\\u0026autoplay_time_for_fullscreen\\u003d3000\\u0026autoplay_time_for_music_content\\u003d3000\\u0026bg_vm_reinit_threshold\\u003d7200000\\u0026blocked_packages_for_sps\\u003d[]\\u0026botguard_async_snapshot_timeout_ms\\u003d3000\\u0026captions_url_add_ei\\u003dtrue\\u0026check_ad_ui_status_for_mweb_safari\\u003dtrue\\u0026check_navigator_accuracy_timeout_ms\\u003d0\\u0026clear_user_partitioned_ls\\u003dtrue\\u0026client_respect_autoplay_switch_button_renderer\\u003dtrue\\u0026compress_gel\\u003dtrue\\u0026compression_disable_point\\u003d10\\u0026compression_performance_threshold\\u003d250\\u0026csi_on_gel\\u003dtrue\\u0026dash_manifest_version\\u003d5\\u0026debug_bandaid_hostname\\u003d\\u0026debug_sherlog_username\\u003d\\u0026delay_ads_gvi_call_on_bulleit_living_room_ms\\u003d0\\u0026deprecate_csi_has_info\\u003dtrue\\u0026deprecate_delay_ping\\u003dtrue\\u0026deprecate_pair_servlet_enabled\\u003dtrue\\u0026desktop_image_cta_no_background\\u003dtrue\\u0026desktop_log_img_click_location\\u003dtrue\\u0026desktop_sparkles_light_cta_button\\u003dtrue\\u0026disable_channel_id_check_for_suspended_channels\\u003dtrue\\u0026disable_child_node_auto_formatted_strings\\u003dtrue\\u0026disable_defer_admodule_on_advertiser_video\\u003dtrue\\u0026disable_features_for_supex\\u003dtrue\\u0026disable_inline_preview_scrubbing_for_vac_ads_on_web\\u003dtrue\\u0026disable_legacy_desktop_remote_queue\\u003dtrue\\u0026disable_mdx_connection_in_mdx_module_for_music_web\\u003dtrue\\u0026disable_new_pause_state3\\u003dtrue\\u0026disable_pacf_logging_for_memory_limited_tv\\u003dtrue\\u0026disable_rounding_ad_notify\\u003dtrue\\u0026disable_simple_mixed_direction_formatted_strings\\u003dtrue\\u0026disable_ssdai_on_errors\\u003dtrue\\u0026disable_tabbing_before_flyout_ad_elements_appear\\u003dtrue\\u0026disable_thumbnail_preloading\\u003dtrue\\u0026edge_encryption_fill_primary_key_version\\u003dtrue\\u0026embeds_add_player_mode_to_ad_events\\u003dtrue\\u0026embeds_disable_progress_bar_context_menu_handling\\u003dtrue\\u0026embeds_enable_muted_autoplay\\u003dtrue\\u0026embeds_web_enable_autoplay_not_supported_logging_fix\\u003dtrue\\u0026embeds_web_enable_host_flags_client_permissions\\u003dtrue\\u0026embeds_web_enable_host_flags_innertube\\u003dtrue\\u0026embeds_web_enable_lite_logging\\u003dtrue\\u0026embeds_web_enable_load_player_from_page_show\\u003dtrue\\u0026embeds_web_enable_log_splay_as_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_dtts\\u003dtrue\\u0026embeds_web_enable_modestbranding_deprecation\\u003dtrue\\u0026embeds_web_enable_pause_overlay_wn_update\\u003dtrue\\u0026embeds_web_enable_pfp_unbranded_el_deprecation\\u003dtrue\\u0026embeds_web_enable_rcat_allowlist\\u003dtrue\\u0026embeds_web_enable_scripted_playback_blocked_logging_fix\\u003dtrue\\u0026embeds_web_enable_smallmode_fullscreen_button_fix\\u003dtrue\\u0026embeds_web_enable_ve_conversion_logging_tracking_no_allow_list\\u003dtrue\\u0026embeds_web_hide_unfilled_more_videos_suggestions\\u003dtrue\\u0026embeds_web_lite_mode\\u003d1\\u0026embeds_web_move_preload_by_player_vars_to_public\\u003dtrue\\u0026embeds_web_nwl_disable_nocookie\\u003dtrue\\u0026embeds_web_shopping_overlay_no_wait_for_paid_content_overlay\\u003dtrue\\u0026embeds_web_synth_ch_headers_banned_urls_regex\\u003d\\u0026enable_ab_report_on_errorscreen\\u003dtrue\\u0026enable_ab_rp_int\\u003dtrue\\u0026enable_ad_cpn_macro_substitution_for_click_pings\\u003dtrue\\u0026enable_app_promo_endcap_eml_on_tablet\\u003dtrue\\u0026enable_ata_dialog_all_web\\u003dtrue\\u0026enable_cast_for_web_unplugged\\u003dtrue\\u0026enable_cast_on_music_web\\u003dtrue\\u0026enable_client_page_id_header_for_first_party_pings\\u003dtrue\\u0026enable_client_sli_logging\\u003dtrue\\u0026enable_cta_banner_on_unplugged_lr\\u003dtrue\\u0026enable_dark_mode_style_endcap\\u003dtrue\\u0026enable_dark_mode_style_endcap_timed_pie_countdown\\u003dtrue\\u0026enable_discrete_live_precise_embargos\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_android\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_ios\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_compliant_banner_image_ad_renderer\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_mobile\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_one_click_ata_translators_infeed_elements\\u003dtrue\\u0026enable_error_corrections_infocard\\u003dtrue\\u0026enable_error_corrections_infocard_web_client\\u003dtrue\\u0026enable_error_corrections_infocard_web_client_check\\u003dtrue\\u0026enable_error_corrections_infocards_icon_web\\u003dtrue\\u0026enable_eviction_protection_for_bulleit\\u003dtrue\\u0026enable_flow_logging_p4e\\u003dtrue\\u0026enable_free_preview_timer\\u003dtrue\\u0026enable_gel_log_commands\\u003dtrue\\u0026enable_h5_player_ad_block_status_logging\\u003dtrue\\u0026enable_h5_player_ad_block_status_piping\\u003dtrue\\u0026enable_handles_account_menu_switcher\\u003dtrue\\u0026enable_high_frequency_cookie_rotation\\u003dtrue\\u0026enable_kabuki_comments_on_shorts\\u003ddisabled\\u0026enable_live_ad_serving_context\\u003dtrue\\u0026enable_live_premiere_web_player_indicator\\u003dtrue\\u0026enable_loggingcontext_trackingparams\\u003dtrue\\u0026enable_lr_home_infeed_ads_inline_playback_progress_pings\\u003dtrue\\u0026enable_mixed_direction_formatted_strings\\u003dtrue\\u0026enable_modern_skip_button_on_web\\u003dtrue\\u0026enable_multiple_heatseeker_decorations\\u003dtrue\\u0026enable_mweb_endcap_clickable_icon_description\\u003dtrue\\u0026enable_mweb_endcap_dark_mode_action_button\\u003dtrue\\u0026enable_mweb_livestream_ui_update\\u003dtrue\\u0026enable_new_paid_product_placement\\u003dtrue\\u0026enable_out_of_stock_text_all_surfaces\\u003dtrue\\u0026enable_pacf_slot_asde_infeed_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5_TV\\u003dtrue\\u0026enable_pacf_through_ybfe_tv\\u003dtrue\\u0026enable_pacf_through_ybfe_tv_for_page_top_formats\\u003dtrue\\u0026enable_pacf_through_ysfe_tv\\u003dtrue\\u0026enable_pass_sdc_get_accounts_list\\u003dtrue\\u0026enable_pl_r_c\\u003dtrue\\u0026enable_pl_r_c_s\\u003dtrue\\u0026enable_pl_r_si_fa\\u003dtrue\\u0026enable_player_param_truncation_before_navigation_on_web_on_search\\u003dtrue\\u0026enable_populate_att_psd_in_abe_feedback\\u003dtrue\\u0026enable_populate_psd_in_abe_feedback\\u003dtrue\\u0026enable_post_ad_perception_survey_fix_on_tvhtml5\\u003dtrue\\u0026enable_post_ad_perception_survey_in_tvhtml5\\u003dtrue\\u0026enable_sdf_midroll_postroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_main\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_misc\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_tv\\u003dtrue\\u0026enable_server_stitched_dai\\u003dtrue\\u0026enable_set_endcap_thumbnail_from_layout\\u003dtrue\\u0026enable_shorts_player\\u003dtrue\\u0026enable_skip_ad_guidance_prompt\\u003dtrue\\u0026enable_skippable_ads_for_unplugged_ad_pod\\u003dtrue\\u0026enable_small_endcap_action_button_for_mweb\\u003dtrue\\u0026enable_smearing_expansion_dai\\u003dtrue\\u0026enable_tectonic_ad_ux_for_halftime\\u003dtrue\\u0026enable_third_party_info\\u003dtrue\\u0026enable_topsoil_wta_for_halftime_live_infra\\u003dtrue\\u0026enable_unknown_lact_fix_on_html5\\u003dtrue\\u0026enable_web_media_session_metadata_fix\\u003dtrue\\u0026enable_web_tiered_gel\\u003dtrue\\u0026enable_wn_infocards\\u003dtrue\\u0026enable_yt_ata_iframe_authuser\\u003dtrue\\u0026err_on_pl_r_c\\u003dtrue\\u0026error_message_for_gsuite_network_restrictions\\u003dtrue\\u0026export_networkless_options\\u003dtrue\\u0026external_fullscreen_with_edu\\u003dtrue\\u0026fetch_att_independently\\u003dtrue\\u0026fetch_bid_for_dclk_status\\u003dtrue\\u0026fill_single_video_with_notify_to_lasr\\u003dtrue\\u0026filter_vp9_for_csdai\\u003dtrue\\u0026fix_ads_tracking_for_swf_config_deprecation_mweb\\u003dtrue\\u0026fix_h5_toggle_button_a11y\\u003dtrue\\u0026fix_survey_color_contrast_on_destop\\u003dtrue\\u0026fix_toggle_button_role_for_ad_components\\u003dtrue\\u0026fix_web_instream_survey_question_aria_label\\u003dtrue\\u0026gcf_config_store_enabled\\u003dtrue\\u0026gcf_music_innertube\\u003dtrue\\u0026gel_min_batch_size\\u003d3\\u0026gel_queue_timeout_max_ms\\u003d300000\\u0026gpa_sparkles_ten_percent_layer\\u003dtrue\\u0026gvi_channel_client_screen\\u003dtrue\\u0026h5_companion_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_enable_generic_error_logging_event\\u003dtrue\\u0026h5_enable_unified_csi_preroll\\u003dtrue\\u0026h5_inplayer_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_reset_cache_and_filter_before_update_masthead\\u003dtrue\\u0026heatseeker_decoration_threshold\\u003d0.8\\u0026hfr_dropped_framerate_fallback_threshold\\u003d0\\u0026hide_cta_for_home_web_video_ads_animate_in_time\\u003d2\\u0026hide_endpoint_overflow_on_ytd_display_ad_renderer\\u003dtrue\\u0026html5_ad_timeout_ms\\u003d0\\u0026html5_adaptation_step_count\\u003d0\\u0026html5_add_dai_smearing_to_qoe\\u003dtrue\\u0026html5_add_drm_formats_to_test_format\\u003dtrue\\u0026html5_ads_preroll_lock_timeout_delay_ms\\u003d15000\\u0026html5_allow_video_keyframe_without_audio\\u003dtrue\\u0026html5_apply_min_failures\\u003dtrue\\u0026html5_apply_start_time_within_ads_for_ssdai_transitions\\u003dtrue\\u0026html5_atr_disable_force_fallback\\u003dtrue\\u0026html5_attach_num_random_bytes_to_bandaid\\u003d0\\u0026html5_attach_po_token_to_bandaid\\u003dtrue\\u0026html5_autonav_cap_idle_secs\\u003d0\\u0026html5_autonav_quality_cap\\u003d720\\u0026html5_autoplay_default_quality_cap\\u003d0\\u0026html5_block_pip_safari_delay\\u003d0\\u0026html5_bypass_contention_secs\\u003d0.0\\u0026html5_cache_request_key\\u003d\\u0026html5_check_for_idle_network_interval_ms\\u003d-1\\u0026html5_check_video_data_errors_before_playback_start\\u003dtrue\\u0026html5_cobalt_default_buffer_size_in_bytes\\u003d0\\u0026html5_cobalt_max_size_for_immed_job\\u003d0\\u0026html5_cobalt_min_processor_cnt_to_offload_algo\\u003d0\\u0026html5_cobalt_override_quic\\u003d0\\u0026html5_consume_media_bytes_slice_infos\\u003dtrue\\u0026html5_continuous_goodput_probe_interval_ms\\u003d0\\u0026html5_de_dupe_content_video_loads_in_lifecycle_api\\u003dtrue\\u0026html5_debug_data_log_probability\\u003d0.1\\u0026html5_decode_to_texture_cap\\u003dtrue\\u0026html5_default_ad_gain\\u003d0.5\\u0026html5_default_quality_cap\\u003d0\\u0026html5_defer_fetch_att_ms\\u003d1000\\u0026html5_delayed_retry_count\\u003d1\\u0026html5_delayed_retry_delay_ms\\u003d5000\\u0026html5_deprecate_adservice\\u003dtrue\\u0026html5_deprecate_video_tag_pool\\u003dtrue\\u0026html5_desktop_vr180_allow_panning\\u003dtrue\\u0026html5_df_downgrade_thresh\\u003d0.6\\u0026html5_disable_csi_for_bulleit\\u003dtrue\\u0026html5_disable_move_pssh_to_moov\\u003dtrue\\u0026html5_disable_non_contiguous\\u003dtrue\\u0026html5_displayed_frame_rate_downgrade_threshold\\u003d45\\u0026html5_drm_byterate_soft_cap\\u003d0\\u0026html5_drm_check_all_key_error_states\\u003dtrue\\u0026html5_drm_cpi_license_key\\u003dtrue\\u0026html5_drm_live_byterate_soft_cap\\u003d0\\u0026html5_enable_ac3\\u003dtrue\\u0026html5_enable_ads_client_monitoring_log_tv\\u003dtrue\\u0026html5_enable_caption_changes_for_mosaic\\u003dtrue\\u0026html5_enable_client_hints_override\\u003dtrue\\u0026html5_enable_composite_embargo\\u003dtrue\\u0026html5_enable_eac3\\u003dtrue\\u0026html5_enable_embedded_player_visibility_signals\\u003dtrue\\u0026html5_enable_non_notify_composite_vod_lsar_pacf\\u003dtrue\\u0026html5_enable_oduc\\u003dtrue\\u0026html5_enable_pp_proxima_eligible\\u003dtrue\\u0026html5_enable_single_video_vod_ivar_on_pacf\\u003dtrue\\u0026html5_enable_tvos_dash\\u003dtrue\\u0026html5_enable_tvos_encrypted_vp9\\u003dtrue\\u0026html5_enable_widevine_for_alc\\u003dtrue\\u0026html5_enable_widevine_for_fast_linear\\u003dtrue\\u0026html5_encourage_array_coalescing\\u003dtrue\\u0026html5_gapless_ended_transition_buffer_ms\\u003d200\\u0026html5_gapless_handoff_close_end_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_close_end_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_handoff_started_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_started_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_loop_seek_offset_in_milli\\u003d0\\u0026html5_generate_session_po_token\\u003dtrue\\u0026html5_gl_fps_threshold\\u003d0\\u0026html5_hdcp_probing_stream_url\\u003d\\u0026html5_head_miss_secs\\u003d0.0\\u0026html5_hfr_quality_cap\\u003d0\\u0026html5_high_res_logging_percent\\u003d0.01\\u0026html5_honor_caption_availabilities_in_audio_track\\u003dtrue\\u0026html5_hopeless_secs\\u003d0\\u0026html5_idle_rate_limit_ms\\u003d0\\u0026html5_ignore_interruptive_ads_for_server_stitched\\u003dtrue\\u0026html5_ignore_stall_from_no_data_timeouts\\u003dtrue\\u0026html5_innertube_heartbeats_for_fairplay\\u003dtrue\\u0026html5_innertube_heartbeats_for_playready\\u003dtrue\\u0026html5_innertube_heartbeats_for_widevine\\u003dtrue\\u0026html5_ios4_seek_above_zero\\u003dtrue\\u0026html5_ios7_force_play_on_stall\\u003dtrue\\u0026html5_ios_force_seek_to_zero_on_stop\\u003dtrue\\u0026html5_jumbo_mobile_subsegment_readahead_target\\u003d3.0\\u0026html5_jumbo_ull_nonstreaming_mffa_ms\\u003d4000\\u0026html5_jumbo_ull_subsegment_readahead_target\\u003d1.3\\u0026html5_license_constraint_delay\\u003d5000\\u0026html5_live_abr_head_miss_fraction\\u003d0.0\\u0026html5_live_abr_repredict_fraction\\u003d0.0\\u0026html5_live_chunk_readahead_proxima_override\\u003d0\\u0026html5_live_head_playable\\u003dtrue\\u0026html5_live_low_latency_bandwidth_window\\u003d0.0\\u0026html5_live_normal_latency_bandwidth_window\\u003d0.0\\u0026html5_live_quality_cap\\u003d0\\u0026html5_live_ultra_low_latency_bandwidth_window\\u003d0.0\\u0026html5_liveness_drift_chunk_override\\u003d0\\u0026html5_liveness_drift_proxima_override\\u003d0\\u0026html5_log_audio_abr\\u003dtrue\\u0026html5_log_audio_switch_metrics\\u003dtrue\\u0026html5_log_experiment_id_from_player_response_to_ctmp\\u003d\\u0026html5_log_first_ssdai_requests_killswitch\\u003dtrue\\u0026html5_log_rebuffer_events\\u003d5\\u0026html5_log_trigger_events_with_debug_data\\u003dtrue\\u0026html5_long_rebuffer_jiggle_cmt_delay_ms\\u003d0\\u0026html5_long_rebuffer_threshold_ms\\u003d30000\\u0026html5_manifestless_unplugged\\u003dtrue\\u0026html5_manifestless_vp9_otf\\u003dtrue\\u0026html5_max_buffer_health_for_downgrade_prop\\u003d-1.0\\u0026html5_max_buffer_health_for_downgrade_secs\\u003d0.0\\u0026html5_max_byterate\\u003d0\\u0026html5_max_drift_per_track_secs\\u003d0.0\\u0026html5_max_headm_for_streaming_xhr\\u003d0\\u0026html5_max_live_dvr_window_plus_margin_secs\\u003d46800.0\\u0026html5_max_readbehind_secs\\u003d0\\u0026html5_max_redirect_response_length\\u003d8192\\u0026html5_max_selectable_quality_ordinal\\u003d0\\u0026html5_max_source_buffer_append_size_in_bytes\\u003d0\\u0026html5_maximum_readahead_seconds\\u003d0.0\\u0026html5_media_fullscreen\\u003dtrue\\u0026html5_mffa_ms_proxima_override\\u003d0\\u0026html5_mfl_extend_max_request_time\\u003dtrue\\u0026html5_min_failures_to_delay_retry\\u003d3\\u0026html5_min_media_duration_for_append_prop\\u003d0.0\\u0026html5_min_media_duration_for_cabr_slice\\u003d0.0\\u0026html5_min_progress_event_interval_ms\\u003d10\\u0026html5_min_quality_ordinal\\u003d0\\u0026html5_min_readbehind_cap_secs\\u003d60\\u0026html5_min_readbehind_secs\\u003d0\\u0026html5_min_seconds_between_format_selections\\u003d0.0\\u0026html5_min_selectable_quality_ordinal\\u003d0\\u0026html5_min_startup_buffered_ad_media_duration_secs\\u003d1.2\\u0026html5_min_startup_buffered_media_duration_secs\\u003d1.2\\u0026html5_min_startup_duration_live_secs\\u003d0.25\\u0026html5_min_upgrade_health_secs\\u003d0.0\\u0026html5_minimum_readahead_seconds\\u003d0.0\\u0026html5_mock_content_binding_for_session_token\\u003d\\u0026html5_no_placeholder_rollbacks\\u003dtrue\\u0026html5_non_network_rebuffer_duration_ms\\u003d0\\u0026html5_non_onesie_attach_po_token\\u003dtrue\\u0026html5_normal_latency_mffa_ms\\u003d0\\u0026html5_not_register_disposables_when_core_listens\\u003dtrue\\u0026html5_oduc_transfer_logging\\u003dtrue\\u0026html5_offline_failure_retry_limit\\u003d2\\u0026html5_offline_prevent_redownload_downloaded_video\\u003dtrue\\u0026html5_onesie_defer_content_loader_ms\\u003d0\\u0026html5_onesie_live_ttl_secs\\u003d8\\u0026html5_onesie_notify_cuepoint_manager_on_completion\\u003dtrue\\u0026html5_onesie_prewarm_interval_ms\\u003d0\\u0026html5_onesie_prewarm_max_lact_ms\\u003d0\\u0026html5_onesie_redirector_timeout\\u003dtrue\\u0026html5_onesie_redirector_timeout_ms\\u003d0\\u0026html5_onesie_request_timeout_ms\\u003d1000\\u0026html5_pause_on_nonforeground_platform_errors\\u003dtrue\\u0026html5_peak_shave\\u003dtrue\\u0026html5_perf_cap_override_sticky\\u003dtrue\\u0026html5_performance_cap_floor\\u003d360\\u0026html5_performance_impact_profiling_timer_ms\\u003d0\\u0026html5_perserve_av1_perf_cap\\u003dtrue\\u0026html5_platform_minimum_readahead_seconds\\u003d0.0\\u0026html5_platform_whitelisted_for_frame_accurate_seeks\\u003dtrue\\u0026html5_player_autonav_logging\\u003dtrue\\u0026html5_player_dynamic_bottom_gradient\\u003dtrue\\u0026html5_player_min_build_cl\\u003d-1\\u0026html5_player_preload_ad_fix\\u003dtrue\\u0026html5_post_interrupt_readahead\\u003d20\\u0026html5_prefer_server_bwe3\\u003dtrue\\u0026html5_preload_wait_time_secs\\u003d0.0\\u0026html5_probe_primary_delay_base_ms\\u003d0\\u0026html5_process_all_encrypted_events\\u003dtrue\\u0026html5_ps4_shorts_1080p_soft_cap\\u003dtrue\\u0026html5_qoe_lh_max_report_count\\u003d0\\u0026html5_qoe_lh_min_duration_ms\\u003d0\\u0026html5_qoe_proto_mock_length\\u003d0\\u0026html5_query_sw_secure_crypto_for_android\\u003dtrue\\u0026html5_random_playback_cap\\u003d0\\u0026html5_recognize_predict_start_cue_point\\u003dtrue\\u0026html5_remove_command_triggered_companions\\u003dtrue\\u0026html5_remove_not_servable_check_killswitch\\u003dtrue\\u0026html5_rename_apbs\\u003dtrue\\u0026html5_report_fatal_drm_restricted_error_killswitch\\u003dtrue\\u0026html5_report_slow_ads_as_error\\u003dtrue\\u0026html5_repredict_interval_ms\\u003d0\\u0026html5_request_only_hdr_or_sdr_keys\\u003dtrue\\u0026html5_request_size_max_kb\\u003d0\\u0026html5_request_size_min_kb\\u003d0\\u0026html5_request_sizing_multiplier\\u003d0.8\\u0026html5_resource_bad_status_delay_scaling\\u003d1.5\\u0026html5_restore_time_after_unpause\\u003dtrue\\u0026html5_restore_time_after_unpause_redux\\u003dtrue\\u0026html5_restrict_streaming_xhr_on_sqless_requests\\u003dtrue\\u0026html5_retry_quota_exceeded_via_seek\\u003dtrue\\u0026html5_safari_desktop_eme_min_version\\u003d0\\u0026html5_samsung_kant_limit_max_bitrate\\u003d0\\u0026html5_seek_again_after_time_jump_cfl\\u003dtrue\\u0026html5_seek_jiggle_cmt_delay_ms\\u003d8000\\u0026html5_seek_new_elem_delay_ms\\u003d12000\\u0026html5_seek_new_elem_shorts_delay_ms\\u003d2000\\u0026html5_seek_new_media_element_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_element_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_new_media_source_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_source_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_set_cmt_delay_ms\\u003d2000\\u0026html5_seek_timeout_delay_ms\\u003d20000\\u0026html5_server_stitched_dai_decorated_url_retry_limit\\u003d5\\u0026html5_server_stitched_dai_group\\u003dtrue\\u0026html5_session_po_token_interval_time_ms\\u003d900000\\u0026html5_set_video_data_to_stale\\u003dtrue\\u0026html5_shorts_gapless_next_buffer_in_seconds\\u003d0\\u0026html5_skip_slow_ad_delay_ms\\u003d15000\\u0026html5_slow_start_no_media_source_delay_ms\\u003d0\\u0026html5_slow_start_timeout_delay_ms\\u003d20000\\u0026html5_ssdai_adfetch_dynamic_timeout_ms\\u003d5000\\u0026html5_ssdai_enable_new_seek_logic\\u003dtrue\\u0026html5_ssdai_failure_retry_limit\\u003d0\\u0026html5_stall_factor\\u003d0.0\\u0026html5_stall_window_size_ct\\u003d20\\u0026html5_stateful_audio_min_adjustment_value\\u003d0\\u0026html5_static_abr_resolution_shelf\\u003d0\\u0026html5_store_xhr_headers_readable\\u003dtrue\\u0026html5_streaming_xhr_time_based_consolidation_ms\\u003d0\\u0026html5_subsegment_readahead_load_speed_check_interval\\u003d0.5\\u0026html5_subsegment_readahead_min_buffer_health_secs\\u003d0.25\\u0026html5_subsegment_readahead_min_buffer_health_secs_on_timeout\\u003d0.1\\u0026html5_subsegment_readahead_min_load_speed\\u003d1.5\\u0026html5_subsegment_readahead_seek_latency_fudge\\u003d0.5\\u0026html5_subsegment_readahead_target_buffer_health_secs\\u003d0.5\\u0026html5_subsegment_readahead_timeout_secs\\u003d2.0\\u0026html5_top_shelf_format_byterate_factor\\u003d1.5\\u0026html5_track_overshoot\\u003dtrue\\u0026html5_transfer_processing_logs_interval\\u003d1000\\u0026html5_ugc_live_audio_51\\u003dtrue\\u0026html5_ugc_vod_audio_51\\u003dtrue\\u0026html5_unreported_seek_reseek_delay_ms\\u003d0\\u0026html5_unrestricted_layer_high_res_logging_percent\\u003d0.0\\u0026html5_update_time_on_seeked\\u003dtrue\\u0026html5_use_jsonformatter_to_parse_player_response\\u003dtrue\\u0026html5_use_post_for_media\\u003dtrue\\u0026html5_use_target_duration\\u003dtrue\\u0026html5_use_ump\\u003dtrue\\u0026html5_use_video_transition_endpoint_heartbeat\\u003dtrue\\u0026html5_video_tbd_min_kb\\u003d0\\u0026html5_viewport_undersend_maximum\\u003d0.0\\u0026html5_volume_slider_tooltip\\u003dtrue\\u0026html5_web_po_experiment_ids\\u003d[]\\u0026html5_webpo_idle_priority_job\\u003dtrue\\u0026html5_woffle_resume\\u003dtrue\\u0026html5_workaround_delay_trigger\\u003dtrue\\u0026ignore_overlapping_cue_points_on_endemic_live_html5\\u003dtrue\\u0026il_payload_scraping\\u003d\\u0026il_use_view_model_logging_context\\u003dtrue\\u0026initial_gel_batch_timeout\\u003d2000\\u0026injected_license_handler_error_code\\u003d0\\u0026injected_license_handler_license_status\\u003d0\\u0026itdrm_enable_revocation_reporting\\u003dtrue\\u0026itdrm_injected_license_service_error_code\\u003d0\\u0026itdrm_widevine_hardened_vmp_mode\\u003dlog\\u0026json_condensed_response\\u003dtrue\\u0026kev_adb_pg\\u003dtrue\\u0026kevlar_command_handler_command_banlist\\u003d[]\\u0026kevlar_dropdown_fix\\u003dtrue\\u0026kevlar_gel_error_routing\\u003dtrue\\u0026kevlar_miniplayer\\u003dtrue\\u0026kevlar_miniplayer_expand_top\\u003dtrue\\u0026kevlar_miniplayer_play_pause_on_scrim\\u003dtrue\\u0026kevlar_playback_associated_queue\\u003dtrue\\u0026kevlar_queue_use_update_api\\u003dtrue\\u0026kevlar_use_wil_icons\\u003dtrue\\u0026kevlar_vimio_use_shared_monitor\\u003dtrue\\u0026kevlar_woffle\\u003dtrue\\u0026kids_web_client_log_screen_associated\\u003dtrue\\u0026live_chat_enable_rta_manager\\u003dtrue\\u0026live_chunk_readahead\\u003d3\\u0026live_fresca_v2\\u003dtrue\\u0026log_errors_through_nwl_on_retry\\u003dtrue\\u0026log_gel_compression_latency\\u003dtrue\\u0026log_heartbeat_with_lifecycles\\u003dtrue\\u0026log_web_endpoint_to_layer\\u003dtrue\\u0026log_window_onerror_fraction\\u003d0.1\\u0026manifestless_post_live\\u003dtrue\\u0026manifestless_post_live_ufph\\u003dtrue\\u0026max_body_size_to_compress\\u003d500000\\u0026max_prefetch_window_sec_for_livestream_optimization\\u003d10\\u0026max_resolution_for_white_noise\\u003d360\\u0026mdx_enable_privacy_disclosure_ui\\u003dtrue\\u0026mdx_load_cast_api_bootstrap_script\\u003dtrue\\u0026migrate_events_to_ts\\u003dtrue\\u0026migrate_remaining_web_ad_badges_to_innertube\\u003dtrue\\u0026min_prefetch_offset_sec_for_livestream_optimization\\u003d20\\u0026move_survey_ad_renderer_ve_asde\\u003dtrue\\u0026move_vss_away_from_login_info_cookie\\u003dtrue\\u0026music_enable_shared_audio_tier_logic\\u003dtrue\\u0026mweb_c3_endscreen\\u003dtrue\\u0026mweb_deprecate_skip_ve_logging\\u003dtrue\\u0026mweb_enable_custom_control_shared\\u003dtrue\\u0026mweb_enable_skippables_on_jio_phone\\u003dtrue\\u0026mweb_native_control_in_faux_fullscreen_shared\\u003dtrue\\u0026network_polling_interval\\u003d30000\\u0026networkless_gel\\u003dtrue\\u0026networkless_logging\\u003dtrue\\u0026new_codecs_string_api_uses_legacy_style\\u003dtrue\\u0026new_csn_storage_design\\u003dtrue\\u0026nwl_send_fast_on_unload\\u003dtrue\\u0026nwl_send_from_memory_when_online\\u003dtrue\\u0026offline_error_handling\\u003dtrue\\u0026override_drm_required_playback_policy_channels\\u003d[]\\u0026pacf_logging_delay_milliseconds_through_ybfe_tv\\u003d30000\\u0026pageid_as_header_web\\u003dtrue\\u0026partial_rewind_buffer_seconds\\u003d0\\u0026player_ads_set_adformat_on_client\\u003dtrue\\u0026player_allow_autonav_after_playlist\\u003dtrue\\u0026player_bootstrap_method\\u003dtrue\\u0026player_destroy_old_version\\u003dtrue\\u0026player_doubletap_to_seek\\u003dtrue\\u0026player_enable_playback_playlist_change\\u003dtrue\\u0026player_underlay_min_player_width\\u003d768.0\\u0026player_underlay_video_width_fraction\\u003d0.6\\u0026player_web_canary_stage\\u003d0\\u0026playready_first_play_expiration\\u003d-1\\u0026polymer_bad_build_labels\\u003dtrue\\u0026polymer_verifiy_app_state\\u003dtrue\\u0026populate_author_with_podcast_name_in_video_details\\u003dtrue\\u0026preskip_button_style_ads_backend\\u003dcountdown_next_to_thumbnail\\u0026qoe_nwl_downloads\\u003dtrue\\u0026qoe_send_and_write\\u003dtrue\\u0026record_app_crashed_web\\u003dtrue\\u0026reject_live_ott_h264_clear_240p\\u003dtrue\\u0026reject_live_vp9_mq_clear_with_no_abr_ladder\\u003dtrue\\u0026replace_closure_window_with_updated_ytwindow_in_studio\\u003dtrue\\u0026replace_playability_retriever_in_watch\\u003dtrue\\u0026scheduler_use_raf_by_default\\u003dtrue\\u0026self_podding_header_string_template\\u003dself_podding_interstitial_message\\u0026self_podding_highlight_non_default_button\\u003dtrue\\u0026self_podding_midroll_choice_string_template\\u003dself_podding_midroll_choice\\u0026send_config_hash_timer\\u003d0\\u0026set_interstitial_advertisers_question_text\\u003dtrue\\u0026set_mock_id_as_expected_content_binding\\u003d\\u0026shell_load_gcf\\u003dtrue\\u0026short_start_time_prefer_publish_in_watch_log\\u003dtrue\\u0026shorts_mode_to_player_api\\u003dtrue\\u0026should_clear_video_data_on_player_cued_unstarted\\u003dtrue\\u0026simply_embedded_enable_botguard\\u003dtrue\\u0026skip_inline_muted_license_service_check\\u003dtrue\\u0026skip_invalid_ytcsi_ticks\\u003dtrue\\u0026skip_ls_gel_retry\\u003dtrue\\u0026skip_setting_info_in_csi_data_object\\u003dtrue\\u0026slow_compressions_before_abandon_count\\u003d4\\u0026speedmaster_cancellation_movement_dp\\u003d10\\u0026speedmaster_playback_rate\\u003d2.0\\u0026speedmaster_touch_activation_ms\\u003d500\\u0026st_skip_debug_params\\u003dtrue\\u0026start_client_gcf\\u003dtrue\\u0026start_client_gcf_for_player\\u003dtrue\\u0026start_sending_config_hash\\u003dtrue\\u0026streaming_data_emergency_itag_blacklist\\u003d[]\\u0026substitute_ad_cpn_macro_in_ssdai\\u003dtrue\\u0026suppress_error_204_logging\\u003dtrue\\u0026transport_use_scheduler\\u003dtrue\\u0026trigger_impression_pings_on_view_search_desktop\\u003dtrue\\u0026tv_pacf_logging_sample_rate\\u003d0.01\\u0026tvhtml5_unplugged_preload_cache_size\\u003d5\\u0026unplugged_dai_live_chunk_readahead\\u003d3\\u0026unplugged_tvhtml5_video_preload_on_focus_delay_ms\\u003d0\\u0026update_log_event_config\\u003dtrue\\u0026use_accessibility_data_on_desktop_player_button\\u003dtrue\\u0026use_color_palettes_modern_collections_v2\\u003dtrue\\u0026use_core_sm\\u003dtrue\\u0026use_csi_stp_handler\\u003dtrue\\u0026use_inlined_player_rpc\\u003dtrue\\u0026use_new_cml\\u003dtrue\\u0026use_new_in_memory_storage\\u003dtrue\\u0026use_new_nwl_initialization\\u003dtrue\\u0026use_new_nwl_saw\\u003dtrue\\u0026use_new_nwl_stw\\u003dtrue\\u0026use_new_nwl_wts\\u003dtrue\\u0026use_player_abuse_bg_library\\u003dtrue\\u0026use_player_cue_range_set\\u003dtrue\\u0026use_profilepage_event_label_in_carousel_playbacks\\u003dtrue\\u0026use_request_time_ms_header\\u003dtrue\\u0026use_session_based_sampling\\u003dtrue\\u0026use_shared_notf_vp9_360p_format_filter_rules\\u003dtrue\\u0026use_ts_visibilitylogger\\u003dtrue\\u0026validate_el_adunit_usage_mweb\\u003d0.1\\u0026variable_buffer_timeout_ms\\u003d0\\u0026vp9_drm_live\\u003dtrue\\u0026vss_final_ping_send_and_write\\u003dtrue\\u0026vss_pings_using_networkless\\u003dtrue\\u0026vss_playback_use_send_and_write\\u003dtrue\\u0026web_api_url\\u003dtrue\\u0026web_async_context_processor_impl\\u003dstandalone\\u0026web_big_boards\\u003dtrue\\u0026web_big_boards_enable_in_inline\\u003dtrue\\u0026web_big_boards_enable_in_miniplayer\\u003dtrue\\u0026web_cinematic_watch_settings\\u003dtrue\\u0026web_client_version_override\\u003d\\u0026web_collect_offline_state\\u003dtrue\\u0026web_csi_action_sampling_enabled\\u003dtrue\\u0026web_csi_debug_sample_enabled\\u003dtrue\\u0026web_dedupe_ve_grafting\\u003dtrue\\u0026web_deprecate_service_ajax_map_dependency\\u003dtrue\\u0026web_disable_channels_chapter_entrypoint\\u003dtrue\\u0026web_enable_ab_em_rsp\\u003dtrue\\u0026web_enable_ab_rsp_cl\\u003dtrue\\u0026web_enable_abd_ref\\u003dtrue\\u0026web_enable_error_204\\u003dtrue\\u0026web_enable_speedmaster\\u003dtrue\\u0026web_enable_voz_audio_feedback\\u003dtrue\\u0026web_fix_fine_scrubbing_drag\\u003dtrue\\u0026web_foreground_heartbeat_interval_ms\\u003d28000\\u0026web_forward_command_on_pbj\\u003dtrue\\u0026web_gel_debounce_ms\\u003d60000\\u0026web_gel_timeout_cap\\u003dtrue\\u0026web_heat_map_v2\\u003dtrue\\u0026web_key_moments_markers\\u003dtrue\\u0026web_l3_storyboard\\u003dtrue\\u0026web_log_memory_total_kbytes\\u003dtrue\\u0026web_logging_max_batch\\u003d150\\u0026web_logging_max_batch_hard_limit\\u003dtrue\\u0026web_modern_ads\\u003dtrue\\u0026web_modern_buttons\\u003dtrue\\u0026web_modern_buttons_bl_survey\\u003dtrue\\u0026web_modern_player_settings_quality_bottom\\u003dtrue\\u0026web_modern_subscribe\\u003dtrue\\u0026web_modern_subscribe_style\\u003dfilled\\u0026web_new_autonav_countdown\\u003dtrue\\u0026web_one_platform_error_handling\\u003dtrue\\u0026web_op_signal_type_banlist\\u003d[]\\u0026web_playback_associated_log_ctt\\u003dtrue\\u0026web_playback_associated_ve\\u003dtrue\\u0026web_player_add_ve_conversion_logging_to_outbound_links\\u003dtrue\\u0026web_player_always_enable_auto_translation\\u003dtrue\\u0026web_player_api_logging_fraction\\u003d0.01\\u0026web_player_autonav_empty_suggestions_fix\\u003dtrue\\u0026web_player_autonav_toggle_always_listen\\u003dtrue\\u0026web_player_autonav_use_server_provided_state\\u003dtrue\\u0026web_player_caption_language_preference_stickiness_duration\\u003d30\\u0026web_player_disable_inline_scrubbing\\u003dtrue\\u0026web_player_enable_cultural_moment_overlay\\u003dtrue\\u0026web_player_enable_early_warning_snackbar\\u003dtrue\\u0026web_player_enable_info_button_in_banner_on_desktop\\u003dtrue\\u0026web_player_enable_premium_hbr_in_h5_api\\u003dtrue\\u0026web_player_enable_premium_hbr_playback_cap\\u003dtrue\\u0026web_player_enable_vod_featured_product_banner_on_desktop\\u003dtrue\\u0026web_player_innertube_playlist_update\\u003dtrue\\u0026web_player_ipp_canary_type_for_logging\\u003d\\u0026web_player_log_click_before_generating_ve_conversion_params\\u003dtrue\\u0026web_player_move_autonav_toggle\\u003dtrue\\u0026web_player_music_visualizer_treatment\\u003dfake\\u0026web_player_nitrate_promo_tooltip\\u003dtrue\\u0026web_player_offline_playlist_auto_refresh\\u003dtrue\\u0026web_player_seek_chapters_by_shortcut\\u003dtrue\\u0026web_player_sentinel_is_uniplayer\\u003dtrue\\u0026web_player_should_honor_include_asr_setting\\u003dtrue\\u0026web_player_show_music_in_this_video_graphic\\u003dvideo_thumbnail\\u0026web_player_small_hbp_settings_menu\\u003dtrue\\u0026web_player_ss_dai_ad_fetching_timeout_ms\\u003d15000\\u0026web_player_ss_media_time_offset\\u003dtrue\\u0026web_player_topify_subtitles_for_shorts\\u003dtrue\\u0026web_player_touch_mode_improvements\\u003dtrue\\u0026web_player_transfer_timeout_threshold_ms\\u003d10800000\\u0026web_player_use_cinematic_label_2\\u003dtrue\\u0026web_player_use_heartbeat_poll_delay_ms\\u003dtrue\\u0026web_player_use_new_api_for_quality_pullback\\u003dtrue\\u0026web_player_ve_conversion_fixes_for_channel_info\\u003dtrue\\u0026web_prefetch_preload_video\\u003dtrue\\u0026web_rounded_thumbnails\\u003dtrue\\u0026web_scheduler_auto_init\\u003dtrue\\u0026web_settings_menu_icons\\u003dtrue\\u0026web_smoothness_test_duration_ms\\u003d0\\u0026web_smoothness_test_method\\u003d0\\u0026web_speedmaster_spacebar_control\\u003dtrue\\u0026web_speedmaster_updated_edu\\u003dtrue\\u0026web_yt_config_context\\u003dtrue\\u0026webfe_disable_ab_em_plb\\u003dtrue\\u0026wil_icon_max_concurrent_fetches\\u003d9999\\u0026wil_icon_render_when_idle\\u003dtrue\\u0026wiz_use_generic_logging_infra\\u003dtrue\\u0026woffle_clean_up_after_entity_migration\\u003dtrue\\u0026woffle_enable_download_status\\u003dtrue\\u0026woffle_orchestration\\u003dtrue\\u0026woffle_playlist_optimization\\u003dtrue\\u0026woffle_used_state_report\\u003dtrue\\u0026ytidb_clear_embedded_player\\u003dtrue\\u0026ytidb_fetch_datasync_ids_for_data_cleanup\\u003dtrue\\u0026ytidb_remake_db_retries\\u003d3\\u0026ytidb_reopen_db_retries\\u003d3\\u0026ytidb_transaction_ended_event_rate_limit\\u003d0.02\\u0026ytidb_transaction_ended_event_rate_limit_session\\u003d0.2\\u0026ytidb_transaction_ended_event_rate_limit_transaction\\u003d0.1\",\"disableSharing\":true,\"hideInfo\":true,\"disableWatchLater\":true,\"cspNonce\":\"xW_SWKdw4-d_OLdvn29m6Q\",\"canaryState\":\"none\",\"enableCsiLogging\":true,\"csiPageType\":\"playlist_overview\",\"datasyncId\":\"Vc2a81ef1||\",\"canaryStage\":\"\"},\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_VERTICAL_LANDING_PAGE_PROMO\":{\"rootElementId\":\"ytd-default-promo-panel-renderer-inline-playback-renderer\",\"jsUrl\":\"/s/player/63e90c30/player_ias.vflset/en_US/base.js\",\"cssUrl\":\"/s/player/63e90c30/www-player.css\",\"contextId\":\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_VERTICAL_LANDING_PAGE_PROMO\",\"eventLabel\":\"profilepage\",\"contentRegion\":\"IT\",\"hl\":\"en_US\",\"hostLanguage\":\"en\",\"playerStyle\":\"desktop-polymer\",\"innertubeApiKey\":\"AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\",\"innertubeApiVersion\":\"v1\",\"innertubeContextClientVersion\":\"2.20231121.08.00\",\"controlsType\":0,\"disableRelatedVideos\":true,\"annotationsLoadPolicy\":3,\"device\":{\"brand\":\"\",\"model\":\"\",\"browser\":\"Chrome\",\"browserVersion\":\"[scrubbed]\",\"os\":\"Windows\",\"osVersion\":\"10.0\",\"platform\":\"DESKTOP\",\"interfaceName\":\"WEB\",\"interfaceVersion\":\"2.20231121.08.00\"},\"serializedExperimentIds\":\"23983296,23986028,24004644,24007246,24080738,24135310,24208765,24371398,24371779,24385728,24439361,24524098,24543193,24543197,24543199,24543201,24549786,24550458,24559327,24560416,24566293,24566687,24699899,51006181,51010235,51012165,51017346,51026715,51027535,51028271,51030311,51035166,51037540,51038399,51038805,51039199,51039493,51039699,51041809,51044150,51044152,51044154,51044158,51046164,51047619,51049006,51054675,51055917,51056050,51057534,51060161,51067339,51069001\",\"serializedExperimentFlags\":\"H5_async_logging_delay_ms\\u003d30000.0\\u0026H5_enable_full_pacf_logging\\u003dtrue\\u0026H5_use_async_logging\\u003dtrue\\u0026ab_det_apb_b\\u003dtrue\\u0026ab_det_fet_wr\\u003dtrue\\u0026ab_det_fet_wr_en\\u003dtrue\\u0026ab_det_gen_re\\u003dtrue\\u0026action_companion_center_align_description\\u003dtrue\\u0026ad_pod_disable_companion_persist_ads_quality\\u003dtrue\\u0026addto_ajax_log_warning_fraction\\u003d0.1\\u0026align_ad_to_video_player_lifecycle_for_bulleit\\u003dtrue\\u0026allow_drm_override\\u003dtrue\\u0026allow_live_autoplay\\u003dtrue\\u0026allow_poltergust_autoplay\\u003dtrue\\u0026allow_skip_networkless\\u003dtrue\\u0026allow_vp9_1080p_mq_enc\\u003dtrue\\u0026att_web_record_metrics\\u003dtrue\\u0026autoplay_time\\u003d8000\\u0026autoplay_time_for_fullscreen\\u003d3000\\u0026autoplay_time_for_music_content\\u003d3000\\u0026bg_vm_reinit_threshold\\u003d7200000\\u0026blocked_packages_for_sps\\u003d[]\\u0026botguard_async_snapshot_timeout_ms\\u003d3000\\u0026captions_url_add_ei\\u003dtrue\\u0026check_ad_ui_status_for_mweb_safari\\u003dtrue\\u0026check_navigator_accuracy_timeout_ms\\u003d0\\u0026clear_user_partitioned_ls\\u003dtrue\\u0026client_respect_autoplay_switch_button_renderer\\u003dtrue\\u0026compress_gel\\u003dtrue\\u0026compression_disable_point\\u003d10\\u0026compression_performance_threshold\\u003d250\\u0026csi_on_gel\\u003dtrue\\u0026dash_manifest_version\\u003d5\\u0026debug_bandaid_hostname\\u003d\\u0026debug_sherlog_username\\u003d\\u0026delay_ads_gvi_call_on_bulleit_living_room_ms\\u003d0\\u0026deprecate_csi_has_info\\u003dtrue\\u0026deprecate_delay_ping\\u003dtrue\\u0026deprecate_pair_servlet_enabled\\u003dtrue\\u0026desktop_image_cta_no_background\\u003dtrue\\u0026desktop_log_img_click_location\\u003dtrue\\u0026desktop_sparkles_light_cta_button\\u003dtrue\\u0026disable_channel_id_check_for_suspended_channels\\u003dtrue\\u0026disable_child_node_auto_formatted_strings\\u003dtrue\\u0026disable_defer_admodule_on_advertiser_video\\u003dtrue\\u0026disable_features_for_supex\\u003dtrue\\u0026disable_inline_preview_scrubbing_for_vac_ads_on_web\\u003dtrue\\u0026disable_legacy_desktop_remote_queue\\u003dtrue\\u0026disable_mdx_connection_in_mdx_module_for_music_web\\u003dtrue\\u0026disable_new_pause_state3\\u003dtrue\\u0026disable_pacf_logging_for_memory_limited_tv\\u003dtrue\\u0026disable_rounding_ad_notify\\u003dtrue\\u0026disable_simple_mixed_direction_formatted_strings\\u003dtrue\\u0026disable_ssdai_on_errors\\u003dtrue\\u0026disable_tabbing_before_flyout_ad_elements_appear\\u003dtrue\\u0026disable_thumbnail_preloading\\u003dtrue\\u0026edge_encryption_fill_primary_key_version\\u003dtrue\\u0026embeds_add_player_mode_to_ad_events\\u003dtrue\\u0026embeds_disable_progress_bar_context_menu_handling\\u003dtrue\\u0026embeds_enable_muted_autoplay\\u003dtrue\\u0026embeds_web_enable_autoplay_not_supported_logging_fix\\u003dtrue\\u0026embeds_web_enable_host_flags_client_permissions\\u003dtrue\\u0026embeds_web_enable_host_flags_innertube\\u003dtrue\\u0026embeds_web_enable_lite_logging\\u003dtrue\\u0026embeds_web_enable_load_player_from_page_show\\u003dtrue\\u0026embeds_web_enable_log_splay_as_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_dtts\\u003dtrue\\u0026embeds_web_enable_modestbranding_deprecation\\u003dtrue\\u0026embeds_web_enable_pause_overlay_wn_update\\u003dtrue\\u0026embeds_web_enable_pfp_unbranded_el_deprecation\\u003dtrue\\u0026embeds_web_enable_rcat_allowlist\\u003dtrue\\u0026embeds_web_enable_scripted_playback_blocked_logging_fix\\u003dtrue\\u0026embeds_web_enable_smallmode_fullscreen_button_fix\\u003dtrue\\u0026embeds_web_enable_ve_conversion_logging_tracking_no_allow_list\\u003dtrue\\u0026embeds_web_hide_unfilled_more_videos_suggestions\\u003dtrue\\u0026embeds_web_lite_mode\\u003d1\\u0026embeds_web_move_preload_by_player_vars_to_public\\u003dtrue\\u0026embeds_web_nwl_disable_nocookie\\u003dtrue\\u0026embeds_web_shopping_overlay_no_wait_for_paid_content_overlay\\u003dtrue\\u0026embeds_web_synth_ch_headers_banned_urls_regex\\u003d\\u0026enable_ab_report_on_errorscreen\\u003dtrue\\u0026enable_ab_rp_int\\u003dtrue\\u0026enable_ad_cpn_macro_substitution_for_click_pings\\u003dtrue\\u0026enable_app_promo_endcap_eml_on_tablet\\u003dtrue\\u0026enable_ata_dialog_all_web\\u003dtrue\\u0026enable_cast_for_web_unplugged\\u003dtrue\\u0026enable_cast_on_music_web\\u003dtrue\\u0026enable_client_page_id_header_for_first_party_pings\\u003dtrue\\u0026enable_client_sli_logging\\u003dtrue\\u0026enable_cta_banner_on_unplugged_lr\\u003dtrue\\u0026enable_dark_mode_style_endcap\\u003dtrue\\u0026enable_dark_mode_style_endcap_timed_pie_countdown\\u003dtrue\\u0026enable_discrete_live_precise_embargos\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_android\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_ios\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_compliant_banner_image_ad_renderer\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_mobile\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_one_click_ata_translators_infeed_elements\\u003dtrue\\u0026enable_error_corrections_infocard\\u003dtrue\\u0026enable_error_corrections_infocard_web_client\\u003dtrue\\u0026enable_error_corrections_infocard_web_client_check\\u003dtrue\\u0026enable_error_corrections_infocards_icon_web\\u003dtrue\\u0026enable_eviction_protection_for_bulleit\\u003dtrue\\u0026enable_flow_logging_p4e\\u003dtrue\\u0026enable_free_preview_timer\\u003dtrue\\u0026enable_gel_log_commands\\u003dtrue\\u0026enable_h5_player_ad_block_status_logging\\u003dtrue\\u0026enable_h5_player_ad_block_status_piping\\u003dtrue\\u0026enable_handles_account_menu_switcher\\u003dtrue\\u0026enable_high_frequency_cookie_rotation\\u003dtrue\\u0026enable_kabuki_comments_on_shorts\\u003ddisabled\\u0026enable_live_ad_serving_context\\u003dtrue\\u0026enable_live_premiere_web_player_indicator\\u003dtrue\\u0026enable_loggingcontext_trackingparams\\u003dtrue\\u0026enable_lr_home_infeed_ads_inline_playback_progress_pings\\u003dtrue\\u0026enable_mixed_direction_formatted_strings\\u003dtrue\\u0026enable_modern_skip_button_on_web\\u003dtrue\\u0026enable_multiple_heatseeker_decorations\\u003dtrue\\u0026enable_mweb_endcap_clickable_icon_description\\u003dtrue\\u0026enable_mweb_endcap_dark_mode_action_button\\u003dtrue\\u0026enable_mweb_livestream_ui_update\\u003dtrue\\u0026enable_new_paid_product_placement\\u003dtrue\\u0026enable_out_of_stock_text_all_surfaces\\u003dtrue\\u0026enable_pacf_slot_asde_infeed_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5_TV\\u003dtrue\\u0026enable_pacf_through_ybfe_tv\\u003dtrue\\u0026enable_pacf_through_ybfe_tv_for_page_top_formats\\u003dtrue\\u0026enable_pacf_through_ysfe_tv\\u003dtrue\\u0026enable_pass_sdc_get_accounts_list\\u003dtrue\\u0026enable_pl_r_c\\u003dtrue\\u0026enable_pl_r_c_s\\u003dtrue\\u0026enable_pl_r_si_fa\\u003dtrue\\u0026enable_player_param_truncation_before_navigation_on_web_on_search\\u003dtrue\\u0026enable_populate_att_psd_in_abe_feedback\\u003dtrue\\u0026enable_populate_psd_in_abe_feedback\\u003dtrue\\u0026enable_post_ad_perception_survey_fix_on_tvhtml5\\u003dtrue\\u0026enable_post_ad_perception_survey_in_tvhtml5\\u003dtrue\\u0026enable_sdf_midroll_postroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_main\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_misc\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_tv\\u003dtrue\\u0026enable_server_stitched_dai\\u003dtrue\\u0026enable_set_endcap_thumbnail_from_layout\\u003dtrue\\u0026enable_shorts_player\\u003dtrue\\u0026enable_skip_ad_guidance_prompt\\u003dtrue\\u0026enable_skippable_ads_for_unplugged_ad_pod\\u003dtrue\\u0026enable_small_endcap_action_button_for_mweb\\u003dtrue\\u0026enable_smearing_expansion_dai\\u003dtrue\\u0026enable_tectonic_ad_ux_for_halftime\\u003dtrue\\u0026enable_third_party_info\\u003dtrue\\u0026enable_topsoil_wta_for_halftime_live_infra\\u003dtrue\\u0026enable_unknown_lact_fix_on_html5\\u003dtrue\\u0026enable_web_media_session_metadata_fix\\u003dtrue\\u0026enable_web_tiered_gel\\u003dtrue\\u0026enable_wn_infocards\\u003dtrue\\u0026enable_yt_ata_iframe_authuser\\u003dtrue\\u0026err_on_pl_r_c\\u003dtrue\\u0026error_message_for_gsuite_network_restrictions\\u003dtrue\\u0026export_networkless_options\\u003dtrue\\u0026external_fullscreen_with_edu\\u003dtrue\\u0026fetch_att_independently\\u003dtrue\\u0026fetch_bid_for_dclk_status\\u003dtrue\\u0026fill_single_video_with_notify_to_lasr\\u003dtrue\\u0026filter_vp9_for_csdai\\u003dtrue\\u0026fix_ads_tracking_for_swf_config_deprecation_mweb\\u003dtrue\\u0026fix_h5_toggle_button_a11y\\u003dtrue\\u0026fix_survey_color_contrast_on_destop\\u003dtrue\\u0026fix_toggle_button_role_for_ad_components\\u003dtrue\\u0026fix_web_instream_survey_question_aria_label\\u003dtrue\\u0026gcf_config_store_enabled\\u003dtrue\\u0026gcf_music_innertube\\u003dtrue\\u0026gel_min_batch_size\\u003d3\\u0026gel_queue_timeout_max_ms\\u003d300000\\u0026gpa_sparkles_ten_percent_layer\\u003dtrue\\u0026gvi_channel_client_screen\\u003dtrue\\u0026h5_companion_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_enable_generic_error_logging_event\\u003dtrue\\u0026h5_enable_unified_csi_preroll\\u003dtrue\\u0026h5_inplayer_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_reset_cache_and_filter_before_update_masthead\\u003dtrue\\u0026heatseeker_decoration_threshold\\u003d0.8\\u0026hfr_dropped_framerate_fallback_threshold\\u003d0\\u0026hide_cta_for_home_web_video_ads_animate_in_time\\u003d2\\u0026hide_endpoint_overflow_on_ytd_display_ad_renderer\\u003dtrue\\u0026html5_ad_timeout_ms\\u003d0\\u0026html5_adaptation_step_count\\u003d0\\u0026html5_add_dai_smearing_to_qoe\\u003dtrue\\u0026html5_add_drm_formats_to_test_format\\u003dtrue\\u0026html5_ads_preroll_lock_timeout_delay_ms\\u003d15000\\u0026html5_allow_video_keyframe_without_audio\\u003dtrue\\u0026html5_apply_min_failures\\u003dtrue\\u0026html5_apply_start_time_within_ads_for_ssdai_transitions\\u003dtrue\\u0026html5_atr_disable_force_fallback\\u003dtrue\\u0026html5_attach_num_random_bytes_to_bandaid\\u003d0\\u0026html5_attach_po_token_to_bandaid\\u003dtrue\\u0026html5_autonav_cap_idle_secs\\u003d0\\u0026html5_autonav_quality_cap\\u003d720\\u0026html5_autoplay_default_quality_cap\\u003d0\\u0026html5_block_pip_safari_delay\\u003d0\\u0026html5_bypass_contention_secs\\u003d0.0\\u0026html5_cache_request_key\\u003d\\u0026html5_check_for_idle_network_interval_ms\\u003d-1\\u0026html5_check_video_data_errors_before_playback_start\\u003dtrue\\u0026html5_cobalt_default_buffer_size_in_bytes\\u003d0\\u0026html5_cobalt_max_size_for_immed_job\\u003d0\\u0026html5_cobalt_min_processor_cnt_to_offload_algo\\u003d0\\u0026html5_cobalt_override_quic\\u003d0\\u0026html5_consume_media_bytes_slice_infos\\u003dtrue\\u0026html5_continuous_goodput_probe_interval_ms\\u003d0\\u0026html5_de_dupe_content_video_loads_in_lifecycle_api\\u003dtrue\\u0026html5_debug_data_log_probability\\u003d0.1\\u0026html5_decode_to_texture_cap\\u003dtrue\\u0026html5_default_ad_gain\\u003d0.5\\u0026html5_default_quality_cap\\u003d0\\u0026html5_defer_fetch_att_ms\\u003d1000\\u0026html5_delayed_retry_count\\u003d1\\u0026html5_delayed_retry_delay_ms\\u003d5000\\u0026html5_deprecate_adservice\\u003dtrue\\u0026html5_deprecate_video_tag_pool\\u003dtrue\\u0026html5_desktop_vr180_allow_panning\\u003dtrue\\u0026html5_df_downgrade_thresh\\u003d0.6\\u0026html5_disable_csi_for_bulleit\\u003dtrue\\u0026html5_disable_move_pssh_to_moov\\u003dtrue\\u0026html5_disable_non_contiguous\\u003dtrue\\u0026html5_displayed_frame_rate_downgrade_threshold\\u003d45\\u0026html5_drm_byterate_soft_cap\\u003d0\\u0026html5_drm_check_all_key_error_states\\u003dtrue\\u0026html5_drm_cpi_license_key\\u003dtrue\\u0026html5_drm_live_byterate_soft_cap\\u003d0\\u0026html5_enable_ac3\\u003dtrue\\u0026html5_enable_ads_client_monitoring_log_tv\\u003dtrue\\u0026html5_enable_caption_changes_for_mosaic\\u003dtrue\\u0026html5_enable_client_hints_override\\u003dtrue\\u0026html5_enable_composite_embargo\\u003dtrue\\u0026html5_enable_eac3\\u003dtrue\\u0026html5_enable_embedded_player_visibility_signals\\u003dtrue\\u0026html5_enable_non_notify_composite_vod_lsar_pacf\\u003dtrue\\u0026html5_enable_oduc\\u003dtrue\\u0026html5_enable_pp_proxima_eligible\\u003dtrue\\u0026html5_enable_single_video_vod_ivar_on_pacf\\u003dtrue\\u0026html5_enable_tvos_dash\\u003dtrue\\u0026html5_enable_tvos_encrypted_vp9\\u003dtrue\\u0026html5_enable_widevine_for_alc\\u003dtrue\\u0026html5_enable_widevine_for_fast_linear\\u003dtrue\\u0026html5_encourage_array_coalescing\\u003dtrue\\u0026html5_gapless_ended_transition_buffer_ms\\u003d200\\u0026html5_gapless_handoff_close_end_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_close_end_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_handoff_started_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_started_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_loop_seek_offset_in_milli\\u003d0\\u0026html5_generate_session_po_token\\u003dtrue\\u0026html5_gl_fps_threshold\\u003d0\\u0026html5_hdcp_probing_stream_url\\u003d\\u0026html5_head_miss_secs\\u003d0.0\\u0026html5_hfr_quality_cap\\u003d0\\u0026html5_high_res_logging_percent\\u003d0.01\\u0026html5_honor_caption_availabilities_in_audio_track\\u003dtrue\\u0026html5_hopeless_secs\\u003d0\\u0026html5_idle_rate_limit_ms\\u003d0\\u0026html5_ignore_interruptive_ads_for_server_stitched\\u003dtrue\\u0026html5_ignore_stall_from_no_data_timeouts\\u003dtrue\\u0026html5_innertube_heartbeats_for_fairplay\\u003dtrue\\u0026html5_innertube_heartbeats_for_playready\\u003dtrue\\u0026html5_innertube_heartbeats_for_widevine\\u003dtrue\\u0026html5_ios4_seek_above_zero\\u003dtrue\\u0026html5_ios7_force_play_on_stall\\u003dtrue\\u0026html5_ios_force_seek_to_zero_on_stop\\u003dtrue\\u0026html5_jumbo_mobile_subsegment_readahead_target\\u003d3.0\\u0026html5_jumbo_ull_nonstreaming_mffa_ms\\u003d4000\\u0026html5_jumbo_ull_subsegment_readahead_target\\u003d1.3\\u0026html5_license_constraint_delay\\u003d5000\\u0026html5_live_abr_head_miss_fraction\\u003d0.0\\u0026html5_live_abr_repredict_fraction\\u003d0.0\\u0026html5_live_chunk_readahead_proxima_override\\u003d0\\u0026html5_live_head_playable\\u003dtrue\\u0026html5_live_low_latency_bandwidth_window\\u003d0.0\\u0026html5_live_normal_latency_bandwidth_window\\u003d0.0\\u0026html5_live_quality_cap\\u003d0\\u0026html5_live_ultra_low_latency_bandwidth_window\\u003d0.0\\u0026html5_liveness_drift_chunk_override\\u003d0\\u0026html5_liveness_drift_proxima_override\\u003d0\\u0026html5_log_audio_abr\\u003dtrue\\u0026html5_log_audio_switch_metrics\\u003dtrue\\u0026html5_log_experiment_id_from_player_response_to_ctmp\\u003d\\u0026html5_log_first_ssdai_requests_killswitch\\u003dtrue\\u0026html5_log_rebuffer_events\\u003d5\\u0026html5_log_trigger_events_with_debug_data\\u003dtrue\\u0026html5_long_rebuffer_jiggle_cmt_delay_ms\\u003d0\\u0026html5_long_rebuffer_threshold_ms\\u003d30000\\u0026html5_manifestless_unplugged\\u003dtrue\\u0026html5_manifestless_vp9_otf\\u003dtrue\\u0026html5_max_buffer_health_for_downgrade_prop\\u003d-1.0\\u0026html5_max_buffer_health_for_downgrade_secs\\u003d0.0\\u0026html5_max_byterate\\u003d0\\u0026html5_max_drift_per_track_secs\\u003d0.0\\u0026html5_max_headm_for_streaming_xhr\\u003d0\\u0026html5_max_live_dvr_window_plus_margin_secs\\u003d46800.0\\u0026html5_max_readbehind_secs\\u003d0\\u0026html5_max_redirect_response_length\\u003d8192\\u0026html5_max_selectable_quality_ordinal\\u003d0\\u0026html5_max_source_buffer_append_size_in_bytes\\u003d0\\u0026html5_maximum_readahead_seconds\\u003d0.0\\u0026html5_media_fullscreen\\u003dtrue\\u0026html5_mffa_ms_proxima_override\\u003d0\\u0026html5_mfl_extend_max_request_time\\u003dtrue\\u0026html5_min_failures_to_delay_retry\\u003d3\\u0026html5_min_media_duration_for_append_prop\\u003d0.0\\u0026html5_min_media_duration_for_cabr_slice\\u003d0.0\\u0026html5_min_progress_event_interval_ms\\u003d10\\u0026html5_min_quality_ordinal\\u003d0\\u0026html5_min_readbehind_cap_secs\\u003d60\\u0026html5_min_readbehind_secs\\u003d0\\u0026html5_min_seconds_between_format_selections\\u003d0.0\\u0026html5_min_selectable_quality_ordinal\\u003d0\\u0026html5_min_startup_buffered_ad_media_duration_secs\\u003d1.2\\u0026html5_min_startup_buffered_media_duration_secs\\u003d1.2\\u0026html5_min_startup_duration_live_secs\\u003d0.25\\u0026html5_min_upgrade_health_secs\\u003d0.0\\u0026html5_minimum_readahead_seconds\\u003d0.0\\u0026html5_mock_content_binding_for_session_token\\u003d\\u0026html5_no_placeholder_rollbacks\\u003dtrue\\u0026html5_non_network_rebuffer_duration_ms\\u003d0\\u0026html5_non_onesie_attach_po_token\\u003dtrue\\u0026html5_normal_latency_mffa_ms\\u003d0\\u0026html5_not_register_disposables_when_core_listens\\u003dtrue\\u0026html5_oduc_transfer_logging\\u003dtrue\\u0026html5_offline_failure_retry_limit\\u003d2\\u0026html5_offline_prevent_redownload_downloaded_video\\u003dtrue\\u0026html5_onesie_defer_content_loader_ms\\u003d0\\u0026html5_onesie_live_ttl_secs\\u003d8\\u0026html5_onesie_notify_cuepoint_manager_on_completion\\u003dtrue\\u0026html5_onesie_prewarm_interval_ms\\u003d0\\u0026html5_onesie_prewarm_max_lact_ms\\u003d0\\u0026html5_onesie_redirector_timeout\\u003dtrue\\u0026html5_onesie_redirector_timeout_ms\\u003d0\\u0026html5_onesie_request_timeout_ms\\u003d1000\\u0026html5_pause_on_nonforeground_platform_errors\\u003dtrue\\u0026html5_peak_shave\\u003dtrue\\u0026html5_perf_cap_override_sticky\\u003dtrue\\u0026html5_performance_cap_floor\\u003d360\\u0026html5_performance_impact_profiling_timer_ms\\u003d0\\u0026html5_perserve_av1_perf_cap\\u003dtrue\\u0026html5_platform_minimum_readahead_seconds\\u003d0.0\\u0026html5_platform_whitelisted_for_frame_accurate_seeks\\u003dtrue\\u0026html5_player_autonav_logging\\u003dtrue\\u0026html5_player_dynamic_bottom_gradient\\u003dtrue\\u0026html5_player_min_build_cl\\u003d-1\\u0026html5_player_preload_ad_fix\\u003dtrue\\u0026html5_post_interrupt_readahead\\u003d20\\u0026html5_prefer_server_bwe3\\u003dtrue\\u0026html5_preload_wait_time_secs\\u003d0.0\\u0026html5_probe_primary_delay_base_ms\\u003d0\\u0026html5_process_all_encrypted_events\\u003dtrue\\u0026html5_ps4_shorts_1080p_soft_cap\\u003dtrue\\u0026html5_qoe_lh_max_report_count\\u003d0\\u0026html5_qoe_lh_min_duration_ms\\u003d0\\u0026html5_qoe_proto_mock_length\\u003d0\\u0026html5_query_sw_secure_crypto_for_android\\u003dtrue\\u0026html5_random_playback_cap\\u003d0\\u0026html5_recognize_predict_start_cue_point\\u003dtrue\\u0026html5_remove_command_triggered_companions\\u003dtrue\\u0026html5_remove_not_servable_check_killswitch\\u003dtrue\\u0026html5_rename_apbs\\u003dtrue\\u0026html5_report_fatal_drm_restricted_error_killswitch\\u003dtrue\\u0026html5_report_slow_ads_as_error\\u003dtrue\\u0026html5_repredict_interval_ms\\u003d0\\u0026html5_request_only_hdr_or_sdr_keys\\u003dtrue\\u0026html5_request_size_max_kb\\u003d0\\u0026html5_request_size_min_kb\\u003d0\\u0026html5_request_sizing_multiplier\\u003d0.8\\u0026html5_resource_bad_status_delay_scaling\\u003d1.5\\u0026html5_restore_time_after_unpause\\u003dtrue\\u0026html5_restore_time_after_unpause_redux\\u003dtrue\\u0026html5_restrict_streaming_xhr_on_sqless_requests\\u003dtrue\\u0026html5_retry_quota_exceeded_via_seek\\u003dtrue\\u0026html5_safari_desktop_eme_min_version\\u003d0\\u0026html5_samsung_kant_limit_max_bitrate\\u003d0\\u0026html5_seek_again_after_time_jump_cfl\\u003dtrue\\u0026html5_seek_jiggle_cmt_delay_ms\\u003d8000\\u0026html5_seek_new_elem_delay_ms\\u003d12000\\u0026html5_seek_new_elem_shorts_delay_ms\\u003d2000\\u0026html5_seek_new_media_element_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_element_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_new_media_source_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_source_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_set_cmt_delay_ms\\u003d2000\\u0026html5_seek_timeout_delay_ms\\u003d20000\\u0026html5_server_stitched_dai_decorated_url_retry_limit\\u003d5\\u0026html5_server_stitched_dai_group\\u003dtrue\\u0026html5_session_po_token_interval_time_ms\\u003d900000\\u0026html5_set_video_data_to_stale\\u003dtrue\\u0026html5_shorts_gapless_next_buffer_in_seconds\\u003d0\\u0026html5_skip_slow_ad_delay_ms\\u003d15000\\u0026html5_slow_start_no_media_source_delay_ms\\u003d0\\u0026html5_slow_start_timeout_delay_ms\\u003d20000\\u0026html5_ssdai_adfetch_dynamic_timeout_ms\\u003d5000\\u0026html5_ssdai_enable_new_seek_logic\\u003dtrue\\u0026html5_ssdai_failure_retry_limit\\u003d0\\u0026html5_stall_factor\\u003d0.0\\u0026html5_stall_window_size_ct\\u003d20\\u0026html5_stateful_audio_min_adjustment_value\\u003d0\\u0026html5_static_abr_resolution_shelf\\u003d0\\u0026html5_store_xhr_headers_readable\\u003dtrue\\u0026html5_streaming_xhr_time_based_consolidation_ms\\u003d0\\u0026html5_subsegment_readahead_load_speed_check_interval\\u003d0.5\\u0026html5_subsegment_readahead_min_buffer_health_secs\\u003d0.25\\u0026html5_subsegment_readahead_min_buffer_health_secs_on_timeout\\u003d0.1\\u0026html5_subsegment_readahead_min_load_speed\\u003d1.5\\u0026html5_subsegment_readahead_seek_latency_fudge\\u003d0.5\\u0026html5_subsegment_readahead_target_buffer_health_secs\\u003d0.5\\u0026html5_subsegment_readahead_timeout_secs\\u003d2.0\\u0026html5_top_shelf_format_byterate_factor\\u003d1.5\\u0026html5_track_overshoot\\u003dtrue\\u0026html5_transfer_processing_logs_interval\\u003d1000\\u0026html5_ugc_live_audio_51\\u003dtrue\\u0026html5_ugc_vod_audio_51\\u003dtrue\\u0026html5_unreported_seek_reseek_delay_ms\\u003d0\\u0026html5_unrestricted_layer_high_res_logging_percent\\u003d0.0\\u0026html5_update_time_on_seeked\\u003dtrue\\u0026html5_use_jsonformatter_to_parse_player_response\\u003dtrue\\u0026html5_use_post_for_media\\u003dtrue\\u0026html5_use_target_duration\\u003dtrue\\u0026html5_use_ump\\u003dtrue\\u0026html5_use_video_transition_endpoint_heartbeat\\u003dtrue\\u0026html5_video_tbd_min_kb\\u003d0\\u0026html5_viewport_undersend_maximum\\u003d0.0\\u0026html5_volume_slider_tooltip\\u003dtrue\\u0026html5_web_po_experiment_ids\\u003d[]\\u0026html5_webpo_idle_priority_job\\u003dtrue\\u0026html5_woffle_resume\\u003dtrue\\u0026html5_workaround_delay_trigger\\u003dtrue\\u0026ignore_overlapping_cue_points_on_endemic_live_html5\\u003dtrue\\u0026il_payload_scraping\\u003d\\u0026il_use_view_model_logging_context\\u003dtrue\\u0026initial_gel_batch_timeout\\u003d2000\\u0026injected_license_handler_error_code\\u003d0\\u0026injected_license_handler_license_status\\u003d0\\u0026itdrm_enable_revocation_reporting\\u003dtrue\\u0026itdrm_injected_license_service_error_code\\u003d0\\u0026itdrm_widevine_hardened_vmp_mode\\u003dlog\\u0026json_condensed_response\\u003dtrue\\u0026kev_adb_pg\\u003dtrue\\u0026kevlar_command_handler_command_banlist\\u003d[]\\u0026kevlar_dropdown_fix\\u003dtrue\\u0026kevlar_gel_error_routing\\u003dtrue\\u0026kevlar_miniplayer\\u003dtrue\\u0026kevlar_miniplayer_expand_top\\u003dtrue\\u0026kevlar_miniplayer_play_pause_on_scrim\\u003dtrue\\u0026kevlar_playback_associated_queue\\u003dtrue\\u0026kevlar_queue_use_update_api\\u003dtrue\\u0026kevlar_use_wil_icons\\u003dtrue\\u0026kevlar_vimio_use_shared_monitor\\u003dtrue\\u0026kevlar_woffle\\u003dtrue\\u0026kids_web_client_log_screen_associated\\u003dtrue\\u0026live_chat_enable_rta_manager\\u003dtrue\\u0026live_chunk_readahead\\u003d3\\u0026live_fresca_v2\\u003dtrue\\u0026log_errors_through_nwl_on_retry\\u003dtrue\\u0026log_gel_compression_latency\\u003dtrue\\u0026log_heartbeat_with_lifecycles\\u003dtrue\\u0026log_web_endpoint_to_layer\\u003dtrue\\u0026log_window_onerror_fraction\\u003d0.1\\u0026manifestless_post_live\\u003dtrue\\u0026manifestless_post_live_ufph\\u003dtrue\\u0026max_body_size_to_compress\\u003d500000\\u0026max_prefetch_window_sec_for_livestream_optimization\\u003d10\\u0026max_resolution_for_white_noise\\u003d360\\u0026mdx_enable_privacy_disclosure_ui\\u003dtrue\\u0026mdx_load_cast_api_bootstrap_script\\u003dtrue\\u0026migrate_events_to_ts\\u003dtrue\\u0026migrate_remaining_web_ad_badges_to_innertube\\u003dtrue\\u0026min_prefetch_offset_sec_for_livestream_optimization\\u003d20\\u0026move_survey_ad_renderer_ve_asde\\u003dtrue\\u0026move_vss_away_from_login_info_cookie\\u003dtrue\\u0026music_enable_shared_audio_tier_logic\\u003dtrue\\u0026mweb_c3_endscreen\\u003dtrue\\u0026mweb_deprecate_skip_ve_logging\\u003dtrue\\u0026mweb_enable_custom_control_shared\\u003dtrue\\u0026mweb_enable_skippables_on_jio_phone\\u003dtrue\\u0026mweb_native_control_in_faux_fullscreen_shared\\u003dtrue\\u0026network_polling_interval\\u003d30000\\u0026networkless_gel\\u003dtrue\\u0026networkless_logging\\u003dtrue\\u0026new_codecs_string_api_uses_legacy_style\\u003dtrue\\u0026new_csn_storage_design\\u003dtrue\\u0026nwl_send_fast_on_unload\\u003dtrue\\u0026nwl_send_from_memory_when_online\\u003dtrue\\u0026offline_error_handling\\u003dtrue\\u0026override_drm_required_playback_policy_channels\\u003d[]\\u0026pacf_logging_delay_milliseconds_through_ybfe_tv\\u003d30000\\u0026pageid_as_header_web\\u003dtrue\\u0026partial_rewind_buffer_seconds\\u003d0\\u0026player_ads_set_adformat_on_client\\u003dtrue\\u0026player_allow_autonav_after_playlist\\u003dtrue\\u0026player_bootstrap_method\\u003dtrue\\u0026player_destroy_old_version\\u003dtrue\\u0026player_doubletap_to_seek\\u003dtrue\\u0026player_enable_playback_playlist_change\\u003dtrue\\u0026player_underlay_min_player_width\\u003d768.0\\u0026player_underlay_video_width_fraction\\u003d0.6\\u0026player_web_canary_stage\\u003d0\\u0026playready_first_play_expiration\\u003d-1\\u0026polymer_bad_build_labels\\u003dtrue\\u0026polymer_verifiy_app_state\\u003dtrue\\u0026populate_author_with_podcast_name_in_video_details\\u003dtrue\\u0026preskip_button_style_ads_backend\\u003dcountdown_next_to_thumbnail\\u0026qoe_nwl_downloads\\u003dtrue\\u0026qoe_send_and_write\\u003dtrue\\u0026record_app_crashed_web\\u003dtrue\\u0026reject_live_ott_h264_clear_240p\\u003dtrue\\u0026reject_live_vp9_mq_clear_with_no_abr_ladder\\u003dtrue\\u0026replace_closure_window_with_updated_ytwindow_in_studio\\u003dtrue\\u0026replace_playability_retriever_in_watch\\u003dtrue\\u0026scheduler_use_raf_by_default\\u003dtrue\\u0026self_podding_header_string_template\\u003dself_podding_interstitial_message\\u0026self_podding_highlight_non_default_button\\u003dtrue\\u0026self_podding_midroll_choice_string_template\\u003dself_podding_midroll_choice\\u0026send_config_hash_timer\\u003d0\\u0026set_interstitial_advertisers_question_text\\u003dtrue\\u0026set_mock_id_as_expected_content_binding\\u003d\\u0026shell_load_gcf\\u003dtrue\\u0026short_start_time_prefer_publish_in_watch_log\\u003dtrue\\u0026shorts_mode_to_player_api\\u003dtrue\\u0026should_clear_video_data_on_player_cued_unstarted\\u003dtrue\\u0026simply_embedded_enable_botguard\\u003dtrue\\u0026skip_inline_muted_license_service_check\\u003dtrue\\u0026skip_invalid_ytcsi_ticks\\u003dtrue\\u0026skip_ls_gel_retry\\u003dtrue\\u0026skip_setting_info_in_csi_data_object\\u003dtrue\\u0026slow_compressions_before_abandon_count\\u003d4\\u0026speedmaster_cancellation_movement_dp\\u003d10\\u0026speedmaster_playback_rate\\u003d2.0\\u0026speedmaster_touch_activation_ms\\u003d500\\u0026st_skip_debug_params\\u003dtrue\\u0026start_client_gcf\\u003dtrue\\u0026start_client_gcf_for_player\\u003dtrue\\u0026start_sending_config_hash\\u003dtrue\\u0026streaming_data_emergency_itag_blacklist\\u003d[]\\u0026substitute_ad_cpn_macro_in_ssdai\\u003dtrue\\u0026suppress_error_204_logging\\u003dtrue\\u0026transport_use_scheduler\\u003dtrue\\u0026trigger_impression_pings_on_view_search_desktop\\u003dtrue\\u0026tv_pacf_logging_sample_rate\\u003d0.01\\u0026tvhtml5_unplugged_preload_cache_size\\u003d5\\u0026unplugged_dai_live_chunk_readahead\\u003d3\\u0026unplugged_tvhtml5_video_preload_on_focus_delay_ms\\u003d0\\u0026update_log_event_config\\u003dtrue\\u0026use_accessibility_data_on_desktop_player_button\\u003dtrue\\u0026use_color_palettes_modern_collections_v2\\u003dtrue\\u0026use_core_sm\\u003dtrue\\u0026use_csi_stp_handler\\u003dtrue\\u0026use_inlined_player_rpc\\u003dtrue\\u0026use_new_cml\\u003dtrue\\u0026use_new_in_memory_storage\\u003dtrue\\u0026use_new_nwl_initialization\\u003dtrue\\u0026use_new_nwl_saw\\u003dtrue\\u0026use_new_nwl_stw\\u003dtrue\\u0026use_new_nwl_wts\\u003dtrue\\u0026use_player_abuse_bg_library\\u003dtrue\\u0026use_player_cue_range_set\\u003dtrue\\u0026use_profilepage_event_label_in_carousel_playbacks\\u003dtrue\\u0026use_request_time_ms_header\\u003dtrue\\u0026use_session_based_sampling\\u003dtrue\\u0026use_shared_notf_vp9_360p_format_filter_rules\\u003dtrue\\u0026use_ts_visibilitylogger\\u003dtrue\\u0026validate_el_adunit_usage_mweb\\u003d0.1\\u0026variable_buffer_timeout_ms\\u003d0\\u0026vp9_drm_live\\u003dtrue\\u0026vss_final_ping_send_and_write\\u003dtrue\\u0026vss_pings_using_networkless\\u003dtrue\\u0026vss_playback_use_send_and_write\\u003dtrue\\u0026web_api_url\\u003dtrue\\u0026web_async_context_processor_impl\\u003dstandalone\\u0026web_big_boards\\u003dtrue\\u0026web_big_boards_enable_in_inline\\u003dtrue\\u0026web_big_boards_enable_in_miniplayer\\u003dtrue\\u0026web_cinematic_watch_settings\\u003dtrue\\u0026web_client_version_override\\u003d\\u0026web_collect_offline_state\\u003dtrue\\u0026web_csi_action_sampling_enabled\\u003dtrue\\u0026web_csi_debug_sample_enabled\\u003dtrue\\u0026web_dedupe_ve_grafting\\u003dtrue\\u0026web_deprecate_service_ajax_map_dependency\\u003dtrue\\u0026web_disable_channels_chapter_entrypoint\\u003dtrue\\u0026web_enable_ab_em_rsp\\u003dtrue\\u0026web_enable_ab_rsp_cl\\u003dtrue\\u0026web_enable_abd_ref\\u003dtrue\\u0026web_enable_error_204\\u003dtrue\\u0026web_enable_speedmaster\\u003dtrue\\u0026web_enable_voz_audio_feedback\\u003dtrue\\u0026web_fix_fine_scrubbing_drag\\u003dtrue\\u0026web_foreground_heartbeat_interval_ms\\u003d28000\\u0026web_forward_command_on_pbj\\u003dtrue\\u0026web_gel_debounce_ms\\u003d60000\\u0026web_gel_timeout_cap\\u003dtrue\\u0026web_heat_map_v2\\u003dtrue\\u0026web_key_moments_markers\\u003dtrue\\u0026web_l3_storyboard\\u003dtrue\\u0026web_log_memory_total_kbytes\\u003dtrue\\u0026web_logging_max_batch\\u003d150\\u0026web_logging_max_batch_hard_limit\\u003dtrue\\u0026web_modern_ads\\u003dtrue\\u0026web_modern_buttons\\u003dtrue\\u0026web_modern_buttons_bl_survey\\u003dtrue\\u0026web_modern_player_settings_quality_bottom\\u003dtrue\\u0026web_modern_subscribe\\u003dtrue\\u0026web_modern_subscribe_style\\u003dfilled\\u0026web_new_autonav_countdown\\u003dtrue\\u0026web_one_platform_error_handling\\u003dtrue\\u0026web_op_signal_type_banlist\\u003d[]\\u0026web_playback_associated_log_ctt\\u003dtrue\\u0026web_playback_associated_ve\\u003dtrue\\u0026web_player_add_ve_conversion_logging_to_outbound_links\\u003dtrue\\u0026web_player_always_enable_auto_translation\\u003dtrue\\u0026web_player_api_logging_fraction\\u003d0.01\\u0026web_player_autonav_empty_suggestions_fix\\u003dtrue\\u0026web_player_autonav_toggle_always_listen\\u003dtrue\\u0026web_player_autonav_use_server_provided_state\\u003dtrue\\u0026web_player_caption_language_preference_stickiness_duration\\u003d30\\u0026web_player_disable_inline_scrubbing\\u003dtrue\\u0026web_player_enable_cultural_moment_overlay\\u003dtrue\\u0026web_player_enable_early_warning_snackbar\\u003dtrue\\u0026web_player_enable_info_button_in_banner_on_desktop\\u003dtrue\\u0026web_player_enable_premium_hbr_in_h5_api\\u003dtrue\\u0026web_player_enable_premium_hbr_playback_cap\\u003dtrue\\u0026web_player_enable_vod_featured_product_banner_on_desktop\\u003dtrue\\u0026web_player_innertube_playlist_update\\u003dtrue\\u0026web_player_ipp_canary_type_for_logging\\u003d\\u0026web_player_log_click_before_generating_ve_conversion_params\\u003dtrue\\u0026web_player_move_autonav_toggle\\u003dtrue\\u0026web_player_music_visualizer_treatment\\u003dfake\\u0026web_player_nitrate_promo_tooltip\\u003dtrue\\u0026web_player_offline_playlist_auto_refresh\\u003dtrue\\u0026web_player_seek_chapters_by_shortcut\\u003dtrue\\u0026web_player_sentinel_is_uniplayer\\u003dtrue\\u0026web_player_should_honor_include_asr_setting\\u003dtrue\\u0026web_player_show_music_in_this_video_graphic\\u003dvideo_thumbnail\\u0026web_player_small_hbp_settings_menu\\u003dtrue\\u0026web_player_ss_dai_ad_fetching_timeout_ms\\u003d15000\\u0026web_player_ss_media_time_offset\\u003dtrue\\u0026web_player_topify_subtitles_for_shorts\\u003dtrue\\u0026web_player_touch_mode_improvements\\u003dtrue\\u0026web_player_transfer_timeout_threshold_ms\\u003d10800000\\u0026web_player_use_cinematic_label_2\\u003dtrue\\u0026web_player_use_heartbeat_poll_delay_ms\\u003dtrue\\u0026web_player_use_new_api_for_quality_pullback\\u003dtrue\\u0026web_player_ve_conversion_fixes_for_channel_info\\u003dtrue\\u0026web_prefetch_preload_video\\u003dtrue\\u0026web_rounded_thumbnails\\u003dtrue\\u0026web_scheduler_auto_init\\u003dtrue\\u0026web_settings_menu_icons\\u003dtrue\\u0026web_smoothness_test_duration_ms\\u003d0\\u0026web_smoothness_test_method\\u003d0\\u0026web_speedmaster_spacebar_control\\u003dtrue\\u0026web_speedmaster_updated_edu\\u003dtrue\\u0026web_yt_config_context\\u003dtrue\\u0026webfe_disable_ab_em_plb\\u003dtrue\\u0026wil_icon_max_concurrent_fetches\\u003d9999\\u0026wil_icon_render_when_idle\\u003dtrue\\u0026wiz_use_generic_logging_infra\\u003dtrue\\u0026woffle_clean_up_after_entity_migration\\u003dtrue\\u0026woffle_enable_download_status\\u003dtrue\\u0026woffle_orchestration\\u003dtrue\\u0026woffle_playlist_optimization\\u003dtrue\\u0026woffle_used_state_report\\u003dtrue\\u0026ytidb_clear_embedded_player\\u003dtrue\\u0026ytidb_fetch_datasync_ids_for_data_cleanup\\u003dtrue\\u0026ytidb_remake_db_retries\\u003d3\\u0026ytidb_reopen_db_retries\\u003d3\\u0026ytidb_transaction_ended_event_rate_limit\\u003d0.02\\u0026ytidb_transaction_ended_event_rate_limit_session\\u003d0.2\\u0026ytidb_transaction_ended_event_rate_limit_transaction\\u003d0.1\",\"hideInfo\":true,\"startMuted\":true,\"enableMutedAutoplay\":true,\"cspNonce\":\"xW_SWKdw4-d_OLdvn29m6Q\",\"canaryState\":\"none\",\"enableCsiLogging\":true,\"csiPageType\":\"channels\",\"datasyncId\":\"Vc2a81ef1||\",\"canaryStage\":\"\"},\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_SHORTS\":{\"rootElementId\":\"shorts-player\",\"jsUrl\":\"/s/player/63e90c30/player_ias.vflset/en_US/base.js\",\"cssUrl\":\"/s/player/63e90c30/www-player.css\",\"contextId\":\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_SHORTS\",\"eventLabel\":\"shortspage\",\"contentRegion\":\"IT\",\"hl\":\"en_US\",\"hostLanguage\":\"en\",\"playerStyle\":\"desktop-polymer\",\"innertubeApiKey\":\"AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\",\"innertubeApiVersion\":\"v1\",\"innertubeContextClientVersion\":\"2.20231121.08.00\",\"controlsType\":0,\"disableKeyboardControls\":true,\"disableRelatedVideos\":true,\"annotationsLoadPolicy\":3,\"device\":{\"brand\":\"\",\"model\":\"\",\"browser\":\"Chrome\",\"browserVersion\":\"[scrubbed]\",\"os\":\"Windows\",\"osVersion\":\"10.0\",\"platform\":\"DESKTOP\",\"interfaceName\":\"WEB\",\"interfaceVersion\":\"2.20231121.08.00\"},\"serializedExperimentIds\":\"23983296,23986028,24004644,24007246,24080738,24135310,24208765,24371398,24371779,24385728,24439361,24524098,24543193,24543197,24543199,24543201,24549786,24550458,24559327,24560416,24566293,24566687,24699899,51006181,51010235,51012165,51017346,51026715,51027535,51028271,51030311,51035166,51037540,51038399,51038805,51039199,51039493,51039699,51041809,51044150,51044152,51044154,51044158,51046164,51047619,51049006,51054675,51055917,51056050,51057534,51060161,51067339,51069001\",\"serializedExperimentFlags\":\"H5_async_logging_delay_ms\\u003d30000.0\\u0026H5_enable_full_pacf_logging\\u003dtrue\\u0026H5_use_async_logging\\u003dtrue\\u0026ab_det_apb_b\\u003dtrue\\u0026ab_det_fet_wr\\u003dtrue\\u0026ab_det_fet_wr_en\\u003dtrue\\u0026ab_det_gen_re\\u003dtrue\\u0026action_companion_center_align_description\\u003dtrue\\u0026ad_pod_disable_companion_persist_ads_quality\\u003dtrue\\u0026addto_ajax_log_warning_fraction\\u003d0.1\\u0026align_ad_to_video_player_lifecycle_for_bulleit\\u003dtrue\\u0026allow_drm_override\\u003dtrue\\u0026allow_live_autoplay\\u003dtrue\\u0026allow_poltergust_autoplay\\u003dtrue\\u0026allow_skip_networkless\\u003dtrue\\u0026allow_vp9_1080p_mq_enc\\u003dtrue\\u0026att_web_record_metrics\\u003dtrue\\u0026autoplay_time\\u003d8000\\u0026autoplay_time_for_fullscreen\\u003d3000\\u0026autoplay_time_for_music_content\\u003d3000\\u0026bg_vm_reinit_threshold\\u003d7200000\\u0026blocked_packages_for_sps\\u003d[]\\u0026botguard_async_snapshot_timeout_ms\\u003d3000\\u0026captions_url_add_ei\\u003dtrue\\u0026check_ad_ui_status_for_mweb_safari\\u003dtrue\\u0026check_navigator_accuracy_timeout_ms\\u003d0\\u0026clear_user_partitioned_ls\\u003dtrue\\u0026client_respect_autoplay_switch_button_renderer\\u003dtrue\\u0026compress_gel\\u003dtrue\\u0026compression_disable_point\\u003d10\\u0026compression_performance_threshold\\u003d250\\u0026csi_on_gel\\u003dtrue\\u0026dash_manifest_version\\u003d5\\u0026debug_bandaid_hostname\\u003d\\u0026debug_sherlog_username\\u003d\\u0026delay_ads_gvi_call_on_bulleit_living_room_ms\\u003d0\\u0026deprecate_csi_has_info\\u003dtrue\\u0026deprecate_delay_ping\\u003dtrue\\u0026deprecate_pair_servlet_enabled\\u003dtrue\\u0026desktop_image_cta_no_background\\u003dtrue\\u0026desktop_log_img_click_location\\u003dtrue\\u0026desktop_sparkles_light_cta_button\\u003dtrue\\u0026disable_channel_id_check_for_suspended_channels\\u003dtrue\\u0026disable_child_node_auto_formatted_strings\\u003dtrue\\u0026disable_defer_admodule_on_advertiser_video\\u003dtrue\\u0026disable_features_for_supex\\u003dtrue\\u0026disable_inline_preview_scrubbing_for_vac_ads_on_web\\u003dtrue\\u0026disable_legacy_desktop_remote_queue\\u003dtrue\\u0026disable_mdx_connection_in_mdx_module_for_music_web\\u003dtrue\\u0026disable_new_pause_state3\\u003dtrue\\u0026disable_pacf_logging_for_memory_limited_tv\\u003dtrue\\u0026disable_rounding_ad_notify\\u003dtrue\\u0026disable_simple_mixed_direction_formatted_strings\\u003dtrue\\u0026disable_ssdai_on_errors\\u003dtrue\\u0026disable_tabbing_before_flyout_ad_elements_appear\\u003dtrue\\u0026disable_thumbnail_preloading\\u003dtrue\\u0026edge_encryption_fill_primary_key_version\\u003dtrue\\u0026embeds_add_player_mode_to_ad_events\\u003dtrue\\u0026embeds_disable_progress_bar_context_menu_handling\\u003dtrue\\u0026embeds_enable_muted_autoplay\\u003dtrue\\u0026embeds_web_enable_autoplay_not_supported_logging_fix\\u003dtrue\\u0026embeds_web_enable_host_flags_client_permissions\\u003dtrue\\u0026embeds_web_enable_host_flags_innertube\\u003dtrue\\u0026embeds_web_enable_lite_logging\\u003dtrue\\u0026embeds_web_enable_load_player_from_page_show\\u003dtrue\\u0026embeds_web_enable_log_splay_as_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_dtts\\u003dtrue\\u0026embeds_web_enable_modestbranding_deprecation\\u003dtrue\\u0026embeds_web_enable_pause_overlay_wn_update\\u003dtrue\\u0026embeds_web_enable_pfp_unbranded_el_deprecation\\u003dtrue\\u0026embeds_web_enable_rcat_allowlist\\u003dtrue\\u0026embeds_web_enable_scripted_playback_blocked_logging_fix\\u003dtrue\\u0026embeds_web_enable_smallmode_fullscreen_button_fix\\u003dtrue\\u0026embeds_web_enable_ve_conversion_logging_tracking_no_allow_list\\u003dtrue\\u0026embeds_web_hide_unfilled_more_videos_suggestions\\u003dtrue\\u0026embeds_web_lite_mode\\u003d1\\u0026embeds_web_move_preload_by_player_vars_to_public\\u003dtrue\\u0026embeds_web_nwl_disable_nocookie\\u003dtrue\\u0026embeds_web_shopping_overlay_no_wait_for_paid_content_overlay\\u003dtrue\\u0026embeds_web_synth_ch_headers_banned_urls_regex\\u003d\\u0026enable_ab_report_on_errorscreen\\u003dtrue\\u0026enable_ab_rp_int\\u003dtrue\\u0026enable_ad_cpn_macro_substitution_for_click_pings\\u003dtrue\\u0026enable_app_promo_endcap_eml_on_tablet\\u003dtrue\\u0026enable_ata_dialog_all_web\\u003dtrue\\u0026enable_cast_for_web_unplugged\\u003dtrue\\u0026enable_cast_on_music_web\\u003dtrue\\u0026enable_client_page_id_header_for_first_party_pings\\u003dtrue\\u0026enable_client_sli_logging\\u003dtrue\\u0026enable_cta_banner_on_unplugged_lr\\u003dtrue\\u0026enable_dark_mode_style_endcap\\u003dtrue\\u0026enable_dark_mode_style_endcap_timed_pie_countdown\\u003dtrue\\u0026enable_discrete_live_precise_embargos\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_android\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_ios\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_compliant_banner_image_ad_renderer\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_mobile\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_one_click_ata_translators_infeed_elements\\u003dtrue\\u0026enable_error_corrections_infocard\\u003dtrue\\u0026enable_error_corrections_infocard_web_client\\u003dtrue\\u0026enable_error_corrections_infocard_web_client_check\\u003dtrue\\u0026enable_error_corrections_infocards_icon_web\\u003dtrue\\u0026enable_eviction_protection_for_bulleit\\u003dtrue\\u0026enable_flow_logging_p4e\\u003dtrue\\u0026enable_free_preview_timer\\u003dtrue\\u0026enable_gel_log_commands\\u003dtrue\\u0026enable_h5_player_ad_block_status_logging\\u003dtrue\\u0026enable_h5_player_ad_block_status_piping\\u003dtrue\\u0026enable_handles_account_menu_switcher\\u003dtrue\\u0026enable_high_frequency_cookie_rotation\\u003dtrue\\u0026enable_kabuki_comments_on_shorts\\u003ddisabled\\u0026enable_live_ad_serving_context\\u003dtrue\\u0026enable_live_premiere_web_player_indicator\\u003dtrue\\u0026enable_loggingcontext_trackingparams\\u003dtrue\\u0026enable_lr_home_infeed_ads_inline_playback_progress_pings\\u003dtrue\\u0026enable_mixed_direction_formatted_strings\\u003dtrue\\u0026enable_modern_skip_button_on_web\\u003dtrue\\u0026enable_multiple_heatseeker_decorations\\u003dtrue\\u0026enable_mweb_endcap_clickable_icon_description\\u003dtrue\\u0026enable_mweb_endcap_dark_mode_action_button\\u003dtrue\\u0026enable_mweb_livestream_ui_update\\u003dtrue\\u0026enable_new_paid_product_placement\\u003dtrue\\u0026enable_out_of_stock_text_all_surfaces\\u003dtrue\\u0026enable_pacf_slot_asde_infeed_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5_TV\\u003dtrue\\u0026enable_pacf_through_ybfe_tv\\u003dtrue\\u0026enable_pacf_through_ybfe_tv_for_page_top_formats\\u003dtrue\\u0026enable_pacf_through_ysfe_tv\\u003dtrue\\u0026enable_pass_sdc_get_accounts_list\\u003dtrue\\u0026enable_pl_r_c\\u003dtrue\\u0026enable_pl_r_c_s\\u003dtrue\\u0026enable_pl_r_si_fa\\u003dtrue\\u0026enable_player_param_truncation_before_navigation_on_web_on_search\\u003dtrue\\u0026enable_populate_att_psd_in_abe_feedback\\u003dtrue\\u0026enable_populate_psd_in_abe_feedback\\u003dtrue\\u0026enable_post_ad_perception_survey_fix_on_tvhtml5\\u003dtrue\\u0026enable_post_ad_perception_survey_in_tvhtml5\\u003dtrue\\u0026enable_sdf_midroll_postroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_main\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_misc\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_tv\\u003dtrue\\u0026enable_server_stitched_dai\\u003dtrue\\u0026enable_set_endcap_thumbnail_from_layout\\u003dtrue\\u0026enable_shorts_player\\u003dtrue\\u0026enable_skip_ad_guidance_prompt\\u003dtrue\\u0026enable_skippable_ads_for_unplugged_ad_pod\\u003dtrue\\u0026enable_small_endcap_action_button_for_mweb\\u003dtrue\\u0026enable_smearing_expansion_dai\\u003dtrue\\u0026enable_tectonic_ad_ux_for_halftime\\u003dtrue\\u0026enable_third_party_info\\u003dtrue\\u0026enable_topsoil_wta_for_halftime_live_infra\\u003dtrue\\u0026enable_unknown_lact_fix_on_html5\\u003dtrue\\u0026enable_web_media_session_metadata_fix\\u003dtrue\\u0026enable_web_tiered_gel\\u003dtrue\\u0026enable_wn_infocards\\u003dtrue\\u0026enable_yt_ata_iframe_authuser\\u003dtrue\\u0026err_on_pl_r_c\\u003dtrue\\u0026error_message_for_gsuite_network_restrictions\\u003dtrue\\u0026export_networkless_options\\u003dtrue\\u0026external_fullscreen_with_edu\\u003dtrue\\u0026fetch_att_independently\\u003dtrue\\u0026fetch_bid_for_dclk_status\\u003dtrue\\u0026fill_single_video_with_notify_to_lasr\\u003dtrue\\u0026filter_vp9_for_csdai\\u003dtrue\\u0026fix_ads_tracking_for_swf_config_deprecation_mweb\\u003dtrue\\u0026fix_h5_toggle_button_a11y\\u003dtrue\\u0026fix_survey_color_contrast_on_destop\\u003dtrue\\u0026fix_toggle_button_role_for_ad_components\\u003dtrue\\u0026fix_web_instream_survey_question_aria_label\\u003dtrue\\u0026gcf_config_store_enabled\\u003dtrue\\u0026gcf_music_innertube\\u003dtrue\\u0026gel_min_batch_size\\u003d3\\u0026gel_queue_timeout_max_ms\\u003d300000\\u0026gpa_sparkles_ten_percent_layer\\u003dtrue\\u0026gvi_channel_client_screen\\u003dtrue\\u0026h5_companion_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_enable_generic_error_logging_event\\u003dtrue\\u0026h5_enable_unified_csi_preroll\\u003dtrue\\u0026h5_inplayer_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_reset_cache_and_filter_before_update_masthead\\u003dtrue\\u0026heatseeker_decoration_threshold\\u003d0.8\\u0026hfr_dropped_framerate_fallback_threshold\\u003d0\\u0026hide_cta_for_home_web_video_ads_animate_in_time\\u003d2\\u0026hide_endpoint_overflow_on_ytd_display_ad_renderer\\u003dtrue\\u0026html5_ad_timeout_ms\\u003d0\\u0026html5_adaptation_step_count\\u003d0\\u0026html5_add_dai_smearing_to_qoe\\u003dtrue\\u0026html5_add_drm_formats_to_test_format\\u003dtrue\\u0026html5_ads_preroll_lock_timeout_delay_ms\\u003d15000\\u0026html5_allow_video_keyframe_without_audio\\u003dtrue\\u0026html5_apply_min_failures\\u003dtrue\\u0026html5_apply_start_time_within_ads_for_ssdai_transitions\\u003dtrue\\u0026html5_atr_disable_force_fallback\\u003dtrue\\u0026html5_attach_num_random_bytes_to_bandaid\\u003d0\\u0026html5_attach_po_token_to_bandaid\\u003dtrue\\u0026html5_autonav_cap_idle_secs\\u003d0\\u0026html5_autonav_quality_cap\\u003d720\\u0026html5_autoplay_default_quality_cap\\u003d0\\u0026html5_block_pip_safari_delay\\u003d0\\u0026html5_bypass_contention_secs\\u003d0.0\\u0026html5_cache_request_key\\u003d\\u0026html5_check_for_idle_network_interval_ms\\u003d-1\\u0026html5_check_video_data_errors_before_playback_start\\u003dtrue\\u0026html5_cobalt_default_buffer_size_in_bytes\\u003d0\\u0026html5_cobalt_max_size_for_immed_job\\u003d0\\u0026html5_cobalt_min_processor_cnt_to_offload_algo\\u003d0\\u0026html5_cobalt_override_quic\\u003d0\\u0026html5_consume_media_bytes_slice_infos\\u003dtrue\\u0026html5_continuous_goodput_probe_interval_ms\\u003d0\\u0026html5_de_dupe_content_video_loads_in_lifecycle_api\\u003dtrue\\u0026html5_debug_data_log_probability\\u003d0.1\\u0026html5_decode_to_texture_cap\\u003dtrue\\u0026html5_default_ad_gain\\u003d0.5\\u0026html5_default_quality_cap\\u003d0\\u0026html5_defer_fetch_att_ms\\u003d1000\\u0026html5_delayed_retry_count\\u003d1\\u0026html5_delayed_retry_delay_ms\\u003d5000\\u0026html5_deprecate_adservice\\u003dtrue\\u0026html5_deprecate_video_tag_pool\\u003dtrue\\u0026html5_desktop_vr180_allow_panning\\u003dtrue\\u0026html5_df_downgrade_thresh\\u003d0.6\\u0026html5_disable_csi_for_bulleit\\u003dtrue\\u0026html5_disable_move_pssh_to_moov\\u003dtrue\\u0026html5_disable_non_contiguous\\u003dtrue\\u0026html5_displayed_frame_rate_downgrade_threshold\\u003d45\\u0026html5_drm_byterate_soft_cap\\u003d0\\u0026html5_drm_check_all_key_error_states\\u003dtrue\\u0026html5_drm_cpi_license_key\\u003dtrue\\u0026html5_drm_live_byterate_soft_cap\\u003d0\\u0026html5_enable_ac3\\u003dtrue\\u0026html5_enable_ads_client_monitoring_log_tv\\u003dtrue\\u0026html5_enable_caption_changes_for_mosaic\\u003dtrue\\u0026html5_enable_client_hints_override\\u003dtrue\\u0026html5_enable_composite_embargo\\u003dtrue\\u0026html5_enable_eac3\\u003dtrue\\u0026html5_enable_embedded_player_visibility_signals\\u003dtrue\\u0026html5_enable_non_notify_composite_vod_lsar_pacf\\u003dtrue\\u0026html5_enable_oduc\\u003dtrue\\u0026html5_enable_pp_proxima_eligible\\u003dtrue\\u0026html5_enable_single_video_vod_ivar_on_pacf\\u003dtrue\\u0026html5_enable_tvos_dash\\u003dtrue\\u0026html5_enable_tvos_encrypted_vp9\\u003dtrue\\u0026html5_enable_widevine_for_alc\\u003dtrue\\u0026html5_enable_widevine_for_fast_linear\\u003dtrue\\u0026html5_encourage_array_coalescing\\u003dtrue\\u0026html5_gapless_ended_transition_buffer_ms\\u003d200\\u0026html5_gapless_handoff_close_end_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_close_end_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_handoff_started_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_started_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_loop_seek_offset_in_milli\\u003d0\\u0026html5_generate_session_po_token\\u003dtrue\\u0026html5_gl_fps_threshold\\u003d0\\u0026html5_hdcp_probing_stream_url\\u003d\\u0026html5_head_miss_secs\\u003d0.0\\u0026html5_hfr_quality_cap\\u003d0\\u0026html5_high_res_logging_percent\\u003d0.01\\u0026html5_honor_caption_availabilities_in_audio_track\\u003dtrue\\u0026html5_hopeless_secs\\u003d0\\u0026html5_idle_rate_limit_ms\\u003d0\\u0026html5_ignore_interruptive_ads_for_server_stitched\\u003dtrue\\u0026html5_ignore_stall_from_no_data_timeouts\\u003dtrue\\u0026html5_innertube_heartbeats_for_fairplay\\u003dtrue\\u0026html5_innertube_heartbeats_for_playready\\u003dtrue\\u0026html5_innertube_heartbeats_for_widevine\\u003dtrue\\u0026html5_ios4_seek_above_zero\\u003dtrue\\u0026html5_ios7_force_play_on_stall\\u003dtrue\\u0026html5_ios_force_seek_to_zero_on_stop\\u003dtrue\\u0026html5_jumbo_mobile_subsegment_readahead_target\\u003d3.0\\u0026html5_jumbo_ull_nonstreaming_mffa_ms\\u003d4000\\u0026html5_jumbo_ull_subsegment_readahead_target\\u003d1.3\\u0026html5_license_constraint_delay\\u003d5000\\u0026html5_live_abr_head_miss_fraction\\u003d0.0\\u0026html5_live_abr_repredict_fraction\\u003d0.0\\u0026html5_live_chunk_readahead_proxima_override\\u003d0\\u0026html5_live_head_playable\\u003dtrue\\u0026html5_live_low_latency_bandwidth_window\\u003d0.0\\u0026html5_live_normal_latency_bandwidth_window\\u003d0.0\\u0026html5_live_quality_cap\\u003d0\\u0026html5_live_ultra_low_latency_bandwidth_window\\u003d0.0\\u0026html5_liveness_drift_chunk_override\\u003d0\\u0026html5_liveness_drift_proxima_override\\u003d0\\u0026html5_log_audio_abr\\u003dtrue\\u0026html5_log_audio_switch_metrics\\u003dtrue\\u0026html5_log_experiment_id_from_player_response_to_ctmp\\u003d\\u0026html5_log_first_ssdai_requests_killswitch\\u003dtrue\\u0026html5_log_rebuffer_events\\u003d5\\u0026html5_log_trigger_events_with_debug_data\\u003dtrue\\u0026html5_long_rebuffer_jiggle_cmt_delay_ms\\u003d0\\u0026html5_long_rebuffer_threshold_ms\\u003d30000\\u0026html5_manifestless_unplugged\\u003dtrue\\u0026html5_manifestless_vp9_otf\\u003dtrue\\u0026html5_max_buffer_health_for_downgrade_prop\\u003d-1.0\\u0026html5_max_buffer_health_for_downgrade_secs\\u003d0.0\\u0026html5_max_byterate\\u003d0\\u0026html5_max_drift_per_track_secs\\u003d0.0\\u0026html5_max_headm_for_streaming_xhr\\u003d0\\u0026html5_max_live_dvr_window_plus_margin_secs\\u003d46800.0\\u0026html5_max_readbehind_secs\\u003d0\\u0026html5_max_redirect_response_length\\u003d8192\\u0026html5_max_selectable_quality_ordinal\\u003d0\\u0026html5_max_source_buffer_append_size_in_bytes\\u003d0\\u0026html5_maximum_readahead_seconds\\u003d0.0\\u0026html5_media_fullscreen\\u003dtrue\\u0026html5_mffa_ms_proxima_override\\u003d0\\u0026html5_mfl_extend_max_request_time\\u003dtrue\\u0026html5_min_failures_to_delay_retry\\u003d3\\u0026html5_min_media_duration_for_append_prop\\u003d0.0\\u0026html5_min_media_duration_for_cabr_slice\\u003d0.0\\u0026html5_min_progress_event_interval_ms\\u003d10\\u0026html5_min_quality_ordinal\\u003d0\\u0026html5_min_readbehind_cap_secs\\u003d60\\u0026html5_min_readbehind_secs\\u003d0\\u0026html5_min_seconds_between_format_selections\\u003d0.0\\u0026html5_min_selectable_quality_ordinal\\u003d0\\u0026html5_min_startup_buffered_ad_media_duration_secs\\u003d1.2\\u0026html5_min_startup_buffered_media_duration_secs\\u003d1.2\\u0026html5_min_startup_duration_live_secs\\u003d0.25\\u0026html5_min_upgrade_health_secs\\u003d0.0\\u0026html5_minimum_readahead_seconds\\u003d0.0\\u0026html5_mock_content_binding_for_session_token\\u003d\\u0026html5_no_placeholder_rollbacks\\u003dtrue\\u0026html5_non_network_rebuffer_duration_ms\\u003d0\\u0026html5_non_onesie_attach_po_token\\u003dtrue\\u0026html5_normal_latency_mffa_ms\\u003d0\\u0026html5_not_register_disposables_when_core_listens\\u003dtrue\\u0026html5_oduc_transfer_logging\\u003dtrue\\u0026html5_offline_failure_retry_limit\\u003d2\\u0026html5_offline_prevent_redownload_downloaded_video\\u003dtrue\\u0026html5_onesie_defer_content_loader_ms\\u003d0\\u0026html5_onesie_live_ttl_secs\\u003d8\\u0026html5_onesie_notify_cuepoint_manager_on_completion\\u003dtrue\\u0026html5_onesie_prewarm_interval_ms\\u003d0\\u0026html5_onesie_prewarm_max_lact_ms\\u003d0\\u0026html5_onesie_redirector_timeout\\u003dtrue\\u0026html5_onesie_redirector_timeout_ms\\u003d0\\u0026html5_onesie_request_timeout_ms\\u003d1000\\u0026html5_pause_on_nonforeground_platform_errors\\u003dtrue\\u0026html5_peak_shave\\u003dtrue\\u0026html5_perf_cap_override_sticky\\u003dtrue\\u0026html5_performance_cap_floor\\u003d360\\u0026html5_performance_impact_profiling_timer_ms\\u003d0\\u0026html5_perserve_av1_perf_cap\\u003dtrue\\u0026html5_platform_minimum_readahead_seconds\\u003d0.0\\u0026html5_platform_whitelisted_for_frame_accurate_seeks\\u003dtrue\\u0026html5_player_autonav_logging\\u003dtrue\\u0026html5_player_dynamic_bottom_gradient\\u003dtrue\\u0026html5_player_min_build_cl\\u003d-1\\u0026html5_player_preload_ad_fix\\u003dtrue\\u0026html5_post_interrupt_readahead\\u003d20\\u0026html5_prefer_server_bwe3\\u003dtrue\\u0026html5_preload_wait_time_secs\\u003d0.0\\u0026html5_probe_primary_delay_base_ms\\u003d0\\u0026html5_process_all_encrypted_events\\u003dtrue\\u0026html5_ps4_shorts_1080p_soft_cap\\u003dtrue\\u0026html5_qoe_lh_max_report_count\\u003d0\\u0026html5_qoe_lh_min_duration_ms\\u003d0\\u0026html5_qoe_proto_mock_length\\u003d0\\u0026html5_query_sw_secure_crypto_for_android\\u003dtrue\\u0026html5_random_playback_cap\\u003d0\\u0026html5_recognize_predict_start_cue_point\\u003dtrue\\u0026html5_remove_command_triggered_companions\\u003dtrue\\u0026html5_remove_not_servable_check_killswitch\\u003dtrue\\u0026html5_rename_apbs\\u003dtrue\\u0026html5_report_fatal_drm_restricted_error_killswitch\\u003dtrue\\u0026html5_report_slow_ads_as_error\\u003dtrue\\u0026html5_repredict_interval_ms\\u003d0\\u0026html5_request_only_hdr_or_sdr_keys\\u003dtrue\\u0026html5_request_size_max_kb\\u003d0\\u0026html5_request_size_min_kb\\u003d0\\u0026html5_request_sizing_multiplier\\u003d0.8\\u0026html5_resource_bad_status_delay_scaling\\u003d1.5\\u0026html5_restore_time_after_unpause\\u003dtrue\\u0026html5_restore_time_after_unpause_redux\\u003dtrue\\u0026html5_restrict_streaming_xhr_on_sqless_requests\\u003dtrue\\u0026html5_retry_quota_exceeded_via_seek\\u003dtrue\\u0026html5_safari_desktop_eme_min_version\\u003d0\\u0026html5_samsung_kant_limit_max_bitrate\\u003d0\\u0026html5_seek_again_after_time_jump_cfl\\u003dtrue\\u0026html5_seek_jiggle_cmt_delay_ms\\u003d8000\\u0026html5_seek_new_elem_delay_ms\\u003d12000\\u0026html5_seek_new_elem_shorts_delay_ms\\u003d2000\\u0026html5_seek_new_media_element_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_element_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_new_media_source_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_source_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_set_cmt_delay_ms\\u003d2000\\u0026html5_seek_timeout_delay_ms\\u003d20000\\u0026html5_server_stitched_dai_decorated_url_retry_limit\\u003d5\\u0026html5_server_stitched_dai_group\\u003dtrue\\u0026html5_session_po_token_interval_time_ms\\u003d900000\\u0026html5_set_video_data_to_stale\\u003dtrue\\u0026html5_shorts_gapless_next_buffer_in_seconds\\u003d0\\u0026html5_skip_slow_ad_delay_ms\\u003d15000\\u0026html5_slow_start_no_media_source_delay_ms\\u003d0\\u0026html5_slow_start_timeout_delay_ms\\u003d20000\\u0026html5_ssdai_adfetch_dynamic_timeout_ms\\u003d5000\\u0026html5_ssdai_enable_new_seek_logic\\u003dtrue\\u0026html5_ssdai_failure_retry_limit\\u003d0\\u0026html5_stall_factor\\u003d0.0\\u0026html5_stall_window_size_ct\\u003d20\\u0026html5_stateful_audio_min_adjustment_value\\u003d0\\u0026html5_static_abr_resolution_shelf\\u003d0\\u0026html5_store_xhr_headers_readable\\u003dtrue\\u0026html5_streaming_xhr_time_based_consolidation_ms\\u003d0\\u0026html5_subsegment_readahead_load_speed_check_interval\\u003d0.5\\u0026html5_subsegment_readahead_min_buffer_health_secs\\u003d0.25\\u0026html5_subsegment_readahead_min_buffer_health_secs_on_timeout\\u003d0.1\\u0026html5_subsegment_readahead_min_load_speed\\u003d1.5\\u0026html5_subsegment_readahead_seek_latency_fudge\\u003d0.5\\u0026html5_subsegment_readahead_target_buffer_health_secs\\u003d0.5\\u0026html5_subsegment_readahead_timeout_secs\\u003d2.0\\u0026html5_top_shelf_format_byterate_factor\\u003d1.5\\u0026html5_track_overshoot\\u003dtrue\\u0026html5_transfer_processing_logs_interval\\u003d1000\\u0026html5_ugc_live_audio_51\\u003dtrue\\u0026html5_ugc_vod_audio_51\\u003dtrue\\u0026html5_unreported_seek_reseek_delay_ms\\u003d0\\u0026html5_unrestricted_layer_high_res_logging_percent\\u003d0.0\\u0026html5_update_time_on_seeked\\u003dtrue\\u0026html5_use_jsonformatter_to_parse_player_response\\u003dtrue\\u0026html5_use_post_for_media\\u003dtrue\\u0026html5_use_target_duration\\u003dtrue\\u0026html5_use_ump\\u003dtrue\\u0026html5_use_video_transition_endpoint_heartbeat\\u003dtrue\\u0026html5_video_tbd_min_kb\\u003d0\\u0026html5_viewport_undersend_maximum\\u003d0.0\\u0026html5_volume_slider_tooltip\\u003dtrue\\u0026html5_web_po_experiment_ids\\u003d[]\\u0026html5_webpo_idle_priority_job\\u003dtrue\\u0026html5_woffle_resume\\u003dtrue\\u0026html5_workaround_delay_trigger\\u003dtrue\\u0026ignore_overlapping_cue_points_on_endemic_live_html5\\u003dtrue\\u0026il_payload_scraping\\u003d\\u0026il_use_view_model_logging_context\\u003dtrue\\u0026initial_gel_batch_timeout\\u003d2000\\u0026injected_license_handler_error_code\\u003d0\\u0026injected_license_handler_license_status\\u003d0\\u0026itdrm_enable_revocation_reporting\\u003dtrue\\u0026itdrm_injected_license_service_error_code\\u003d0\\u0026itdrm_widevine_hardened_vmp_mode\\u003dlog\\u0026json_condensed_response\\u003dtrue\\u0026kev_adb_pg\\u003dtrue\\u0026kevlar_command_handler_command_banlist\\u003d[]\\u0026kevlar_dropdown_fix\\u003dtrue\\u0026kevlar_gel_error_routing\\u003dtrue\\u0026kevlar_miniplayer\\u003dtrue\\u0026kevlar_miniplayer_expand_top\\u003dtrue\\u0026kevlar_miniplayer_play_pause_on_scrim\\u003dtrue\\u0026kevlar_playback_associated_queue\\u003dtrue\\u0026kevlar_queue_use_update_api\\u003dtrue\\u0026kevlar_use_wil_icons\\u003dtrue\\u0026kevlar_vimio_use_shared_monitor\\u003dtrue\\u0026kevlar_woffle\\u003dtrue\\u0026kids_web_client_log_screen_associated\\u003dtrue\\u0026live_chat_enable_rta_manager\\u003dtrue\\u0026live_chunk_readahead\\u003d3\\u0026live_fresca_v2\\u003dtrue\\u0026log_errors_through_nwl_on_retry\\u003dtrue\\u0026log_gel_compression_latency\\u003dtrue\\u0026log_heartbeat_with_lifecycles\\u003dtrue\\u0026log_web_endpoint_to_layer\\u003dtrue\\u0026log_window_onerror_fraction\\u003d0.1\\u0026manifestless_post_live\\u003dtrue\\u0026manifestless_post_live_ufph\\u003dtrue\\u0026max_body_size_to_compress\\u003d500000\\u0026max_prefetch_window_sec_for_livestream_optimization\\u003d10\\u0026max_resolution_for_white_noise\\u003d360\\u0026mdx_enable_privacy_disclosure_ui\\u003dtrue\\u0026mdx_load_cast_api_bootstrap_script\\u003dtrue\\u0026migrate_events_to_ts\\u003dtrue\\u0026migrate_remaining_web_ad_badges_to_innertube\\u003dtrue\\u0026min_prefetch_offset_sec_for_livestream_optimization\\u003d20\\u0026move_survey_ad_renderer_ve_asde\\u003dtrue\\u0026move_vss_away_from_login_info_cookie\\u003dtrue\\u0026music_enable_shared_audio_tier_logic\\u003dtrue\\u0026mweb_c3_endscreen\\u003dtrue\\u0026mweb_deprecate_skip_ve_logging\\u003dtrue\\u0026mweb_enable_custom_control_shared\\u003dtrue\\u0026mweb_enable_skippables_on_jio_phone\\u003dtrue\\u0026mweb_native_control_in_faux_fullscreen_shared\\u003dtrue\\u0026network_polling_interval\\u003d30000\\u0026networkless_gel\\u003dtrue\\u0026networkless_logging\\u003dtrue\\u0026new_codecs_string_api_uses_legacy_style\\u003dtrue\\u0026new_csn_storage_design\\u003dtrue\\u0026nwl_send_fast_on_unload\\u003dtrue\\u0026nwl_send_from_memory_when_online\\u003dtrue\\u0026offline_error_handling\\u003dtrue\\u0026override_drm_required_playback_policy_channels\\u003d[]\\u0026pacf_logging_delay_milliseconds_through_ybfe_tv\\u003d30000\\u0026pageid_as_header_web\\u003dtrue\\u0026partial_rewind_buffer_seconds\\u003d0\\u0026player_ads_set_adformat_on_client\\u003dtrue\\u0026player_allow_autonav_after_playlist\\u003dtrue\\u0026player_bootstrap_method\\u003dtrue\\u0026player_destroy_old_version\\u003dtrue\\u0026player_doubletap_to_seek\\u003dtrue\\u0026player_enable_playback_playlist_change\\u003dtrue\\u0026player_underlay_min_player_width\\u003d768.0\\u0026player_underlay_video_width_fraction\\u003d0.6\\u0026player_web_canary_stage\\u003d0\\u0026playready_first_play_expiration\\u003d-1\\u0026polymer_bad_build_labels\\u003dtrue\\u0026polymer_verifiy_app_state\\u003dtrue\\u0026populate_author_with_podcast_name_in_video_details\\u003dtrue\\u0026preskip_button_style_ads_backend\\u003dcountdown_next_to_thumbnail\\u0026qoe_nwl_downloads\\u003dtrue\\u0026qoe_send_and_write\\u003dtrue\\u0026record_app_crashed_web\\u003dtrue\\u0026reject_live_ott_h264_clear_240p\\u003dtrue\\u0026reject_live_vp9_mq_clear_with_no_abr_ladder\\u003dtrue\\u0026replace_closure_window_with_updated_ytwindow_in_studio\\u003dtrue\\u0026replace_playability_retriever_in_watch\\u003dtrue\\u0026scheduler_use_raf_by_default\\u003dtrue\\u0026self_podding_header_string_template\\u003dself_podding_interstitial_message\\u0026self_podding_highlight_non_default_button\\u003dtrue\\u0026self_podding_midroll_choice_string_template\\u003dself_podding_midroll_choice\\u0026send_config_hash_timer\\u003d0\\u0026set_interstitial_advertisers_question_text\\u003dtrue\\u0026set_mock_id_as_expected_content_binding\\u003d\\u0026shell_load_gcf\\u003dtrue\\u0026short_start_time_prefer_publish_in_watch_log\\u003dtrue\\u0026shorts_mode_to_player_api\\u003dtrue\\u0026should_clear_video_data_on_player_cued_unstarted\\u003dtrue\\u0026simply_embedded_enable_botguard\\u003dtrue\\u0026skip_inline_muted_license_service_check\\u003dtrue\\u0026skip_invalid_ytcsi_ticks\\u003dtrue\\u0026skip_ls_gel_retry\\u003dtrue\\u0026skip_setting_info_in_csi_data_object\\u003dtrue\\u0026slow_compressions_before_abandon_count\\u003d4\\u0026speedmaster_cancellation_movement_dp\\u003d10\\u0026speedmaster_playback_rate\\u003d2.0\\u0026speedmaster_touch_activation_ms\\u003d500\\u0026st_skip_debug_params\\u003dtrue\\u0026start_client_gcf\\u003dtrue\\u0026start_client_gcf_for_player\\u003dtrue\\u0026start_sending_config_hash\\u003dtrue\\u0026streaming_data_emergency_itag_blacklist\\u003d[]\\u0026substitute_ad_cpn_macro_in_ssdai\\u003dtrue\\u0026suppress_error_204_logging\\u003dtrue\\u0026transport_use_scheduler\\u003dtrue\\u0026trigger_impression_pings_on_view_search_desktop\\u003dtrue\\u0026tv_pacf_logging_sample_rate\\u003d0.01\\u0026tvhtml5_unplugged_preload_cache_size\\u003d5\\u0026unplugged_dai_live_chunk_readahead\\u003d3\\u0026unplugged_tvhtml5_video_preload_on_focus_delay_ms\\u003d0\\u0026update_log_event_config\\u003dtrue\\u0026use_accessibility_data_on_desktop_player_button\\u003dtrue\\u0026use_color_palettes_modern_collections_v2\\u003dtrue\\u0026use_core_sm\\u003dtrue\\u0026use_csi_stp_handler\\u003dtrue\\u0026use_inlined_player_rpc\\u003dtrue\\u0026use_new_cml\\u003dtrue\\u0026use_new_in_memory_storage\\u003dtrue\\u0026use_new_nwl_initialization\\u003dtrue\\u0026use_new_nwl_saw\\u003dtrue\\u0026use_new_nwl_stw\\u003dtrue\\u0026use_new_nwl_wts\\u003dtrue\\u0026use_player_abuse_bg_library\\u003dtrue\\u0026use_player_cue_range_set\\u003dtrue\\u0026use_profilepage_event_label_in_carousel_playbacks\\u003dtrue\\u0026use_request_time_ms_header\\u003dtrue\\u0026use_session_based_sampling\\u003dtrue\\u0026use_shared_notf_vp9_360p_format_filter_rules\\u003dtrue\\u0026use_ts_visibilitylogger\\u003dtrue\\u0026validate_el_adunit_usage_mweb\\u003d0.1\\u0026variable_buffer_timeout_ms\\u003d0\\u0026vp9_drm_live\\u003dtrue\\u0026vss_final_ping_send_and_write\\u003dtrue\\u0026vss_pings_using_networkless\\u003dtrue\\u0026vss_playback_use_send_and_write\\u003dtrue\\u0026web_api_url\\u003dtrue\\u0026web_async_context_processor_impl\\u003dstandalone\\u0026web_big_boards\\u003dtrue\\u0026web_big_boards_enable_in_inline\\u003dtrue\\u0026web_big_boards_enable_in_miniplayer\\u003dtrue\\u0026web_cinematic_watch_settings\\u003dtrue\\u0026web_client_version_override\\u003d\\u0026web_collect_offline_state\\u003dtrue\\u0026web_csi_action_sampling_enabled\\u003dtrue\\u0026web_csi_debug_sample_enabled\\u003dtrue\\u0026web_dedupe_ve_grafting\\u003dtrue\\u0026web_deprecate_service_ajax_map_dependency\\u003dtrue\\u0026web_disable_channels_chapter_entrypoint\\u003dtrue\\u0026web_enable_ab_em_rsp\\u003dtrue\\u0026web_enable_ab_rsp_cl\\u003dtrue\\u0026web_enable_abd_ref\\u003dtrue\\u0026web_enable_error_204\\u003dtrue\\u0026web_enable_speedmaster\\u003dtrue\\u0026web_enable_voz_audio_feedback\\u003dtrue\\u0026web_fix_fine_scrubbing_drag\\u003dtrue\\u0026web_foreground_heartbeat_interval_ms\\u003d28000\\u0026web_forward_command_on_pbj\\u003dtrue\\u0026web_gel_debounce_ms\\u003d60000\\u0026web_gel_timeout_cap\\u003dtrue\\u0026web_heat_map_v2\\u003dtrue\\u0026web_key_moments_markers\\u003dtrue\\u0026web_l3_storyboard\\u003dtrue\\u0026web_log_memory_total_kbytes\\u003dtrue\\u0026web_logging_max_batch\\u003d150\\u0026web_logging_max_batch_hard_limit\\u003dtrue\\u0026web_modern_ads\\u003dtrue\\u0026web_modern_buttons\\u003dtrue\\u0026web_modern_buttons_bl_survey\\u003dtrue\\u0026web_modern_player_settings_quality_bottom\\u003dtrue\\u0026web_modern_subscribe\\u003dtrue\\u0026web_modern_subscribe_style\\u003dfilled\\u0026web_new_autonav_countdown\\u003dtrue\\u0026web_one_platform_error_handling\\u003dtrue\\u0026web_op_signal_type_banlist\\u003d[]\\u0026web_playback_associated_log_ctt\\u003dtrue\\u0026web_playback_associated_ve\\u003dtrue\\u0026web_player_add_ve_conversion_logging_to_outbound_links\\u003dtrue\\u0026web_player_always_enable_auto_translation\\u003dtrue\\u0026web_player_api_logging_fraction\\u003d0.01\\u0026web_player_autonav_empty_suggestions_fix\\u003dtrue\\u0026web_player_autonav_toggle_always_listen\\u003dtrue\\u0026web_player_autonav_use_server_provided_state\\u003dtrue\\u0026web_player_caption_language_preference_stickiness_duration\\u003d30\\u0026web_player_disable_inline_scrubbing\\u003dtrue\\u0026web_player_enable_cultural_moment_overlay\\u003dtrue\\u0026web_player_enable_early_warning_snackbar\\u003dtrue\\u0026web_player_enable_info_button_in_banner_on_desktop\\u003dtrue\\u0026web_player_enable_premium_hbr_in_h5_api\\u003dtrue\\u0026web_player_enable_premium_hbr_playback_cap\\u003dtrue\\u0026web_player_enable_vod_featured_product_banner_on_desktop\\u003dtrue\\u0026web_player_innertube_playlist_update\\u003dtrue\\u0026web_player_ipp_canary_type_for_logging\\u003d\\u0026web_player_log_click_before_generating_ve_conversion_params\\u003dtrue\\u0026web_player_move_autonav_toggle\\u003dtrue\\u0026web_player_music_visualizer_treatment\\u003dfake\\u0026web_player_nitrate_promo_tooltip\\u003dtrue\\u0026web_player_offline_playlist_auto_refresh\\u003dtrue\\u0026web_player_seek_chapters_by_shortcut\\u003dtrue\\u0026web_player_sentinel_is_uniplayer\\u003dtrue\\u0026web_player_should_honor_include_asr_setting\\u003dtrue\\u0026web_player_show_music_in_this_video_graphic\\u003dvideo_thumbnail\\u0026web_player_small_hbp_settings_menu\\u003dtrue\\u0026web_player_ss_dai_ad_fetching_timeout_ms\\u003d15000\\u0026web_player_ss_media_time_offset\\u003dtrue\\u0026web_player_topify_subtitles_for_shorts\\u003dtrue\\u0026web_player_touch_mode_improvements\\u003dtrue\\u0026web_player_transfer_timeout_threshold_ms\\u003d10800000\\u0026web_player_use_cinematic_label_2\\u003dtrue\\u0026web_player_use_heartbeat_poll_delay_ms\\u003dtrue\\u0026web_player_use_new_api_for_quality_pullback\\u003dtrue\\u0026web_player_ve_conversion_fixes_for_channel_info\\u003dtrue\\u0026web_prefetch_preload_video\\u003dtrue\\u0026web_rounded_thumbnails\\u003dtrue\\u0026web_scheduler_auto_init\\u003dtrue\\u0026web_settings_menu_icons\\u003dtrue\\u0026web_smoothness_test_duration_ms\\u003d0\\u0026web_smoothness_test_method\\u003d0\\u0026web_speedmaster_spacebar_control\\u003dtrue\\u0026web_speedmaster_updated_edu\\u003dtrue\\u0026web_yt_config_context\\u003dtrue\\u0026webfe_disable_ab_em_plb\\u003dtrue\\u0026wil_icon_max_concurrent_fetches\\u003d9999\\u0026wil_icon_render_when_idle\\u003dtrue\\u0026wiz_use_generic_logging_infra\\u003dtrue\\u0026woffle_clean_up_after_entity_migration\\u003dtrue\\u0026woffle_enable_download_status\\u003dtrue\\u0026woffle_orchestration\\u003dtrue\\u0026woffle_playlist_optimization\\u003dtrue\\u0026woffle_used_state_report\\u003dtrue\\u0026ytidb_clear_embedded_player\\u003dtrue\\u0026ytidb_fetch_datasync_ids_for_data_cleanup\\u003dtrue\\u0026ytidb_remake_db_retries\\u003d3\\u0026ytidb_reopen_db_retries\\u003d3\\u0026ytidb_transaction_ended_event_rate_limit\\u003d0.02\\u0026ytidb_transaction_ended_event_rate_limit_session\\u003d0.2\\u0026ytidb_transaction_ended_event_rate_limit_transaction\\u003d0.1\",\"hideInfo\":true,\"disableFullscreen\":true,\"cspNonce\":\"xW_SWKdw4-d_OLdvn29m6Q\",\"canaryState\":\"none\",\"enableCsiLogging\":true,\"datasyncId\":\"Vc2a81ef1||\",\"storeUserVolume\":true,\"disableSeek\":true,\"disablePaidContentOverlay\":true,\"preferGapless\":true,\"canaryStage\":\"\"},\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_SPONSORSHIPS_OFFER\":{\"rootElementId\":\"ytd-sponsorships-offer-with-video-renderer\",\"jsUrl\":\"/s/player/63e90c30/player_ias.vflset/en_US/base.js\",\"cssUrl\":\"/s/player/63e90c30/www-player.css\",\"contextId\":\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_SPONSORSHIPS_OFFER\",\"eventLabel\":\"sponsorshipsoffer\",\"contentRegion\":\"IT\",\"hl\":\"en_US\",\"hostLanguage\":\"en\",\"playerStyle\":\"desktop-polymer\",\"innertubeApiKey\":\"AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\",\"innertubeApiVersion\":\"v1\",\"innertubeContextClientVersion\":\"2.20231121.08.00\",\"disableRelatedVideos\":true,\"annotationsLoadPolicy\":3,\"device\":{\"brand\":\"\",\"model\":\"\",\"browser\":\"Chrome\",\"browserVersion\":\"[scrubbed]\",\"os\":\"Windows\",\"osVersion\":\"10.0\",\"platform\":\"DESKTOP\",\"interfaceName\":\"WEB\",\"interfaceVersion\":\"2.20231121.08.00\"},\"serializedExperimentIds\":\"23983296,23986028,24004644,24007246,24080738,24135310,24208765,24371398,24371779,24385728,24439361,24524098,24543193,24543197,24543199,24543201,24549786,24550458,24559327,24560416,24566293,24566687,24699899,51006181,51010235,51012165,51017346,51026715,51027535,51028271,51030311,51035166,51037540,51038399,51038805,51039199,51039493,51039699,51041809,51044150,51044152,51044154,51044158,51046164,51047619,51049006,51054675,51055917,51056050,51057534,51060161,51067339,51069001\",\"serializedExperimentFlags\":\"H5_async_logging_delay_ms\\u003d30000.0\\u0026H5_enable_full_pacf_logging\\u003dtrue\\u0026H5_use_async_logging\\u003dtrue\\u0026ab_det_apb_b\\u003dtrue\\u0026ab_det_fet_wr\\u003dtrue\\u0026ab_det_fet_wr_en\\u003dtrue\\u0026ab_det_gen_re\\u003dtrue\\u0026action_companion_center_align_description\\u003dtrue\\u0026ad_pod_disable_companion_persist_ads_quality\\u003dtrue\\u0026addto_ajax_log_warning_fraction\\u003d0.1\\u0026align_ad_to_video_player_lifecycle_for_bulleit\\u003dtrue\\u0026allow_drm_override\\u003dtrue\\u0026allow_live_autoplay\\u003dtrue\\u0026allow_poltergust_autoplay\\u003dtrue\\u0026allow_skip_networkless\\u003dtrue\\u0026allow_vp9_1080p_mq_enc\\u003dtrue\\u0026att_web_record_metrics\\u003dtrue\\u0026autoplay_time\\u003d8000\\u0026autoplay_time_for_fullscreen\\u003d3000\\u0026autoplay_time_for_music_content\\u003d3000\\u0026bg_vm_reinit_threshold\\u003d7200000\\u0026blocked_packages_for_sps\\u003d[]\\u0026botguard_async_snapshot_timeout_ms\\u003d3000\\u0026captions_url_add_ei\\u003dtrue\\u0026check_ad_ui_status_for_mweb_safari\\u003dtrue\\u0026check_navigator_accuracy_timeout_ms\\u003d0\\u0026clear_user_partitioned_ls\\u003dtrue\\u0026client_respect_autoplay_switch_button_renderer\\u003dtrue\\u0026compress_gel\\u003dtrue\\u0026compression_disable_point\\u003d10\\u0026compression_performance_threshold\\u003d250\\u0026csi_on_gel\\u003dtrue\\u0026dash_manifest_version\\u003d5\\u0026debug_bandaid_hostname\\u003d\\u0026debug_sherlog_username\\u003d\\u0026delay_ads_gvi_call_on_bulleit_living_room_ms\\u003d0\\u0026deprecate_csi_has_info\\u003dtrue\\u0026deprecate_delay_ping\\u003dtrue\\u0026deprecate_pair_servlet_enabled\\u003dtrue\\u0026desktop_image_cta_no_background\\u003dtrue\\u0026desktop_log_img_click_location\\u003dtrue\\u0026desktop_sparkles_light_cta_button\\u003dtrue\\u0026disable_channel_id_check_for_suspended_channels\\u003dtrue\\u0026disable_child_node_auto_formatted_strings\\u003dtrue\\u0026disable_defer_admodule_on_advertiser_video\\u003dtrue\\u0026disable_features_for_supex\\u003dtrue\\u0026disable_inline_preview_scrubbing_for_vac_ads_on_web\\u003dtrue\\u0026disable_legacy_desktop_remote_queue\\u003dtrue\\u0026disable_mdx_connection_in_mdx_module_for_music_web\\u003dtrue\\u0026disable_new_pause_state3\\u003dtrue\\u0026disable_pacf_logging_for_memory_limited_tv\\u003dtrue\\u0026disable_rounding_ad_notify\\u003dtrue\\u0026disable_simple_mixed_direction_formatted_strings\\u003dtrue\\u0026disable_ssdai_on_errors\\u003dtrue\\u0026disable_tabbing_before_flyout_ad_elements_appear\\u003dtrue\\u0026disable_thumbnail_preloading\\u003dtrue\\u0026edge_encryption_fill_primary_key_version\\u003dtrue\\u0026embeds_add_player_mode_to_ad_events\\u003dtrue\\u0026embeds_disable_progress_bar_context_menu_handling\\u003dtrue\\u0026embeds_enable_muted_autoplay\\u003dtrue\\u0026embeds_web_enable_autoplay_not_supported_logging_fix\\u003dtrue\\u0026embeds_web_enable_host_flags_client_permissions\\u003dtrue\\u0026embeds_web_enable_host_flags_innertube\\u003dtrue\\u0026embeds_web_enable_lite_logging\\u003dtrue\\u0026embeds_web_enable_load_player_from_page_show\\u003dtrue\\u0026embeds_web_enable_log_splay_as_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_dtts\\u003dtrue\\u0026embeds_web_enable_modestbranding_deprecation\\u003dtrue\\u0026embeds_web_enable_pause_overlay_wn_update\\u003dtrue\\u0026embeds_web_enable_pfp_unbranded_el_deprecation\\u003dtrue\\u0026embeds_web_enable_rcat_allowlist\\u003dtrue\\u0026embeds_web_enable_scripted_playback_blocked_logging_fix\\u003dtrue\\u0026embeds_web_enable_smallmode_fullscreen_button_fix\\u003dtrue\\u0026embeds_web_enable_ve_conversion_logging_tracking_no_allow_list\\u003dtrue\\u0026embeds_web_hide_unfilled_more_videos_suggestions\\u003dtrue\\u0026embeds_web_lite_mode\\u003d1\\u0026embeds_web_move_preload_by_player_vars_to_public\\u003dtrue\\u0026embeds_web_nwl_disable_nocookie\\u003dtrue\\u0026embeds_web_shopping_overlay_no_wait_for_paid_content_overlay\\u003dtrue\\u0026embeds_web_synth_ch_headers_banned_urls_regex\\u003d\\u0026enable_ab_report_on_errorscreen\\u003dtrue\\u0026enable_ab_rp_int\\u003dtrue\\u0026enable_ad_cpn_macro_substitution_for_click_pings\\u003dtrue\\u0026enable_app_promo_endcap_eml_on_tablet\\u003dtrue\\u0026enable_ata_dialog_all_web\\u003dtrue\\u0026enable_cast_for_web_unplugged\\u003dtrue\\u0026enable_cast_on_music_web\\u003dtrue\\u0026enable_client_page_id_header_for_first_party_pings\\u003dtrue\\u0026enable_client_sli_logging\\u003dtrue\\u0026enable_cta_banner_on_unplugged_lr\\u003dtrue\\u0026enable_dark_mode_style_endcap\\u003dtrue\\u0026enable_dark_mode_style_endcap_timed_pie_countdown\\u003dtrue\\u0026enable_discrete_live_precise_embargos\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_android\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_ios\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_compliant_banner_image_ad_renderer\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_mobile\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_one_click_ata_translators_infeed_elements\\u003dtrue\\u0026enable_error_corrections_infocard\\u003dtrue\\u0026enable_error_corrections_infocard_web_client\\u003dtrue\\u0026enable_error_corrections_infocard_web_client_check\\u003dtrue\\u0026enable_error_corrections_infocards_icon_web\\u003dtrue\\u0026enable_eviction_protection_for_bulleit\\u003dtrue\\u0026enable_flow_logging_p4e\\u003dtrue\\u0026enable_free_preview_timer\\u003dtrue\\u0026enable_gel_log_commands\\u003dtrue\\u0026enable_h5_player_ad_block_status_logging\\u003dtrue\\u0026enable_h5_player_ad_block_status_piping\\u003dtrue\\u0026enable_handles_account_menu_switcher\\u003dtrue\\u0026enable_high_frequency_cookie_rotation\\u003dtrue\\u0026enable_kabuki_comments_on_shorts\\u003ddisabled\\u0026enable_live_ad_serving_context\\u003dtrue\\u0026enable_live_premiere_web_player_indicator\\u003dtrue\\u0026enable_loggingcontext_trackingparams\\u003dtrue\\u0026enable_lr_home_infeed_ads_inline_playback_progress_pings\\u003dtrue\\u0026enable_mixed_direction_formatted_strings\\u003dtrue\\u0026enable_modern_skip_button_on_web\\u003dtrue\\u0026enable_multiple_heatseeker_decorations\\u003dtrue\\u0026enable_mweb_endcap_clickable_icon_description\\u003dtrue\\u0026enable_mweb_endcap_dark_mode_action_button\\u003dtrue\\u0026enable_mweb_livestream_ui_update\\u003dtrue\\u0026enable_new_paid_product_placement\\u003dtrue\\u0026enable_out_of_stock_text_all_surfaces\\u003dtrue\\u0026enable_pacf_slot_asde_infeed_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5_TV\\u003dtrue\\u0026enable_pacf_through_ybfe_tv\\u003dtrue\\u0026enable_pacf_through_ybfe_tv_for_page_top_formats\\u003dtrue\\u0026enable_pacf_through_ysfe_tv\\u003dtrue\\u0026enable_pass_sdc_get_accounts_list\\u003dtrue\\u0026enable_pl_r_c\\u003dtrue\\u0026enable_pl_r_c_s\\u003dtrue\\u0026enable_pl_r_si_fa\\u003dtrue\\u0026enable_player_param_truncation_before_navigation_on_web_on_search\\u003dtrue\\u0026enable_populate_att_psd_in_abe_feedback\\u003dtrue\\u0026enable_populate_psd_in_abe_feedback\\u003dtrue\\u0026enable_post_ad_perception_survey_fix_on_tvhtml5\\u003dtrue\\u0026enable_post_ad_perception_survey_in_tvhtml5\\u003dtrue\\u0026enable_sdf_midroll_postroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_main\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_misc\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_tv\\u003dtrue\\u0026enable_server_stitched_dai\\u003dtrue\\u0026enable_set_endcap_thumbnail_from_layout\\u003dtrue\\u0026enable_shorts_player\\u003dtrue\\u0026enable_skip_ad_guidance_prompt\\u003dtrue\\u0026enable_skippable_ads_for_unplugged_ad_pod\\u003dtrue\\u0026enable_small_endcap_action_button_for_mweb\\u003dtrue\\u0026enable_smearing_expansion_dai\\u003dtrue\\u0026enable_tectonic_ad_ux_for_halftime\\u003dtrue\\u0026enable_third_party_info\\u003dtrue\\u0026enable_topsoil_wta_for_halftime_live_infra\\u003dtrue\\u0026enable_unknown_lact_fix_on_html5\\u003dtrue\\u0026enable_web_media_session_metadata_fix\\u003dtrue\\u0026enable_web_tiered_gel\\u003dtrue\\u0026enable_wn_infocards\\u003dtrue\\u0026enable_yt_ata_iframe_authuser\\u003dtrue\\u0026err_on_pl_r_c\\u003dtrue\\u0026error_message_for_gsuite_network_restrictions\\u003dtrue\\u0026export_networkless_options\\u003dtrue\\u0026external_fullscreen_with_edu\\u003dtrue\\u0026fetch_att_independently\\u003dtrue\\u0026fetch_bid_for_dclk_status\\u003dtrue\\u0026fill_single_video_with_notify_to_lasr\\u003dtrue\\u0026filter_vp9_for_csdai\\u003dtrue\\u0026fix_ads_tracking_for_swf_config_deprecation_mweb\\u003dtrue\\u0026fix_h5_toggle_button_a11y\\u003dtrue\\u0026fix_survey_color_contrast_on_destop\\u003dtrue\\u0026fix_toggle_button_role_for_ad_components\\u003dtrue\\u0026fix_web_instream_survey_question_aria_label\\u003dtrue\\u0026gcf_config_store_enabled\\u003dtrue\\u0026gcf_music_innertube\\u003dtrue\\u0026gel_min_batch_size\\u003d3\\u0026gel_queue_timeout_max_ms\\u003d300000\\u0026gpa_sparkles_ten_percent_layer\\u003dtrue\\u0026gvi_channel_client_screen\\u003dtrue\\u0026h5_companion_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_enable_generic_error_logging_event\\u003dtrue\\u0026h5_enable_unified_csi_preroll\\u003dtrue\\u0026h5_inplayer_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_reset_cache_and_filter_before_update_masthead\\u003dtrue\\u0026heatseeker_decoration_threshold\\u003d0.8\\u0026hfr_dropped_framerate_fallback_threshold\\u003d0\\u0026hide_cta_for_home_web_video_ads_animate_in_time\\u003d2\\u0026hide_endpoint_overflow_on_ytd_display_ad_renderer\\u003dtrue\\u0026html5_ad_timeout_ms\\u003d0\\u0026html5_adaptation_step_count\\u003d0\\u0026html5_add_dai_smearing_to_qoe\\u003dtrue\\u0026html5_add_drm_formats_to_test_format\\u003dtrue\\u0026html5_ads_preroll_lock_timeout_delay_ms\\u003d15000\\u0026html5_allow_video_keyframe_without_audio\\u003dtrue\\u0026html5_apply_min_failures\\u003dtrue\\u0026html5_apply_start_time_within_ads_for_ssdai_transitions\\u003dtrue\\u0026html5_atr_disable_force_fallback\\u003dtrue\\u0026html5_attach_num_random_bytes_to_bandaid\\u003d0\\u0026html5_attach_po_token_to_bandaid\\u003dtrue\\u0026html5_autonav_cap_idle_secs\\u003d0\\u0026html5_autonav_quality_cap\\u003d720\\u0026html5_autoplay_default_quality_cap\\u003d0\\u0026html5_block_pip_safari_delay\\u003d0\\u0026html5_bypass_contention_secs\\u003d0.0\\u0026html5_cache_request_key\\u003d\\u0026html5_check_for_idle_network_interval_ms\\u003d-1\\u0026html5_check_video_data_errors_before_playback_start\\u003dtrue\\u0026html5_cobalt_default_buffer_size_in_bytes\\u003d0\\u0026html5_cobalt_max_size_for_immed_job\\u003d0\\u0026html5_cobalt_min_processor_cnt_to_offload_algo\\u003d0\\u0026html5_cobalt_override_quic\\u003d0\\u0026html5_consume_media_bytes_slice_infos\\u003dtrue\\u0026html5_continuous_goodput_probe_interval_ms\\u003d0\\u0026html5_de_dupe_content_video_loads_in_lifecycle_api\\u003dtrue\\u0026html5_debug_data_log_probability\\u003d0.1\\u0026html5_decode_to_texture_cap\\u003dtrue\\u0026html5_default_ad_gain\\u003d0.5\\u0026html5_default_quality_cap\\u003d0\\u0026html5_defer_fetch_att_ms\\u003d1000\\u0026html5_delayed_retry_count\\u003d1\\u0026html5_delayed_retry_delay_ms\\u003d5000\\u0026html5_deprecate_adservice\\u003dtrue\\u0026html5_deprecate_video_tag_pool\\u003dtrue\\u0026html5_desktop_vr180_allow_panning\\u003dtrue\\u0026html5_df_downgrade_thresh\\u003d0.6\\u0026html5_disable_csi_for_bulleit\\u003dtrue\\u0026html5_disable_move_pssh_to_moov\\u003dtrue\\u0026html5_disable_non_contiguous\\u003dtrue\\u0026html5_displayed_frame_rate_downgrade_threshold\\u003d45\\u0026html5_drm_byterate_soft_cap\\u003d0\\u0026html5_drm_check_all_key_error_states\\u003dtrue\\u0026html5_drm_cpi_license_key\\u003dtrue\\u0026html5_drm_live_byterate_soft_cap\\u003d0\\u0026html5_enable_ac3\\u003dtrue\\u0026html5_enable_ads_client_monitoring_log_tv\\u003dtrue\\u0026html5_enable_caption_changes_for_mosaic\\u003dtrue\\u0026html5_enable_client_hints_override\\u003dtrue\\u0026html5_enable_composite_embargo\\u003dtrue\\u0026html5_enable_eac3\\u003dtrue\\u0026html5_enable_embedded_player_visibility_signals\\u003dtrue\\u0026html5_enable_non_notify_composite_vod_lsar_pacf\\u003dtrue\\u0026html5_enable_oduc\\u003dtrue\\u0026html5_enable_pp_proxima_eligible\\u003dtrue\\u0026html5_enable_single_video_vod_ivar_on_pacf\\u003dtrue\\u0026html5_enable_tvos_dash\\u003dtrue\\u0026html5_enable_tvos_encrypted_vp9\\u003dtrue\\u0026html5_enable_widevine_for_alc\\u003dtrue\\u0026html5_enable_widevine_for_fast_linear\\u003dtrue\\u0026html5_encourage_array_coalescing\\u003dtrue\\u0026html5_gapless_ended_transition_buffer_ms\\u003d200\\u0026html5_gapless_handoff_close_end_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_close_end_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_handoff_started_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_started_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_loop_seek_offset_in_milli\\u003d0\\u0026html5_generate_session_po_token\\u003dtrue\\u0026html5_gl_fps_threshold\\u003d0\\u0026html5_hdcp_probing_stream_url\\u003d\\u0026html5_head_miss_secs\\u003d0.0\\u0026html5_hfr_quality_cap\\u003d0\\u0026html5_high_res_logging_percent\\u003d0.01\\u0026html5_honor_caption_availabilities_in_audio_track\\u003dtrue\\u0026html5_hopeless_secs\\u003d0\\u0026html5_idle_rate_limit_ms\\u003d0\\u0026html5_ignore_interruptive_ads_for_server_stitched\\u003dtrue\\u0026html5_ignore_stall_from_no_data_timeouts\\u003dtrue\\u0026html5_innertube_heartbeats_for_fairplay\\u003dtrue\\u0026html5_innertube_heartbeats_for_playready\\u003dtrue\\u0026html5_innertube_heartbeats_for_widevine\\u003dtrue\\u0026html5_ios4_seek_above_zero\\u003dtrue\\u0026html5_ios7_force_play_on_stall\\u003dtrue\\u0026html5_ios_force_seek_to_zero_on_stop\\u003dtrue\\u0026html5_jumbo_mobile_subsegment_readahead_target\\u003d3.0\\u0026html5_jumbo_ull_nonstreaming_mffa_ms\\u003d4000\\u0026html5_jumbo_ull_subsegment_readahead_target\\u003d1.3\\u0026html5_license_constraint_delay\\u003d5000\\u0026html5_live_abr_head_miss_fraction\\u003d0.0\\u0026html5_live_abr_repredict_fraction\\u003d0.0\\u0026html5_live_chunk_readahead_proxima_override\\u003d0\\u0026html5_live_head_playable\\u003dtrue\\u0026html5_live_low_latency_bandwidth_window\\u003d0.0\\u0026html5_live_normal_latency_bandwidth_window\\u003d0.0\\u0026html5_live_quality_cap\\u003d0\\u0026html5_live_ultra_low_latency_bandwidth_window\\u003d0.0\\u0026html5_liveness_drift_chunk_override\\u003d0\\u0026html5_liveness_drift_proxima_override\\u003d0\\u0026html5_log_audio_abr\\u003dtrue\\u0026html5_log_audio_switch_metrics\\u003dtrue\\u0026html5_log_experiment_id_from_player_response_to_ctmp\\u003d\\u0026html5_log_first_ssdai_requests_killswitch\\u003dtrue\\u0026html5_log_rebuffer_events\\u003d5\\u0026html5_log_trigger_events_with_debug_data\\u003dtrue\\u0026html5_long_rebuffer_jiggle_cmt_delay_ms\\u003d0\\u0026html5_long_rebuffer_threshold_ms\\u003d30000\\u0026html5_manifestless_unplugged\\u003dtrue\\u0026html5_manifestless_vp9_otf\\u003dtrue\\u0026html5_max_buffer_health_for_downgrade_prop\\u003d-1.0\\u0026html5_max_buffer_health_for_downgrade_secs\\u003d0.0\\u0026html5_max_byterate\\u003d0\\u0026html5_max_drift_per_track_secs\\u003d0.0\\u0026html5_max_headm_for_streaming_xhr\\u003d0\\u0026html5_max_live_dvr_window_plus_margin_secs\\u003d46800.0\\u0026html5_max_readbehind_secs\\u003d0\\u0026html5_max_redirect_response_length\\u003d8192\\u0026html5_max_selectable_quality_ordinal\\u003d0\\u0026html5_max_source_buffer_append_size_in_bytes\\u003d0\\u0026html5_maximum_readahead_seconds\\u003d0.0\\u0026html5_media_fullscreen\\u003dtrue\\u0026html5_mffa_ms_proxima_override\\u003d0\\u0026html5_mfl_extend_max_request_time\\u003dtrue\\u0026html5_min_failures_to_delay_retry\\u003d3\\u0026html5_min_media_duration_for_append_prop\\u003d0.0\\u0026html5_min_media_duration_for_cabr_slice\\u003d0.0\\u0026html5_min_progress_event_interval_ms\\u003d10\\u0026html5_min_quality_ordinal\\u003d0\\u0026html5_min_readbehind_cap_secs\\u003d60\\u0026html5_min_readbehind_secs\\u003d0\\u0026html5_min_seconds_between_format_selections\\u003d0.0\\u0026html5_min_selectable_quality_ordinal\\u003d0\\u0026html5_min_startup_buffered_ad_media_duration_secs\\u003d1.2\\u0026html5_min_startup_buffered_media_duration_secs\\u003d1.2\\u0026html5_min_startup_duration_live_secs\\u003d0.25\\u0026html5_min_upgrade_health_secs\\u003d0.0\\u0026html5_minimum_readahead_seconds\\u003d0.0\\u0026html5_mock_content_binding_for_session_token\\u003d\\u0026html5_no_placeholder_rollbacks\\u003dtrue\\u0026html5_non_network_rebuffer_duration_ms\\u003d0\\u0026html5_non_onesie_attach_po_token\\u003dtrue\\u0026html5_normal_latency_mffa_ms\\u003d0\\u0026html5_not_register_disposables_when_core_listens\\u003dtrue\\u0026html5_oduc_transfer_logging\\u003dtrue\\u0026html5_offline_failure_retry_limit\\u003d2\\u0026html5_offline_prevent_redownload_downloaded_video\\u003dtrue\\u0026html5_onesie_defer_content_loader_ms\\u003d0\\u0026html5_onesie_live_ttl_secs\\u003d8\\u0026html5_onesie_notify_cuepoint_manager_on_completion\\u003dtrue\\u0026html5_onesie_prewarm_interval_ms\\u003d0\\u0026html5_onesie_prewarm_max_lact_ms\\u003d0\\u0026html5_onesie_redirector_timeout\\u003dtrue\\u0026html5_onesie_redirector_timeout_ms\\u003d0\\u0026html5_onesie_request_timeout_ms\\u003d1000\\u0026html5_pause_on_nonforeground_platform_errors\\u003dtrue\\u0026html5_peak_shave\\u003dtrue\\u0026html5_perf_cap_override_sticky\\u003dtrue\\u0026html5_performance_cap_floor\\u003d360\\u0026html5_performance_impact_profiling_timer_ms\\u003d0\\u0026html5_perserve_av1_perf_cap\\u003dtrue\\u0026html5_platform_minimum_readahead_seconds\\u003d0.0\\u0026html5_platform_whitelisted_for_frame_accurate_seeks\\u003dtrue\\u0026html5_player_autonav_logging\\u003dtrue\\u0026html5_player_dynamic_bottom_gradient\\u003dtrue\\u0026html5_player_min_build_cl\\u003d-1\\u0026html5_player_preload_ad_fix\\u003dtrue\\u0026html5_post_interrupt_readahead\\u003d20\\u0026html5_prefer_server_bwe3\\u003dtrue\\u0026html5_preload_wait_time_secs\\u003d0.0\\u0026html5_probe_primary_delay_base_ms\\u003d0\\u0026html5_process_all_encrypted_events\\u003dtrue\\u0026html5_ps4_shorts_1080p_soft_cap\\u003dtrue\\u0026html5_qoe_lh_max_report_count\\u003d0\\u0026html5_qoe_lh_min_duration_ms\\u003d0\\u0026html5_qoe_proto_mock_length\\u003d0\\u0026html5_query_sw_secure_crypto_for_android\\u003dtrue\\u0026html5_random_playback_cap\\u003d0\\u0026html5_recognize_predict_start_cue_point\\u003dtrue\\u0026html5_remove_command_triggered_companions\\u003dtrue\\u0026html5_remove_not_servable_check_killswitch\\u003dtrue\\u0026html5_rename_apbs\\u003dtrue\\u0026html5_report_fatal_drm_restricted_error_killswitch\\u003dtrue\\u0026html5_report_slow_ads_as_error\\u003dtrue\\u0026html5_repredict_interval_ms\\u003d0\\u0026html5_request_only_hdr_or_sdr_keys\\u003dtrue\\u0026html5_request_size_max_kb\\u003d0\\u0026html5_request_size_min_kb\\u003d0\\u0026html5_request_sizing_multiplier\\u003d0.8\\u0026html5_resource_bad_status_delay_scaling\\u003d1.5\\u0026html5_restore_time_after_unpause\\u003dtrue\\u0026html5_restore_time_after_unpause_redux\\u003dtrue\\u0026html5_restrict_streaming_xhr_on_sqless_requests\\u003dtrue\\u0026html5_retry_quota_exceeded_via_seek\\u003dtrue\\u0026html5_safari_desktop_eme_min_version\\u003d0\\u0026html5_samsung_kant_limit_max_bitrate\\u003d0\\u0026html5_seek_again_after_time_jump_cfl\\u003dtrue\\u0026html5_seek_jiggle_cmt_delay_ms\\u003d8000\\u0026html5_seek_new_elem_delay_ms\\u003d12000\\u0026html5_seek_new_elem_shorts_delay_ms\\u003d2000\\u0026html5_seek_new_media_element_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_element_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_new_media_source_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_source_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_set_cmt_delay_ms\\u003d2000\\u0026html5_seek_timeout_delay_ms\\u003d20000\\u0026html5_server_stitched_dai_decorated_url_retry_limit\\u003d5\\u0026html5_server_stitched_dai_group\\u003dtrue\\u0026html5_session_po_token_interval_time_ms\\u003d900000\\u0026html5_set_video_data_to_stale\\u003dtrue\\u0026html5_shorts_gapless_next_buffer_in_seconds\\u003d0\\u0026html5_skip_slow_ad_delay_ms\\u003d15000\\u0026html5_slow_start_no_media_source_delay_ms\\u003d0\\u0026html5_slow_start_timeout_delay_ms\\u003d20000\\u0026html5_ssdai_adfetch_dynamic_timeout_ms\\u003d5000\\u0026html5_ssdai_enable_new_seek_logic\\u003dtrue\\u0026html5_ssdai_failure_retry_limit\\u003d0\\u0026html5_stall_factor\\u003d0.0\\u0026html5_stall_window_size_ct\\u003d20\\u0026html5_stateful_audio_min_adjustment_value\\u003d0\\u0026html5_static_abr_resolution_shelf\\u003d0\\u0026html5_store_xhr_headers_readable\\u003dtrue\\u0026html5_streaming_xhr_time_based_consolidation_ms\\u003d0\\u0026html5_subsegment_readahead_load_speed_check_interval\\u003d0.5\\u0026html5_subsegment_readahead_min_buffer_health_secs\\u003d0.25\\u0026html5_subsegment_readahead_min_buffer_health_secs_on_timeout\\u003d0.1\\u0026html5_subsegment_readahead_min_load_speed\\u003d1.5\\u0026html5_subsegment_readahead_seek_latency_fudge\\u003d0.5\\u0026html5_subsegment_readahead_target_buffer_health_secs\\u003d0.5\\u0026html5_subsegment_readahead_timeout_secs\\u003d2.0\\u0026html5_top_shelf_format_byterate_factor\\u003d1.5\\u0026html5_track_overshoot\\u003dtrue\\u0026html5_transfer_processing_logs_interval\\u003d1000\\u0026html5_ugc_live_audio_51\\u003dtrue\\u0026html5_ugc_vod_audio_51\\u003dtrue\\u0026html5_unreported_seek_reseek_delay_ms\\u003d0\\u0026html5_unrestricted_layer_high_res_logging_percent\\u003d0.0\\u0026html5_update_time_on_seeked\\u003dtrue\\u0026html5_use_jsonformatter_to_parse_player_response\\u003dtrue\\u0026html5_use_post_for_media\\u003dtrue\\u0026html5_use_target_duration\\u003dtrue\\u0026html5_use_ump\\u003dtrue\\u0026html5_use_video_transition_endpoint_heartbeat\\u003dtrue\\u0026html5_video_tbd_min_kb\\u003d0\\u0026html5_viewport_undersend_maximum\\u003d0.0\\u0026html5_volume_slider_tooltip\\u003dtrue\\u0026html5_web_po_experiment_ids\\u003d[]\\u0026html5_webpo_idle_priority_job\\u003dtrue\\u0026html5_woffle_resume\\u003dtrue\\u0026html5_workaround_delay_trigger\\u003dtrue\\u0026ignore_overlapping_cue_points_on_endemic_live_html5\\u003dtrue\\u0026il_payload_scraping\\u003d\\u0026il_use_view_model_logging_context\\u003dtrue\\u0026initial_gel_batch_timeout\\u003d2000\\u0026injected_license_handler_error_code\\u003d0\\u0026injected_license_handler_license_status\\u003d0\\u0026itdrm_enable_revocation_reporting\\u003dtrue\\u0026itdrm_injected_license_service_error_code\\u003d0\\u0026itdrm_widevine_hardened_vmp_mode\\u003dlog\\u0026json_condensed_response\\u003dtrue\\u0026kev_adb_pg\\u003dtrue\\u0026kevlar_command_handler_command_banlist\\u003d[]\\u0026kevlar_dropdown_fix\\u003dtrue\\u0026kevlar_gel_error_routing\\u003dtrue\\u0026kevlar_miniplayer\\u003dtrue\\u0026kevlar_miniplayer_expand_top\\u003dtrue\\u0026kevlar_miniplayer_play_pause_on_scrim\\u003dtrue\\u0026kevlar_playback_associated_queue\\u003dtrue\\u0026kevlar_queue_use_update_api\\u003dtrue\\u0026kevlar_use_wil_icons\\u003dtrue\\u0026kevlar_vimio_use_shared_monitor\\u003dtrue\\u0026kevlar_woffle\\u003dtrue\\u0026kids_web_client_log_screen_associated\\u003dtrue\\u0026live_chat_enable_rta_manager\\u003dtrue\\u0026live_chunk_readahead\\u003d3\\u0026live_fresca_v2\\u003dtrue\\u0026log_errors_through_nwl_on_retry\\u003dtrue\\u0026log_gel_compression_latency\\u003dtrue\\u0026log_heartbeat_with_lifecycles\\u003dtrue\\u0026log_web_endpoint_to_layer\\u003dtrue\\u0026log_window_onerror_fraction\\u003d0.1\\u0026manifestless_post_live\\u003dtrue\\u0026manifestless_post_live_ufph\\u003dtrue\\u0026max_body_size_to_compress\\u003d500000\\u0026max_prefetch_window_sec_for_livestream_optimization\\u003d10\\u0026max_resolution_for_white_noise\\u003d360\\u0026mdx_enable_privacy_disclosure_ui\\u003dtrue\\u0026mdx_load_cast_api_bootstrap_script\\u003dtrue\\u0026migrate_events_to_ts\\u003dtrue\\u0026migrate_remaining_web_ad_badges_to_innertube\\u003dtrue\\u0026min_prefetch_offset_sec_for_livestream_optimization\\u003d20\\u0026move_survey_ad_renderer_ve_asde\\u003dtrue\\u0026move_vss_away_from_login_info_cookie\\u003dtrue\\u0026music_enable_shared_audio_tier_logic\\u003dtrue\\u0026mweb_c3_endscreen\\u003dtrue\\u0026mweb_deprecate_skip_ve_logging\\u003dtrue\\u0026mweb_enable_custom_control_shared\\u003dtrue\\u0026mweb_enable_skippables_on_jio_phone\\u003dtrue\\u0026mweb_native_control_in_faux_fullscreen_shared\\u003dtrue\\u0026network_polling_interval\\u003d30000\\u0026networkless_gel\\u003dtrue\\u0026networkless_logging\\u003dtrue\\u0026new_codecs_string_api_uses_legacy_style\\u003dtrue\\u0026new_csn_storage_design\\u003dtrue\\u0026nwl_send_fast_on_unload\\u003dtrue\\u0026nwl_send_from_memory_when_online\\u003dtrue\\u0026offline_error_handling\\u003dtrue\\u0026override_drm_required_playback_policy_channels\\u003d[]\\u0026pacf_logging_delay_milliseconds_through_ybfe_tv\\u003d30000\\u0026pageid_as_header_web\\u003dtrue\\u0026partial_rewind_buffer_seconds\\u003d0\\u0026player_ads_set_adformat_on_client\\u003dtrue\\u0026player_allow_autonav_after_playlist\\u003dtrue\\u0026player_bootstrap_method\\u003dtrue\\u0026player_destroy_old_version\\u003dtrue\\u0026player_doubletap_to_seek\\u003dtrue\\u0026player_enable_playback_playlist_change\\u003dtrue\\u0026player_underlay_min_player_width\\u003d768.0\\u0026player_underlay_video_width_fraction\\u003d0.6\\u0026player_web_canary_stage\\u003d0\\u0026playready_first_play_expiration\\u003d-1\\u0026polymer_bad_build_labels\\u003dtrue\\u0026polymer_verifiy_app_state\\u003dtrue\\u0026populate_author_with_podcast_name_in_video_details\\u003dtrue\\u0026preskip_button_style_ads_backend\\u003dcountdown_next_to_thumbnail\\u0026qoe_nwl_downloads\\u003dtrue\\u0026qoe_send_and_write\\u003dtrue\\u0026record_app_crashed_web\\u003dtrue\\u0026reject_live_ott_h264_clear_240p\\u003dtrue\\u0026reject_live_vp9_mq_clear_with_no_abr_ladder\\u003dtrue\\u0026replace_closure_window_with_updated_ytwindow_in_studio\\u003dtrue\\u0026replace_playability_retriever_in_watch\\u003dtrue\\u0026scheduler_use_raf_by_default\\u003dtrue\\u0026self_podding_header_string_template\\u003dself_podding_interstitial_message\\u0026self_podding_highlight_non_default_button\\u003dtrue\\u0026self_podding_midroll_choice_string_template\\u003dself_podding_midroll_choice\\u0026send_config_hash_timer\\u003d0\\u0026set_interstitial_advertisers_question_text\\u003dtrue\\u0026set_mock_id_as_expected_content_binding\\u003d\\u0026shell_load_gcf\\u003dtrue\\u0026short_start_time_prefer_publish_in_watch_log\\u003dtrue\\u0026shorts_mode_to_player_api\\u003dtrue\\u0026should_clear_video_data_on_player_cued_unstarted\\u003dtrue\\u0026simply_embedded_enable_botguard\\u003dtrue\\u0026skip_inline_muted_license_service_check\\u003dtrue\\u0026skip_invalid_ytcsi_ticks\\u003dtrue\\u0026skip_ls_gel_retry\\u003dtrue\\u0026skip_setting_info_in_csi_data_object\\u003dtrue\\u0026slow_compressions_before_abandon_count\\u003d4\\u0026speedmaster_cancellation_movement_dp\\u003d10\\u0026speedmaster_playback_rate\\u003d2.0\\u0026speedmaster_touch_activation_ms\\u003d500\\u0026st_skip_debug_params\\u003dtrue\\u0026start_client_gcf\\u003dtrue\\u0026start_client_gcf_for_player\\u003dtrue\\u0026start_sending_config_hash\\u003dtrue\\u0026streaming_data_emergency_itag_blacklist\\u003d[]\\u0026substitute_ad_cpn_macro_in_ssdai\\u003dtrue\\u0026suppress_error_204_logging\\u003dtrue\\u0026transport_use_scheduler\\u003dtrue\\u0026trigger_impression_pings_on_view_search_desktop\\u003dtrue\\u0026tv_pacf_logging_sample_rate\\u003d0.01\\u0026tvhtml5_unplugged_preload_cache_size\\u003d5\\u0026unplugged_dai_live_chunk_readahead\\u003d3\\u0026unplugged_tvhtml5_video_preload_on_focus_delay_ms\\u003d0\\u0026update_log_event_config\\u003dtrue\\u0026use_accessibility_data_on_desktop_player_button\\u003dtrue\\u0026use_color_palettes_modern_collections_v2\\u003dtrue\\u0026use_core_sm\\u003dtrue\\u0026use_csi_stp_handler\\u003dtrue\\u0026use_inlined_player_rpc\\u003dtrue\\u0026use_new_cml\\u003dtrue\\u0026use_new_in_memory_storage\\u003dtrue\\u0026use_new_nwl_initialization\\u003dtrue\\u0026use_new_nwl_saw\\u003dtrue\\u0026use_new_nwl_stw\\u003dtrue\\u0026use_new_nwl_wts\\u003dtrue\\u0026use_player_abuse_bg_library\\u003dtrue\\u0026use_player_cue_range_set\\u003dtrue\\u0026use_profilepage_event_label_in_carousel_playbacks\\u003dtrue\\u0026use_request_time_ms_header\\u003dtrue\\u0026use_session_based_sampling\\u003dtrue\\u0026use_shared_notf_vp9_360p_format_filter_rules\\u003dtrue\\u0026use_ts_visibilitylogger\\u003dtrue\\u0026validate_el_adunit_usage_mweb\\u003d0.1\\u0026variable_buffer_timeout_ms\\u003d0\\u0026vp9_drm_live\\u003dtrue\\u0026vss_final_ping_send_and_write\\u003dtrue\\u0026vss_pings_using_networkless\\u003dtrue\\u0026vss_playback_use_send_and_write\\u003dtrue\\u0026web_api_url\\u003dtrue\\u0026web_async_context_processor_impl\\u003dstandalone\\u0026web_big_boards\\u003dtrue\\u0026web_big_boards_enable_in_inline\\u003dtrue\\u0026web_big_boards_enable_in_miniplayer\\u003dtrue\\u0026web_cinematic_watch_settings\\u003dtrue\\u0026web_client_version_override\\u003d\\u0026web_collect_offline_state\\u003dtrue\\u0026web_csi_action_sampling_enabled\\u003dtrue\\u0026web_csi_debug_sample_enabled\\u003dtrue\\u0026web_dedupe_ve_grafting\\u003dtrue\\u0026web_deprecate_service_ajax_map_dependency\\u003dtrue\\u0026web_disable_channels_chapter_entrypoint\\u003dtrue\\u0026web_enable_ab_em_rsp\\u003dtrue\\u0026web_enable_ab_rsp_cl\\u003dtrue\\u0026web_enable_abd_ref\\u003dtrue\\u0026web_enable_error_204\\u003dtrue\\u0026web_enable_speedmaster\\u003dtrue\\u0026web_enable_voz_audio_feedback\\u003dtrue\\u0026web_fix_fine_scrubbing_drag\\u003dtrue\\u0026web_foreground_heartbeat_interval_ms\\u003d28000\\u0026web_forward_command_on_pbj\\u003dtrue\\u0026web_gel_debounce_ms\\u003d60000\\u0026web_gel_timeout_cap\\u003dtrue\\u0026web_heat_map_v2\\u003dtrue\\u0026web_key_moments_markers\\u003dtrue\\u0026web_l3_storyboard\\u003dtrue\\u0026web_log_memory_total_kbytes\\u003dtrue\\u0026web_logging_max_batch\\u003d150\\u0026web_logging_max_batch_hard_limit\\u003dtrue\\u0026web_modern_ads\\u003dtrue\\u0026web_modern_buttons\\u003dtrue\\u0026web_modern_buttons_bl_survey\\u003dtrue\\u0026web_modern_player_settings_quality_bottom\\u003dtrue\\u0026web_modern_subscribe\\u003dtrue\\u0026web_modern_subscribe_style\\u003dfilled\\u0026web_new_autonav_countdown\\u003dtrue\\u0026web_one_platform_error_handling\\u003dtrue\\u0026web_op_signal_type_banlist\\u003d[]\\u0026web_playback_associated_log_ctt\\u003dtrue\\u0026web_playback_associated_ve\\u003dtrue\\u0026web_player_add_ve_conversion_logging_to_outbound_links\\u003dtrue\\u0026web_player_always_enable_auto_translation\\u003dtrue\\u0026web_player_api_logging_fraction\\u003d0.01\\u0026web_player_autonav_empty_suggestions_fix\\u003dtrue\\u0026web_player_autonav_toggle_always_listen\\u003dtrue\\u0026web_player_autonav_use_server_provided_state\\u003dtrue\\u0026web_player_caption_language_preference_stickiness_duration\\u003d30\\u0026web_player_disable_inline_scrubbing\\u003dtrue\\u0026web_player_enable_cultural_moment_overlay\\u003dtrue\\u0026web_player_enable_early_warning_snackbar\\u003dtrue\\u0026web_player_enable_info_button_in_banner_on_desktop\\u003dtrue\\u0026web_player_enable_premium_hbr_in_h5_api\\u003dtrue\\u0026web_player_enable_premium_hbr_playback_cap\\u003dtrue\\u0026web_player_enable_vod_featured_product_banner_on_desktop\\u003dtrue\\u0026web_player_innertube_playlist_update\\u003dtrue\\u0026web_player_ipp_canary_type_for_logging\\u003d\\u0026web_player_log_click_before_generating_ve_conversion_params\\u003dtrue\\u0026web_player_move_autonav_toggle\\u003dtrue\\u0026web_player_music_visualizer_treatment\\u003dfake\\u0026web_player_nitrate_promo_tooltip\\u003dtrue\\u0026web_player_offline_playlist_auto_refresh\\u003dtrue\\u0026web_player_seek_chapters_by_shortcut\\u003dtrue\\u0026web_player_sentinel_is_uniplayer\\u003dtrue\\u0026web_player_should_honor_include_asr_setting\\u003dtrue\\u0026web_player_show_music_in_this_video_graphic\\u003dvideo_thumbnail\\u0026web_player_small_hbp_settings_menu\\u003dtrue\\u0026web_player_ss_dai_ad_fetching_timeout_ms\\u003d15000\\u0026web_player_ss_media_time_offset\\u003dtrue\\u0026web_player_topify_subtitles_for_shorts\\u003dtrue\\u0026web_player_touch_mode_improvements\\u003dtrue\\u0026web_player_transfer_timeout_threshold_ms\\u003d10800000\\u0026web_player_use_cinematic_label_2\\u003dtrue\\u0026web_player_use_heartbeat_poll_delay_ms\\u003dtrue\\u0026web_player_use_new_api_for_quality_pullback\\u003dtrue\\u0026web_player_ve_conversion_fixes_for_channel_info\\u003dtrue\\u0026web_prefetch_preload_video\\u003dtrue\\u0026web_rounded_thumbnails\\u003dtrue\\u0026web_scheduler_auto_init\\u003dtrue\\u0026web_settings_menu_icons\\u003dtrue\\u0026web_smoothness_test_duration_ms\\u003d0\\u0026web_smoothness_test_method\\u003d0\\u0026web_speedmaster_spacebar_control\\u003dtrue\\u0026web_speedmaster_updated_edu\\u003dtrue\\u0026web_yt_config_context\\u003dtrue\\u0026webfe_disable_ab_em_plb\\u003dtrue\\u0026wil_icon_max_concurrent_fetches\\u003d9999\\u0026wil_icon_render_when_idle\\u003dtrue\\u0026wiz_use_generic_logging_infra\\u003dtrue\\u0026woffle_clean_up_after_entity_migration\\u003dtrue\\u0026woffle_enable_download_status\\u003dtrue\\u0026woffle_orchestration\\u003dtrue\\u0026woffle_playlist_optimization\\u003dtrue\\u0026woffle_used_state_report\\u003dtrue\\u0026ytidb_clear_embedded_player\\u003dtrue\\u0026ytidb_fetch_datasync_ids_for_data_cleanup\\u003dtrue\\u0026ytidb_remake_db_retries\\u003d3\\u0026ytidb_reopen_db_retries\\u003d3\\u0026ytidb_transaction_ended_event_rate_limit\\u003d0.02\\u0026ytidb_transaction_ended_event_rate_limit_session\\u003d0.2\\u0026ytidb_transaction_ended_event_rate_limit_transaction\\u003d0.1\",\"disableFullscreen\":true,\"cspNonce\":\"xW_SWKdw4-d_OLdvn29m6Q\",\"canaryState\":\"none\",\"datasyncId\":\"Vc2a81ef1||\",\"canaryStage\":\"\"},\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_INLINE_PREVIEW\":{\"rootElementId\":\"inline-preview-player\",\"jsUrl\":\"/s/player/63e90c30/player_ias.vflset/en_US/base.js\",\"cssUrl\":\"/s/player/63e90c30/www-player.css\",\"contextId\":\"WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_INLINE_PREVIEW\",\"eventLabel\":\"detailpage\",\"contentRegion\":\"IT\",\"hl\":\"en_US\",\"hostLanguage\":\"en\",\"playerStyle\":\"desktop-polymer\",\"innertubeApiKey\":\"AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\",\"innertubeApiVersion\":\"v1\",\"innertubeContextClientVersion\":\"2.20231121.08.00\",\"disableKeyboardControls\":true,\"device\":{\"brand\":\"\",\"model\":\"\",\"browser\":\"Chrome\",\"browserVersion\":\"[scrubbed]\",\"os\":\"Windows\",\"osVersion\":\"10.0\",\"platform\":\"DESKTOP\",\"interfaceName\":\"WEB\",\"interfaceVersion\":\"2.20231121.08.00\"},\"serializedExperimentIds\":\"23983296,23986028,24004644,24007246,24080738,24135310,24208765,24371398,24371779,24385728,24439361,24524098,24543193,24543197,24543199,24543201,24549786,24550458,24559327,24560416,24566293,24566687,24699899,51006181,51010235,51012165,51017346,51026715,51027535,51028271,51030311,51035166,51037540,51038399,51038805,51039199,51039493,51039699,51041809,51044150,51044152,51044154,51044158,51046164,51047619,51049006,51054675,51055917,51056050,51057534,51060161,51067339,51069001\",\"serializedExperimentFlags\":\"H5_async_logging_delay_ms\\u003d30000.0\\u0026H5_enable_full_pacf_logging\\u003dtrue\\u0026H5_use_async_logging\\u003dtrue\\u0026ab_det_apb_b\\u003dtrue\\u0026ab_det_fet_wr\\u003dtrue\\u0026ab_det_fet_wr_en\\u003dtrue\\u0026ab_det_gen_re\\u003dtrue\\u0026action_companion_center_align_description\\u003dtrue\\u0026ad_pod_disable_companion_persist_ads_quality\\u003dtrue\\u0026addto_ajax_log_warning_fraction\\u003d0.1\\u0026align_ad_to_video_player_lifecycle_for_bulleit\\u003dtrue\\u0026allow_drm_override\\u003dtrue\\u0026allow_live_autoplay\\u003dtrue\\u0026allow_poltergust_autoplay\\u003dtrue\\u0026allow_skip_networkless\\u003dtrue\\u0026allow_vp9_1080p_mq_enc\\u003dtrue\\u0026att_web_record_metrics\\u003dtrue\\u0026autoplay_time\\u003d8000\\u0026autoplay_time_for_fullscreen\\u003d3000\\u0026autoplay_time_for_music_content\\u003d3000\\u0026bg_vm_reinit_threshold\\u003d7200000\\u0026blocked_packages_for_sps\\u003d[]\\u0026botguard_async_snapshot_timeout_ms\\u003d3000\\u0026captions_url_add_ei\\u003dtrue\\u0026check_ad_ui_status_for_mweb_safari\\u003dtrue\\u0026check_navigator_accuracy_timeout_ms\\u003d0\\u0026clear_user_partitioned_ls\\u003dtrue\\u0026client_respect_autoplay_switch_button_renderer\\u003dtrue\\u0026compress_gel\\u003dtrue\\u0026compression_disable_point\\u003d10\\u0026compression_performance_threshold\\u003d250\\u0026csi_on_gel\\u003dtrue\\u0026dash_manifest_version\\u003d5\\u0026debug_bandaid_hostname\\u003d\\u0026debug_sherlog_username\\u003d\\u0026delay_ads_gvi_call_on_bulleit_living_room_ms\\u003d0\\u0026deprecate_csi_has_info\\u003dtrue\\u0026deprecate_delay_ping\\u003dtrue\\u0026deprecate_pair_servlet_enabled\\u003dtrue\\u0026desktop_image_cta_no_background\\u003dtrue\\u0026desktop_log_img_click_location\\u003dtrue\\u0026desktop_sparkles_light_cta_button\\u003dtrue\\u0026disable_channel_id_check_for_suspended_channels\\u003dtrue\\u0026disable_child_node_auto_formatted_strings\\u003dtrue\\u0026disable_defer_admodule_on_advertiser_video\\u003dtrue\\u0026disable_features_for_supex\\u003dtrue\\u0026disable_inline_preview_scrubbing_for_vac_ads_on_web\\u003dtrue\\u0026disable_legacy_desktop_remote_queue\\u003dtrue\\u0026disable_mdx_connection_in_mdx_module_for_music_web\\u003dtrue\\u0026disable_new_pause_state3\\u003dtrue\\u0026disable_pacf_logging_for_memory_limited_tv\\u003dtrue\\u0026disable_rounding_ad_notify\\u003dtrue\\u0026disable_simple_mixed_direction_formatted_strings\\u003dtrue\\u0026disable_ssdai_on_errors\\u003dtrue\\u0026disable_tabbing_before_flyout_ad_elements_appear\\u003dtrue\\u0026disable_thumbnail_preloading\\u003dtrue\\u0026edge_encryption_fill_primary_key_version\\u003dtrue\\u0026embeds_add_player_mode_to_ad_events\\u003dtrue\\u0026embeds_disable_progress_bar_context_menu_handling\\u003dtrue\\u0026embeds_enable_muted_autoplay\\u003dtrue\\u0026embeds_web_enable_autoplay_not_supported_logging_fix\\u003dtrue\\u0026embeds_web_enable_host_flags_client_permissions\\u003dtrue\\u0026embeds_web_enable_host_flags_innertube\\u003dtrue\\u0026embeds_web_enable_lite_logging\\u003dtrue\\u0026embeds_web_enable_load_player_from_page_show\\u003dtrue\\u0026embeds_web_enable_log_splay_as_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_dtts\\u003dtrue\\u0026embeds_web_enable_modestbranding_deprecation\\u003dtrue\\u0026embeds_web_enable_pause_overlay_wn_update\\u003dtrue\\u0026embeds_web_enable_pfp_unbranded_el_deprecation\\u003dtrue\\u0026embeds_web_enable_rcat_allowlist\\u003dtrue\\u0026embeds_web_enable_scripted_playback_blocked_logging_fix\\u003dtrue\\u0026embeds_web_enable_smallmode_fullscreen_button_fix\\u003dtrue\\u0026embeds_web_enable_ve_conversion_logging_tracking_no_allow_list\\u003dtrue\\u0026embeds_web_hide_unfilled_more_videos_suggestions\\u003dtrue\\u0026embeds_web_lite_mode\\u003d1\\u0026embeds_web_move_preload_by_player_vars_to_public\\u003dtrue\\u0026embeds_web_nwl_disable_nocookie\\u003dtrue\\u0026embeds_web_shopping_overlay_no_wait_for_paid_content_overlay\\u003dtrue\\u0026embeds_web_synth_ch_headers_banned_urls_regex\\u003d\\u0026enable_ab_report_on_errorscreen\\u003dtrue\\u0026enable_ab_rp_int\\u003dtrue\\u0026enable_ad_cpn_macro_substitution_for_click_pings\\u003dtrue\\u0026enable_app_promo_endcap_eml_on_tablet\\u003dtrue\\u0026enable_ata_dialog_all_web\\u003dtrue\\u0026enable_cast_for_web_unplugged\\u003dtrue\\u0026enable_cast_on_music_web\\u003dtrue\\u0026enable_client_page_id_header_for_first_party_pings\\u003dtrue\\u0026enable_client_sli_logging\\u003dtrue\\u0026enable_cta_banner_on_unplugged_lr\\u003dtrue\\u0026enable_dark_mode_style_endcap\\u003dtrue\\u0026enable_dark_mode_style_endcap_timed_pie_countdown\\u003dtrue\\u0026enable_discrete_live_precise_embargos\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_android\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_ios\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_compliant_banner_image_ad_renderer\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_mobile\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_one_click_ata_translators_infeed_elements\\u003dtrue\\u0026enable_error_corrections_infocard\\u003dtrue\\u0026enable_error_corrections_infocard_web_client\\u003dtrue\\u0026enable_error_corrections_infocard_web_client_check\\u003dtrue\\u0026enable_error_corrections_infocards_icon_web\\u003dtrue\\u0026enable_eviction_protection_for_bulleit\\u003dtrue\\u0026enable_flow_logging_p4e\\u003dtrue\\u0026enable_free_preview_timer\\u003dtrue\\u0026enable_gel_log_commands\\u003dtrue\\u0026enable_h5_player_ad_block_status_logging\\u003dtrue\\u0026enable_h5_player_ad_block_status_piping\\u003dtrue\\u0026enable_handles_account_menu_switcher\\u003dtrue\\u0026enable_high_frequency_cookie_rotation\\u003dtrue\\u0026enable_kabuki_comments_on_shorts\\u003ddisabled\\u0026enable_live_ad_serving_context\\u003dtrue\\u0026enable_live_premiere_web_player_indicator\\u003dtrue\\u0026enable_loggingcontext_trackingparams\\u003dtrue\\u0026enable_lr_home_infeed_ads_inline_playback_progress_pings\\u003dtrue\\u0026enable_mixed_direction_formatted_strings\\u003dtrue\\u0026enable_modern_skip_button_on_web\\u003dtrue\\u0026enable_multiple_heatseeker_decorations\\u003dtrue\\u0026enable_mweb_endcap_clickable_icon_description\\u003dtrue\\u0026enable_mweb_endcap_dark_mode_action_button\\u003dtrue\\u0026enable_mweb_livestream_ui_update\\u003dtrue\\u0026enable_new_paid_product_placement\\u003dtrue\\u0026enable_out_of_stock_text_all_surfaces\\u003dtrue\\u0026enable_pacf_slot_asde_infeed_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5_TV\\u003dtrue\\u0026enable_pacf_through_ybfe_tv\\u003dtrue\\u0026enable_pacf_through_ybfe_tv_for_page_top_formats\\u003dtrue\\u0026enable_pacf_through_ysfe_tv\\u003dtrue\\u0026enable_pass_sdc_get_accounts_list\\u003dtrue\\u0026enable_pl_r_c\\u003dtrue\\u0026enable_pl_r_c_s\\u003dtrue\\u0026enable_pl_r_si_fa\\u003dtrue\\u0026enable_player_param_truncation_before_navigation_on_web_on_search\\u003dtrue\\u0026enable_populate_att_psd_in_abe_feedback\\u003dtrue\\u0026enable_populate_psd_in_abe_feedback\\u003dtrue\\u0026enable_post_ad_perception_survey_fix_on_tvhtml5\\u003dtrue\\u0026enable_post_ad_perception_survey_in_tvhtml5\\u003dtrue\\u0026enable_sdf_midroll_postroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_main\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_misc\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_tv\\u003dtrue\\u0026enable_server_stitched_dai\\u003dtrue\\u0026enable_set_endcap_thumbnail_from_layout\\u003dtrue\\u0026enable_shorts_player\\u003dtrue\\u0026enable_skip_ad_guidance_prompt\\u003dtrue\\u0026enable_skippable_ads_for_unplugged_ad_pod\\u003dtrue\\u0026enable_small_endcap_action_button_for_mweb\\u003dtrue\\u0026enable_smearing_expansion_dai\\u003dtrue\\u0026enable_tectonic_ad_ux_for_halftime\\u003dtrue\\u0026enable_third_party_info\\u003dtrue\\u0026enable_topsoil_wta_for_halftime_live_infra\\u003dtrue\\u0026enable_unknown_lact_fix_on_html5\\u003dtrue\\u0026enable_web_media_session_metadata_fix\\u003dtrue\\u0026enable_web_tiered_gel\\u003dtrue\\u0026enable_wn_infocards\\u003dtrue\\u0026enable_yt_ata_iframe_authuser\\u003dtrue\\u0026err_on_pl_r_c\\u003dtrue\\u0026error_message_for_gsuite_network_restrictions\\u003dtrue\\u0026export_networkless_options\\u003dtrue\\u0026external_fullscreen_with_edu\\u003dtrue\\u0026fetch_att_independently\\u003dtrue\\u0026fetch_bid_for_dclk_status\\u003dtrue\\u0026fill_single_video_with_notify_to_lasr\\u003dtrue\\u0026filter_vp9_for_csdai\\u003dtrue\\u0026fix_ads_tracking_for_swf_config_deprecation_mweb\\u003dtrue\\u0026fix_h5_toggle_button_a11y\\u003dtrue\\u0026fix_survey_color_contrast_on_destop\\u003dtrue\\u0026fix_toggle_button_role_for_ad_components\\u003dtrue\\u0026fix_web_instream_survey_question_aria_label\\u003dtrue\\u0026gcf_config_store_enabled\\u003dtrue\\u0026gcf_music_innertube\\u003dtrue\\u0026gel_min_batch_size\\u003d3\\u0026gel_queue_timeout_max_ms\\u003d300000\\u0026gpa_sparkles_ten_percent_layer\\u003dtrue\\u0026gvi_channel_client_screen\\u003dtrue\\u0026h5_companion_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_enable_generic_error_logging_event\\u003dtrue\\u0026h5_enable_unified_csi_preroll\\u003dtrue\\u0026h5_inplayer_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_reset_cache_and_filter_before_update_masthead\\u003dtrue\\u0026heatseeker_decoration_threshold\\u003d0.8\\u0026hfr_dropped_framerate_fallback_threshold\\u003d0\\u0026hide_cta_for_home_web_video_ads_animate_in_time\\u003d2\\u0026hide_endpoint_overflow_on_ytd_display_ad_renderer\\u003dtrue\\u0026html5_ad_timeout_ms\\u003d0\\u0026html5_adaptation_step_count\\u003d0\\u0026html5_add_dai_smearing_to_qoe\\u003dtrue\\u0026html5_add_drm_formats_to_test_format\\u003dtrue\\u0026html5_ads_preroll_lock_timeout_delay_ms\\u003d15000\\u0026html5_allow_video_keyframe_without_audio\\u003dtrue\\u0026html5_apply_min_failures\\u003dtrue\\u0026html5_apply_start_time_within_ads_for_ssdai_transitions\\u003dtrue\\u0026html5_atr_disable_force_fallback\\u003dtrue\\u0026html5_attach_num_random_bytes_to_bandaid\\u003d0\\u0026html5_attach_po_token_to_bandaid\\u003dtrue\\u0026html5_autonav_cap_idle_secs\\u003d0\\u0026html5_autonav_quality_cap\\u003d720\\u0026html5_autoplay_default_quality_cap\\u003d0\\u0026html5_block_pip_safari_delay\\u003d0\\u0026html5_bypass_contention_secs\\u003d0.0\\u0026html5_cache_request_key\\u003d\\u0026html5_check_for_idle_network_interval_ms\\u003d-1\\u0026html5_check_video_data_errors_before_playback_start\\u003dtrue\\u0026html5_cobalt_default_buffer_size_in_bytes\\u003d0\\u0026html5_cobalt_max_size_for_immed_job\\u003d0\\u0026html5_cobalt_min_processor_cnt_to_offload_algo\\u003d0\\u0026html5_cobalt_override_quic\\u003d0\\u0026html5_consume_media_bytes_slice_infos\\u003dtrue\\u0026html5_continuous_goodput_probe_interval_ms\\u003d0\\u0026html5_de_dupe_content_video_loads_in_lifecycle_api\\u003dtrue\\u0026html5_debug_data_log_probability\\u003d0.1\\u0026html5_decode_to_texture_cap\\u003dtrue\\u0026html5_default_ad_gain\\u003d0.5\\u0026html5_default_quality_cap\\u003d0\\u0026html5_defer_fetch_att_ms\\u003d1000\\u0026html5_delayed_retry_count\\u003d1\\u0026html5_delayed_retry_delay_ms\\u003d5000\\u0026html5_deprecate_adservice\\u003dtrue\\u0026html5_deprecate_video_tag_pool\\u003dtrue\\u0026html5_desktop_vr180_allow_panning\\u003dtrue\\u0026html5_df_downgrade_thresh\\u003d0.6\\u0026html5_disable_csi_for_bulleit\\u003dtrue\\u0026html5_disable_move_pssh_to_moov\\u003dtrue\\u0026html5_disable_non_contiguous\\u003dtrue\\u0026html5_displayed_frame_rate_downgrade_threshold\\u003d45\\u0026html5_drm_byterate_soft_cap\\u003d0\\u0026html5_drm_check_all_key_error_states\\u003dtrue\\u0026html5_drm_cpi_license_key\\u003dtrue\\u0026html5_drm_live_byterate_soft_cap\\u003d0\\u0026html5_enable_ac3\\u003dtrue\\u0026html5_enable_ads_client_monitoring_log_tv\\u003dtrue\\u0026html5_enable_caption_changes_for_mosaic\\u003dtrue\\u0026html5_enable_client_hints_override\\u003dtrue\\u0026html5_enable_composite_embargo\\u003dtrue\\u0026html5_enable_eac3\\u003dtrue\\u0026html5_enable_embedded_player_visibility_signals\\u003dtrue\\u0026html5_enable_non_notify_composite_vod_lsar_pacf\\u003dtrue\\u0026html5_enable_oduc\\u003dtrue\\u0026html5_enable_pp_proxima_eligible\\u003dtrue\\u0026html5_enable_single_video_vod_ivar_on_pacf\\u003dtrue\\u0026html5_enable_tvos_dash\\u003dtrue\\u0026html5_enable_tvos_encrypted_vp9\\u003dtrue\\u0026html5_enable_widevine_for_alc\\u003dtrue\\u0026html5_enable_widevine_for_fast_linear\\u003dtrue\\u0026html5_encourage_array_coalescing\\u003dtrue\\u0026html5_gapless_ended_transition_buffer_ms\\u003d200\\u0026html5_gapless_handoff_close_end_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_close_end_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_handoff_started_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_started_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_loop_seek_offset_in_milli\\u003d0\\u0026html5_generate_session_po_token\\u003dtrue\\u0026html5_gl_fps_threshold\\u003d0\\u0026html5_hdcp_probing_stream_url\\u003d\\u0026html5_head_miss_secs\\u003d0.0\\u0026html5_hfr_quality_cap\\u003d0\\u0026html5_high_res_logging_percent\\u003d0.01\\u0026html5_honor_caption_availabilities_in_audio_track\\u003dtrue\\u0026html5_hopeless_secs\\u003d0\\u0026html5_idle_rate_limit_ms\\u003d0\\u0026html5_ignore_interruptive_ads_for_server_stitched\\u003dtrue\\u0026html5_ignore_stall_from_no_data_timeouts\\u003dtrue\\u0026html5_innertube_heartbeats_for_fairplay\\u003dtrue\\u0026html5_innertube_heartbeats_for_playready\\u003dtrue\\u0026html5_innertube_heartbeats_for_widevine\\u003dtrue\\u0026html5_ios4_seek_above_zero\\u003dtrue\\u0026html5_ios7_force_play_on_stall\\u003dtrue\\u0026html5_ios_force_seek_to_zero_on_stop\\u003dtrue\\u0026html5_jumbo_mobile_subsegment_readahead_target\\u003d3.0\\u0026html5_jumbo_ull_nonstreaming_mffa_ms\\u003d4000\\u0026html5_jumbo_ull_subsegment_readahead_target\\u003d1.3\\u0026html5_license_constraint_delay\\u003d5000\\u0026html5_live_abr_head_miss_fraction\\u003d0.0\\u0026html5_live_abr_repredict_fraction\\u003d0.0\\u0026html5_live_chunk_readahead_proxima_override\\u003d0\\u0026html5_live_head_playable\\u003dtrue\\u0026html5_live_low_latency_bandwidth_window\\u003d0.0\\u0026html5_live_normal_latency_bandwidth_window\\u003d0.0\\u0026html5_live_quality_cap\\u003d0\\u0026html5_live_ultra_low_latency_bandwidth_window\\u003d0.0\\u0026html5_liveness_drift_chunk_override\\u003d0\\u0026html5_liveness_drift_proxima_override\\u003d0\\u0026html5_log_audio_abr\\u003dtrue\\u0026html5_log_audio_switch_metrics\\u003dtrue\\u0026html5_log_experiment_id_from_player_response_to_ctmp\\u003d\\u0026html5_log_first_ssdai_requests_killswitch\\u003dtrue\\u0026html5_log_rebuffer_events\\u003d5\\u0026html5_log_trigger_events_with_debug_data\\u003dtrue\\u0026html5_long_rebuffer_jiggle_cmt_delay_ms\\u003d0\\u0026html5_long_rebuffer_threshold_ms\\u003d30000\\u0026html5_manifestless_unplugged\\u003dtrue\\u0026html5_manifestless_vp9_otf\\u003dtrue\\u0026html5_max_buffer_health_for_downgrade_prop\\u003d-1.0\\u0026html5_max_buffer_health_for_downgrade_secs\\u003d0.0\\u0026html5_max_byterate\\u003d0\\u0026html5_max_drift_per_track_secs\\u003d0.0\\u0026html5_max_headm_for_streaming_xhr\\u003d0\\u0026html5_max_live_dvr_window_plus_margin_secs\\u003d46800.0\\u0026html5_max_readbehind_secs\\u003d0\\u0026html5_max_redirect_response_length\\u003d8192\\u0026html5_max_selectable_quality_ordinal\\u003d0\\u0026html5_max_source_buffer_append_size_in_bytes\\u003d0\\u0026html5_maximum_readahead_seconds\\u003d0.0\\u0026html5_media_fullscreen\\u003dtrue\\u0026html5_mffa_ms_proxima_override\\u003d0\\u0026html5_mfl_extend_max_request_time\\u003dtrue\\u0026html5_min_failures_to_delay_retry\\u003d3\\u0026html5_min_media_duration_for_append_prop\\u003d0.0\\u0026html5_min_media_duration_for_cabr_slice\\u003d0.0\\u0026html5_min_progress_event_interval_ms\\u003d10\\u0026html5_min_quality_ordinal\\u003d0\\u0026html5_min_readbehind_cap_secs\\u003d60\\u0026html5_min_readbehind_secs\\u003d0\\u0026html5_min_seconds_between_format_selections\\u003d0.0\\u0026html5_min_selectable_quality_ordinal\\u003d0\\u0026html5_min_startup_buffered_ad_media_duration_secs\\u003d1.2\\u0026html5_min_startup_buffered_media_duration_secs\\u003d1.2\\u0026html5_min_startup_duration_live_secs\\u003d0.25\\u0026html5_min_upgrade_health_secs\\u003d0.0\\u0026html5_minimum_readahead_seconds\\u003d0.0\\u0026html5_mock_content_binding_for_session_token\\u003d\\u0026html5_no_placeholder_rollbacks\\u003dtrue\\u0026html5_non_network_rebuffer_duration_ms\\u003d0\\u0026html5_non_onesie_attach_po_token\\u003dtrue\\u0026html5_normal_latency_mffa_ms\\u003d0\\u0026html5_not_register_disposables_when_core_listens\\u003dtrue\\u0026html5_oduc_transfer_logging\\u003dtrue\\u0026html5_offline_failure_retry_limit\\u003d2\\u0026html5_offline_prevent_redownload_downloaded_video\\u003dtrue\\u0026html5_onesie_defer_content_loader_ms\\u003d0\\u0026html5_onesie_live_ttl_secs\\u003d8\\u0026html5_onesie_notify_cuepoint_manager_on_completion\\u003dtrue\\u0026html5_onesie_prewarm_interval_ms\\u003d0\\u0026html5_onesie_prewarm_max_lact_ms\\u003d0\\u0026html5_onesie_redirector_timeout\\u003dtrue\\u0026html5_onesie_redirector_timeout_ms\\u003d0\\u0026html5_onesie_request_timeout_ms\\u003d1000\\u0026html5_pause_on_nonforeground_platform_errors\\u003dtrue\\u0026html5_peak_shave\\u003dtrue\\u0026html5_perf_cap_override_sticky\\u003dtrue\\u0026html5_performance_cap_floor\\u003d360\\u0026html5_performance_impact_profiling_timer_ms\\u003d0\\u0026html5_perserve_av1_perf_cap\\u003dtrue\\u0026html5_platform_minimum_readahead_seconds\\u003d0.0\\u0026html5_platform_whitelisted_for_frame_accurate_seeks\\u003dtrue\\u0026html5_player_autonav_logging\\u003dtrue\\u0026html5_player_dynamic_bottom_gradient\\u003dtrue\\u0026html5_player_min_build_cl\\u003d-1\\u0026html5_player_preload_ad_fix\\u003dtrue\\u0026html5_post_interrupt_readahead\\u003d20\\u0026html5_prefer_server_bwe3\\u003dtrue\\u0026html5_preload_wait_time_secs\\u003d0.0\\u0026html5_probe_primary_delay_base_ms\\u003d0\\u0026html5_process_all_encrypted_events\\u003dtrue\\u0026html5_ps4_shorts_1080p_soft_cap\\u003dtrue\\u0026html5_qoe_lh_max_report_count\\u003d0\\u0026html5_qoe_lh_min_duration_ms\\u003d0\\u0026html5_qoe_proto_mock_length\\u003d0\\u0026html5_query_sw_secure_crypto_for_android\\u003dtrue\\u0026html5_random_playback_cap\\u003d0\\u0026html5_recognize_predict_start_cue_point\\u003dtrue\\u0026html5_remove_command_triggered_companions\\u003dtrue\\u0026html5_remove_not_servable_check_killswitch\\u003dtrue\\u0026html5_rename_apbs\\u003dtrue\\u0026html5_report_fatal_drm_restricted_error_killswitch\\u003dtrue\\u0026html5_report_slow_ads_as_error\\u003dtrue\\u0026html5_repredict_interval_ms\\u003d0\\u0026html5_request_only_hdr_or_sdr_keys\\u003dtrue\\u0026html5_request_size_max_kb\\u003d0\\u0026html5_request_size_min_kb\\u003d0\\u0026html5_request_sizing_multiplier\\u003d0.8\\u0026html5_resource_bad_status_delay_scaling\\u003d1.5\\u0026html5_restore_time_after_unpause\\u003dtrue\\u0026html5_restore_time_after_unpause_redux\\u003dtrue\\u0026html5_restrict_streaming_xhr_on_sqless_requests\\u003dtrue\\u0026html5_retry_quota_exceeded_via_seek\\u003dtrue\\u0026html5_safari_desktop_eme_min_version\\u003d0\\u0026html5_samsung_kant_limit_max_bitrate\\u003d0\\u0026html5_seek_again_after_time_jump_cfl\\u003dtrue\\u0026html5_seek_jiggle_cmt_delay_ms\\u003d8000\\u0026html5_seek_new_elem_delay_ms\\u003d12000\\u0026html5_seek_new_elem_shorts_delay_ms\\u003d2000\\u0026html5_seek_new_media_element_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_element_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_new_media_source_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_source_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_set_cmt_delay_ms\\u003d2000\\u0026html5_seek_timeout_delay_ms\\u003d20000\\u0026html5_server_stitched_dai_decorated_url_retry_limit\\u003d5\\u0026html5_server_stitched_dai_group\\u003dtrue\\u0026html5_session_po_token_interval_time_ms\\u003d900000\\u0026html5_set_video_data_to_stale\\u003dtrue\\u0026html5_shorts_gapless_next_buffer_in_seconds\\u003d0\\u0026html5_skip_slow_ad_delay_ms\\u003d15000\\u0026html5_slow_start_no_media_source_delay_ms\\u003d0\\u0026html5_slow_start_timeout_delay_ms\\u003d20000\\u0026html5_ssdai_adfetch_dynamic_timeout_ms\\u003d5000\\u0026html5_ssdai_enable_new_seek_logic\\u003dtrue\\u0026html5_ssdai_failure_retry_limit\\u003d0\\u0026html5_stall_factor\\u003d0.0\\u0026html5_stall_window_size_ct\\u003d20\\u0026html5_stateful_audio_min_adjustment_value\\u003d0\\u0026html5_static_abr_resolution_shelf\\u003d0\\u0026html5_store_xhr_headers_readable\\u003dtrue\\u0026html5_streaming_xhr_time_based_consolidation_ms\\u003d0\\u0026html5_subsegment_readahead_load_speed_check_interval\\u003d0.5\\u0026html5_subsegment_readahead_min_buffer_health_secs\\u003d0.25\\u0026html5_subsegment_readahead_min_buffer_health_secs_on_timeout\\u003d0.1\\u0026html5_subsegment_readahead_min_load_speed\\u003d1.5\\u0026html5_subsegment_readahead_seek_latency_fudge\\u003d0.5\\u0026html5_subsegment_readahead_target_buffer_health_secs\\u003d0.5\\u0026html5_subsegment_readahead_timeout_secs\\u003d2.0\\u0026html5_top_shelf_format_byterate_factor\\u003d1.5\\u0026html5_track_overshoot\\u003dtrue\\u0026html5_transfer_processing_logs_interval\\u003d1000\\u0026html5_ugc_live_audio_51\\u003dtrue\\u0026html5_ugc_vod_audio_51\\u003dtrue\\u0026html5_unreported_seek_reseek_delay_ms\\u003d0\\u0026html5_unrestricted_layer_high_res_logging_percent\\u003d0.0\\u0026html5_update_time_on_seeked\\u003dtrue\\u0026html5_use_jsonformatter_to_parse_player_response\\u003dtrue\\u0026html5_use_post_for_media\\u003dtrue\\u0026html5_use_target_duration\\u003dtrue\\u0026html5_use_ump\\u003dtrue\\u0026html5_use_video_transition_endpoint_heartbeat\\u003dtrue\\u0026html5_video_tbd_min_kb\\u003d0\\u0026html5_viewport_undersend_maximum\\u003d0.0\\u0026html5_volume_slider_tooltip\\u003dtrue\\u0026html5_web_po_experiment_ids\\u003d[]\\u0026html5_webpo_idle_priority_job\\u003dtrue\\u0026html5_woffle_resume\\u003dtrue\\u0026html5_workaround_delay_trigger\\u003dtrue\\u0026ignore_overlapping_cue_points_on_endemic_live_html5\\u003dtrue\\u0026il_payload_scraping\\u003d\\u0026il_use_view_model_logging_context\\u003dtrue\\u0026initial_gel_batch_timeout\\u003d2000\\u0026injected_license_handler_error_code\\u003d0\\u0026injected_license_handler_license_status\\u003d0\\u0026itdrm_enable_revocation_reporting\\u003dtrue\\u0026itdrm_injected_license_service_error_code\\u003d0\\u0026itdrm_widevine_hardened_vmp_mode\\u003dlog\\u0026json_condensed_response\\u003dtrue\\u0026kev_adb_pg\\u003dtrue\\u0026kevlar_command_handler_command_banlist\\u003d[]\\u0026kevlar_dropdown_fix\\u003dtrue\\u0026kevlar_gel_error_routing\\u003dtrue\\u0026kevlar_miniplayer\\u003dtrue\\u0026kevlar_miniplayer_expand_top\\u003dtrue\\u0026kevlar_miniplayer_play_pause_on_scrim\\u003dtrue\\u0026kevlar_playback_associated_queue\\u003dtrue\\u0026kevlar_queue_use_update_api\\u003dtrue\\u0026kevlar_use_wil_icons\\u003dtrue\\u0026kevlar_vimio_use_shared_monitor\\u003dtrue\\u0026kevlar_woffle\\u003dtrue\\u0026kids_web_client_log_screen_associated\\u003dtrue\\u0026live_chat_enable_rta_manager\\u003dtrue\\u0026live_chunk_readahead\\u003d3\\u0026live_fresca_v2\\u003dtrue\\u0026log_errors_through_nwl_on_retry\\u003dtrue\\u0026log_gel_compression_latency\\u003dtrue\\u0026log_heartbeat_with_lifecycles\\u003dtrue\\u0026log_web_endpoint_to_layer\\u003dtrue\\u0026log_window_onerror_fraction\\u003d0.1\\u0026manifestless_post_live\\u003dtrue\\u0026manifestless_post_live_ufph\\u003dtrue\\u0026max_body_size_to_compress\\u003d500000\\u0026max_prefetch_window_sec_for_livestream_optimization\\u003d10\\u0026max_resolution_for_white_noise\\u003d360\\u0026mdx_enable_privacy_disclosure_ui\\u003dtrue\\u0026mdx_load_cast_api_bootstrap_script\\u003dtrue\\u0026migrate_events_to_ts\\u003dtrue\\u0026migrate_remaining_web_ad_badges_to_innertube\\u003dtrue\\u0026min_prefetch_offset_sec_for_livestream_optimization\\u003d20\\u0026move_survey_ad_renderer_ve_asde\\u003dtrue\\u0026move_vss_away_from_login_info_cookie\\u003dtrue\\u0026music_enable_shared_audio_tier_logic\\u003dtrue\\u0026mweb_c3_endscreen\\u003dtrue\\u0026mweb_deprecate_skip_ve_logging\\u003dtrue\\u0026mweb_enable_custom_control_shared\\u003dtrue\\u0026mweb_enable_skippables_on_jio_phone\\u003dtrue\\u0026mweb_native_control_in_faux_fullscreen_shared\\u003dtrue\\u0026network_polling_interval\\u003d30000\\u0026networkless_gel\\u003dtrue\\u0026networkless_logging\\u003dtrue\\u0026new_codecs_string_api_uses_legacy_style\\u003dtrue\\u0026new_csn_storage_design\\u003dtrue\\u0026nwl_send_fast_on_unload\\u003dtrue\\u0026nwl_send_from_memory_when_online\\u003dtrue\\u0026offline_error_handling\\u003dtrue\\u0026override_drm_required_playback_policy_channels\\u003d[]\\u0026pacf_logging_delay_milliseconds_through_ybfe_tv\\u003d30000\\u0026pageid_as_header_web\\u003dtrue\\u0026partial_rewind_buffer_seconds\\u003d0\\u0026player_ads_set_adformat_on_client\\u003dtrue\\u0026player_allow_autonav_after_playlist\\u003dtrue\\u0026player_bootstrap_method\\u003dtrue\\u0026player_destroy_old_version\\u003dtrue\\u0026player_doubletap_to_seek\\u003dtrue\\u0026player_enable_playback_playlist_change\\u003dtrue\\u0026player_underlay_min_player_width\\u003d768.0\\u0026player_underlay_video_width_fraction\\u003d0.6\\u0026player_web_canary_stage\\u003d0\\u0026playready_first_play_expiration\\u003d-1\\u0026polymer_bad_build_labels\\u003dtrue\\u0026polymer_verifiy_app_state\\u003dtrue\\u0026populate_author_with_podcast_name_in_video_details\\u003dtrue\\u0026preskip_button_style_ads_backend\\u003dcountdown_next_to_thumbnail\\u0026qoe_nwl_downloads\\u003dtrue\\u0026qoe_send_and_write\\u003dtrue\\u0026record_app_crashed_web\\u003dtrue\\u0026reject_live_ott_h264_clear_240p\\u003dtrue\\u0026reject_live_vp9_mq_clear_with_no_abr_ladder\\u003dtrue\\u0026replace_closure_window_with_updated_ytwindow_in_studio\\u003dtrue\\u0026replace_playability_retriever_in_watch\\u003dtrue\\u0026scheduler_use_raf_by_default\\u003dtrue\\u0026self_podding_header_string_template\\u003dself_podding_interstitial_message\\u0026self_podding_highlight_non_default_button\\u003dtrue\\u0026self_podding_midroll_choice_string_template\\u003dself_podding_midroll_choice\\u0026send_config_hash_timer\\u003d0\\u0026set_interstitial_advertisers_question_text\\u003dtrue\\u0026set_mock_id_as_expected_content_binding\\u003d\\u0026shell_load_gcf\\u003dtrue\\u0026short_start_time_prefer_publish_in_watch_log\\u003dtrue\\u0026shorts_mode_to_player_api\\u003dtrue\\u0026should_clear_video_data_on_player_cued_unstarted\\u003dtrue\\u0026simply_embedded_enable_botguard\\u003dtrue\\u0026skip_inline_muted_license_service_check\\u003dtrue\\u0026skip_invalid_ytcsi_ticks\\u003dtrue\\u0026skip_ls_gel_retry\\u003dtrue\\u0026skip_setting_info_in_csi_data_object\\u003dtrue\\u0026slow_compressions_before_abandon_count\\u003d4\\u0026speedmaster_cancellation_movement_dp\\u003d10\\u0026speedmaster_playback_rate\\u003d2.0\\u0026speedmaster_touch_activation_ms\\u003d500\\u0026st_skip_debug_params\\u003dtrue\\u0026start_client_gcf\\u003dtrue\\u0026start_client_gcf_for_player\\u003dtrue\\u0026start_sending_config_hash\\u003dtrue\\u0026streaming_data_emergency_itag_blacklist\\u003d[]\\u0026substitute_ad_cpn_macro_in_ssdai\\u003dtrue\\u0026suppress_error_204_logging\\u003dtrue\\u0026transport_use_scheduler\\u003dtrue\\u0026trigger_impression_pings_on_view_search_desktop\\u003dtrue\\u0026tv_pacf_logging_sample_rate\\u003d0.01\\u0026tvhtml5_unplugged_preload_cache_size\\u003d5\\u0026unplugged_dai_live_chunk_readahead\\u003d3\\u0026unplugged_tvhtml5_video_preload_on_focus_delay_ms\\u003d0\\u0026update_log_event_config\\u003dtrue\\u0026use_accessibility_data_on_desktop_player_button\\u003dtrue\\u0026use_color_palettes_modern_collections_v2\\u003dtrue\\u0026use_core_sm\\u003dtrue\\u0026use_csi_stp_handler\\u003dtrue\\u0026use_inlined_player_rpc\\u003dtrue\\u0026use_new_cml\\u003dtrue\\u0026use_new_in_memory_storage\\u003dtrue\\u0026use_new_nwl_initialization\\u003dtrue\\u0026use_new_nwl_saw\\u003dtrue\\u0026use_new_nwl_stw\\u003dtrue\\u0026use_new_nwl_wts\\u003dtrue\\u0026use_player_abuse_bg_library\\u003dtrue\\u0026use_player_cue_range_set\\u003dtrue\\u0026use_profilepage_event_label_in_carousel_playbacks\\u003dtrue\\u0026use_request_time_ms_header\\u003dtrue\\u0026use_session_based_sampling\\u003dtrue\\u0026use_shared_notf_vp9_360p_format_filter_rules\\u003dtrue\\u0026use_ts_visibilitylogger\\u003dtrue\\u0026validate_el_adunit_usage_mweb\\u003d0.1\\u0026variable_buffer_timeout_ms\\u003d0\\u0026vp9_drm_live\\u003dtrue\\u0026vss_final_ping_send_and_write\\u003dtrue\\u0026vss_pings_using_networkless\\u003dtrue\\u0026vss_playback_use_send_and_write\\u003dtrue\\u0026web_api_url\\u003dtrue\\u0026web_async_context_processor_impl\\u003dstandalone\\u0026web_big_boards\\u003dtrue\\u0026web_big_boards_enable_in_inline\\u003dtrue\\u0026web_big_boards_enable_in_miniplayer\\u003dtrue\\u0026web_cinematic_watch_settings\\u003dtrue\\u0026web_client_version_override\\u003d\\u0026web_collect_offline_state\\u003dtrue\\u0026web_csi_action_sampling_enabled\\u003dtrue\\u0026web_csi_debug_sample_enabled\\u003dtrue\\u0026web_dedupe_ve_grafting\\u003dtrue\\u0026web_deprecate_service_ajax_map_dependency\\u003dtrue\\u0026web_disable_channels_chapter_entrypoint\\u003dtrue\\u0026web_enable_ab_em_rsp\\u003dtrue\\u0026web_enable_ab_rsp_cl\\u003dtrue\\u0026web_enable_abd_ref\\u003dtrue\\u0026web_enable_error_204\\u003dtrue\\u0026web_enable_speedmaster\\u003dtrue\\u0026web_enable_voz_audio_feedback\\u003dtrue\\u0026web_fix_fine_scrubbing_drag\\u003dtrue\\u0026web_foreground_heartbeat_interval_ms\\u003d28000\\u0026web_forward_command_on_pbj\\u003dtrue\\u0026web_gel_debounce_ms\\u003d60000\\u0026web_gel_timeout_cap\\u003dtrue\\u0026web_heat_map_v2\\u003dtrue\\u0026web_key_moments_markers\\u003dtrue\\u0026web_l3_storyboard\\u003dtrue\\u0026web_log_memory_total_kbytes\\u003dtrue\\u0026web_logging_max_batch\\u003d150\\u0026web_logging_max_batch_hard_limit\\u003dtrue\\u0026web_modern_ads\\u003dtrue\\u0026web_modern_buttons\\u003dtrue\\u0026web_modern_buttons_bl_survey\\u003dtrue\\u0026web_modern_player_settings_quality_bottom\\u003dtrue\\u0026web_modern_subscribe\\u003dtrue\\u0026web_modern_subscribe_style\\u003dfilled\\u0026web_new_autonav_countdown\\u003dtrue\\u0026web_one_platform_error_handling\\u003dtrue\\u0026web_op_signal_type_banlist\\u003d[]\\u0026web_playback_associated_log_ctt\\u003dtrue\\u0026web_playback_associated_ve\\u003dtrue\\u0026web_player_add_ve_conversion_logging_to_outbound_links\\u003dtrue\\u0026web_player_always_enable_auto_translation\\u003dtrue\\u0026web_player_api_logging_fraction\\u003d0.01\\u0026web_player_autonav_empty_suggestions_fix\\u003dtrue\\u0026web_player_autonav_toggle_always_listen\\u003dtrue\\u0026web_player_autonav_use_server_provided_state\\u003dtrue\\u0026web_player_caption_language_preference_stickiness_duration\\u003d30\\u0026web_player_disable_inline_scrubbing\\u003dtrue\\u0026web_player_enable_cultural_moment_overlay\\u003dtrue\\u0026web_player_enable_early_warning_snackbar\\u003dtrue\\u0026web_player_enable_info_button_in_banner_on_desktop\\u003dtrue\\u0026web_player_enable_premium_hbr_in_h5_api\\u003dtrue\\u0026web_player_enable_premium_hbr_playback_cap\\u003dtrue\\u0026web_player_enable_vod_featured_product_banner_on_desktop\\u003dtrue\\u0026web_player_innertube_playlist_update\\u003dtrue\\u0026web_player_ipp_canary_type_for_logging\\u003d\\u0026web_player_log_click_before_generating_ve_conversion_params\\u003dtrue\\u0026web_player_move_autonav_toggle\\u003dtrue\\u0026web_player_music_visualizer_treatment\\u003dfake\\u0026web_player_nitrate_promo_tooltip\\u003dtrue\\u0026web_player_offline_playlist_auto_refresh\\u003dtrue\\u0026web_player_seek_chapters_by_shortcut\\u003dtrue\\u0026web_player_sentinel_is_uniplayer\\u003dtrue\\u0026web_player_should_honor_include_asr_setting\\u003dtrue\\u0026web_player_show_music_in_this_video_graphic\\u003dvideo_thumbnail\\u0026web_player_small_hbp_settings_menu\\u003dtrue\\u0026web_player_ss_dai_ad_fetching_timeout_ms\\u003d15000\\u0026web_player_ss_media_time_offset\\u003dtrue\\u0026web_player_topify_subtitles_for_shorts\\u003dtrue\\u0026web_player_touch_mode_improvements\\u003dtrue\\u0026web_player_transfer_timeout_threshold_ms\\u003d10800000\\u0026web_player_use_cinematic_label_2\\u003dtrue\\u0026web_player_use_heartbeat_poll_delay_ms\\u003dtrue\\u0026web_player_use_new_api_for_quality_pullback\\u003dtrue\\u0026web_player_ve_conversion_fixes_for_channel_info\\u003dtrue\\u0026web_prefetch_preload_video\\u003dtrue\\u0026web_rounded_thumbnails\\u003dtrue\\u0026web_scheduler_auto_init\\u003dtrue\\u0026web_settings_menu_icons\\u003dtrue\\u0026web_smoothness_test_duration_ms\\u003d0\\u0026web_smoothness_test_method\\u003d0\\u0026web_speedmaster_spacebar_control\\u003dtrue\\u0026web_speedmaster_updated_edu\\u003dtrue\\u0026web_yt_config_context\\u003dtrue\\u0026webfe_disable_ab_em_plb\\u003dtrue\\u0026wil_icon_max_concurrent_fetches\\u003d9999\\u0026wil_icon_render_when_idle\\u003dtrue\\u0026wiz_use_generic_logging_infra\\u003dtrue\\u0026woffle_clean_up_after_entity_migration\\u003dtrue\\u0026woffle_enable_download_status\\u003dtrue\\u0026woffle_orchestration\\u003dtrue\\u0026woffle_playlist_optimization\\u003dtrue\\u0026woffle_used_state_report\\u003dtrue\\u0026ytidb_clear_embedded_player\\u003dtrue\\u0026ytidb_fetch_datasync_ids_for_data_cleanup\\u003dtrue\\u0026ytidb_remake_db_retries\\u003d3\\u0026ytidb_reopen_db_retries\\u003d3\\u0026ytidb_transaction_ended_event_rate_limit\\u003d0.02\\u0026ytidb_transaction_ended_event_rate_limit_session\\u003d0.2\\u0026ytidb_transaction_ended_event_rate_limit_transaction\\u003d0.1\",\"disableFullscreen\":true,\"cspNonce\":\"xW_SWKdw4-d_OLdvn29m6Q\",\"canaryState\":\"none\",\"enableCsiLogging\":true,\"csiPageType\":\"watch\",\"disableMdxCast\":true,\"datasyncId\":\"Vc2a81ef1||\",\"showInlinePreviewUi\":true,\"canaryStage\":\"\"},\"WEB_PLAYER_CONTEXT_CONFIG_ID_HANDLES_CLAIMING\":{\"rootElementId\":\"ytd-handles-claiming-video-item-renderer\",\"jsUrl\":\"/s/player/63e90c30/player_ias.vflset/en_US/base.js\",\"cssUrl\":\"/s/player/63e90c30/www-player.css\",\"contextId\":\"WEB_PLAYER_CONTEXT_CONFIG_ID_HANDLES_CLAIMING\",\"eventLabel\":\"handlesclaiming\",\"contentRegion\":\"IT\",\"hl\":\"en_US\",\"hostLanguage\":\"en\",\"playerStyle\":\"desktop-polymer\",\"innertubeApiKey\":\"AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\",\"innertubeApiVersion\":\"v1\",\"innertubeContextClientVersion\":\"2.20231121.08.00\",\"disableRelatedVideos\":true,\"device\":{\"brand\":\"\",\"model\":\"\",\"browser\":\"Chrome\",\"browserVersion\":\"[scrubbed]\",\"os\":\"Windows\",\"osVersion\":\"10.0\",\"platform\":\"DESKTOP\",\"interfaceName\":\"WEB\",\"interfaceVersion\":\"2.20231121.08.00\"},\"serializedExperimentIds\":\"23983296,23986028,24004644,24007246,24080738,24135310,24208765,24371398,24371779,24385728,24439361,24524098,24543193,24543197,24543199,24543201,24549786,24550458,24559327,24560416,24566293,24566687,24699899,51006181,51010235,51012165,51017346,51026715,51027535,51028271,51030311,51035166,51037540,51038399,51038805,51039199,51039493,51039699,51041809,51044150,51044152,51044154,51044158,51046164,51047619,51049006,51054675,51055917,51056050,51057534,51060161,51067339,51069001\",\"serializedExperimentFlags\":\"H5_async_logging_delay_ms\\u003d30000.0\\u0026H5_enable_full_pacf_logging\\u003dtrue\\u0026H5_use_async_logging\\u003dtrue\\u0026ab_det_apb_b\\u003dtrue\\u0026ab_det_fet_wr\\u003dtrue\\u0026ab_det_fet_wr_en\\u003dtrue\\u0026ab_det_gen_re\\u003dtrue\\u0026action_companion_center_align_description\\u003dtrue\\u0026ad_pod_disable_companion_persist_ads_quality\\u003dtrue\\u0026addto_ajax_log_warning_fraction\\u003d0.1\\u0026align_ad_to_video_player_lifecycle_for_bulleit\\u003dtrue\\u0026allow_drm_override\\u003dtrue\\u0026allow_live_autoplay\\u003dtrue\\u0026allow_poltergust_autoplay\\u003dtrue\\u0026allow_skip_networkless\\u003dtrue\\u0026allow_vp9_1080p_mq_enc\\u003dtrue\\u0026att_web_record_metrics\\u003dtrue\\u0026autoplay_time\\u003d8000\\u0026autoplay_time_for_fullscreen\\u003d3000\\u0026autoplay_time_for_music_content\\u003d3000\\u0026bg_vm_reinit_threshold\\u003d7200000\\u0026blocked_packages_for_sps\\u003d[]\\u0026botguard_async_snapshot_timeout_ms\\u003d3000\\u0026captions_url_add_ei\\u003dtrue\\u0026check_ad_ui_status_for_mweb_safari\\u003dtrue\\u0026check_navigator_accuracy_timeout_ms\\u003d0\\u0026clear_user_partitioned_ls\\u003dtrue\\u0026client_respect_autoplay_switch_button_renderer\\u003dtrue\\u0026compress_gel\\u003dtrue\\u0026compression_disable_point\\u003d10\\u0026compression_performance_threshold\\u003d250\\u0026csi_on_gel\\u003dtrue\\u0026dash_manifest_version\\u003d5\\u0026debug_bandaid_hostname\\u003d\\u0026debug_sherlog_username\\u003d\\u0026delay_ads_gvi_call_on_bulleit_living_room_ms\\u003d0\\u0026deprecate_csi_has_info\\u003dtrue\\u0026deprecate_delay_ping\\u003dtrue\\u0026deprecate_pair_servlet_enabled\\u003dtrue\\u0026desktop_image_cta_no_background\\u003dtrue\\u0026desktop_log_img_click_location\\u003dtrue\\u0026desktop_sparkles_light_cta_button\\u003dtrue\\u0026disable_channel_id_check_for_suspended_channels\\u003dtrue\\u0026disable_child_node_auto_formatted_strings\\u003dtrue\\u0026disable_defer_admodule_on_advertiser_video\\u003dtrue\\u0026disable_features_for_supex\\u003dtrue\\u0026disable_inline_preview_scrubbing_for_vac_ads_on_web\\u003dtrue\\u0026disable_legacy_desktop_remote_queue\\u003dtrue\\u0026disable_mdx_connection_in_mdx_module_for_music_web\\u003dtrue\\u0026disable_new_pause_state3\\u003dtrue\\u0026disable_pacf_logging_for_memory_limited_tv\\u003dtrue\\u0026disable_rounding_ad_notify\\u003dtrue\\u0026disable_simple_mixed_direction_formatted_strings\\u003dtrue\\u0026disable_ssdai_on_errors\\u003dtrue\\u0026disable_tabbing_before_flyout_ad_elements_appear\\u003dtrue\\u0026disable_thumbnail_preloading\\u003dtrue\\u0026edge_encryption_fill_primary_key_version\\u003dtrue\\u0026embeds_add_player_mode_to_ad_events\\u003dtrue\\u0026embeds_disable_progress_bar_context_menu_handling\\u003dtrue\\u0026embeds_enable_muted_autoplay\\u003dtrue\\u0026embeds_web_enable_autoplay_not_supported_logging_fix\\u003dtrue\\u0026embeds_web_enable_host_flags_client_permissions\\u003dtrue\\u0026embeds_web_enable_host_flags_innertube\\u003dtrue\\u0026embeds_web_enable_lite_logging\\u003dtrue\\u0026embeds_web_enable_load_player_from_page_show\\u003dtrue\\u0026embeds_web_enable_log_splay_as_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_autoplay\\u003dtrue\\u0026embeds_web_enable_mobile_dtts\\u003dtrue\\u0026embeds_web_enable_modestbranding_deprecation\\u003dtrue\\u0026embeds_web_enable_pause_overlay_wn_update\\u003dtrue\\u0026embeds_web_enable_pfp_unbranded_el_deprecation\\u003dtrue\\u0026embeds_web_enable_rcat_allowlist\\u003dtrue\\u0026embeds_web_enable_scripted_playback_blocked_logging_fix\\u003dtrue\\u0026embeds_web_enable_smallmode_fullscreen_button_fix\\u003dtrue\\u0026embeds_web_enable_ve_conversion_logging_tracking_no_allow_list\\u003dtrue\\u0026embeds_web_hide_unfilled_more_videos_suggestions\\u003dtrue\\u0026embeds_web_lite_mode\\u003d1\\u0026embeds_web_move_preload_by_player_vars_to_public\\u003dtrue\\u0026embeds_web_nwl_disable_nocookie\\u003dtrue\\u0026embeds_web_shopping_overlay_no_wait_for_paid_content_overlay\\u003dtrue\\u0026embeds_web_synth_ch_headers_banned_urls_regex\\u003d\\u0026enable_ab_report_on_errorscreen\\u003dtrue\\u0026enable_ab_rp_int\\u003dtrue\\u0026enable_ad_cpn_macro_substitution_for_click_pings\\u003dtrue\\u0026enable_app_promo_endcap_eml_on_tablet\\u003dtrue\\u0026enable_ata_dialog_all_web\\u003dtrue\\u0026enable_cast_for_web_unplugged\\u003dtrue\\u0026enable_cast_on_music_web\\u003dtrue\\u0026enable_client_page_id_header_for_first_party_pings\\u003dtrue\\u0026enable_client_sli_logging\\u003dtrue\\u0026enable_cta_banner_on_unplugged_lr\\u003dtrue\\u0026enable_dark_mode_style_endcap\\u003dtrue\\u0026enable_dark_mode_style_endcap_timed_pie_countdown\\u003dtrue\\u0026enable_discrete_live_precise_embargos\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_android\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_ios\\u003dtrue\\u0026enable_dsa_ad_badge_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_compliant_banner_image_ad_renderer\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_mobile\\u003dtrue\\u0026enable_dsa_innertube_for_action_endcap_on_web\\u003dtrue\\u0026enable_dsa_one_click_ata_translators_infeed_elements\\u003dtrue\\u0026enable_error_corrections_infocard\\u003dtrue\\u0026enable_error_corrections_infocard_web_client\\u003dtrue\\u0026enable_error_corrections_infocard_web_client_check\\u003dtrue\\u0026enable_error_corrections_infocards_icon_web\\u003dtrue\\u0026enable_eviction_protection_for_bulleit\\u003dtrue\\u0026enable_flow_logging_p4e\\u003dtrue\\u0026enable_free_preview_timer\\u003dtrue\\u0026enable_gel_log_commands\\u003dtrue\\u0026enable_h5_player_ad_block_status_logging\\u003dtrue\\u0026enable_h5_player_ad_block_status_piping\\u003dtrue\\u0026enable_handles_account_menu_switcher\\u003dtrue\\u0026enable_high_frequency_cookie_rotation\\u003dtrue\\u0026enable_kabuki_comments_on_shorts\\u003ddisabled\\u0026enable_live_ad_serving_context\\u003dtrue\\u0026enable_live_premiere_web_player_indicator\\u003dtrue\\u0026enable_loggingcontext_trackingparams\\u003dtrue\\u0026enable_lr_home_infeed_ads_inline_playback_progress_pings\\u003dtrue\\u0026enable_mixed_direction_formatted_strings\\u003dtrue\\u0026enable_modern_skip_button_on_web\\u003dtrue\\u0026enable_multiple_heatseeker_decorations\\u003dtrue\\u0026enable_mweb_endcap_clickable_icon_description\\u003dtrue\\u0026enable_mweb_endcap_dark_mode_action_button\\u003dtrue\\u0026enable_mweb_livestream_ui_update\\u003dtrue\\u0026enable_new_paid_product_placement\\u003dtrue\\u0026enable_out_of_stock_text_all_surfaces\\u003dtrue\\u0026enable_pacf_slot_asde_infeed_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5\\u003dtrue\\u0026enable_pacf_slot_asde_player_byte_h5_TV\\u003dtrue\\u0026enable_pacf_through_ybfe_tv\\u003dtrue\\u0026enable_pacf_through_ybfe_tv_for_page_top_formats\\u003dtrue\\u0026enable_pacf_through_ysfe_tv\\u003dtrue\\u0026enable_pass_sdc_get_accounts_list\\u003dtrue\\u0026enable_pl_r_c\\u003dtrue\\u0026enable_pl_r_c_s\\u003dtrue\\u0026enable_pl_r_si_fa\\u003dtrue\\u0026enable_player_param_truncation_before_navigation_on_web_on_search\\u003dtrue\\u0026enable_populate_att_psd_in_abe_feedback\\u003dtrue\\u0026enable_populate_psd_in_abe_feedback\\u003dtrue\\u0026enable_post_ad_perception_survey_fix_on_tvhtml5\\u003dtrue\\u0026enable_post_ad_perception_survey_in_tvhtml5\\u003dtrue\\u0026enable_sdf_midroll_postroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_main\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_all_android_misc\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_h5\\u003dtrue\\u0026enable_sdf_preroll_player_bytes_video_tv\\u003dtrue\\u0026enable_server_stitched_dai\\u003dtrue\\u0026enable_set_endcap_thumbnail_from_layout\\u003dtrue\\u0026enable_shorts_player\\u003dtrue\\u0026enable_skip_ad_guidance_prompt\\u003dtrue\\u0026enable_skippable_ads_for_unplugged_ad_pod\\u003dtrue\\u0026enable_small_endcap_action_button_for_mweb\\u003dtrue\\u0026enable_smearing_expansion_dai\\u003dtrue\\u0026enable_tectonic_ad_ux_for_halftime\\u003dtrue\\u0026enable_third_party_info\\u003dtrue\\u0026enable_topsoil_wta_for_halftime_live_infra\\u003dtrue\\u0026enable_unknown_lact_fix_on_html5\\u003dtrue\\u0026enable_web_media_session_metadata_fix\\u003dtrue\\u0026enable_web_tiered_gel\\u003dtrue\\u0026enable_wn_infocards\\u003dtrue\\u0026enable_yt_ata_iframe_authuser\\u003dtrue\\u0026err_on_pl_r_c\\u003dtrue\\u0026error_message_for_gsuite_network_restrictions\\u003dtrue\\u0026export_networkless_options\\u003dtrue\\u0026external_fullscreen_with_edu\\u003dtrue\\u0026fetch_att_independently\\u003dtrue\\u0026fetch_bid_for_dclk_status\\u003dtrue\\u0026fill_single_video_with_notify_to_lasr\\u003dtrue\\u0026filter_vp9_for_csdai\\u003dtrue\\u0026fix_ads_tracking_for_swf_config_deprecation_mweb\\u003dtrue\\u0026fix_h5_toggle_button_a11y\\u003dtrue\\u0026fix_survey_color_contrast_on_destop\\u003dtrue\\u0026fix_toggle_button_role_for_ad_components\\u003dtrue\\u0026fix_web_instream_survey_question_aria_label\\u003dtrue\\u0026gcf_config_store_enabled\\u003dtrue\\u0026gcf_music_innertube\\u003dtrue\\u0026gel_min_batch_size\\u003d3\\u0026gel_queue_timeout_max_ms\\u003d300000\\u0026gpa_sparkles_ten_percent_layer\\u003dtrue\\u0026gvi_channel_client_screen\\u003dtrue\\u0026h5_companion_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_enable_generic_error_logging_event\\u003dtrue\\u0026h5_enable_unified_csi_preroll\\u003dtrue\\u0026h5_inplayer_enable_adcpn_macro_substitution_for_click_pings\\u003dtrue\\u0026h5_reset_cache_and_filter_before_update_masthead\\u003dtrue\\u0026heatseeker_decoration_threshold\\u003d0.8\\u0026hfr_dropped_framerate_fallback_threshold\\u003d0\\u0026hide_cta_for_home_web_video_ads_animate_in_time\\u003d2\\u0026hide_endpoint_overflow_on_ytd_display_ad_renderer\\u003dtrue\\u0026html5_ad_timeout_ms\\u003d0\\u0026html5_adaptation_step_count\\u003d0\\u0026html5_add_dai_smearing_to_qoe\\u003dtrue\\u0026html5_add_drm_formats_to_test_format\\u003dtrue\\u0026html5_ads_preroll_lock_timeout_delay_ms\\u003d15000\\u0026html5_allow_video_keyframe_without_audio\\u003dtrue\\u0026html5_apply_min_failures\\u003dtrue\\u0026html5_apply_start_time_within_ads_for_ssdai_transitions\\u003dtrue\\u0026html5_atr_disable_force_fallback\\u003dtrue\\u0026html5_attach_num_random_bytes_to_bandaid\\u003d0\\u0026html5_attach_po_token_to_bandaid\\u003dtrue\\u0026html5_autonav_cap_idle_secs\\u003d0\\u0026html5_autonav_quality_cap\\u003d720\\u0026html5_autoplay_default_quality_cap\\u003d0\\u0026html5_block_pip_safari_delay\\u003d0\\u0026html5_bypass_contention_secs\\u003d0.0\\u0026html5_cache_request_key\\u003d\\u0026html5_check_for_idle_network_interval_ms\\u003d-1\\u0026html5_check_video_data_errors_before_playback_start\\u003dtrue\\u0026html5_cobalt_default_buffer_size_in_bytes\\u003d0\\u0026html5_cobalt_max_size_for_immed_job\\u003d0\\u0026html5_cobalt_min_processor_cnt_to_offload_algo\\u003d0\\u0026html5_cobalt_override_quic\\u003d0\\u0026html5_consume_media_bytes_slice_infos\\u003dtrue\\u0026html5_continuous_goodput_probe_interval_ms\\u003d0\\u0026html5_de_dupe_content_video_loads_in_lifecycle_api\\u003dtrue\\u0026html5_debug_data_log_probability\\u003d0.1\\u0026html5_decode_to_texture_cap\\u003dtrue\\u0026html5_default_ad_gain\\u003d0.5\\u0026html5_default_quality_cap\\u003d0\\u0026html5_defer_fetch_att_ms\\u003d1000\\u0026html5_delayed_retry_count\\u003d1\\u0026html5_delayed_retry_delay_ms\\u003d5000\\u0026html5_deprecate_adservice\\u003dtrue\\u0026html5_deprecate_video_tag_pool\\u003dtrue\\u0026html5_desktop_vr180_allow_panning\\u003dtrue\\u0026html5_df_downgrade_thresh\\u003d0.6\\u0026html5_disable_csi_for_bulleit\\u003dtrue\\u0026html5_disable_move_pssh_to_moov\\u003dtrue\\u0026html5_disable_non_contiguous\\u003dtrue\\u0026html5_displayed_frame_rate_downgrade_threshold\\u003d45\\u0026html5_drm_byterate_soft_cap\\u003d0\\u0026html5_drm_check_all_key_error_states\\u003dtrue\\u0026html5_drm_cpi_license_key\\u003dtrue\\u0026html5_drm_live_byterate_soft_cap\\u003d0\\u0026html5_enable_ac3\\u003dtrue\\u0026html5_enable_ads_client_monitoring_log_tv\\u003dtrue\\u0026html5_enable_caption_changes_for_mosaic\\u003dtrue\\u0026html5_enable_client_hints_override\\u003dtrue\\u0026html5_enable_composite_embargo\\u003dtrue\\u0026html5_enable_eac3\\u003dtrue\\u0026html5_enable_embedded_player_visibility_signals\\u003dtrue\\u0026html5_enable_non_notify_composite_vod_lsar_pacf\\u003dtrue\\u0026html5_enable_oduc\\u003dtrue\\u0026html5_enable_pp_proxima_eligible\\u003dtrue\\u0026html5_enable_single_video_vod_ivar_on_pacf\\u003dtrue\\u0026html5_enable_tvos_dash\\u003dtrue\\u0026html5_enable_tvos_encrypted_vp9\\u003dtrue\\u0026html5_enable_widevine_for_alc\\u003dtrue\\u0026html5_enable_widevine_for_fast_linear\\u003dtrue\\u0026html5_encourage_array_coalescing\\u003dtrue\\u0026html5_gapless_ended_transition_buffer_ms\\u003d200\\u0026html5_gapless_handoff_close_end_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_close_end_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_handoff_started_long_rebuffer_cfl\\u003dtrue\\u0026html5_gapless_handoff_started_long_rebuffer_delay_ms\\u003d0\\u0026html5_gapless_loop_seek_offset_in_milli\\u003d0\\u0026html5_generate_session_po_token\\u003dtrue\\u0026html5_gl_fps_threshold\\u003d0\\u0026html5_hdcp_probing_stream_url\\u003d\\u0026html5_head_miss_secs\\u003d0.0\\u0026html5_hfr_quality_cap\\u003d0\\u0026html5_high_res_logging_percent\\u003d0.01\\u0026html5_honor_caption_availabilities_in_audio_track\\u003dtrue\\u0026html5_hopeless_secs\\u003d0\\u0026html5_idle_rate_limit_ms\\u003d0\\u0026html5_ignore_interruptive_ads_for_server_stitched\\u003dtrue\\u0026html5_ignore_stall_from_no_data_timeouts\\u003dtrue\\u0026html5_innertube_heartbeats_for_fairplay\\u003dtrue\\u0026html5_innertube_heartbeats_for_playready\\u003dtrue\\u0026html5_innertube_heartbeats_for_widevine\\u003dtrue\\u0026html5_ios4_seek_above_zero\\u003dtrue\\u0026html5_ios7_force_play_on_stall\\u003dtrue\\u0026html5_ios_force_seek_to_zero_on_stop\\u003dtrue\\u0026html5_jumbo_mobile_subsegment_readahead_target\\u003d3.0\\u0026html5_jumbo_ull_nonstreaming_mffa_ms\\u003d4000\\u0026html5_jumbo_ull_subsegment_readahead_target\\u003d1.3\\u0026html5_license_constraint_delay\\u003d5000\\u0026html5_live_abr_head_miss_fraction\\u003d0.0\\u0026html5_live_abr_repredict_fraction\\u003d0.0\\u0026html5_live_chunk_readahead_proxima_override\\u003d0\\u0026html5_live_head_playable\\u003dtrue\\u0026html5_live_low_latency_bandwidth_window\\u003d0.0\\u0026html5_live_normal_latency_bandwidth_window\\u003d0.0\\u0026html5_live_quality_cap\\u003d0\\u0026html5_live_ultra_low_latency_bandwidth_window\\u003d0.0\\u0026html5_liveness_drift_chunk_override\\u003d0\\u0026html5_liveness_drift_proxima_override\\u003d0\\u0026html5_log_audio_abr\\u003dtrue\\u0026html5_log_audio_switch_metrics\\u003dtrue\\u0026html5_log_experiment_id_from_player_response_to_ctmp\\u003d\\u0026html5_log_first_ssdai_requests_killswitch\\u003dtrue\\u0026html5_log_rebuffer_events\\u003d5\\u0026html5_log_trigger_events_with_debug_data\\u003dtrue\\u0026html5_long_rebuffer_jiggle_cmt_delay_ms\\u003d0\\u0026html5_long_rebuffer_threshold_ms\\u003d30000\\u0026html5_manifestless_unplugged\\u003dtrue\\u0026html5_manifestless_vp9_otf\\u003dtrue\\u0026html5_max_buffer_health_for_downgrade_prop\\u003d-1.0\\u0026html5_max_buffer_health_for_downgrade_secs\\u003d0.0\\u0026html5_max_byterate\\u003d0\\u0026html5_max_drift_per_track_secs\\u003d0.0\\u0026html5_max_headm_for_streaming_xhr\\u003d0\\u0026html5_max_live_dvr_window_plus_margin_secs\\u003d46800.0\\u0026html5_max_readbehind_secs\\u003d0\\u0026html5_max_redirect_response_length\\u003d8192\\u0026html5_max_selectable_quality_ordinal\\u003d0\\u0026html5_max_source_buffer_append_size_in_bytes\\u003d0\\u0026html5_maximum_readahead_seconds\\u003d0.0\\u0026html5_media_fullscreen\\u003dtrue\\u0026html5_mffa_ms_proxima_override\\u003d0\\u0026html5_mfl_extend_max_request_time\\u003dtrue\\u0026html5_min_failures_to_delay_retry\\u003d3\\u0026html5_min_media_duration_for_append_prop\\u003d0.0\\u0026html5_min_media_duration_for_cabr_slice\\u003d0.0\\u0026html5_min_progress_event_interval_ms\\u003d10\\u0026html5_min_quality_ordinal\\u003d0\\u0026html5_min_readbehind_cap_secs\\u003d60\\u0026html5_min_readbehind_secs\\u003d0\\u0026html5_min_seconds_between_format_selections\\u003d0.0\\u0026html5_min_selectable_quality_ordinal\\u003d0\\u0026html5_min_startup_buffered_ad_media_duration_secs\\u003d1.2\\u0026html5_min_startup_buffered_media_duration_secs\\u003d1.2\\u0026html5_min_startup_duration_live_secs\\u003d0.25\\u0026html5_min_upgrade_health_secs\\u003d0.0\\u0026html5_minimum_readahead_seconds\\u003d0.0\\u0026html5_mock_content_binding_for_session_token\\u003d\\u0026html5_no_placeholder_rollbacks\\u003dtrue\\u0026html5_non_network_rebuffer_duration_ms\\u003d0\\u0026html5_non_onesie_attach_po_token\\u003dtrue\\u0026html5_normal_latency_mffa_ms\\u003d0\\u0026html5_not_register_disposables_when_core_listens\\u003dtrue\\u0026html5_oduc_transfer_logging\\u003dtrue\\u0026html5_offline_failure_retry_limit\\u003d2\\u0026html5_offline_prevent_redownload_downloaded_video\\u003dtrue\\u0026html5_onesie_defer_content_loader_ms\\u003d0\\u0026html5_onesie_live_ttl_secs\\u003d8\\u0026html5_onesie_notify_cuepoint_manager_on_completion\\u003dtrue\\u0026html5_onesie_prewarm_interval_ms\\u003d0\\u0026html5_onesie_prewarm_max_lact_ms\\u003d0\\u0026html5_onesie_redirector_timeout\\u003dtrue\\u0026html5_onesie_redirector_timeout_ms\\u003d0\\u0026html5_onesie_request_timeout_ms\\u003d1000\\u0026html5_pause_on_nonforeground_platform_errors\\u003dtrue\\u0026html5_peak_shave\\u003dtrue\\u0026html5_perf_cap_override_sticky\\u003dtrue\\u0026html5_performance_cap_floor\\u003d360\\u0026html5_performance_impact_profiling_timer_ms\\u003d0\\u0026html5_perserve_av1_perf_cap\\u003dtrue\\u0026html5_platform_minimum_readahead_seconds\\u003d0.0\\u0026html5_platform_whitelisted_for_frame_accurate_seeks\\u003dtrue\\u0026html5_player_autonav_logging\\u003dtrue\\u0026html5_player_dynamic_bottom_gradient\\u003dtrue\\u0026html5_player_min_build_cl\\u003d-1\\u0026html5_player_preload_ad_fix\\u003dtrue\\u0026html5_post_interrupt_readahead\\u003d20\\u0026html5_prefer_server_bwe3\\u003dtrue\\u0026html5_preload_wait_time_secs\\u003d0.0\\u0026html5_probe_primary_delay_base_ms\\u003d0\\u0026html5_process_all_encrypted_events\\u003dtrue\\u0026html5_ps4_shorts_1080p_soft_cap\\u003dtrue\\u0026html5_qoe_lh_max_report_count\\u003d0\\u0026html5_qoe_lh_min_duration_ms\\u003d0\\u0026html5_qoe_proto_mock_length\\u003d0\\u0026html5_query_sw_secure_crypto_for_android\\u003dtrue\\u0026html5_random_playback_cap\\u003d0\\u0026html5_recognize_predict_start_cue_point\\u003dtrue\\u0026html5_remove_command_triggered_companions\\u003dtrue\\u0026html5_remove_not_servable_check_killswitch\\u003dtrue\\u0026html5_rename_apbs\\u003dtrue\\u0026html5_report_fatal_drm_restricted_error_killswitch\\u003dtrue\\u0026html5_report_slow_ads_as_error\\u003dtrue\\u0026html5_repredict_interval_ms\\u003d0\\u0026html5_request_only_hdr_or_sdr_keys\\u003dtrue\\u0026html5_request_size_max_kb\\u003d0\\u0026html5_request_size_min_kb\\u003d0\\u0026html5_request_sizing_multiplier\\u003d0.8\\u0026html5_resource_bad_status_delay_scaling\\u003d1.5\\u0026html5_restore_time_after_unpause\\u003dtrue\\u0026html5_restore_time_after_unpause_redux\\u003dtrue\\u0026html5_restrict_streaming_xhr_on_sqless_requests\\u003dtrue\\u0026html5_retry_quota_exceeded_via_seek\\u003dtrue\\u0026html5_safari_desktop_eme_min_version\\u003d0\\u0026html5_samsung_kant_limit_max_bitrate\\u003d0\\u0026html5_seek_again_after_time_jump_cfl\\u003dtrue\\u0026html5_seek_jiggle_cmt_delay_ms\\u003d8000\\u0026html5_seek_new_elem_delay_ms\\u003d12000\\u0026html5_seek_new_elem_shorts_delay_ms\\u003d2000\\u0026html5_seek_new_media_element_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_element_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_new_media_source_shorts_reuse_cfl\\u003dtrue\\u0026html5_seek_new_media_source_shorts_reuse_delay_ms\\u003d0\\u0026html5_seek_set_cmt_delay_ms\\u003d2000\\u0026html5_seek_timeout_delay_ms\\u003d20000\\u0026html5_server_stitched_dai_decorated_url_retry_limit\\u003d5\\u0026html5_server_stitched_dai_group\\u003dtrue\\u0026html5_session_po_token_interval_time_ms\\u003d900000\\u0026html5_set_video_data_to_stale\\u003dtrue\\u0026html5_shorts_gapless_next_buffer_in_seconds\\u003d0\\u0026html5_skip_slow_ad_delay_ms\\u003d15000\\u0026html5_slow_start_no_media_source_delay_ms\\u003d0\\u0026html5_slow_start_timeout_delay_ms\\u003d20000\\u0026html5_ssdai_adfetch_dynamic_timeout_ms\\u003d5000\\u0026html5_ssdai_enable_new_seek_logic\\u003dtrue\\u0026html5_ssdai_failure_retry_limit\\u003d0\\u0026html5_stall_factor\\u003d0.0\\u0026html5_stall_window_size_ct\\u003d20\\u0026html5_stateful_audio_min_adjustment_value\\u003d0\\u0026html5_static_abr_resolution_shelf\\u003d0\\u0026html5_store_xhr_headers_readable\\u003dtrue\\u0026html5_streaming_xhr_time_based_consolidation_ms\\u003d0\\u0026html5_subsegment_readahead_load_speed_check_interval\\u003d0.5\\u0026html5_subsegment_readahead_min_buffer_health_secs\\u003d0.25\\u0026html5_subsegment_readahead_min_buffer_health_secs_on_timeout\\u003d0.1\\u0026html5_subsegment_readahead_min_load_speed\\u003d1.5\\u0026html5_subsegment_readahead_seek_latency_fudge\\u003d0.5\\u0026html5_subsegment_readahead_target_buffer_health_secs\\u003d0.5\\u0026html5_subsegment_readahead_timeout_secs\\u003d2.0\\u0026html5_top_shelf_format_byterate_factor\\u003d1.5\\u0026html5_track_overshoot\\u003dtrue\\u0026html5_transfer_processing_logs_interval\\u003d1000\\u0026html5_ugc_live_audio_51\\u003dtrue\\u0026html5_ugc_vod_audio_51\\u003dtrue\\u0026html5_unreported_seek_reseek_delay_ms\\u003d0\\u0026html5_unrestricted_layer_high_res_logging_percent\\u003d0.0\\u0026html5_update_time_on_seeked\\u003dtrue\\u0026html5_use_jsonformatter_to_parse_player_response\\u003dtrue\\u0026html5_use_post_for_media\\u003dtrue\\u0026html5_use_target_duration\\u003dtrue\\u0026html5_use_ump\\u003dtrue\\u0026html5_use_video_transition_endpoint_heartbeat\\u003dtrue\\u0026html5_video_tbd_min_kb\\u003d0\\u0026html5_viewport_undersend_maximum\\u003d0.0\\u0026html5_volume_slider_tooltip\\u003dtrue\\u0026html5_web_po_experiment_ids\\u003d[]\\u0026html5_webpo_idle_priority_job\\u003dtrue\\u0026html5_woffle_resume\\u003dtrue\\u0026html5_workaround_delay_trigger\\u003dtrue\\u0026ignore_overlapping_cue_points_on_endemic_live_html5\\u003dtrue\\u0026il_payload_scraping\\u003d\\u0026il_use_view_model_logging_context\\u003dtrue\\u0026initial_gel_batch_timeout\\u003d2000\\u0026injected_license_handler_error_code\\u003d0\\u0026injected_license_handler_license_status\\u003d0\\u0026itdrm_enable_revocation_reporting\\u003dtrue\\u0026itdrm_injected_license_service_error_code\\u003d0\\u0026itdrm_widevine_hardened_vmp_mode\\u003dlog\\u0026json_condensed_response\\u003dtrue\\u0026kev_adb_pg\\u003dtrue\\u0026kevlar_command_handler_command_banlist\\u003d[]\\u0026kevlar_dropdown_fix\\u003dtrue\\u0026kevlar_gel_error_routing\\u003dtrue\\u0026kevlar_miniplayer\\u003dtrue\\u0026kevlar_miniplayer_expand_top\\u003dtrue\\u0026kevlar_miniplayer_play_pause_on_scrim\\u003dtrue\\u0026kevlar_playback_associated_queue\\u003dtrue\\u0026kevlar_queue_use_update_api\\u003dtrue\\u0026kevlar_use_wil_icons\\u003dtrue\\u0026kevlar_vimio_use_shared_monitor\\u003dtrue\\u0026kevlar_woffle\\u003dtrue\\u0026kids_web_client_log_screen_associated\\u003dtrue\\u0026live_chat_enable_rta_manager\\u003dtrue\\u0026live_chunk_readahead\\u003d3\\u0026live_fresca_v2\\u003dtrue\\u0026log_errors_through_nwl_on_retry\\u003dtrue\\u0026log_gel_compression_latency\\u003dtrue\\u0026log_heartbeat_with_lifecycles\\u003dtrue\\u0026log_web_endpoint_to_layer\\u003dtrue\\u0026log_window_onerror_fraction\\u003d0.1\\u0026manifestless_post_live\\u003dtrue\\u0026manifestless_post_live_ufph\\u003dtrue\\u0026max_body_size_to_compress\\u003d500000\\u0026max_prefetch_window_sec_for_livestream_optimization\\u003d10\\u0026max_resolution_for_white_noise\\u003d360\\u0026mdx_enable_privacy_disclosure_ui\\u003dtrue\\u0026mdx_load_cast_api_bootstrap_script\\u003dtrue\\u0026migrate_events_to_ts\\u003dtrue\\u0026migrate_remaining_web_ad_badges_to_innertube\\u003dtrue\\u0026min_prefetch_offset_sec_for_livestream_optimization\\u003d20\\u0026move_survey_ad_renderer_ve_asde\\u003dtrue\\u0026move_vss_away_from_login_info_cookie\\u003dtrue\\u0026music_enable_shared_audio_tier_logic\\u003dtrue\\u0026mweb_c3_endscreen\\u003dtrue\\u0026mweb_deprecate_skip_ve_logging\\u003dtrue\\u0026mweb_enable_custom_control_shared\\u003dtrue\\u0026mweb_enable_skippables_on_jio_phone\\u003dtrue\\u0026mweb_native_control_in_faux_fullscreen_shared\\u003dtrue\\u0026network_polling_interval\\u003d30000\\u0026networkless_gel\\u003dtrue\\u0026networkless_logging\\u003dtrue\\u0026new_codecs_string_api_uses_legacy_style\\u003dtrue\\u0026new_csn_storage_design\\u003dtrue\\u0026nwl_send_fast_on_unload\\u003dtrue\\u0026nwl_send_from_memory_when_online\\u003dtrue\\u0026offline_error_handling\\u003dtrue\\u0026override_drm_required_playback_policy_channels\\u003d[]\\u0026pacf_logging_delay_milliseconds_through_ybfe_tv\\u003d30000\\u0026pageid_as_header_web\\u003dtrue\\u0026partial_rewind_buffer_seconds\\u003d0\\u0026player_ads_set_adformat_on_client\\u003dtrue\\u0026player_allow_autonav_after_playlist\\u003dtrue\\u0026player_bootstrap_method\\u003dtrue\\u0026player_destroy_old_version\\u003dtrue\\u0026player_doubletap_to_seek\\u003dtrue\\u0026player_enable_playback_playlist_change\\u003dtrue\\u0026player_underlay_min_player_width\\u003d768.0\\u0026player_underlay_video_width_fraction\\u003d0.6\\u0026player_web_canary_stage\\u003d0\\u0026playready_first_play_expiration\\u003d-1\\u0026polymer_bad_build_labels\\u003dtrue\\u0026polymer_verifiy_app_state\\u003dtrue\\u0026populate_author_with_podcast_name_in_video_details\\u003dtrue\\u0026preskip_button_style_ads_backend\\u003dcountdown_next_to_thumbnail\\u0026qoe_nwl_downloads\\u003dtrue\\u0026qoe_send_and_write\\u003dtrue\\u0026record_app_crashed_web\\u003dtrue\\u0026reject_live_ott_h264_clear_240p\\u003dtrue\\u0026reject_live_vp9_mq_clear_with_no_abr_ladder\\u003dtrue\\u0026replace_closure_window_with_updated_ytwindow_in_studio\\u003dtrue\\u0026replace_playability_retriever_in_watch\\u003dtrue\\u0026scheduler_use_raf_by_default\\u003dtrue\\u0026self_podding_header_string_template\\u003dself_podding_interstitial_message\\u0026self_podding_highlight_non_default_button\\u003dtrue\\u0026self_podding_midroll_choice_string_template\\u003dself_podding_midroll_choice\\u0026send_config_hash_timer\\u003d0\\u0026set_interstitial_advertisers_question_text\\u003dtrue\\u0026set_mock_id_as_expected_content_binding\\u003d\\u0026shell_load_gcf\\u003dtrue\\u0026short_start_time_prefer_publish_in_watch_log\\u003dtrue\\u0026shorts_mode_to_player_api\\u003dtrue\\u0026should_clear_video_data_on_player_cued_unstarted\\u003dtrue\\u0026simply_embedded_enable_botguard\\u003dtrue\\u0026skip_inline_muted_license_service_check\\u003dtrue\\u0026skip_invalid_ytcsi_ticks\\u003dtrue\\u0026skip_ls_gel_retry\\u003dtrue\\u0026skip_setting_info_in_csi_data_object\\u003dtrue\\u0026slow_compressions_before_abandon_count\\u003d4\\u0026speedmaster_cancellation_movement_dp\\u003d10\\u0026speedmaster_playback_rate\\u003d2.0\\u0026speedmaster_touch_activation_ms\\u003d500\\u0026st_skip_debug_params\\u003dtrue\\u0026start_client_gcf\\u003dtrue\\u0026start_client_gcf_for_player\\u003dtrue\\u0026start_sending_config_hash\\u003dtrue\\u0026streaming_data_emergency_itag_blacklist\\u003d[]\\u0026substitute_ad_cpn_macro_in_ssdai\\u003dtrue\\u0026suppress_error_204_logging\\u003dtrue\\u0026transport_use_scheduler\\u003dtrue\\u0026trigger_impression_pings_on_view_search_desktop\\u003dtrue\\u0026tv_pacf_logging_sample_rate\\u003d0.01\\u0026tvhtml5_unplugged_preload_cache_size\\u003d5\\u0026unplugged_dai_live_chunk_readahead\\u003d3\\u0026unplugged_tvhtml5_video_preload_on_focus_delay_ms\\u003d0\\u0026update_log_event_config\\u003dtrue\\u0026use_accessibility_data_on_desktop_player_button\\u003dtrue\\u0026use_color_palettes_modern_collections_v2\\u003dtrue\\u0026use_core_sm\\u003dtrue\\u0026use_csi_stp_handler\\u003dtrue\\u0026use_inlined_player_rpc\\u003dtrue\\u0026use_new_cml\\u003dtrue\\u0026use_new_in_memory_storage\\u003dtrue\\u0026use_new_nwl_initialization\\u003dtrue\\u0026use_new_nwl_saw\\u003dtrue\\u0026use_new_nwl_stw\\u003dtrue\\u0026use_new_nwl_wts\\u003dtrue\\u0026use_player_abuse_bg_library\\u003dtrue\\u0026use_player_cue_range_set\\u003dtrue\\u0026use_profilepage_event_label_in_carousel_playbacks\\u003dtrue\\u0026use_request_time_ms_header\\u003dtrue\\u0026use_session_based_sampling\\u003dtrue\\u0026use_shared_notf_vp9_360p_format_filter_rules\\u003dtrue\\u0026use_ts_visibilitylogger\\u003dtrue\\u0026validate_el_adunit_usage_mweb\\u003d0.1\\u0026variable_buffer_timeout_ms\\u003d0\\u0026vp9_drm_live\\u003dtrue\\u0026vss_final_ping_send_and_write\\u003dtrue\\u0026vss_pings_using_networkless\\u003dtrue\\u0026vss_playback_use_send_and_write\\u003dtrue\\u0026web_api_url\\u003dtrue\\u0026web_async_context_processor_impl\\u003dstandalone\\u0026web_big_boards\\u003dtrue\\u0026web_big_boards_enable_in_inline\\u003dtrue\\u0026web_big_boards_enable_in_miniplayer\\u003dtrue\\u0026web_cinematic_watch_settings\\u003dtrue\\u0026web_client_version_override\\u003d\\u0026web_collect_offline_state\\u003dtrue\\u0026web_csi_action_sampling_enabled\\u003dtrue\\u0026web_csi_debug_sample_enabled\\u003dtrue\\u0026web_dedupe_ve_grafting\\u003dtrue\\u0026web_deprecate_service_ajax_map_dependency\\u003dtrue\\u0026web_disable_channels_chapter_entrypoint\\u003dtrue\\u0026web_enable_ab_em_rsp\\u003dtrue\\u0026web_enable_ab_rsp_cl\\u003dtrue\\u0026web_enable_abd_ref\\u003dtrue\\u0026web_enable_error_204\\u003dtrue\\u0026web_enable_speedmaster\\u003dtrue\\u0026web_enable_voz_audio_feedback\\u003dtrue\\u0026web_fix_fine_scrubbing_drag\\u003dtrue\\u0026web_foreground_heartbeat_interval_ms\\u003d28000\\u0026web_forward_command_on_pbj\\u003dtrue\\u0026web_gel_debounce_ms\\u003d60000\\u0026web_gel_timeout_cap\\u003dtrue\\u0026web_heat_map_v2\\u003dtrue\\u0026web_key_moments_markers\\u003dtrue\\u0026web_l3_storyboard\\u003dtrue\\u0026web_log_memory_total_kbytes\\u003dtrue\\u0026web_logging_max_batch\\u003d150\\u0026web_logging_max_batch_hard_limit\\u003dtrue\\u0026web_modern_ads\\u003dtrue\\u0026web_modern_buttons\\u003dtrue\\u0026web_modern_buttons_bl_survey\\u003dtrue\\u0026web_modern_player_settings_quality_bottom\\u003dtrue\\u0026web_modern_subscribe\\u003dtrue\\u0026web_modern_subscribe_style\\u003dfilled\\u0026web_new_autonav_countdown\\u003dtrue\\u0026web_one_platform_error_handling\\u003dtrue\\u0026web_op_signal_type_banlist\\u003d[]\\u0026web_playback_associated_log_ctt\\u003dtrue\\u0026web_playback_associated_ve\\u003dtrue\\u0026web_player_add_ve_conversion_logging_to_outbound_links\\u003dtrue\\u0026web_player_always_enable_auto_translation\\u003dtrue\\u0026web_player_api_logging_fraction\\u003d0.01\\u0026web_player_autonav_empty_suggestions_fix\\u003dtrue\\u0026web_player_autonav_toggle_always_listen\\u003dtrue\\u0026web_player_autonav_use_server_provided_state\\u003dtrue\\u0026web_player_caption_language_preference_stickiness_duration\\u003d30\\u0026web_player_disable_inline_scrubbing\\u003dtrue\\u0026web_player_enable_cultural_moment_overlay\\u003dtrue\\u0026web_player_enable_early_warning_snackbar\\u003dtrue\\u0026web_player_enable_info_button_in_banner_on_desktop\\u003dtrue\\u0026web_player_enable_premium_hbr_in_h5_api\\u003dtrue\\u0026web_player_enable_premium_hbr_playback_cap\\u003dtrue\\u0026web_player_enable_vod_featured_product_banner_on_desktop\\u003dtrue\\u0026web_player_innertube_playlist_update\\u003dtrue\\u0026web_player_ipp_canary_type_for_logging\\u003d\\u0026web_player_log_click_before_generating_ve_conversion_params\\u003dtrue\\u0026web_player_move_autonav_toggle\\u003dtrue\\u0026web_player_music_visualizer_treatment\\u003dfake\\u0026web_player_nitrate_promo_tooltip\\u003dtrue\\u0026web_player_offline_playlist_auto_refresh\\u003dtrue\\u0026web_player_seek_chapters_by_shortcut\\u003dtrue\\u0026web_player_sentinel_is_uniplayer\\u003dtrue\\u0026web_player_should_honor_include_asr_setting\\u003dtrue\\u0026web_player_show_music_in_this_video_graphic\\u003dvideo_thumbnail\\u0026web_player_small_hbp_settings_menu\\u003dtrue\\u0026web_player_ss_dai_ad_fetching_timeout_ms\\u003d15000\\u0026web_player_ss_media_time_offset\\u003dtrue\\u0026web_player_topify_subtitles_for_shorts\\u003dtrue\\u0026web_player_touch_mode_improvements\\u003dtrue\\u0026web_player_transfer_timeout_threshold_ms\\u003d10800000\\u0026web_player_use_cinematic_label_2\\u003dtrue\\u0026web_player_use_heartbeat_poll_delay_ms\\u003dtrue\\u0026web_player_use_new_api_for_quality_pullback\\u003dtrue\\u0026web_player_ve_conversion_fixes_for_channel_info\\u003dtrue\\u0026web_prefetch_preload_video\\u003dtrue\\u0026web_rounded_thumbnails\\u003dtrue\\u0026web_scheduler_auto_init\\u003dtrue\\u0026web_settings_menu_icons\\u003dtrue\\u0026web_smoothness_test_duration_ms\\u003d0\\u0026web_smoothness_test_method\\u003d0\\u0026web_speedmaster_spacebar_control\\u003dtrue\\u0026web_speedmaster_updated_edu\\u003dtrue\\u0026web_yt_config_context\\u003dtrue\\u0026webfe_disable_ab_em_plb\\u003dtrue\\u0026wil_icon_max_concurrent_fetches\\u003d9999\\u0026wil_icon_render_when_idle\\u003dtrue\\u0026wiz_use_generic_logging_infra\\u003dtrue\\u0026woffle_clean_up_after_entity_migration\\u003dtrue\\u0026woffle_enable_download_status\\u003dtrue\\u0026woffle_orchestration\\u003dtrue\\u0026woffle_playlist_optimization\\u003dtrue\\u0026woffle_used_state_report\\u003dtrue\\u0026ytidb_clear_embedded_player\\u003dtrue\\u0026ytidb_fetch_datasync_ids_for_data_cleanup\\u003dtrue\\u0026ytidb_remake_db_retries\\u003d3\\u0026ytidb_reopen_db_retries\\u003d3\\u0026ytidb_transaction_ended_event_rate_limit\\u003d0.02\\u0026ytidb_transaction_ended_event_rate_limit_session\\u003d0.2\\u0026ytidb_transaction_ended_event_rate_limit_transaction\\u003d0.1\",\"cspNonce\":\"xW_SWKdw4-d_OLdvn29m6Q\",\"canaryState\":\"none\",\"datasyncId\":\"Vc2a81ef1||\",\"canaryStage\":\"\"}},\"XSRF_FIELD_NAME\":\"session_token\",\"XSRF_TOKEN\":\"QUFFLUhqbW5QY19GdVkwRkVUVVllOGJFLXJkS1V4dkhOd3xBQ3Jtc0trUXByZU1hSFBNbkFfanNBbWMwVzlrOFYteE9KRFJwYmJFc2RFRm02elh0QVQtS2dJRDN3N0RCMFRkbDdySk5oSTJDbjlDVXFaQVgwY3g1YlJQclNEdG1nZkcwY0V1bHVhRjFTX1FrcVhSUXQ0emY2TQ\\u003d\\u003d\",\"YPC_MB_URL\":\"https://payments.youtube.com/payments/v4/js/integrator.js?ss\\u003dmd\",\"YTR_FAMILY_CREATION_URL\":\"https://families.google.com/webcreation?usegapi\\u003d1\",\"SERVER_VERSION\":\"prod\",\"REUSE_COMPONENTS\":true,\"STAMPER_STABLE_LIST\":true,\"DATASYNC_ID\":\"Vc2a81ef1||\",\"SERIALIZED_CLIENT_CONFIG_DATA\":\"COCy_qoGEMeDsAUQpoGwBRCU-v4SEOno_hIQ1-mvBRCIh7AFEIjjrwUQ1KGvBRDQ4q8FENuvrwUQ95ewBRDrk64FEPaOsAUQ_IWwBRCp968FEJaDsAUQsYewBRCa8K8FEL_3rwUQp_evBRCyxq8FENnJrwUQuIuuBRC9tq4FEK7U_hIQ3ej-EhCrgrAFEKy3rwUQ4divBRCei7AFEKKBsAUQ1YiwBRC3768FEOHyrwUQzN-uBRD6vq8FEOb9_hIQ7qKvBRDi1K4FEL6KsAUQqIGwBRDUkrAFELfq_hIQvPmvBRDnuq8FEK-HsAUQmZGwBRD1-a8FEMyu_hIQpcL-EhDb2K8FEOvo_hIQyfevBRDj2K8FEKuHsAUQrYewBRDf2K8FEKKSsAUQ3IKwBRD1-_4SEL75rwUQ6sOvBRCZlLAFENPhrwUQ6pawBRDks_4SEInorgUQyv-vBRDRiLAF\",\"LIVE_CHAT_BASE_TANGO_CONFIG\":{\"apiKey\":\"AIzaSyDZNkyC-AtROwMBpLfevIvqYk-Gfi8ZOeo\",\"channelUri\":\"https://client-channel.google.com/client-channel/client\",\"clientName\":\"yt-live-comments\",\"requiresAuthToken\":true,\"senderUri\":\"https://clients4.google.com/invalidation/lcs/client\",\"useNewTango\":true},\"FEXP_EXPERIMENTS\":[23983296,23986028,24004644,24007246,24080738,24135310,24208765,24371398,24371779,24385728,24439361,24524098,24543193,24543197,24543199,24543201,24549786,24550458,24559327,24560416,24566293,24566687,24699899,51006181,51010235,51012165,51017346,51026715,51027535,51028271,51030311,51035166,51037540,51038399,51038805,51039199,51039493,51039699,51041809,51044150,51044152,51044154,51044158,51046164,51047619,51049006,51054675,51055917,51056050,51057534,51060161,51067339,51069001],\"LIVE_CHAT_SEND_MESSAGE_ACTION\":\"live_chat/watch_page/send\",\"ROOT_VE_TYPE\":3854,\"CLIENT_PROTOCOL\":\"h2\",\"CLIENT_TRANSPORT\":\"tcp\",\"EOM_VISITOR_DATA\":\"CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D\",\"TIME_CREATED_MS\":1700764000730,\"BUTTON_REWORK\":true,\"VALID_SESSION_TEMPDATA_DOMAINS\":[\"youtu.be\",\"youtube.com\",\"www.youtube.com\",\"web-green-qa.youtube.com\",\"web-release-qa.youtube.com\",\"web-integration-qa.youtube.com\",\"m.youtube.com\",\"mweb-green-qa.youtube.com\",\"mweb-release-qa.youtube.com\",\"mweb-integration-qa.youtube.com\",\"studio.youtube.com\",\"studio-green-qa.youtube.com\",\"studio-integration-qa.youtube.com\"],\"WORKER_PERFORMANCE_URL\":{\"privateDoNotAccessOrElseTrustedResourceUrlWrappedValue\":\"/s/desktop/bd3558ba/jsbin/worker-performance.vflset/worker-performance.js\"},\"RAW_COLD_CONFIG_GROUP\":{\"configData\":\"COCy_qoGEO26rQUQ65OuBRC9tq4FEOLUrgUQ--iuBRD-6K4FENjurgUQpMWvBRD-768FEMr_rwUQloOwBRCviLAFENGIsAUQvoqwBRCei7AFEPaOsAUQo4-wBRCZkbAFEKKSsAUQ1JKwBRDtkrAFEJmUsAUQnZSwBRDqlrAFEKiXsAUQ95ewBRCembAFGjJBT2pGb3gxcWE5dlpoSkFhYTNEcUFEN0p5dmJZNHpFRzJvWHBsRDhlMXVjd2g3QkthZyIyQU9qRm94MXFhOXZaaEpBYWEzRHFBRDdKeXZiWTR6RUcyb1hwbEQ4ZTF1Y3doN0JLYWcqXENBTVNRUTBlZ3Bhb0FzZ1dfZ1dtSDlJU19RYlFFcmNQMVFDNkFEcUZGaFVqa29MUUROdjJCbzRlc2tiZVlwMHZnNFFGcWdQajBRYUJqTXdMbGt6Yk9QbEgtc1lH\",\"mainAppColdConfig\":{\"iosSsoSafariFsiPromoEnabled\":true,\"iosTodayWidgetEnabled\":false,\"iosEnableDynamicFontSizing\":false,\"enableMobileAutoOffline\":false,\"androidEnablePip\":false,\"postsV2\":false,\"enableDetailedNetworkStatusReporting\":false,\"hourToReportNetworkStatus\":0,\"networkStatusReportingWindowSecs\":0,\"iosSearchviewRefactoryEnabled\":false,\"ngwFlexyEnabled\":false,\"iosWatchExpandTransitionWithoutSnapshot\":false,\"androidNgwUiEnabled\":false,\"androidThumbnailMonitorEnabled\":false,\"androidThumbnailMonitorCount\":0,\"androidThumbnailMonitorMinimumWidth\":0,\"enableGhostCards\":false,\"enableInlineMuted\":false,\"ngwFlexyMaxCropRatio\":1.0,\"androidRestoreBrowseContentsFromBackStack\":false,\"searchHintExp\":\"search_youtube\"}},\"RAW_HOT_CONFIG_GROUP\":{\"mainAppHotConfig\":{\"iosWatchExpandTransition\":false,\"iosEarlySetWatchTransition\":false,\"exposeConfigRefreshSetting\":false,\"iosEnableSearchButtonOnPlayerOverlay\":false,\"iosMinimumTooltipDurationMsecs\":1000,\"iosFreshHomeIntervalSecs\":0,\"iosFreshSubscriptionsIntervalSecs\":0,\"iosTodayWidgetRefreshIntervalSecs\":28800,\"iosFreshNotificationsInboxIntervalSecs\":0,\"signedOutNotificationsIosPrompt\":true,\"iosFreshFullRefresh\":false},\"loggingHotConfig\":{\"eventLoggingConfig\":{\"enabled\":true,\"payloadPolicies\":[{\"enabled\":true,\"payloadNumber\":219,\"tier\":\"DELAYED_EVENT_TIER_FAST\"},{\"enabled\":true,\"payloadNumber\":469,\"tier\":\"DELAYED_EVENT_TIER_FAST\"},{\"enabled\":true,\"payloadNumber\":6,\"tier\":\"DELAYED_EVENT_TIER_DISPATCH_TO_EMPTY\"},{\"enabled\":true,\"payloadNumber\":5,\"tier\":\"DELAYED_EVENT_TIER_DISPATCH_TO_EMPTY\"},{\"enabled\":true,\"payloadNumber\":7,\"tier\":\"DELAYED_EVENT_TIER_DISPATCH_TO_EMPTY\"},{\"enabled\":true,\"payloadNumber\":434,\"tier\":\"DELAYED_EVENT_TIER_DISPATCH_TO_EMPTY\"}],\"maxAgeHours\":720,\"requestRetryEnabled\":true,\"retryConfig\":{\"fixedBatchRetryEnabled\":false},\"shouldForceSetAllPayloadsToImmediateTier\":false},\"csiConfig\":{\"loggingUrl\":{\"baseUrl\":\"https://www.youtube.com/csi_204\"},\"iosHomeActionThroughCsi204Enabled\":false,\"browseActionThroughCsi204Enabled\":true,\"browseActionThroughGelEnabled\":false,\"debugSampleWeight\":10,\"debugTicks\":[{\"tickName\":\"ada\"},{\"tickName\":\"ais_a\"},{\"tickName\":\"ais_r\"},{\"tickName\":\"arb_f\"},{\"tickName\":\"ari\"},{\"tickName\":\"fab_r\"},{\"tickName\":\"fcb_r\"},{\"tickName\":\"fvb\"},{\"tickName\":\"fvb_r\"},{\"tickName\":\"gv\"},{\"tickName\":\"mb_s\"},{\"tickName\":\"nreqs\"},{\"tickName\":\"nrese\"},{\"tickName\":\"oafs_r\"},{\"tickName\":\"oais_r\"},{\"tickName\":\"ogpd\"},{\"tickName\":\"omd_c\"},{\"tickName\":\"omd_s\"},{\"tickName\":\"omp_c\"},{\"tickName\":\"omp_r\"},{\"tickName\":\"oprd_c\"},{\"tickName\":\"oprd_s\"},{\"tickName\":\"oprr\"},{\"tickName\":\"or_fs\"},{\"tickName\":\"or_p\"},{\"tickName\":\"or100k\"},{\"tickName\":\"orf\"},{\"tickName\":\"orfb\"},{\"tickName\":\"orh_r\"},{\"tickName\":\"ormk\"},{\"tickName\":\"orpr\"},{\"tickName\":\"osor\"},{\"tickName\":\"ovfs_r\"},{\"tickName\":\"ovis_r\"},{\"tickName\":\"pl_c\"},{\"tickName\":\"r_wrr\"},{\"tickName\":\"r_wrs\"},{\"tickName\":\"vda\"},{\"tickName\":\"vis_a\"},{\"tickName\":\"vis_r\"},{\"tickName\":\"vrb_f\"},{\"tickName\":\"vri\"}]}}},\"SERIALIZED_HOT_HASH_DATA\":\"COCy_qoGEhMyODQ0ODEzNjEwMDYxNTgzMjg2GOCy_qoGKJTk_BIo3JP9EijGsv0SKKq0_RIopdD9Eiiekf4SKJqt_hIoyMr-Eijdzv4SKKjh_hIoovX-Eijh9v4SKLP5_hIo9fv-EiiY_P4SKN39_hIo7v3-EijF_v4SMjJBT2pGb3gxcWE5dlpoSkFhYTNEcUFEN0p5dmJZNHpFRzJvWHBsRDhlMXVjd2g3QkthZzoyQU9qRm94MXFhOXZaaEpBYWEzRHFBRDdKeXZiWTR6RUcyb1hwbEQ4ZTF1Y3doN0JLYWdCMENBTVNJQTBMb3RmNkZiNF95Z0NvT2NBUkZSZmR6OElNcUpzQ2ktNEI4ZUFPdFlBRQ%3D%3D\",\"SERIALIZED_COLD_HASH_DATA\":\"COCy_qoGEhM4OTgwNzI3ODM3MDc1MDIyOTQ3GOCy_qoGMjJBT2pGb3gxcWE5dlpoSkFhYTNEcUFEN0p5dmJZNHpFRzJvWHBsRDhlMXVjd2g3QkthZzoyQU9qRm94MXFhOXZaaEpBYWEzRHFBRDdKeXZiWTR6RUcyb1hwbEQ4ZTF1Y3doN0JLYWdCXENBTVNRUTBlZ3Bhb0FzZ1dfZ1dtSDlJU19RYlFFcmNQMVFDNkFEcUZGaFVqa29MUUROdjJCbzRlc2tiZVlwMHZnNFFGcWdQajBRYUJqTXdMbGt6Yk9QbEgtc1lH\",\"PERSIST_IDENTITY_IFRAME_URL\":{\"privateDoNotAccessOrElseTrustedResourceUrlWrappedValue\":\"https://studio.youtube.com/persist_identity\"},\"WORKER_SERIALIZATION_URL\":{\"privateDoNotAccessOrElseTrustedResourceUrlWrappedValue\":\"/s/desktop/bd3558ba/jsbin/worker-serialization.vflset/worker-serialization.js\"},\"WEBVIEW_EOM\":false,\"VISIBILITY_TIME_BETWEEN_JOBS_MS\":100,\"START_IN_THEATER_MODE\":false,\"START_IN_FULL_WINDOW_MODE\":false,\"SERVICE_WORKER_PROMPT_NOTIFICATIONS\":true,\"SBOX_LABELS\":{\"SUGGESTION_DISMISS_LABEL\":\"Remove\",\"SUGGESTION_DISMISSED_LABEL\":\"Suggestion removed\"},\"ONE_PICK_URL\":\"\",\"NO_EMPTY_DATA_IMG\":true,\"MENTIONS_EDU_HELP_LINK\":\"https://support.google.com/youtube/?p\\u003dcreator_community\",\"IS_HOMEPAGE_COLD\":true,\"DEFERRED_DETACH\":true,\"RECAPTCHA_V3_SITEKEY\":\"6LedoOcUAAAAAHA4CFG9zRpaCNjYj33SYjzQ9cTy\",\"PLAYER_JS_URL\":\"/s/player/63e90c30/player_ias.vflset/en_US/base.js\",\"PLAYER_CSS_URL\":\"/s/player/63e90c30/www-player.css\",\"LINK_GAL_DOMAIN\":\"https://accountlinking-pa-clients6.youtube.com\",\"LINK_OIS_DOMAIN\":\"oauthintegrations-clients6.youtube.com\",\"IS_TABLET\":false,\"LINK_API_KEY\":\"AIzaSyDophAQuyyiBr8h0nypEwXUKozH-BEswD0\",\"DISABLE_WARM_LOADS\":false,\"VOZ_API_KEY\":\"AIzaSyBU2xE_JHvB6wag3tMfhxXpg2Q_W8xnM-I\",\"STS\":19681,\"SBOX_SETTINGS\":{\"HAS_ON_SCREEN_KEYBOARD\":false,\"IS_FUSION\":false,\"IS_POLYMER\":true,\"REQUEST_DOMAIN\":\"it\",\"REQUEST_LANGUAGE\":\"en\",\"SEND_VISITOR_DATA\":true,\"SEARCHBOX_BEHAVIOR_EXPERIMENT\":\"zero-prefix\",\"SEARCHBOX_ENABLE_REFINEMENT_SUGGEST\":true,\"SEARCHBOX_TAP_TARGET_EXPERIMENT\":0,\"SEARCHBOX_ZERO_TYPING_SUGGEST_USE_REGULAR_SUGGEST\":\"always\",\"VISITOR_DATA\":\"CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D\",\"SEARCHBOX_HOST_OVERRIDE\":\"suggestqueries-clients6.youtube.com\",\"HIDE_REMOVE_LINK\":false},\"SBOX_JS_URL\":\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/www-searchbox.vflset/www-searchbox.js\"}); window.ytcfg.obfuscatedData_ = [];var setMessage=function(msg){if(window.yt\u0026\u0026yt.setMsg)yt.setMsg(msg);else{window.ytcfg=window.ytcfg||{};ytcfg.msgs=msg}};\nsetMessage({\"ADDED_TO_QUEUE\":\"Added to queue\",\"ADD_TO_DROPDOWN_LABEL\":\"Save to...\",\"AD_BADGE_TEXT\":\"Ad\",\"AD_TITLE\":\"Ad: $title.\",\"BACK_ALT_LABEL\":\"Back\",\"BACK_ONLINE\":\"Back online\",\"CANCEL\":\"Cancel\",\"CAPTION_OFF_TOAST\":\"Subtitles/CC turned off\",\"CAPTION_ON_TOAST\":\"Subtitles/CC turned on\",\"CHARACTER_LIMIT\":\"Use fewer than $number characters\",\"CHECK_CONNECTION_OR_DOWNLOADS\":\"Please check your connection or watch your downloaded videos.\",\"CHIP_BAR_ALT_LABEL\":\"More videos\",\"CLEAR\":\"Clear\",\"CLOSE\":\"Close\",\"CLOSED_CAPTIONS_DISABLED\":\"No captions are available for this video\",\"CLOSED_CAPTIONS_OFF\":\"Subtitles/CC turned off\",\"CLOSED_CAPTIONS_ON\":\"Subtitles/CC turned on\",\"COMMENT_LABEL\":\"Comment\",\"CONNECT_TO_THE_INTERNET\":\"Connect to the internet\",\"CONTINUE_WATCHING\":\"Continue watching\",\"DELETE\":\"Delete\",\"DELETED_PLAYLIST\":\"Playlist deleted from downloads.\",\"DELETED_VIDEO\":\"Video deleted from downloads.\",\"DELETE_ALL_DOWNLOADS_PROMPT\":\"Delete all downloads?\",\"DELETE_FROM_DOWNLOADS\":\"Remove from downloads\",\"DELETING_ALL\":\"Downloads are being deleted\",\"DISLIKE_LABEL\":\"Dislike\",\"DISMISS\":\"Dismiss\",\"DMA_CONSENT_CONFIRMATION\":\"Your choice will take effect on March 6, 2024. You can change your choices anytime in your Google Account.\",\"DMA_CONSENT_GENERAL_ERROR\":\"Something went wrong while loading\",\"DMA_CONSENT_RECORD_ERROR\":\"Something went wrong and your choices were not saved\",\"DOWNLOAD\":\"Download\",\"DOWNLOADED\":\"Downloaded\",\"DOWNLOADING\":\"Downloading\",\"DOWNLOADING_PERCENT\":\"Downloading... $percent%\",\"DOWNLOADS\":\"Downloads\",\"DOWNLOADS_AVAILABILITY\":\"Downloads remain available as long as your device has an active internet connection at least once every 30 days.\",\"DOWNLOADS_SETTINGS\":\"Downloads Settings\",\"DOWNLOAD_EXPIRED\":\"Download expired\",\"DOWNLOAD_PAUSED\":\"Download paused\",\"DOWNLOAD_QUALITY\":\"Download Quality\",\"DO_NOT_HAVE_DOWNLOADS\":\"You do not have any downloads\",\"EDIT_AVATAR_LABEL\":\"Edit profile picture\",\"EDU_GOT_IT\":\"Got It\",\"END_OF_PLAYLIST\":\"End of playlist\",\"ENTER_DATE_OR_EARLIER\":\"Enter $allowed_date or earlier\",\"ENTER_DATE_OR_LATER\":\"Enter $allowed_date or later\",\"FREEBIE_JOIN_MEMBERSHIP_EDU_TEXT\":\"This channel offers a membership which you can join for free with YouTube Premium\",\"GET_PREMIUM\":\"Get Premium\",\"GO_TO_DOWNLOADS\":\"Go to downloads\",\"GUIDE_ALT_LABEL\":\"Guide\",\"HORIZONTAL_LIST_NEXT_LABEL\":\"Next\",\"HORIZONTAL_LIST_PREVIOUS_LABEL\":\"Previous\",\"IMAGE_HORIZONTAL_POSITION_LABEL\":\"The center of the preview is $x_percent% from the left and $y_percent% from the right.\",\"IMAGE_VERTICAL_POSITION_LABEL\":\"The center of the preview is $x_percent% from the top and $y_percent% from the bottom.\",\"INVALID_DATE_ERROR\":\"Invalid Date\",\"JOIN_MEMBERSHIP_EDU_TEXT\":\"Get access to exclusive perks when you purchase a membership to this channel.\",\"JOIN_MEMBERSHIP_EDU_TITLE\":\"Membership\",\"KEEP_OPEN\":\"Keep this window open to continue\",\"LIBRARY_GUIDE_ITEM_EDU_TEXT\":\"Find your history, playlists, purchases, and more\",\"LIBRARY_GUIDE_ITEM_EDU_TITLE\":\"Check out your new Library\",\"LIKE_LABEL\":\"Like\",\"LOCAL_TIME_LABEL\":\"Local Time\",\"LOGO_ALT_LABEL\":\"YouTube Home\",\"MAIN_APP_WEB_COMMENT_TEASER_TOOLTIP\":\"Click here to read comments while watching the video.\",\"MANAGE_MEMBERSHIP_EDU_TEXT\":\"Access your benefits and manage your membership from here.\",\"MENTIONS_EDU_TEXT\":\"Go to the Help Center to see how mentions work on YouTube.\",\"MENTIONS_EDU_TITLE\":\"Learn more\",\"MINIPLAYER_CLOSE\":\"Close player\",\"MINIPLAYER_COLLAPSE_LABEL\":\"Collapse\",\"MINIPLAYER_EXPAND_LABEL\":\"Expand\",\"MUTE_VOLUME\":\"Mute\",\"NEXT_VIDEO_LABEL\":\"Next video\",\"NOT_NOW\":\"Not now\",\"NO_ANGLE_BRACKET_LABEL\":\"Playlist title cannot contain \\u003c or \\u003e\",\"NO_DOWNLOADS\":\"No downloads\",\"NO_INTERNET_CONNECTION\":\"No internet connection\",\"OFFLINE_CHECK_CONNECTION\":\"You\\u0027re offline. Check your connection.\",\"PAUSE_DOWNLOADING\":\"Pause downloading\",\"PLAYER_LABEL_MUTE\":\"Mute (m)\",\"PLAYER_LABEL_PAUSE\":\"Pause (k)\",\"PLAYER_LABEL_PLAY\":\"Play (k)\",\"PLAYER_LABEL_UNMUTE\":\"Unmute (m)\",\"PLAYLIST_NEXT_VIDEO_TITLE\":\"Next: $video_title\",\"PLAY_ALL\":\"Play all\",\"PREPARING_TO_DOWNLOAD\":\"Preparing to download...\",\"PREVIOUS_VIDEO_LABEL\":\"Previous video\",\"QUEUE\":\"Queue\",\"QUEUE_CLEARED\":\"{count,plural, \\u003d1{1 video in the queue removed}other{# videos in the queue removed}}\",\"QUEUE_CLEARED_UNPLURALIZED\":\"Queue cleared\",\"QUEUE_CLOSE_MINIPLAYER_CONFIRM_BODY_TEXT\":\"Are you sure you want to close the player?\",\"QUEUE_CLOSE_MINIPLAYER_CONFIRM_TITLE\":\"Queue will be cleared\",\"QUEUE_RECOVER_BUTTON\":\"Restore\",\"QUEUE_RECOVER_MESSAGE\":\"Recover queue\",\"REACH_BOTTOM_OF_IMAGE_TEXT\":\"You have reached the bottom of the image\",\"REACH_LEFT_OF_IMAGE_TEXT\":\"You have reached the left of the image\",\"REACH_RIGHT_OF_IMAGE_TEXT\":\"You have reached the right of the image\",\"REACH_TOP_OF_IMAGE_TEXT\":\"You have reached the top of the image\",\"REMEMBER_MY_SETTINGS\":\"Remember my settings\",\"REMEMBER_MY_SETTINGS_N_DAYS\":\"Remember my settings for $days_till_expired days.\",\"REPOSITION_IMAGE_HORIZONTALLY_LABEL\":\"Use left and right arrow keys to reposition the preview\",\"REPOSITION_IMAGE_VERTICALLY_LABEL\":\"Use up and down arrow keys to reposition the preview\",\"REQUIRED_LABEL\":\"Required\",\"RESUME_DOWNLOAD\":\"Resume download\",\"RETRY\":\"Retry\",\"SBOX_INAPPROPRIATE_ADDITIONAL\":\"Provide additional details (optional)\",\"SBOX_INAPPROPRIATE_CANCEL\":\"Cancel\",\"SBOX_INAPPROPRIATE_CATEGORY\":\"The selected predictions are:\",\"SBOX_INAPPROPRIATE_DANGEROUS\":\"Dangerous and harmful activity\",\"SBOX_INAPPROPRIATE_EXPLICIT\":\"Sexually explicit\",\"SBOX_INAPPROPRIATE_HATEFUL\":\"Hateful\",\"SBOX_INAPPROPRIATE_OTHER\":\"Other\",\"SBOX_INAPPROPRIATE_PROMPT\":\"Report search predictions\",\"SBOX_INAPPROPRIATE_REASON\":\"Reason (required)\",\"SBOX_INAPPROPRIATE_REPORT\":\"Report\",\"SBOX_INAPPROPRIATE_SUBMIT\":\"Submit\",\"SBOX_INAPPROPRIATE_SUGGESTIONS\":\"Select predictions you would like to report:\",\"SBOX_INAPPROPRIATE_TITLE\":\"Report search predictions\",\"SBOX_INAPPROPRIATE_TOAST\":\"Thanks for your feedback!\",\"SBOX_INAPPROPRIATE_VIOLENT\":\"Violent\",\"SBOX_PLACEHOLDER\":\"Search\",\"SBOX_VOICE_OVERLAY_PLACEHOLDER\":\"Listening...\",\"SEEK_SLIDER\":\"Seek slider\",\"SHARE_LABEL\":\"Share\",\"SHARE_POST_EDU_TEXT\":\"Now you can share posts on YouTube\",\"SHOW_LESS\":\"Show less\",\"SHOW_MORE\":\"Show more\",\"SIGN_IN_LABEL\":\"Sign in\",\"SMART_DOWNLOADS\":\"Smart downloads\",\"SMART_DOWNLOADS_UPDATING\":\"Updating Smart downloads...\",\"SMART_DOWNLOADS_UPDATING_RATIO\":\"Updating Smart downloads... $downloaded/$total\",\"STORAGE_FULL\":\"Storage full\",\"SUBSCRIBE_LABEL\":\"Subscribe\",\"SUBS_FILTER_EDU_CHANNEL_TEXT\":\"Now showing new videos from this channel.\",\"SUBS_FILTER_EDU_TEXT\":\"See new videos from each channel\",\"SUBS_GUIDE_ITEM_EDU_TEXT\":\"See new videos from all of your subscriptions\",\"SUGGEST_NEW_VIDEOS_TEXT\":\"New videos\",\"TIMEZONE_FORMAT\":\"($utc_offset_text) $city_name\",\"TRANSFER_FAILED\":\"Download failed\",\"TRY_AGAIN_LATER\":\"Something went wrong. Please try again later.\",\"TURN_OFF\":\"Turn off\",\"TURN_ON\":\"Turn on\",\"UNAVAILABLE_OFFLINE\":\"Unavailable offline\",\"UNDO\":\"Undo\",\"UNDO_ACTION\":\"Undo\",\"UNMUTE_VOLUME\":\"Unmute\",\"UPDATED_TIME\":\"Updated $relative_time\",\"UPDATE_SMART_DOWNLOADS_NOW\":\"Update now\",\"UPDATING\":\"Updating...\",\"UTC_OFFSET_FORMAT\":\"GMT$utc_offset\",\"VIDEOS_DOWNLOADING\":{\"case1\":\"Downloading 1 video...\",\"other\":\"Downloading # videos...\"},\"VIDEOS_DOWNLOADING_RATIO\":\"Downloading... $downloaded/$total\",\"VIDEO_ACTION_MENU\":\"Action menu\",\"VIEW_DOWNLOADS\":\"View\",\"VIEW_FULL_PLAYLIST\":\"View full playlist\",\"WAITING_FOR_INTERNET\":\"Waiting for internet connection...\",\"WAITING_TO_DOWNLOAD\":\"Waiting to download...\",\"YOU_ARE_OFFLINE\":\"You are offline\",\"__lang__\":\"en\"});})();ytcfg.set(\"initialInnerWidth\",window.innerWidth);ytcfg.set(\"initialInnerHeight\",window.innerHeight);\n\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('lpcf', null, '');}\u003c/script\u003e\u003cscript src=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/scheduler.vflset/scheduler.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003c/script\u003e\u003cscript src=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/www-i18n-constants-en_US.vflset/www-i18n-constants.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003c/script\u003e\u003cscript src=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/www-tampering.vflset/www-tampering.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003c/script\u003e\u003cscript src=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/spf.vflset/spf.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif(window[\"_spf_state\"])window[\"_spf_state\"].config={\"assume-all-json-requests-chunked\":true};\n\u003c/script\u003e\u003cscript src=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/network.vflset/network.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('csl', null, '');}\u003c/script\u003e\u003clink rel=\"stylesheet\" href=\"//fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700\u0026family=YouTube+Sans:wght@300..900\u0026display=swap\" nonce=\"kJjun5IvzN4fmjIJ3C6Vxg\"\u003e\u003cscript name=\"www-roboto\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (document.fonts \u0026\u0026 document.fonts.load) {document.fonts.load(\"400 10pt Roboto\", \"\"); document.fonts.load(\"500 10pt Roboto\", \"\");}\u003c/script\u003e\u003clink rel=\"stylesheet\" href=\"https://www.youtube.com/s/desktop/bd3558ba/cssbin/www-main-desktop-home-page-skeleton.css\" nonce=\"kJjun5IvzN4fmjIJ3C6Vxg\"\u003e\u003clink rel=\"stylesheet\" href=\"https://www.youtube.com/s/desktop/bd3558ba/cssbin/www-onepick.css\" nonce=\"kJjun5IvzN4fmjIJ3C6Vxg\"\u003e\u003clink rel=\"stylesheet\" href=\"https://www.youtube.com/s/_/ytmainappweb/_/ss/k=ytmainappweb.kevlar_base.CylGSP1vG8k.L.B1.O/am=AEAo/d=0/rs=AGKMywHTPz1th-7oAagrpGI2fpCQAkR8Hw\" nonce=\"kJjun5IvzN4fmjIJ3C6Vxg\"\u003e\u003cstyle class=\"global_styles\" nonce=\"kJjun5IvzN4fmjIJ3C6Vxg\"\u003ebody{padding:0;margin:0;overflow-y:scroll}body.autoscroll{overflow-y:auto}body.no-scroll{overflow:hidden}body.no-y-scroll{overflow-y:hidden}.hidden{display:none}textarea{--paper-input-container-input_-_white-space:pre-wrap}.grecaptcha-badge{visibility:hidden}\u003c/style\u003e\u003cstyle class=\"masthead_shell\" nonce=\"kJjun5IvzN4fmjIJ3C6Vxg\"\u003eytd-masthead.shell{background-color:#fff!important;position:fixed;top:0;right:0;left:0;display:-ms-flex;display:-webkit-flex;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:flex;height:56px;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;-moz-box-align:center;align-items:center}ytd-masthead.shell #menu-icon{margin-left:16px}ytd-app\u003eytd-masthead.chunked{position:fixed;top:0;width:100%}ytd-masthead.shell.dark,ytd-masthead.shell.theater{background-color:#0f0f0f!important}ytd-masthead.shell.full-window-mode{background-color:#0f0f0f!important;opacity:0;-webkit-transform:translateY(calc(-100% - 5px));transform:translateY(calc(-100% - 5px))}ytd-masthead.shell\u003e:first-child{padding-left:16px}ytd-masthead.shell\u003e:last-child{padding-right:16px}ytd-masthead #masthead-logo{display:-ms-flex;display:-webkit-flex;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:flex}ytd-masthead #masthead-logo #country-code{margin-right:2px}ytd-masthead.shell #yt-logo-red-svg,ytd-masthead.shell #yt-logo-red-updated-svg,ytd-masthead.shell #yt-logo-svg,ytd-masthead.shell #yt-logo-updated-svg{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;margin-left:8px;padding:0;color:#000}ytd-masthead.shell #a11y-skip-nav{display:none}ytd-masthead.shell svg{width:40px;height:40px;padding:8px;margin-right:8px;-moz-box-sizing:border-box;box-sizing:border-box;color:#606060;fill:currentColor}ytd-masthead .external-icon{width:24px;height:24px}ytd-masthead .yt-icons-ext{fill:currentColor;color:#606060}ytd-masthead.shell.dark .yt-icons-ext ytd-masthead.shell.theater .yt-icons-ext{fill:#fff}ytd-masthead svg#yt-logo-svg{width:80px}ytd-masthead svg#yt-logo-red-svg{width:106.4px}ytd-masthead svg#yt-logo-updated-svg{width:90px}ytd-masthead svg#yt-logo-red-updated-svg{width:97px}@media (max-width:656px){ytd-masthead.shell\u003e:first-child{padding-left:8px}ytd-masthead.shell\u003e:last-child{padding-right:8px}ytd-masthead.shell svg{margin-right:0}ytd-masthead #masthead-logo{-ms-flex:1 1 0.000000001px;-webkit-flex:1;-webkit-box-flex:1;-moz-box-flex:1;flex:1;-webkit-flex-basis:0.000000001px;-ms-flex-preferred-size:0.000000001px;flex-basis:0.000000001px}ytd-masthead.shell #yt-logo-red-svg,ytd-masthead.shell #yt-logo-svg{margin-left:4px}}@media (min-width:876px){ytd-masthead #masthead-logo{width:129px}}#masthead-skeleton-icons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-moz-box-orient:horizontal;-moz-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:end;-webkit-justify-content:flex-end;-moz-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}ytd-masthead.masthead-finish #masthead-skeleton-icons{display:none}.masthead-skeleton-icon{border-radius:50%;height:32px;width:32px;margin:0 8px;background-color:#e3e3e3}ytd-masthead.dark .masthead-skeleton-icon{background-color:#292929}\u003c/style\u003e\u003cstyle class=\"masthead_custom_styles\" is=\"custom-style\" id=\"ext-styles\" nonce=\"kJjun5IvzN4fmjIJ3C6Vxg\"\u003e:-stv-set-elsewhere{--yt-spec-icon-active-other:initial}ytd-masthead .yt-icons-ext{color:var(--yt-spec-icon-active-other)}ytd-masthead svg#yt-logo-red-svg #youtube-red-paths path,ytd-masthead svg#yt-logo-red-updated-svg #youtube-red-paths path,ytd-masthead svg#yt-logo-svg #youtube-paths path,ytd-masthead svg#yt-logo-updated-svg #youtube-paths path{fill:#282828}ytd-masthead.dark svg#yt-logo-red-svg #youtube-red-paths path,ytd-masthead.dark svg#yt-logo-red-updated-svg #youtube-red-paths path,ytd-masthead.dark svg#yt-logo-svg #youtube-paths path,ytd-masthead.dark svg#yt-logo-updated-svg #youtube-paths path,ytd-masthead.theater svg#yt-logo-red-svg #youtube-red-paths path,ytd-masthead.theater svg#yt-logo-svg #youtube-paths path{fill:#fff}\u003c/style\u003e\u003cstyle class=\"searchbox\" nonce=\"kJjun5IvzN4fmjIJ3C6Vxg\"\u003e#search-input.ytd-searchbox-spt input{-webkit-appearance:none;-webkit-font-smoothing:antialiased;background-color:transparent;border:none;box-shadow:none;color:inherit;font-family:Roboto,Noto,sans-serif;font-size:16px;font-weight:400;line-height:24px;margin-left:4px;max-width:100%;outline:none;text-align:inherit;width:100%;-ms-flex:1 1 0.000000001px;-webkit-flex:1;-webkit-box-flex:1;-moz-box-flex:1;flex:1;-webkit-flex-basis:0.000000001px;-ms-flex-preferred-size:0.000000001px;flex-basis:0.000000001px}#search-container.ytd-searchbox-spt{pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0}#search-input.ytd-searchbox-spt #search::-webkit-input-placeholder{color:#888}#search-input.ytd-searchbox-spt #search::-moz-input-placeholder{color:#888}#search-input.ytd-searchbox-spt #search:-ms-input-placeholder{color:#888}\u003c/style\u003e\u003cstyle class=\"kevlar_global_styles\" nonce=\"kJjun5IvzN4fmjIJ3C6Vxg\"\u003ehtml{background-color:#fff!important;-webkit-text-size-adjust:none}html[dark]{background-color:#0f0f0f!important}#logo-red-icon-container.ytd-topbar-logo-renderer{width:86px}\u003c/style\u003e\u003cmeta name=\"theme-color\" content=\"rgba(255, 255, 255, 0.98)\"\u003e\u003clink rel=\"search\" type=\"application/opensearchdescription+xml\" href=\"https://www.youtube.com/opensearch?locale=en_US\" title=\"YouTube\"\u003e\u003clink rel=\"manifest\" href=\"/manifest.webmanifest\" crossorigin=\"use-credentials\"\u003e\u003c/head\u003e\u003cbody dir=\"ltr\"\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('bs', null, '');}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eytcfg.set('initialBodyClientWidth', document.body.clientWidth);\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('ai', null, '');}\u003c/script\u003e\u003ciframe name=\"passive_signin\" src=\"https://accounts.google.com/ServiceLogin?service=youtube\u0026amp;uilel=3\u0026amp;passive=true\u0026amp;continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252Fsignin_passive%26feature%3Dpassive\u0026amp;hl=en\" style=\"display: none\"\u003e\u003c/iframe\u003e\u003cytd-app\u003e\u003cytd-masthead id=\"masthead\" logo-type=\"YOUTUBE_LOGO\" slot=\"masthead\" class=\"shell \"\u003e\u003cdiv id=\"search-container\" class=\"ytd-searchbox-spt\" slot=\"search-container\"\u003e\u003c/div\u003e\u003cdiv id=\"search-input\" class=\"ytd-searchbox-spt\" slot=\"search-input\"\u003e\u003cinput id=\"search\" autocapitalize=\"none\" autocomplete=\"off\" autocorrect=\"off\" hidden name=\"search_query\" tabindex=\"0\" type=\"text\" spellcheck=\"false\"\u003e\u003c/div\u003e\u003csvg id=\"menu-icon\" class=\"external-icon\" preserveAspectRatio=\"xMidYMid meet\"\u003e\u003cg id=\"menu\" class=\"yt-icons-ext\" viewBox=\"0 0 24 24\"\u003e\u003cpath d=\"M21,6H3V5h18V6z M21,11H3v1h18V11z M21,17H3v1h18V17z\"/\u003e\u003c/g\u003e\u003c/svg\u003e\u003cdiv id=\"masthead-logo\" slot=\"masthead-logo\"\u003e\u003ca style=\"display: none;\" href=\"/\" title=\"YouTube\"\u003e\u003csvg id=\"yt-logo-updated-svg\" class=\"external-icon\" viewBox=\"0 0 90 20\"\u003e\u003cg id=\"yt-logo-updated\" viewBox=\"0 0 90 20\" preserveAspectRatio=\"xMidYMid meet\"\u003e\u003cg\u003e\u003cpath d=\"M27.9727 3.12324C27.6435 1.89323 26.6768 0.926623 25.4468 0.597366C23.2197 2.24288e-07 14.285 0 14.285 0C14.285 0 5.35042 2.24288e-07 3.12323 0.597366C1.89323 0.926623 0.926623 1.89323 0.597366 3.12324C2.24288e-07 5.35042 0 10 0 10C0 10 2.24288e-07 14.6496 0.597366 16.8768C0.926623 18.1068 1.89323 19.0734 3.12323 19.4026C5.35042 20 14.285 20 14.285 20C14.285 20 23.2197 20 25.4468 19.4026C26.6768 19.0734 27.6435 18.1068 27.9727 16.8768C28.5701 14.6496 28.5701 10 28.5701 10C28.5701 10 28.5677 5.35042 27.9727 3.12324Z\" fill=\"#FF0000\"/\u003e\u003cpath d=\"M11.4253 14.2854L18.8477 10.0004L11.4253 5.71533V14.2854Z\" fill=\"white\"/\u003e\u003c/g\u003e\u003cg\u003e\u003cg id=\"youtube-paths\"\u003e\u003cpath d=\"M34.6024 13.0036L31.3945 1.41846H34.1932L35.3174 6.6701C35.6043 7.96361 35.8136 9.06662 35.95 9.97913H36.0323C36.1264 9.32532 36.3381 8.22937 36.665 6.68892L37.8291 1.41846H40.6278L37.3799 13.0036V18.561H34.6001V13.0036H34.6024Z\"/\u003e\u003cpath d=\"M41.4697 18.1937C40.9053 17.8127 40.5031 17.22 40.2632 16.4157C40.0257 15.6114 39.9058 14.5437 39.9058 13.2078V11.3898C39.9058 10.0422 40.0422 8.95805 40.315 8.14196C40.5878 7.32588 41.0135 6.72851 41.592 6.35457C42.1706 5.98063 42.9302 5.79248 43.871 5.79248C44.7976 5.79248 45.5384 5.98298 46.0981 6.36398C46.6555 6.74497 47.0647 7.34234 47.3234 8.15137C47.5821 8.96275 47.7115 10.0422 47.7115 11.3898V13.2078C47.7115 14.5437 47.5845 15.6161 47.3329 16.4251C47.0812 17.2365 46.672 17.8292 46.1075 18.2031C45.5431 18.5771 44.7764 18.7652 43.8098 18.7652C42.8126 18.7675 42.0342 18.5747 41.4697 18.1937ZM44.6353 16.2323C44.7905 15.8231 44.8705 15.1575 44.8705 14.2309V10.3292C44.8705 9.43077 44.7929 8.77225 44.6353 8.35833C44.4777 7.94206 44.2026 7.7351 43.8074 7.7351C43.4265 7.7351 43.156 7.94206 43.0008 8.35833C42.8432 8.77461 42.7656 9.43077 42.7656 10.3292V14.2309C42.7656 15.1575 42.8408 15.8254 42.9914 16.2323C43.1419 16.6415 43.4123 16.8461 43.8074 16.8461C44.2026 16.8461 44.4777 16.6415 44.6353 16.2323Z\"/\u003e\u003cpath d=\"M56.8154 18.5634H54.6094L54.3648 17.03H54.3037C53.7039 18.1871 52.8055 18.7656 51.6061 18.7656C50.7759 18.7656 50.1621 18.4928 49.767 17.9496C49.3719 17.4039 49.1743 16.5526 49.1743 15.3955V6.03751H51.9942V15.2308C51.9942 15.7906 52.0553 16.188 52.1776 16.4256C52.2999 16.6631 52.5045 16.783 52.7914 16.783C53.036 16.783 53.2712 16.7078 53.497 16.5573C53.7228 16.4067 53.8874 16.2162 53.9979 15.9858V6.03516H56.8154V18.5634Z\"/\u003e\u003cpath d=\"M64.4755 3.68758H61.6768V18.5629H58.9181V3.68758H56.1194V1.42041H64.4755V3.68758Z\"/\u003e\u003cpath d=\"M71.2768 18.5634H69.0708L68.8262 17.03H68.7651C68.1654 18.1871 67.267 18.7656 66.0675 18.7656C65.2373 18.7656 64.6235 18.4928 64.2284 17.9496C63.8333 17.4039 63.6357 16.5526 63.6357 15.3955V6.03751H66.4556V15.2308C66.4556 15.7906 66.5167 16.188 66.639 16.4256C66.7613 16.6631 66.9659 16.783 67.2529 16.783C67.4974 16.783 67.7326 16.7078 67.9584 16.5573C68.1842 16.4067 68.3488 16.2162 68.4593 15.9858V6.03516H71.2768V18.5634Z\"/\u003e\u003cpath d=\"M80.609 8.0387C80.4373 7.24849 80.1621 6.67699 79.7812 6.32186C79.4002 5.96674 78.8757 5.79035 78.2078 5.79035C77.6904 5.79035 77.2059 5.93616 76.7567 6.23014C76.3075 6.52412 75.9594 6.90747 75.7148 7.38489H75.6937V0.785645H72.9773V18.5608H75.3056L75.5925 17.3755H75.6537C75.8724 17.7988 76.1993 18.1304 76.6344 18.3774C77.0695 18.622 77.554 18.7443 78.0855 18.7443C79.038 18.7443 79.7412 18.3045 80.1904 17.4272C80.6396 16.5476 80.8653 15.1765 80.8653 13.3092V11.3266C80.8653 9.92722 80.7783 8.82892 80.609 8.0387ZM78.0243 13.1492C78.0243 14.0617 77.9867 14.7767 77.9114 15.2941C77.8362 15.8115 77.7115 16.1808 77.5328 16.3971C77.3564 16.6158 77.1165 16.724 76.8178 16.724C76.585 16.724 76.371 16.6699 76.1734 16.5594C75.9759 16.4512 75.816 16.2866 75.6937 16.0702V8.96062C75.7877 8.6196 75.9524 8.34209 76.1852 8.12337C76.4157 7.90465 76.6697 7.79646 76.9401 7.79646C77.2271 7.79646 77.4481 7.90935 77.6034 8.13278C77.7609 8.35855 77.8691 8.73485 77.9303 9.26636C77.9914 9.79787 78.022 10.5528 78.022 11.5335V13.1492H78.0243Z\"/\u003e\u003cpath d=\"M84.8657 13.8712C84.8657 14.6755 84.8892 15.2776 84.9363 15.6798C84.9833 16.0819 85.0821 16.3736 85.2326 16.5594C85.3831 16.7428 85.6136 16.8345 85.9264 16.8345C86.3474 16.8345 86.639 16.6699 86.7942 16.343C86.9518 16.0161 87.0365 15.4705 87.0506 14.7085L89.4824 14.8519C89.4965 14.9601 89.5035 15.1106 89.5035 15.3011C89.5035 16.4582 89.186 17.3237 88.5534 17.8952C87.9208 18.4667 87.0247 18.7536 85.8676 18.7536C84.4777 18.7536 83.504 18.3185 82.9466 17.446C82.3869 16.5735 82.1094 15.2259 82.1094 13.4008V11.2136C82.1094 9.33452 82.3987 7.96105 82.9772 7.09558C83.5558 6.2301 84.5459 5.79736 85.9499 5.79736C86.9165 5.79736 87.6597 5.97375 88.1771 6.32888C88.6945 6.684 89.059 7.23433 89.2707 7.98457C89.4824 8.7348 89.5882 9.76961 89.5882 11.0913V13.2362H84.8657V13.8712ZM85.2232 7.96811C85.0797 8.14449 84.9857 8.43377 84.9363 8.83593C84.8892 9.2381 84.8657 9.84722 84.8657 10.6657V11.5641H86.9283V10.6657C86.9283 9.86133 86.9001 9.25221 86.846 8.83593C86.7919 8.41966 86.6931 8.12803 86.5496 7.95635C86.4062 7.78702 86.1851 7.7 85.8864 7.7C85.5854 7.70235 85.3643 7.79172 85.2232 7.96811Z\"/\u003e\u003c/g\u003e\u003c/g\u003e\u003c/g\u003e\u003c/svg\u003e\u003c/a\u003e\u003ca style=\"display: none;\" href=\"/\" title=\"YouTube\"\u003e\u003csvg id=\"yt-logo-red-updated-svg\" class=\"external-icon\" viewBox=\"0 0 97 20\" style=\"width: 97px;\"\u003e\u003cg id=\"yt-logo-red-updated\" viewBox=\"0 0 97 20\" preserveAspectRatio=\"xMidYMid meet\"\u003e\u003cg\u003e\u003cpath d=\"M27.9704 3.12324C27.6411 1.89323 26.6745 0.926623 25.4445 0.597366C23.2173 2.24288e-07 14.2827 0 14.2827 0C14.2827 0 5.34807 2.24288e-07 3.12088 0.597366C1.89323 0.926623 0.924271 1.89323 0.595014 3.12324C-2.8036e-07 5.35042 0 10 0 10C0 10 -1.57002e-06 14.6496 0.597364 16.8768C0.926621 18.1068 1.89323 19.0734 3.12324 19.4026C5.35042 20 14.285 20 14.285 20C14.285 20 23.2197 20 25.4468 19.4026C26.6769 19.0734 27.6435 18.1068 27.9727 16.8768C28.5701 14.6496 28.5701 10 28.5701 10C28.5701 10 28.5677 5.35042 27.9704 3.12324Z\" fill=\"#FF0000\"/\u003e\u003cpath d=\"M11.4275 14.2854L18.8475 10.0004L11.4275 5.71533V14.2854Z\" fill=\"white\"/\u003e\u003c/g\u003e\u003cg id=\"youtube-red-paths\"\u003e\u003cpath d=\"M40.0566 6.34524V7.03668C40.0566 10.4915 38.5255 12.5118 35.1742 12.5118H34.6638V18.5583H31.9263V1.42285H35.414C38.6078 1.42285 40.0566 2.7728 40.0566 6.34524ZM37.1779 6.59218C37.1779 4.09924 36.7287 3.50658 35.1765 3.50658H34.6662V10.4727H35.1365C36.6064 10.4727 37.1803 9.40968 37.1803 7.10253L37.1779 6.59218Z\"/\u003e\u003cpath d=\"M46.5336 5.8345L46.3901 9.08238C45.2259 8.83779 44.264 9.02123 43.836 9.77382V18.5579H41.1196V6.0391H43.2857L43.5303 8.75312H43.6337C43.9183 6.77288 44.8379 5.771 46.0232 5.771C46.1949 5.7757 46.3666 5.79687 46.5336 5.8345Z\"/\u003e\u003cpath d=\"M49.6567 13.2456V13.8782C49.6567 16.0842 49.779 16.8415 50.7198 16.8415C51.6182 16.8415 51.8228 16.1501 51.8439 14.7178L54.2734 14.8613C54.4568 17.5565 53.0481 18.763 50.6586 18.763C47.7588 18.763 46.9004 16.8627 46.9004 13.4126V11.223C46.9004 7.58707 47.8599 5.80908 50.7409 5.80908C53.6407 5.80908 54.3769 7.32131 54.3769 11.0984V13.2456H49.6567ZM49.6567 10.6703V11.5687H51.7193V10.675C51.7193 8.37258 51.5547 7.71172 50.6821 7.71172C49.8096 7.71172 49.6567 8.38669 49.6567 10.675V10.6703Z\"/\u003e\u003cpath d=\"M68.4103 9.09902V18.5557H65.5928V9.30834C65.5928 8.28764 65.327 7.77729 64.7132 7.77729C64.2216 7.77729 63.7724 8.06186 63.4667 8.59338C63.4832 8.76271 63.4902 8.93439 63.4879 9.10373V18.5605H60.668V9.30834C60.668 8.28764 60.4022 7.77729 59.7884 7.77729C59.2969 7.77729 58.8665 8.06186 58.5631 8.57456V18.5628H55.7456V6.03929H57.9728L58.2221 7.63383H58.2621C58.8947 6.42969 59.9178 5.77588 61.1219 5.77588C62.3072 5.77588 62.9799 6.36854 63.288 7.43157C63.9418 6.34973 64.9225 5.77588 66.0443 5.77588C67.7564 5.77588 68.4103 7.00119 68.4103 9.09902Z\"/\u003e\u003cpath d=\"M69.8191 2.8338C69.8191 1.4862 70.3106 1.09814 71.3501 1.09814C72.4132 1.09814 72.8812 1.54734 72.8812 2.8338C72.8812 4.22373 72.4108 4.57181 71.3501 4.57181C70.3106 4.56945 69.8191 4.22138 69.8191 2.8338ZM69.9837 6.03935H72.6789V18.5629H69.9837V6.03935Z\"/\u003e\u003cpath d=\"M81.891 6.03955V18.5631H79.6849L79.4403 17.032H79.3792C78.7466 18.2573 77.827 18.7677 76.684 18.7677C75.0095 18.7677 74.2522 17.7046 74.2522 15.3975V6.0419H77.0697V15.2352C77.0697 16.3382 77.3002 16.7874 77.867 16.7874C78.3844 16.7663 78.8477 16.4582 79.0688 15.9902V6.0419H81.891V6.03955Z\"/\u003e\u003cpath d=\"M96.1901 9.09893V18.5557H93.3726V9.30825C93.3726 8.28755 93.1068 7.7772 92.493 7.7772C92.0015 7.7772 91.5523 8.06177 91.2465 8.59329C91.263 8.76027 91.2701 8.9296 91.2677 9.09893V18.5557H88.4502V9.30825C88.4502 8.28755 88.1845 7.7772 87.5706 7.7772C87.0791 7.7772 86.6487 8.06177 86.3453 8.57447V18.5627H83.5278V6.0392H85.7527L85.9973 7.63139H86.0372C86.6699 6.42725 87.6929 5.77344 88.8971 5.77344C90.0824 5.77344 90.755 6.3661 91.0631 7.42913C91.7169 6.34729 92.6976 5.77344 93.8194 5.77344C95.541 5.77579 96.1901 7.0011 96.1901 9.09893Z\"/\u003e\u003cpath d=\"M40.0566 6.34524V7.03668C40.0566 10.4915 38.5255 12.5118 35.1742 12.5118H34.6638V18.5583H31.9263V1.42285H35.414C38.6078 1.42285 40.0566 2.7728 40.0566 6.34524ZM37.1779 6.59218C37.1779 4.09924 36.7287 3.50658 35.1765 3.50658H34.6662V10.4727H35.1365C36.6064 10.4727 37.1803 9.40968 37.1803 7.10253L37.1779 6.59218Z\"/\u003e\u003c/g\u003e\u003c/g\u003e\u003c/svg\u003e\u003c/a\u003e\u003cspan id=\"country-code\"\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv id=\"masthead-skeleton-icons\" slot=\"masthead-skeleton\"\u003e\u003cdiv class=\"masthead-skeleton-icon\"\u003e\u003c/div\u003e\u003cdiv class=\"masthead-skeleton-icon\"\u003e\u003c/div\u003e\u003cdiv class=\"masthead-skeleton-icon\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/ytd-masthead\u003e\u003ca slot=\"guide-links-primary\" href=\"https://www.youtube.com/about/\" style=\"display: none;\"\u003eAbout\u003c/a\u003e\u003ca slot=\"guide-links-primary\" href=\"https://www.youtube.com/about/press/\" style=\"display: none;\"\u003ePress\u003c/a\u003e\u003ca slot=\"guide-links-primary\" href=\"https://www.youtube.com/about/copyright/\" style=\"display: none;\"\u003eCopyright\u003c/a\u003e\u003ca slot=\"guide-links-primary\" href=\"/t/contact_us/\" style=\"display: none;\"\u003eContact us\u003c/a\u003e\u003ca slot=\"guide-links-primary\" href=\"https://www.youtube.com/creators/\" style=\"display: none;\"\u003eCreators\u003c/a\u003e\u003ca slot=\"guide-links-primary\" href=\"https://www.youtube.com/ads/\" style=\"display: none;\"\u003eAdvertise\u003c/a\u003e\u003ca slot=\"guide-links-primary\" href=\"https://developers.google.com/youtube\" style=\"display: none;\"\u003eDevelopers\u003c/a\u003e\u003ca slot=\"guide-links-secondary\" href=\"/t/terms\" style=\"display: none;\"\u003eTerms\u003c/a\u003e\u003ca slot=\"guide-links-secondary\" href=\"/t/privacy\" style=\"display: none;\"\u003ePrivacy\u003c/a\u003e\u003ca slot=\"guide-links-secondary\" href=\"https://www.youtube.com/about/policies/\" style=\"display: none;\"\u003ePolicy \u0026amp; Safety\u003c/a\u003e\u003ca slot=\"guide-links-secondary\" href=\"https://www.youtube.com/howyoutubeworks?utm_campaign=ytgen\u0026amp;utm_source=ythp\u0026amp;utm_medium=LeftNav\u0026amp;utm_content=txt\u0026amp;u=https%3A%2F%2Fwww.youtube.com%2Fhowyoutubeworks%3Futm_source%3Dythp%26utm_medium%3DLeftNav%26utm_campaign%3Dytgen\" style=\"display: none;\"\u003eHow YouTube works\u003c/a\u003e\u003ca slot=\"guide-links-secondary\" href=\"/new\" style=\"display: none;\"\u003eTest new features\u003c/a\u003e\u003cdiv id=\"copyright\" slot=\"copyright\" style=\"display: none;\"\u003e\u003cdiv dir=\"ltr\" style=\"display:inline\"\u003e\u0026copy; 2023 Google LLC\u003c/div\u003e\u003c/div\u003e\u003c/ytd-app\u003e\u003cdiv id=\"home-page-skeleton\"\u003e\u003cdiv id=\"guide-skeleton\"\u003e\u003c/div\u003e\u003cdiv id=\"home-container-skeleton\"\u003e\u003cdiv id=\"home-chips\"\u003e\u003c/div\u003e\u003cdiv id=\"home-container-media\"\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"rich-grid-media-skeleton\" style=\"min-width: 310px; flex-basis: 310px;\"\u003e\u003cdiv class=\"video-details\"\u003e\u003cdiv class=\"rich-thumbnail skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details\"\u003e\u003cdiv class=\"channel-avatar skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"details-text-shell\"\u003e\u003cdiv class=\"rich-video-title text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003cdiv class=\"rich-video-meta text-shell skeleton-bg-color\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('gcc', null, '');}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('nc_pj', null, '');}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('rsbe_dpj', null, '');}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('js_ld', null, '');}\u003c/script\u003e\u003cscript id=\"base-js\" src=\"https://www.youtube.com/s/desktop/bd3558ba/jsbin/desktop_polymer.vflset/desktop_polymer.js\" nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003e\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('rsef_dpj', null, '');}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('rsae_dpj', null, '');}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('js_r', null, '');}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('ac', null, '');}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003evar onPolymerReady = function(e) {window.removeEventListener('script-load-dpj', onPolymerReady);if (window.ytcsi) {window.ytcsi.tick('apr', null, '');}}; if (window.Polymer \u0026\u0026 Polymer.RenderStatus) {onPolymerReady();} else {window.addEventListener('script-load-dpj', onPolymerReady);}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003eif (window.ytcsi) {window.ytcsi.tick('pdc', null, '');}\u003c/script\u003e\u003cscript nonce=\"xW_SWKdw4-d_OLdvn29m6Q\"\u003evar ytInitialData = {\"responseContext\":{\"serviceTrackingParams\":[{\"service\":\"GUIDED_HELP\",\"params\":[{\"key\":\"context\",\"value\":\"yt_web_unknown_form_factor_kevlar_w2w\"},{\"key\":\"logged_in\",\"value\":\"0\"}]},{\"service\":\"GFEEDBACK\",\"params\":[{\"key\":\"context\",\"value\":\"yt_web_unknown_form_factor_kevlar_w2w\"},{\"key\":\"browse_id\",\"value\":\"FEwhat_to_watch\"},{\"key\":\"browse_id_prefix\",\"value\":\"\"},{\"key\":\"logged_in\",\"value\":\"0\"},{\"key\":\"e\",\"value\":\"23804281,23946420,23966208,23983296,23986028,23998056,24004644,24007246,24034168,24036947,24077241,24080738,24120820,24135310,24140247,24166867,24181174,24187377,24208765,24241378,24255543,24255545,24288664,24290971,24291857,24299873,24367580,24371398,24371779,24377598,24377910,24382552,24385728,24387949,24390675,24428788,24428941,24428944,24439361,24451319,24453989,24458839,24463871,24468724,24485421,24506515,24506784,24515423,24517093,24518452,24524098,24526515,24526642,24526774,24526787,24526794,24526797,24526806,24526815,24526823,24528550,24528559,24528577,24528582,24528640,24528647,24528659,24528666,24532148,24537200,24539025,24540881,24542367,24542452,24543193,24543197,24543199,24543201,24546060,24546075,24548627,24548629,24549786,24550285,24550458,24559327,24559699,24560416,24561142,24561147,24561152,24561206,24561383,24561412,24563746,24566293,24566687,24585907,24586687,24588590,24589493,24694842,24697067,24698452,24699899,39324156,51003636,51004018,51006181,51006338,51009757,51009781,51009900,51010235,51012165,51012291,51012659,51014091,51016856,51017346,51019442,51019626,51020570,51021953,51025415,51025833,51026715,51027535,51027870,51028271,51029412,51030103,51030311,51031235,51033399,51033577,51035166,51036438,51036511,51036735,51037088,51037346,51037353,51037540,51038399,51038805,51039199,51039493,51039699,51040473,51040842,51041266,51041331,51041497,51041809,51042257,51043059,51043940,51044150,51044152,51044154,51044158,51044723,51045016,51045888,51045969,51046164,51047537,51047579,51047619,51048488,51049006,51049611,51052043,51053957,51054668,51054675,51055016,51055107,51055917,51055919,51056050,51057396,51057534,51057811,51057820,51057842,51057857,51059134,51059323,51059543,51059573,51060161,51061018,51061427,51061467,51061926,51063131,51063140,51063143,51063154,51063327,51065641,51065729,51067339,51067810,51069001,51069319,51069838,51070585\"}]},{\"service\":\"CSI\",\"params\":[{\"key\":\"yt_fn\",\"value\":\"what_to_watch\"},{\"key\":\"c\",\"value\":\"WEB\"},{\"key\":\"cver\",\"value\":\"2.20231121.08.00\"},{\"key\":\"yt_li\",\"value\":\"0\"},{\"key\":\"GetHome_rid\",\"value\":\"0x29921eaa031cc939\"}]},{\"service\":\"GOOGLE_HELP\",\"params\":[{\"key\":\"browse_id\",\"value\":\"FEwhat_to_watch\"},{\"key\":\"browse_id_prefix\",\"value\":\"\"}]},{\"service\":\"ECATCHER\",\"params\":[{\"key\":\"client.version\",\"value\":\"2.20231121\"},{\"key\":\"client.name\",\"value\":\"WEB\"},{\"key\":\"client.fexp\",\"value\":\"24166867,51004018,24698452,24543193,51069838,51031235,51057534,24548629,51061467,51037088,51033399,51020570,24034168,24559327,24451319,24561412,24515423,51067810,24485421,24526642,51054675,24542452,51052043,51054668,51044154,51063143,51070585,24588590,24458839,51038805,24528582,24528647,24526806,51055917,24561383,51044723,24543199,24518452,24532148,51019442,24439361,51009757,51036735,24528640,51027870,51045888,24241378,24255543,23946420,51040473,51028271,24428944,24135310,24699899,24548627,51017346,51035166,51042257,51033577,24549786,51069319,24546060,51059323,24517093,51061926,24428941,51037346,51057820,24526787,24526823,51036511,24537200,51043940,51012291,51025415,24453989,24506515,24524098,51009781,51019626,51041266,24561206,24468724,51036438,51057857,24697067,51037540,24526815,24694842,24385728,24546075,51041331,51047579,51055107,51040842,51016856,51037353,24561147,39324156,51025833,51069001,24463871,24526794,24528577,24377910,51057396,51053957,51045969,51057842,24585907,51030103,51065729,51041497,23804281,51006338,51055016,51059134,24586687,24543197,23986028,51030311,24539025,51044150,24428788,51057811,51039699,24187377,23983296,24036947,24540881,51026715,51067339,23998056,24288664,24563746,51029412,24528666,24528659,24566687,51061018,51046164,24077241,24561142,51063154,24140247,24528550,24290971,24560416,24371779,51044158,24550285,24004644,51056050,24371398,24387949,51006181,51027535,51059573,51063327,51047537,51038399,24526515,51012659,24255545,51063140,24120820,24390675,24526774,51010235,24007246,24367580,51065641,24080738,24589493,51044152,51043059,24299873,24566293,51021953,24561152,51049611,51047619,51009900,24377598,24559699,51003636,24550458,51012165,51049006,24291857,24506784,51059543,51055919,51041809,51063131,24542367,24526797,24181174,51039199,24528559,24382552,51045016,51014091,51048488,51060161,23966208,24543201,51039493,51061427,24208765\"}]}],\"maxAgeSeconds\":300,\"mainAppWebResponseContext\":{\"loggedOut\":true,\"trackingParam\":\"kx_fmPxhoPZRemMIo5DJrpANoiWBEPs-MVZXM4UqQy1R8_wRgkuswmIBwOcCE59TDtslLKPQ-SS\"},\"webResponseContextExtensionData\":{\"ytConfigData\":{\"visitorData\":\"CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D\",\"rootVisualElementType\":3854},\"hasDecorated\":true}},\"contents\":{\"twoColumnBrowseResultsRenderer\":{\"tabs\":[{\"tabRenderer\":{\"selected\":true,\"content\":{\"richGridRenderer\":{\"contents\":[{\"richItemRenderer\":{\"content\":{\"videoRenderer\":{\"videoId\":\"Z-RqHz5EJqo\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/Z-RqHz5EJqo/hq720.jpg?sqp=-oaymwE2COgCEMoBSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gmAAtAFigIMCAAQARhyIFYoOzAP\\u0026rs=AOn4CLD2v49BPSVfl87gik72Ft_BSDJGSA\",\"width\":360,\"height\":202},{\"url\":\"https://i.ytimg.com/vi/Z-RqHz5EJqo/hq720.jpg?sqp=-oaymwE2CNAFEJQDSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gmAAtAFigIMCAAQARhyIFYoOzAP\\u0026rs=AOn4CLCLGAD3eamvLcRFj25UNTOPRvrxfQ\",\"width\":720,\"height\":404}]},\"title\":{\"runs\":[{\"text\":\"Digging A SECRET GARAGE Part 2\"}],\"accessibility\":{\"accessibilityData\":{\"label\":\"Digging A SECRET GARAGE Part 2 by colinfurze 393,343 views 2 hours ago 21 minutes\"}}},\"descriptionSnippet\":{\"runs\":[{\"text\":\"We have the start of this EPIC ROOM \\nUSE Code COLIN to get £300 off your 8Sleep Pod https://www.eightsleep.com/colin\\n\\nGet your furze bundle boxes and Xmas Jumpers at https://www.colinfurzeshop.com...\"}]},\"longBylineText\":{\"runs\":[{\"text\":\"colinfurze\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@colinfurze\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCp68_FLety0O-n9QU6phsgw\",\"canonicalBaseUrl\":\"/@colinfurze\"}}}]},\"publishedTimeText\":{\"simpleText\":\"2 hours ago\"},\"lengthText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"21 minutes, 28 seconds\"}},\"simpleText\":\"21:28\"},\"viewCountText\":{\"simpleText\":\"393,343 views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtcmVjWg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4YngE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=Z-RqHz5EJqo\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"Z-RqHz5EJqo\",\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=67e46a1f3e4426aa\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"ownerBadges\":[{\"metadataBadgeRenderer\":{\"icon\":{\"iconType\":\"CHECK_CIRCLE_THICK\"},\"style\":\"BADGE_STYLE_TYPE_VERIFIED\",\"tooltip\":\"Verified\",\"trackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibilityData\":{\"label\":\"Verified\"}}}],\"ownerText\":{\"runs\":[{\"text\":\"colinfurze\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@colinfurze\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCp68_FLety0O-n9QU6phsgw\",\"canonicalBaseUrl\":\"/@colinfurze\"}}}]},\"shortBylineText\":{\"runs\":[{\"text\":\"colinfurze\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@colinfurze\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCp68_FLety0O-n9QU6phsgw\",\"canonicalBaseUrl\":\"/@colinfurze\"}}}]},\"trackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6mQKrNkPLzw5ryZw==\",\"showActionMenu\":false,\"shortViewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"393K views\"}},\"simpleText\":\"393K views\"},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Add to queue\"}]},\"icon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CMwCEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CMwCEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"Z-RqHz5EJqo\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CMwCEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"Z-RqHz5EJqo\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"Z-RqHz5EJqo\"]}}]}},\"trackingParams\":\"CMwCEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemDownloadRenderer\":{\"serviceEndpoint\":{\"clickTrackingParams\":\"CMsCENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"offlineVideoEndpoint\":{\"videoId\":\"Z-RqHz5EJqo\",\"onAddCommand\":{\"clickTrackingParams\":\"CMsCENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"getDownloadActionCommand\":{\"videoId\":\"Z-RqHz5EJqo\",\"params\":\"CAI%3D\"}}}},\"trackingParams\":\"CMsCENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgtaLVJxSHo1RUpxbw%3D%3D\",\"commands\":[{\"clickTrackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CMoCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"hasSeparator\":true}}],\"trackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Action menu\"}},\"targetId\":\"browse-video-menu-button\"}},\"channelThumbnailSupportedRenderers\":{\"channelThumbnailWithLinkRenderer\":{\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://yt3.ggpht.com/ytc/APkrFKaW13RSsfz5nob6k86sG-XUxsBkYHLiiDkxcJ8RIw=s68-c-k-c0x00ffffff-no-rj\",\"width\":68,\"height\":68}]},\"navigationEndpoint\":{\"clickTrackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@colinfurze\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCp68_FLety0O-n9QU6phsgw\",\"canonicalBaseUrl\":\"/@colinfurze\"}},\"accessibility\":{\"accessibilityData\":{\"label\":\"Go to channel\"}}}},\"thumbnailOverlays\":[{\"thumbnailOverlayTimeStatusRenderer\":{\"text\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"21 minutes, 28 seconds\"}},\"simpleText\":\"21:28\"},\"style\":\"DEFAULT\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"isToggled\":false,\"untoggledIcon\":{\"iconType\":\"WATCH_LATER\"},\"toggledIcon\":{\"iconType\":\"CHECK\"},\"untoggledTooltip\":\"Watch later\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CMkCEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"addedVideoId\":\"Z-RqHz5EJqo\",\"action\":\"ACTION_ADD_VIDEO\"}]}},\"toggledServiceEndpoint\":{\"clickTrackingParams\":\"CMkCEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"action\":\"ACTION_REMOVE_VIDEO_BY_VIDEO_ID\",\"removedVideoId\":\"Z-RqHz5EJqo\"}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Watch later\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CMkCEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"untoggledIcon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"toggledIcon\":{\"iconType\":\"PLAYLIST_ADD_CHECK\"},\"untoggledTooltip\":\"Add to queue\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CMgCEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CMgCEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"Z-RqHz5EJqo\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CMgCEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"Z-RqHz5EJqo\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"Z-RqHz5EJqo\"]}}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Add to queue\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CMgCEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayNowPlayingRenderer\":{\"text\":{\"runs\":[{\"text\":\"Now playing\"}]}}},{\"thumbnailOverlayLoadingPreviewRenderer\":{\"text\":{\"runs\":[{\"text\":\"Keep hovering to play\"}]}}}],\"richThumbnail\":{\"movingThumbnailRenderer\":{\"movingThumbnailDetails\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/an_webp/Z-RqHz5EJqo/mqdefault_6s.webp?du=3000\\u0026sqp=CMKD_qoG\\u0026rs=AOn4CLBNKsQ-xmN1hoVs_aVcmWTmBJEBbg\",\"width\":320,\"height\":180}],\"logAsMovingThumbnail\":true},\"enableHoveredLogging\":true,\"enableOverlay\":true}},\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CMcCENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtcmVjWg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4YngE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=Z-RqHz5EJqo\\u0026pp=YAHIAQE%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"Z-RqHz5EJqo\",\"playerParams\":\"YAHIAQE%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=67e46a1f3e4426aa\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}}}},\"trackingParams\":\"CMYCEJmNBRgAIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richSectionRenderer\":{\"content\":{\"richShelfRenderer\":{\"title\":{\"runs\":[{\"text\":\"Shorts\"}]},\"contents\":[{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"8A_GsMOcWeE\",\"headline\":{\"simpleText\":\"Largest Cake Pop (Official World Record)\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/8A_GsMOcWeE/oar2.jpg\",\"width\":406,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"140 million views\"}},\"simpleText\":\"140M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CMMCEIf2BBgAIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/8A_GsMOcWeE\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"8A_GsMOcWeE\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-jvuu5YoGusDD9dpLNQwuuva\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/8A_GsMOcWeE/frame0.jpg\",\"width\":406,\"height\":720}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CMUCELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"Cgs4QV9Hc01PY1dlRSoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CMMCEIf2BBgAIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"Cgs4QV9Hc01PY1dlRVICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CMMCEIf2BBgAIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CMQCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CMMCEIf2BBgAIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CMMCEIf2BBgAIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"8A_GsMOcWeE\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CMMCEIf2BBgAIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CMMCEIf2BBgAIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CMMCEIf2BBgAIhMIk87x0N_aggMVjV96BR0_MQ6mQOGz8ZyM1vGH8AE=\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Largest Cake Pop (Official World Record) - 57 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CMMCEIf2BBgAIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=8A_GsMOcWeE\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo77ruWKBrrAw_XaSzUMLrr2g%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"8A_GsMOcWeE\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo77ruWKBrrAw_XaSzUMLrr2g%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=f00fc6b0c39c59e1\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CMMCEIf2BBgAIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CMICEJmNBRgAIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"3m4aQSHvdbs\",\"headline\":{\"simpleText\":\"SON Deserves ACTING Award For THIS! 🤣🤣🤣\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/3m4aQSHvdbs/hq720.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=\\u0026rs=AOn4CLBLsNHvYdaMalFsUHeYrIlKbbaIDA\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"55 million views\"}},\"simpleText\":\"55M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CL8CEIf2BBgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/3m4aQSHvdbs\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"3m4aQSHvdbs\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-jvTcV6cs4OxieVMHDAGUnV_\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/3m4aQSHvdbs/frame0.jpg\",\"width\":1080,\"height\":1920}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CMECELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgszbTRhUVNIdmRicyoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CL8CEIf2BBgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgszbTRhUVNIdmRic1ICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CL8CEIf2BBgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CMACEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CL8CEIf2BBgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CL8CEIf2BBgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"3m4aQSHvdbs\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CL8CEIf2BBgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CL8CEIf2BBgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CL8CEIf2BBgBIhMIk87x0N_aggMVjV96BR0_MQ6mQLvrvY-SyIa33gE=\",\"accessibility\":{\"accessibilityData\":{\"label\":\"SON Deserves ACTING Award For THIS! 🤣🤣🤣 - 11 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CL8CEIf2BBgBIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=3m4aQSHvdbs\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo703FenLODsYnlTBwwBlJ1fw%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"3m4aQSHvdbs\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo703FenLODsYnlTBwwBlJ1fw%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=de6e1a4121ef75bb\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CL8CEIf2BBgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CL4CEJmNBRgBIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"gKX6dEOmGvM\",\"headline\":{\"simpleText\":\"cute deer 🦌 😍\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/gKX6dEOmGvM/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=\\u0026rs=AOn4CLDuJhJvv00oskPknrtkAobJhgtgbA\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"73 million views\"}},\"simpleText\":\"73M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CLsCEIf2BBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/gKX6dEOmGvM\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"gKX6dEOmGvM\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-jtyqciEgFijeoqsgdqS5bpf\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/gKX6dEOmGvM/frame0.jpg\",\"width\":576,\"height\":1024}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CL0CELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgtnS1g2ZEVPbUd2TSoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CLsCEIf2BBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgtnS1g2ZEVPbUd2TVICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CLsCEIf2BBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CLwCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CLsCEIf2BBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CLsCEIf2BBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"gKX6dEOmGvM\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CLsCEIf2BBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CLsCEIf2BBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CLsCEIf2BBgCIhMIk87x0N_aggMVjV96BR0_MQ6mQPO1mJ3Ezv7SgAE=\",\"accessibility\":{\"accessibilityData\":{\"label\":\"cute deer 🦌 😍 - 14 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CLsCEIf2BBgCIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=gKX6dEOmGvM\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo7cqnIhIBYo3qKrIHakuW6Xw%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"gKX6dEOmGvM\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo7cqnIhIBYo3qKrIHakuW6Xw%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=80a5fa7443a61af3\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CLsCEIf2BBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CLoCEJmNBRgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"OIibXW2JS3A\",\"headline\":{\"simpleText\":\"Fan PROPOSES to Maria Sakkari! 💍\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/OIibXW2JS3A/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=\\u0026rs=AOn4CLCKaZeL0ExnKPcmhNFlqOY8Ibg_1w\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"129 million views\"}},\"simpleText\":\"129M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CLcCEIf2BBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/OIibXW2JS3A\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"OIibXW2JS3A\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-ju1Ujgn30SaoBjTJIj1b6gz\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/OIibXW2JS3A/frame0.jpg\",\"width\":1080,\"height\":1920}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CLkCELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgtPSWliWFcySlMzQSoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CLcCEIf2BBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgtPSWliWFcySlMzQVICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CLcCEIf2BBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CLgCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CLcCEIf2BBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CLcCEIf2BBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"OIibXW2JS3A\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CLcCEIf2BBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CLcCEIf2BBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CLcCEIf2BBgDIhMIk87x0N_aggMVjV96BR0_MQ6mQPCWpezW66bEOA==\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Fan PROPOSES to Maria Sakkari! 💍 - 40 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CLcCEIf2BBgDIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=OIibXW2JS3A\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo7tVI4J99EmqAY0ySI9W-oMw%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"OIibXW2JS3A\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo7tVI4J99EmqAY0ySI9W-oMw%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=38889b5d6d894b70\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CLcCEIf2BBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CLYCEJmNBRgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"-7LJElqFEnQ\",\"headline\":{\"simpleText\":\"Stir the air\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/-7LJElqFEnQ/hq720.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=\\u0026rs=AOn4CLBEqR9_DaLkm4izx9Cvkdi4l9OMPQ\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"43 million views\"}},\"simpleText\":\"43M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CLMCEIf2BBgEIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/-7LJElqFEnQ\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"-7LJElqFEnQ\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-jtWrF-oLbux8_0GSVmZHkvr\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/-7LJElqFEnQ/frame0.jpg\",\"width\":1080,\"height\":1920}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CLUCELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgstN0xKRWxxRkVuUSoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CLMCEIf2BBgEIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgstN0xKRWxxRkVuUVICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CLMCEIf2BBgEIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CLQCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CLMCEIf2BBgEIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CLMCEIf2BBgEIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"-7LJElqFEnQ\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CLMCEIf2BBgEIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CLMCEIf2BBgEIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CLMCEIf2BBgEIhMIk87x0N_aggMVjV96BR0_MQ6mQPSklNSlorLZ-wE=\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Stir the air - 35 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CLMCEIf2BBgEIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=-7LJElqFEnQ\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo7VqxfqC27sfP9BklZmR5L6w%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"-7LJElqFEnQ\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo7VqxfqC27sfP9BklZmR5L6w%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=fbb2c9125a851274\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CLMCEIf2BBgEIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CLICEJmNBRgEIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"ofhyQ066TPo\",\"headline\":{\"simpleText\":\"Non è stato facile feeega ✨ #shorts\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/ofhyQ066TPo/hq720.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=\\u0026rs=AOn4CLD65tQY0APOdjwwjZrRnmduewU5MA\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"1.6 million views\"}},\"simpleText\":\"1.6M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CK8CEIf2BBgFIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/ofhyQ066TPo\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"ofhyQ066TPo\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-ju4huZ7pjD13i8NCHkxSIxV\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/ofhyQ066TPo/frame0.jpg\",\"width\":1080,\"height\":1920}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CLECELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgtvZmh5UTA2NlRQbyoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CK8CEIf2BBgFIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgtvZmh5UTA2NlRQb1ICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CK8CEIf2BBgFIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CLACEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CK8CEIf2BBgFIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CK8CEIf2BBgFIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"ofhyQ066TPo\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CK8CEIf2BBgFIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CK8CEIf2BBgFIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CK8CEIf2BBgFIhMIk87x0N_aggMVjV96BR0_MQ6mQPqZ6fW0yJz8oQE=\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Non è stato facile feeega ✨ #shorts - 35 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CK8CEIf2BBgFIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=ofhyQ066TPo\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo7uIbme6Yw9d4vDQh5MUiMVQ%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"ofhyQ066TPo\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo7uIbme6Yw9d4vDQh5MUiMVQ%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=a1f872434eba4cfa\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CK8CEIf2BBgFIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CK4CEJmNBRgFIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"eAutzGk8gU0\",\"headline\":{\"simpleText\":\"What I ordered vs what I got #grwm\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/eAutzGk8gU0/oardefault.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=\\u0026rs=AOn4CLD6V8xDk-loQQo-vW8I-EQQxeUgwQ\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"5.7 million views\"}},\"simpleText\":\"5.7M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CKsCEIf2BBgGIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/eAutzGk8gU0\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"eAutzGk8gU0\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-juvdRKtRCxVL975QhJWJr7h\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/eAutzGk8gU0/frame0.jpg\",\"width\":1080,\"height\":1920}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CK0CELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgtlQXV0ekdrOGdVMCoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CKsCEIf2BBgGIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgtlQXV0ekdrOGdVMFICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CKsCEIf2BBgGIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CKwCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CKsCEIf2BBgGIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CKsCEIf2BBgGIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"eAutzGk8gU0\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CKsCEIf2BBgGIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CKsCEIf2BBgGIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CKsCEIf2BBgGIhMIk87x0N_aggMVjV96BR0_MQ6mQM2C8snGueuFeA==\",\"accessibility\":{\"accessibilityData\":{\"label\":\"What I ordered vs what I got #grwm - 15 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CKsCEIf2BBgGIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=eAutzGk8gU0\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo7r3USrUQsVS_e-UISVia-4Q%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"eAutzGk8gU0\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo7r3USrUQsVS_e-UISVia-4Q%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=780badcc693c814d\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CKsCEIf2BBgGIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CKoCEJmNBRgGIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"_aHLLLmYCjI\",\"headline\":{\"simpleText\":\"Best Bride Entrance Ever! 😱\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/_aHLLLmYCjI/oardefault.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=\\u0026rs=AOn4CLAl6RxkAa00G2ETI2b2kL7BdgMIrg\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"4.3 million views\"}},\"simpleText\":\"4.3M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CKcCEIf2BBgHIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/_aHLLLmYCjI\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"_aHLLLmYCjI\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-jv1JroRt-12IyHVJn_aPY4N\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/_aHLLLmYCjI/frame0.jpg\",\"width\":720,\"height\":1280}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CKkCELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgtfYUhMTExtWUNqSSoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CKcCEIf2BBgHIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgtfYUhMTExtWUNqSVICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CKcCEIf2BBgHIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CKgCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CKcCEIf2BBgHIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CKcCEIf2BBgHIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"_aHLLLmYCjI\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CKcCEIf2BBgHIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CKcCEIf2BBgHIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CKcCEIf2BBgHIhMIk87x0N_aggMVjV96BR0_MQ6mQLKU4MzL5fLQ_QE=\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Best Bride Entrance Ever! 😱 - 31 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CKcCEIf2BBgHIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=_aHLLLmYCjI\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo79Sa6EbftdiMh1SZ_2j2ODQ%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"_aHLLLmYCjI\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo79Sa6EbftdiMh1SZ_2j2ODQ%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=fda1cb2cb9980a32\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CKcCEIf2BBgHIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CKYCEJmNBRgHIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"2dQuv4Pc5o0\",\"headline\":{\"simpleText\":\"respect 💯🙄🥶😱\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/2dQuv4Pc5o0/hq720.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=\\u0026rs=AOn4CLC3nEoBUQ6xONbRr_Q3388qPlBj5g\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"25 million views\"}},\"simpleText\":\"25M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CKMCEIf2BBgIIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/2dQuv4Pc5o0\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"2dQuv4Pc5o0\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-jvdXQti3utKU2vtV54JgRQJ\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/2dQuv4Pc5o0/frame0.jpg\",\"width\":720,\"height\":1280}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CKUCELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgsyZFF1djRQYzVvMCoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CKMCEIf2BBgIIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgsyZFF1djRQYzVvMFICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CKMCEIf2BBgIIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CKQCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CKMCEIf2BBgIIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CKMCEIf2BBgIIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"2dQuv4Pc5o0\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CKMCEIf2BBgIIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CKMCEIf2BBgIIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CKMCEIf2BBgIIhMIk87x0N_aggMVjV96BR0_MQ6mQI3N857414vq2QE=\",\"accessibility\":{\"accessibilityData\":{\"label\":\"respect 💯🙄🥶😱 - 18 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CKMCEIf2BBgIIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=2dQuv4Pc5o0\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo73V0LYt7rSlNr7VeeCYEUCQ%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"2dQuv4Pc5o0\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo73V0LYt7rSlNr7VeeCYEUCQ%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=d9d42ebf83dce68d\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CKMCEIf2BBgIIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CKICEJmNBRgIIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"h0I10UmFijY\",\"headline\":{\"simpleText\":\"Spicy Ramen 🌶️🍜🥵 #shorts\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/h0I10UmFijY/hq720.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=\\u0026rs=AOn4CLB3a4hjB9NogMVDzNbvwkQO1UrNPg\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"18 million views\"}},\"simpleText\":\"18M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CJ8CEIf2BBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/h0I10UmFijY\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"h0I10UmFijY\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-jtNuCi8LuYcGUUOWbBSQJpM\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/h0I10UmFijY/frame0.jpg\",\"width\":1080,\"height\":1920}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CKECELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgtoMEkxMFVtRmlqWSoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CJ8CEIf2BBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgtoMEkxMFVtRmlqWVICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CJ8CEIf2BBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CKACEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CJ8CEIf2BBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CJ8CEIf2BBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"h0I10UmFijY\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CJ8CEIf2BBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CJ8CEIf2BBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CJ8CEIf2BBgJIhMIk87x0N_aggMVjV96BR0_MQ6mQLaUlsyUuo2hhwE=\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Spicy Ramen 🌶️🍜🥵 #shorts - 51 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CJ8CEIf2BBgJIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=h0I10UmFijY\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo7TbgovC7mHBlFDlmwUkCaTA%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"h0I10UmFijY\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo7TbgovC7mHBlFDlmwUkCaTA%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=874235d149858a36\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CJ8CEIf2BBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CJ4CEJmNBRgJIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"mJNkzjOeKdE\",\"headline\":{\"simpleText\":\"How Babies get an X Ray\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/mJNkzjOeKdE/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=\\u0026rs=AOn4CLB22g6ED5fw7V9Hq8yUe7EamwfkmQ\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"11 million views\"}},\"simpleText\":\"11M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CJsCEIf2BBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/mJNkzjOeKdE\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"mJNkzjOeKdE\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-ju48QQ7XwlGjSginb-GJqEK\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/mJNkzjOeKdE/frame0.jpg\",\"width\":1080,\"height\":1920}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CJ0CELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgttSk5rempPZUtkRSoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CJsCEIf2BBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgttSk5rempPZUtkRVICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CJsCEIf2BBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CJwCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CJsCEIf2BBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CJsCEIf2BBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"mJNkzjOeKdE\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CJsCEIf2BBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CJsCEIf2BBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CJsCEIf2BBgKIhMIk87x0N_aggMVjV96BR0_MQ6mQNHT-JzjmdnJmAE=\",\"accessibility\":{\"accessibilityData\":{\"label\":\"How Babies get an X Ray - 12 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CJsCEIf2BBgKIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=mJNkzjOeKdE\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo7uPEEO18JRo0oIp2_hiahCg%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"mJNkzjOeKdE\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo7uPEEO18JRo0oIp2_hiahCg%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=989364ce339e29d1\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CJsCEIf2BBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CJoCEJmNBRgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"reelItemRenderer\":{\"videoId\":\"PyBvHn-KAZk\",\"headline\":{\"simpleText\":\"This Man Is A Warrior 👏❤️\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/PyBvHn-KAZk/hq720.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=\\u0026rs=AOn4CLDoKGeHI6XDn7ufBxj7iMqznFVOmQ\",\"width\":405,\"height\":720}],\"isOriginalAspectRatio\":true},\"viewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"51 million views\"}},\"simpleText\":\"51M views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CJcCEIf2BBgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/shorts/PyBvHn-KAZk\",\"webPageType\":\"WEB_PAGE_TYPE_SHORTS\",\"rootVe\":37414}},\"reelWatchEndpoint\":{\"videoId\":\"PyBvHn-KAZk\",\"playerParams\":\"8AEBoAMByAMkuAQFogYVAdXZ-jtB902gthlh5PLzBPFy2b3l\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/PyBvHn-KAZk/frame0.jpg\",\"width\":1080,\"height\":1920}],\"isOriginalAspectRatio\":true},\"overlay\":{\"reelPlayerOverlayRenderer\":{\"style\":\"REEL_PLAYER_OVERLAY_STYLE_SHORTS\",\"trackingParams\":\"CJkCELC1BCITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"reelPlayerNavigationModel\":\"REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED\"}},\"params\":\"CAUwAg%3D%3D\",\"sequenceProvider\":\"REEL_WATCH_SEQUENCE_PROVIDER_RPC\",\"sequenceParams\":\"CgtQeUJ2SG4tS0FaayoCGAVQGWgA\",\"loggingContext\":{\"vssLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"},\"qoeLoggingContext\":{\"serializedContextData\":\"CgIIDA%3D%3D\"}},\"ustreamerConfig\":\"CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==\"}},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CJcCEIf2BBgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgtQeUJ2SG4tS0Faa1ICCAI%3D\",\"commands\":[{\"clickTrackingParams\":\"CJcCEIf2BBgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CJgCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CJcCEIf2BBgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Share\"}},\"hasSeparator\":true}},{\"menuNavigationItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Send feedback\"}]},\"icon\":{\"iconType\":\"FEEDBACK\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CJcCEIf2BBgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"ignoreNavigation\":true}},\"userFeedbackEndpoint\":{\"additionalDatas\":[{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"video_id\",\"value\":\"PyBvHn-KAZk\"}},{\"userFeedbackEndpointProductSpecificValueData\":{\"key\":\"lockup\",\"value\":\"shelf\"}}]}},\"trackingParams\":\"CJcCEIf2BBgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Send feedback\"}}}}],\"trackingParams\":\"CJcCEIf2BBgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"More actions\"}}}},\"trackingParams\":\"CJcCEIf2BBgLIhMIk87x0N_aggMVjV96BR0_MQ6mQJmDqPzn45uQPw==\",\"accessibility\":{\"accessibilityData\":{\"label\":\"This Man Is A Warrior 👏❤️ - 26 seconds - play video\"}},\"style\":\"REEL_ITEM_STYLE_AVATAR_CIRCLE\",\"videoType\":\"REEL_VIDEO_TYPE_VIDEO\",\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CJcCEIf2BBgLIhMIk87x0N_aggMVjV96BR0_MQ6mMgZnLWhpZ2haD0ZFd2hhdF90b193YXRjaJoBBQgkEI4e\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=PyBvHn-KAZk\\u0026pp=YAHIAQHwAQG6AwIYAqIGFQHV2fo7QfdNoLYZYeTy8wTxctm95Q%3D%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"PyBvHn-KAZk\",\"playerParams\":\"YAHIAQHwAQG6AwIYAqIGFQHV2fo7QfdNoLYZYeTy8wTxctm95Q%3D%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=3f206f1e7f8a0199\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"loggingDirectives\":{\"trackingParams\":\"CJcCEIf2BBgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"visibility\":{\"types\":\"12\"},\"enableDisplayloggerExperiment\":true}}},\"trackingParams\":\"CJYCEJmNBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\"}}],\"trackingParams\":\"CJMCEN-DAyITCJPO8dDf2oIDFY1fegUdPzEOpg==\",\"showMoreButton\":{\"buttonRenderer\":{\"style\":\"STYLE_OPACITY\",\"size\":\"SIZE_DEFAULT\",\"text\":{\"runs\":[{\"text\":\"Show more\"}]},\"icon\":{\"iconType\":\"EXPAND\"},\"accessibility\":{\"label\":\"Show more\"},\"trackingParams\":\"CJUCEJnjCyITCJPO8dDf2oIDFY1fegUdPzEOpg==\"}},\"isExpanded\":false,\"icon\":{\"iconType\":\"YOUTUBE_SHORTS_BRAND_24\"},\"isTopDividerHidden\":false,\"isBottomDividerHidden\":false,\"showLessButton\":{\"buttonRenderer\":{\"style\":\"STYLE_OPACITY\",\"size\":\"SIZE_DEFAULT\",\"text\":{\"runs\":[{\"text\":\"Show less\"}]},\"icon\":{\"iconType\":\"COLLAPSE\"},\"accessibility\":{\"label\":\"Show less\"},\"trackingParams\":\"CJQCEPBbIhMIk87x0N_aggMVjV96BR0_MQ6m\"}}}},\"trackingParams\":\"CJICEOOXBRgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"fullBleed\":false}},{\"richSectionRenderer\":{\"content\":{\"richShelfRenderer\":{\"title\":{\"runs\":[{\"text\":\"Trending\"}]},\"contents\":[{\"richItemRenderer\":{\"content\":{\"videoRenderer\":{\"videoId\":\"34I8PW17TII\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/34I8PW17TII/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLCOW6K9KmT7bDOvO_genEpqp-vDcw\",\"width\":360,\"height\":202},{\"url\":\"https://i.ytimg.com/vi/34I8PW17TII/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLCkOZ0B4oaYdl7x8iS40rbkt9V4Iw\",\"width\":720,\"height\":404}]},\"title\":{\"runs\":[{\"text\":\"BRASIL vs. ARGENTINA [0-1] | RESUMEN | ELIMINATORIAS SUDAMERICANAS | FECHA 6\"}],\"accessibility\":{\"accessibilityData\":{\"label\":\"BRASIL vs. ARGENTINA [0-1] | RESUMEN | ELIMINATORIAS SUDAMERICANAS | FECHA 6 by CONMEBOL 8,473,209 views 1 day ago 10 minutes, 9 seconds\"}}},\"descriptionSnippet\":{\"runs\":[{\"text\":\"#brasil #argentina #eliminatoriassudamericanas \\n¡Victoria histórica de #Argentina en el clásico! Venció a Brasil como visitante por primera vez en las #EliminatoriasSudamericanas 👏🇦🇷...\"}]},\"longBylineText\":{\"runs\":[{\"text\":\"CONMEBOL\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@conmebol\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCzU8-lZlRfkV3nj0RzAZdrQ\",\"canonicalBaseUrl\":\"/@conmebol\"}}}]},\"publishedTimeText\":{\"simpleText\":\"1 day ago\"},\"lengthText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"10 minutes, 9 seconds\"}},\"simpleText\":\"10:09\"},\"viewCountText\":{\"simpleText\":\"8,473,209 views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=34I8PW17TII\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"34I8PW17TII\",\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=df823c3d6d7b4c82\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"ownerBadges\":[{\"metadataBadgeRenderer\":{\"icon\":{\"iconType\":\"CHECK_CIRCLE_THICK\"},\"style\":\"BADGE_STYLE_TYPE_VERIFIED\",\"tooltip\":\"Verified\",\"trackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibilityData\":{\"label\":\"Verified\"}}}],\"ownerText\":{\"runs\":[{\"text\":\"CONMEBOL\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@conmebol\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCzU8-lZlRfkV3nj0RzAZdrQ\",\"canonicalBaseUrl\":\"/@conmebol\"}}}]},\"shortBylineText\":{\"runs\":[{\"text\":\"CONMEBOL\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@conmebol\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCzU8-lZlRfkV3nj0RzAZdrQ\",\"canonicalBaseUrl\":\"/@conmebol\"}}}]},\"trackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6mQIKZ7evWh4_B3wE=\",\"showActionMenu\":false,\"shortViewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"8.4 million views\"}},\"simpleText\":\"8.4M views\"},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Add to queue\"}]},\"icon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CJECEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CJECEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"34I8PW17TII\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CJECEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"34I8PW17TII\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"34I8PW17TII\"]}}]}},\"trackingParams\":\"CJECEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemDownloadRenderer\":{\"serviceEndpoint\":{\"clickTrackingParams\":\"CJACENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"offlineVideoEndpoint\":{\"videoId\":\"34I8PW17TII\",\"onAddCommand\":{\"clickTrackingParams\":\"CJACENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"getDownloadActionCommand\":{\"videoId\":\"34I8PW17TII\",\"params\":\"CAI%3D\"}}}},\"trackingParams\":\"CJACENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgszNEk4UFcxN1RJSQ%3D%3D\",\"commands\":[{\"clickTrackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CI8CEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"hasSeparator\":true}}],\"trackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Action menu\"}}}},\"channelThumbnailSupportedRenderers\":{\"channelThumbnailWithLinkRenderer\":{\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://yt3.ggpht.com/89JiHsaEsuCuzlcmtemfWyfMtRRbZrjMciCZrWTWT7oRonqiz29iOnBndDifmPQAcF54thytIQ=s68-c-k-c0x00ffffff-no-rj\",\"width\":68,\"height\":68}]},\"navigationEndpoint\":{\"clickTrackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@conmebol\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCzU8-lZlRfkV3nj0RzAZdrQ\",\"canonicalBaseUrl\":\"/@conmebol\"}},\"accessibility\":{\"accessibilityData\":{\"label\":\"Go to channel\"}}}},\"thumbnailOverlays\":[{\"thumbnailOverlayTimeStatusRenderer\":{\"text\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"10 minutes, 9 seconds\"}},\"simpleText\":\"10:09\"},\"style\":\"DEFAULT\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"isToggled\":false,\"untoggledIcon\":{\"iconType\":\"WATCH_LATER\"},\"toggledIcon\":{\"iconType\":\"CHECK\"},\"untoggledTooltip\":\"Watch later\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CI4CEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"addedVideoId\":\"34I8PW17TII\",\"action\":\"ACTION_ADD_VIDEO\"}]}},\"toggledServiceEndpoint\":{\"clickTrackingParams\":\"CI4CEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"action\":\"ACTION_REMOVE_VIDEO_BY_VIDEO_ID\",\"removedVideoId\":\"34I8PW17TII\"}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Watch later\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CI4CEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"untoggledIcon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"toggledIcon\":{\"iconType\":\"PLAYLIST_ADD_CHECK\"},\"untoggledTooltip\":\"Add to queue\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CI0CEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CI0CEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"34I8PW17TII\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CI0CEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"34I8PW17TII\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"34I8PW17TII\"]}}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Add to queue\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CI0CEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayNowPlayingRenderer\":{\"text\":{\"runs\":[{\"text\":\"Now playing\"}]}}},{\"thumbnailOverlayLoadingPreviewRenderer\":{\"text\":{\"runs\":[{\"text\":\"Keep hovering to play\"}]}}}],\"richThumbnail\":{\"movingThumbnailRenderer\":{\"movingThumbnailDetails\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/an_webp/34I8PW17TII/mqdefault_6s.webp?du=3000\\u0026sqp=CIyV_qoG\\u0026rs=AOn4CLDYzz5EaQj11_ek8aFoaKpQW5z1bg\",\"width\":320,\"height\":180}],\"logAsMovingThumbnail\":true},\"enableHoveredLogging\":true,\"enableOverlay\":true}},\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CIwCENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=34I8PW17TII\\u0026pp=YAHIAQE%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"34I8PW17TII\",\"playerParams\":\"YAHIAQE%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=df823c3d6d7b4c82\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}}}},\"trackingParams\":\"CIsCEJmNBRgAIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"videoRenderer\":{\"videoId\":\"aif_UpFY6hs\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/aif_UpFY6hs/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLBfYwngN8IGxbB5zamvSS-J9-XPGw\",\"width\":360,\"height\":202},{\"url\":\"https://i.ytimg.com/vi/aif_UpFY6hs/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLBetw7QiQQ9DQokg6Gtg0mPuosDRw\",\"width\":720,\"height\":404}]},\"title\":{\"runs\":[{\"text\":\"Brasil 0-1 Argentina: Resumen Extendido | Highlights | Melhores momentos CONMEBOL Eliminatorias\"}],\"accessibility\":{\"accessibilityData\":{\"label\":\"Brasil 0-1 Argentina: Resumen Extendido | Highlights | Melhores momentos CONMEBOL Eliminatorias by Fanatiz 1,066,210 views 1 day ago 16 minutes\"}}},\"descriptionSnippet\":{\"runs\":[{\"text\":\"Relive the Epic Clash: Brazil 0-1 Argentina | In this thrilling World Cup Qualifier at Maracanã Stadium, witness the historic moment as Argentine Centre back Nicolas Otamendi netted the winning...\"}]},\"longBylineText\":{\"runs\":[{\"text\":\"Fanatiz\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@Fanatiz\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCvEJrtUk0C2wh3P-9DOdblA\",\"canonicalBaseUrl\":\"/@Fanatiz\"}}}]},\"publishedTimeText\":{\"simpleText\":\"1 day ago\"},\"lengthText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"16 minutes, 13 seconds\"}},\"simpleText\":\"16:13\"},\"viewCountText\":{\"simpleText\":\"1,066,210 views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=aif_UpFY6hs\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"aif_UpFY6hs\",\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=6a27ff529158ea1b\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"ownerText\":{\"runs\":[{\"text\":\"Fanatiz\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@Fanatiz\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCvEJrtUk0C2wh3P-9DOdblA\",\"canonicalBaseUrl\":\"/@Fanatiz\"}}}]},\"shortBylineText\":{\"runs\":[{\"text\":\"Fanatiz\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@Fanatiz\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCvEJrtUk0C2wh3P-9DOdblA\",\"canonicalBaseUrl\":\"/@Fanatiz\"}}}]},\"trackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6mQJvU44qp6v-Tag==\",\"showActionMenu\":false,\"shortViewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"1 million views\"}},\"simpleText\":\"1M views\"},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Add to queue\"}]},\"icon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CIoCEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CIoCEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"aif_UpFY6hs\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CIoCEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"aif_UpFY6hs\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"aif_UpFY6hs\"]}}]}},\"trackingParams\":\"CIoCEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemDownloadRenderer\":{\"serviceEndpoint\":{\"clickTrackingParams\":\"CIkCENGqBRgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"offlineVideoEndpoint\":{\"videoId\":\"aif_UpFY6hs\",\"onAddCommand\":{\"clickTrackingParams\":\"CIkCENGqBRgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"getDownloadActionCommand\":{\"videoId\":\"aif_UpFY6hs\",\"params\":\"CAI%3D\"}}}},\"trackingParams\":\"CIkCENGqBRgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgthaWZfVXBGWTZocw%3D%3D\",\"commands\":[{\"clickTrackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CIgCEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"hasSeparator\":true}}],\"trackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Action menu\"}}}},\"channelThumbnailSupportedRenderers\":{\"channelThumbnailWithLinkRenderer\":{\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://yt3.ggpht.com/QCNiFPqjSmc4l9HKm4VlbFEGkCRwo8XHzKX2wpRDccuPZkNUwY6nU5s4RXUD4ww-BhSIH5nr=s68-c-k-c0x00ffffff-no-rj\",\"width\":68,\"height\":68}]},\"navigationEndpoint\":{\"clickTrackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@Fanatiz\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCvEJrtUk0C2wh3P-9DOdblA\",\"canonicalBaseUrl\":\"/@Fanatiz\"}},\"accessibility\":{\"accessibilityData\":{\"label\":\"Go to channel\"}}}},\"thumbnailOverlays\":[{\"thumbnailOverlayTimeStatusRenderer\":{\"text\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"16 minutes, 13 seconds\"}},\"simpleText\":\"16:13\"},\"style\":\"DEFAULT\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"isToggled\":false,\"untoggledIcon\":{\"iconType\":\"WATCH_LATER\"},\"toggledIcon\":{\"iconType\":\"CHECK\"},\"untoggledTooltip\":\"Watch later\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CIcCEPnnAxgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"addedVideoId\":\"aif_UpFY6hs\",\"action\":\"ACTION_ADD_VIDEO\"}]}},\"toggledServiceEndpoint\":{\"clickTrackingParams\":\"CIcCEPnnAxgBIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"action\":\"ACTION_REMOVE_VIDEO_BY_VIDEO_ID\",\"removedVideoId\":\"aif_UpFY6hs\"}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Watch later\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CIcCEPnnAxgBIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"untoggledIcon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"toggledIcon\":{\"iconType\":\"PLAYLIST_ADD_CHECK\"},\"untoggledTooltip\":\"Add to queue\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CIYCEMfsBBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CIYCEMfsBBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"aif_UpFY6hs\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CIYCEMfsBBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"aif_UpFY6hs\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"aif_UpFY6hs\"]}}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Add to queue\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CIYCEMfsBBgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayNowPlayingRenderer\":{\"text\":{\"runs\":[{\"text\":\"Now playing\"}]}}},{\"thumbnailOverlayLoadingPreviewRenderer\":{\"text\":{\"runs\":[{\"text\":\"Keep hovering to play\"}]}}}],\"richThumbnail\":{\"movingThumbnailRenderer\":{\"movingThumbnailDetails\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/an_webp/aif_UpFY6hs/mqdefault_6s.webp?du=3000\\u0026sqp=CP6k_qoG\\u0026rs=AOn4CLAgOouPCRObAjcxdeTqKI7DySgzWw\",\"width\":320,\"height\":180}],\"logAsMovingThumbnail\":true},\"enableHoveredLogging\":true,\"enableOverlay\":true}},\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CIUCENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=aif_UpFY6hs\\u0026pp=YAHIAQE%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"aif_UpFY6hs\",\"playerParams\":\"YAHIAQE%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=6a27ff529158ea1b\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}}}},\"trackingParams\":\"CIQCEJmNBRgBIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"videoRenderer\":{\"videoId\":\"8FkLRUJj-o0\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/8FkLRUJj-o0/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLCNx9k-JjrqBd5DHk-qydp5foMg_A\",\"width\":360,\"height\":202},{\"url\":\"https://i.ytimg.com/vi/8FkLRUJj-o0/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLD5vK4ywcCtZAWwxW4aNgWy7Amq1A\",\"width\":720,\"height\":404}]},\"title\":{\"runs\":[{\"text\":\"ANIMAL (OFFICIAL TRAILER): Ranbir Kapoor | Rashmika M, Anil K, Bobby D | Sandeep Vanga | Bhushan K\"}],\"accessibility\":{\"accessibilityData\":{\"label\":\"ANIMAL (OFFICIAL TRAILER): Ranbir Kapoor | Rashmika M, Anil K, Bobby D | Sandeep Vanga | Bhushan K by T-Series 23,152,517 views 10 hours ago 3 minutes, 33 seconds\"}}},\"descriptionSnippet\":{\"runs\":[{\"text\":\"THE ANIMAL, YOU HAVE NEVER SEEN BEFORE! PRESENTING THE OFFICIAL TRAILER OF THE FILM ANIMAL. STARRING RANBIR KAPOOR, RASHMIKA MANDANNA, ANIL KAPOOR, BOBBY DEOL, TRIPTI DIMRI \\u0026 SHAKTI KAPOOR....\"}]},\"longBylineText\":{\"runs\":[{\"text\":\"T-Series\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@tseries\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCq-Fj5jknLsUf-MWSy4_brA\",\"canonicalBaseUrl\":\"/@tseries\"}}}]},\"publishedTimeText\":{\"simpleText\":\"10 hours ago\"},\"lengthText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"3 minutes, 33 seconds\"}},\"simpleText\":\"3:33\"},\"viewCountText\":{\"simpleText\":\"23,152,517 views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=8FkLRUJj-o0\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"8FkLRUJj-o0\",\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=f0590b454263fa8d\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"ownerBadges\":[{\"metadataBadgeRenderer\":{\"icon\":{\"iconType\":\"CHECK_CIRCLE_THICK\"},\"style\":\"BADGE_STYLE_TYPE_VERIFIED\",\"tooltip\":\"Verified\",\"trackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibilityData\":{\"label\":\"Verified\"}}}],\"ownerText\":{\"runs\":[{\"text\":\"T-Series\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@tseries\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCq-Fj5jknLsUf-MWSy4_brA\",\"canonicalBaseUrl\":\"/@tseries\"}}}]},\"shortBylineText\":{\"runs\":[{\"text\":\"T-Series\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@tseries\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCq-Fj5jknLsUf-MWSy4_brA\",\"canonicalBaseUrl\":\"/@tseries\"}}}]},\"trackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6mQI31j5PU6MKs8AE=\",\"showActionMenu\":false,\"shortViewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"23 million views\"}},\"simpleText\":\"23M views\"},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Add to queue\"}]},\"icon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CIMCEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CIMCEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"8FkLRUJj-o0\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CIMCEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"8FkLRUJj-o0\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"8FkLRUJj-o0\"]}}]}},\"trackingParams\":\"CIMCEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemDownloadRenderer\":{\"serviceEndpoint\":{\"clickTrackingParams\":\"CIICENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"offlineVideoEndpoint\":{\"videoId\":\"8FkLRUJj-o0\",\"onAddCommand\":{\"clickTrackingParams\":\"CIICENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"getDownloadActionCommand\":{\"videoId\":\"8FkLRUJj-o0\",\"params\":\"CAI%3D\"}}}},\"trackingParams\":\"CIICENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"Cgs4RmtMUlVKai1vMA%3D%3D\",\"commands\":[{\"clickTrackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CIECEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"hasSeparator\":true}}],\"trackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Action menu\"}}}},\"channelThumbnailSupportedRenderers\":{\"channelThumbnailWithLinkRenderer\":{\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://yt3.ggpht.com/y1F4EOGuP19nZcBlzcyCtnHiYhkAOPQiRxwKeaGrOjXarUZZjcx_heiDiC06_Qj6ERea_qWK9A=s68-c-k-c0x00ffffff-no-rj\",\"width\":68,\"height\":68}]},\"navigationEndpoint\":{\"clickTrackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@tseries\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCq-Fj5jknLsUf-MWSy4_brA\",\"canonicalBaseUrl\":\"/@tseries\"}},\"accessibility\":{\"accessibilityData\":{\"label\":\"Go to channel\"}}}},\"thumbnailOverlays\":[{\"thumbnailOverlayTimeStatusRenderer\":{\"text\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"3 minutes, 33 seconds\"}},\"simpleText\":\"3:33\"},\"style\":\"DEFAULT\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"isToggled\":false,\"untoggledIcon\":{\"iconType\":\"WATCH_LATER\"},\"toggledIcon\":{\"iconType\":\"CHECK\"},\"untoggledTooltip\":\"Watch later\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CIACEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"addedVideoId\":\"8FkLRUJj-o0\",\"action\":\"ACTION_ADD_VIDEO\"}]}},\"toggledServiceEndpoint\":{\"clickTrackingParams\":\"CIACEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"action\":\"ACTION_REMOVE_VIDEO_BY_VIDEO_ID\",\"removedVideoId\":\"8FkLRUJj-o0\"}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Watch later\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CIACEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"untoggledIcon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"toggledIcon\":{\"iconType\":\"PLAYLIST_ADD_CHECK\"},\"untoggledTooltip\":\"Add to queue\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CP8BEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CP8BEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"8FkLRUJj-o0\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CP8BEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"8FkLRUJj-o0\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"8FkLRUJj-o0\"]}}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Add to queue\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CP8BEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayNowPlayingRenderer\":{\"text\":{\"runs\":[{\"text\":\"Now playing\"}]}}},{\"thumbnailOverlayLoadingPreviewRenderer\":{\"text\":{\"runs\":[{\"text\":\"Keep hovering to play\"}]}}}],\"richThumbnail\":{\"movingThumbnailRenderer\":{\"movingThumbnailDetails\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/an_webp/8FkLRUJj-o0/mqdefault_6s.webp?du=3000\\u0026sqp=CKSn_qoG\\u0026rs=AOn4CLDZ--n8onAbCY1J5sMXe5fxKeDkzA\",\"width\":320,\"height\":180}],\"logAsMovingThumbnail\":true},\"enableHoveredLogging\":true,\"enableOverlay\":true}},\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CP4BENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=8FkLRUJj-o0\\u0026pp=YAHIAQE%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"8FkLRUJj-o0\",\"playerParams\":\"YAHIAQE%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=f0590b454263fa8d\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}}}},\"trackingParams\":\"CP0BEJmNBRgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"videoRenderer\":{\"videoId\":\"mkViD0_tXyU\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/mkViD0_tXyU/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLDHaMvs1duLUV6_lHIqAGErgsSbsg\",\"width\":360,\"height\":202},{\"url\":\"https://i.ytimg.com/vi/mkViD0_tXyU/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLBT5MkqKMqr17Bl4GRfYpf1DHQ5tw\",\"width\":720,\"height\":404}]},\"title\":{\"runs\":[{\"text\":\"RED LOCK DI NUOVO CAMPIONI!\"}],\"accessibility\":{\"accessibilityData\":{\"label\":\"RED LOCK DI NUOVO CAMPIONI! by ilMasseo 100,785 views 3 days ago 36 minutes\"}}},\"descriptionSnippet\":{\"runs\":[{\"text\":\"Fioi ecco finalmente la seconda parte del secondo vlog per celebrare la vittoria della seconda edizione della GOA7 LEAGUE! \\nRicordate di lasciare un follow alla pagina Instagram dei Red Lock...\"}]},\"longBylineText\":{\"runs\":[{\"text\":\"ilMasseo\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@ilMasseo\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCH5dV7XjIpPGtqYlHXtG20Q\",\"canonicalBaseUrl\":\"/@ilMasseo\"}}}]},\"publishedTimeText\":{\"simpleText\":\"3 days ago\"},\"lengthText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"36 minutes, 25 seconds\"}},\"simpleText\":\"36:25\"},\"viewCountText\":{\"simpleText\":\"100,785 views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=mkViD0_tXyU\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"mkViD0_tXyU\",\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=9a45620f4fed5f25\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"ownerBadges\":[{\"metadataBadgeRenderer\":{\"icon\":{\"iconType\":\"CHECK_CIRCLE_THICK\"},\"style\":\"BADGE_STYLE_TYPE_VERIFIED\",\"tooltip\":\"Verified\",\"trackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibilityData\":{\"label\":\"Verified\"}}}],\"ownerText\":{\"runs\":[{\"text\":\"ilMasseo\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@ilMasseo\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCH5dV7XjIpPGtqYlHXtG20Q\",\"canonicalBaseUrl\":\"/@ilMasseo\"}}}]},\"shortBylineText\":{\"runs\":[{\"text\":\"ilMasseo\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@ilMasseo\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCH5dV7XjIpPGtqYlHXtG20Q\",\"canonicalBaseUrl\":\"/@ilMasseo\"}}}]},\"trackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mQKW-tf_0wdiimgE=\",\"showActionMenu\":false,\"shortViewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"100K views\"}},\"simpleText\":\"100K views\"},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Add to queue\"}]},\"icon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CPwBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CPwBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"mkViD0_tXyU\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CPwBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"mkViD0_tXyU\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"mkViD0_tXyU\"]}}]}},\"trackingParams\":\"CPwBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemDownloadRenderer\":{\"serviceEndpoint\":{\"clickTrackingParams\":\"CPsBENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"offlineVideoEndpoint\":{\"videoId\":\"mkViD0_tXyU\",\"onAddCommand\":{\"clickTrackingParams\":\"CPsBENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"getDownloadActionCommand\":{\"videoId\":\"mkViD0_tXyU\",\"params\":\"CAI%3D\"}}}},\"trackingParams\":\"CPsBENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"Cgtta1ZpRDBfdFh5VQ%3D%3D\",\"commands\":[{\"clickTrackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CPoBEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"hasSeparator\":true}}],\"trackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Action menu\"}}}},\"channelThumbnailSupportedRenderers\":{\"channelThumbnailWithLinkRenderer\":{\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://yt3.ggpht.com/ytc/APkrFKZjSpUpyAQqL-lRX00c56V_Cp5ouK7VSP41_OmPtw=s68-c-k-c0x00ffffff-no-rj\",\"width\":68,\"height\":68}]},\"navigationEndpoint\":{\"clickTrackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@ilMasseo\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCH5dV7XjIpPGtqYlHXtG20Q\",\"canonicalBaseUrl\":\"/@ilMasseo\"}},\"accessibility\":{\"accessibilityData\":{\"label\":\"Go to channel\"}}}},\"thumbnailOverlays\":[{\"thumbnailOverlayTimeStatusRenderer\":{\"text\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"36 minutes, 25 seconds\"}},\"simpleText\":\"36:25\"},\"style\":\"DEFAULT\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"isToggled\":false,\"untoggledIcon\":{\"iconType\":\"WATCH_LATER\"},\"toggledIcon\":{\"iconType\":\"CHECK\"},\"untoggledTooltip\":\"Watch later\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CPkBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"addedVideoId\":\"mkViD0_tXyU\",\"action\":\"ACTION_ADD_VIDEO\"}]}},\"toggledServiceEndpoint\":{\"clickTrackingParams\":\"CPkBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"action\":\"ACTION_REMOVE_VIDEO_BY_VIDEO_ID\",\"removedVideoId\":\"mkViD0_tXyU\"}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Watch later\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CPkBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"untoggledIcon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"toggledIcon\":{\"iconType\":\"PLAYLIST_ADD_CHECK\"},\"untoggledTooltip\":\"Add to queue\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CPgBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CPgBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"mkViD0_tXyU\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CPgBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"mkViD0_tXyU\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"mkViD0_tXyU\"]}}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Add to queue\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CPgBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayNowPlayingRenderer\":{\"text\":{\"runs\":[{\"text\":\"Now playing\"}]}}},{\"thumbnailOverlayLoadingPreviewRenderer\":{\"text\":{\"runs\":[{\"text\":\"Keep hovering to play\"}]}}}],\"richThumbnail\":{\"movingThumbnailRenderer\":{\"movingThumbnailDetails\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/an_webp/mkViD0_tXyU/mqdefault_6s.webp?du=3000\\u0026sqp=CKXv_aoG\\u0026rs=AOn4CLDiHdXdL2NcegXtqIY1TIljQU8o7w\",\"width\":320,\"height\":180}],\"logAsMovingThumbnail\":true},\"enableHoveredLogging\":true,\"enableOverlay\":true}},\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CPcBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=mkViD0_tXyU\\u0026pp=YAHIAQE%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"mkViD0_tXyU\",\"playerParams\":\"YAHIAQE%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=9a45620f4fed5f25\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}}}},\"trackingParams\":\"CPYBEJmNBRgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"videoRenderer\":{\"videoId\":\"wj4PF_v29jQ\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/wj4PF_v29jQ/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLAgNnQk03GiBuyOyio063kHaAiXsg\",\"width\":360,\"height\":202},{\"url\":\"https://i.ytimg.com/vi/wj4PF_v29jQ/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLA_TApmUJP6A3mH07rE6PYj2x3gVg\",\"width\":720,\"height\":404}]},\"title\":{\"runs\":[{\"text\":\"Highlights: Irlanda-Italia 2-2 | Under 21 | Qualificazioni U21 EURO 2025\"}],\"accessibility\":{\"accessibilityData\":{\"label\":\"Highlights: Irlanda-Italia 2-2 | Under 21 | Qualificazioni U21 EURO 2025 by FIGC Azzurri e Azzurre 145,685 views 1 day ago 2 minutes\"}}},\"descriptionSnippet\":{\"runs\":[{\"text\":\"A Cork l’Italia pareggia per 2-2 contro l’Irlanda nella quinta gara delle qualificazioni a Euro 2025. Padroni di casa in gol nel primo tempo con Phillips, poi pari di Gnonto su rigore,...\"}]},\"longBylineText\":{\"runs\":[{\"text\":\"FIGC Azzurri e Azzurre\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@nazionaledicalcio\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCUnVodBnteAdGONNcUpS_kw\",\"canonicalBaseUrl\":\"/@nazionaledicalcio\"}}}]},\"publishedTimeText\":{\"simpleText\":\"1 day ago\"},\"lengthText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"2 minutes\"}},\"simpleText\":\"2:00\"},\"viewCountText\":{\"simpleText\":\"145,685 views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=wj4PF_v29jQ\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"wj4PF_v29jQ\",\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=c23e0f17fbf6f634\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"ownerBadges\":[{\"metadataBadgeRenderer\":{\"icon\":{\"iconType\":\"CHECK_CIRCLE_THICK\"},\"style\":\"BADGE_STYLE_TYPE_VERIFIED\",\"tooltip\":\"Verified\",\"trackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibilityData\":{\"label\":\"Verified\"}}}],\"ownerText\":{\"runs\":[{\"text\":\"FIGC Azzurri e Azzurre\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@nazionaledicalcio\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCUnVodBnteAdGONNcUpS_kw\",\"canonicalBaseUrl\":\"/@nazionaledicalcio\"}}}]},\"shortBylineText\":{\"runs\":[{\"text\":\"FIGC Azzurri e Azzurre\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@nazionaledicalcio\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCUnVodBnteAdGONNcUpS_kw\",\"canonicalBaseUrl\":\"/@nazionaledicalcio\"}}}]},\"trackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6mQLTs29__4oOfwgE=\",\"showActionMenu\":false,\"shortViewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"145K views\"}},\"simpleText\":\"145K views\"},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Add to queue\"}]},\"icon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CPUBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CPUBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"wj4PF_v29jQ\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CPUBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"wj4PF_v29jQ\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"wj4PF_v29jQ\"]}}]}},\"trackingParams\":\"CPUBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemDownloadRenderer\":{\"serviceEndpoint\":{\"clickTrackingParams\":\"CPQBENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"offlineVideoEndpoint\":{\"videoId\":\"wj4PF_v29jQ\",\"onAddCommand\":{\"clickTrackingParams\":\"CPQBENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"getDownloadActionCommand\":{\"videoId\":\"wj4PF_v29jQ\",\"params\":\"CAI%3D\"}}}},\"trackingParams\":\"CPQBENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"Cgt3ajRQRl92MjlqUQ%3D%3D\",\"commands\":[{\"clickTrackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CPMBEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"hasSeparator\":true}}],\"trackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Action menu\"}}}},\"channelThumbnailSupportedRenderers\":{\"channelThumbnailWithLinkRenderer\":{\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://yt3.ggpht.com/3VKRMEC6rcY8cbMh9mCVbrVIq8PkW9BE_a_KT8tUAF-QZKLWGmDzJF0Rb3kSiCByjhxSLGO6fw=s68-c-k-c0x00ffffff-no-rj\",\"width\":68,\"height\":68}]},\"navigationEndpoint\":{\"clickTrackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@nazionaledicalcio\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCUnVodBnteAdGONNcUpS_kw\",\"canonicalBaseUrl\":\"/@nazionaledicalcio\"}},\"accessibility\":{\"accessibilityData\":{\"label\":\"Go to channel\"}}}},\"thumbnailOverlays\":[{\"thumbnailOverlayTimeStatusRenderer\":{\"text\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"2 minutes\"}},\"simpleText\":\"2:00\"},\"style\":\"DEFAULT\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"isToggled\":false,\"untoggledIcon\":{\"iconType\":\"WATCH_LATER\"},\"toggledIcon\":{\"iconType\":\"CHECK\"},\"untoggledTooltip\":\"Watch later\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CPIBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"addedVideoId\":\"wj4PF_v29jQ\",\"action\":\"ACTION_ADD_VIDEO\"}]}},\"toggledServiceEndpoint\":{\"clickTrackingParams\":\"CPIBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"action\":\"ACTION_REMOVE_VIDEO_BY_VIDEO_ID\",\"removedVideoId\":\"wj4PF_v29jQ\"}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Watch later\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CPIBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"untoggledIcon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"toggledIcon\":{\"iconType\":\"PLAYLIST_ADD_CHECK\"},\"untoggledTooltip\":\"Add to queue\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CPEBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CPEBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"wj4PF_v29jQ\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CPEBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"wj4PF_v29jQ\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"wj4PF_v29jQ\"]}}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Add to queue\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CPEBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayNowPlayingRenderer\":{\"text\":{\"runs\":[{\"text\":\"Now playing\"}]}}},{\"thumbnailOverlayLoadingPreviewRenderer\":{\"text\":{\"runs\":[{\"text\":\"Keep hovering to play\"}]}}}],\"richThumbnail\":{\"movingThumbnailRenderer\":{\"movingThumbnailDetails\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/an_webp/wj4PF_v29jQ/mqdefault_6s.webp?du=3000\\u0026sqp=CLir_qoG\\u0026rs=AOn4CLCdAwhejouX4aEocmQ9J2oF5P-sFQ\",\"width\":320,\"height\":180}],\"logAsMovingThumbnail\":true},\"enableHoveredLogging\":true,\"enableOverlay\":true}},\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CPABENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=wj4PF_v29jQ\\u0026pp=YAHIAQE%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"wj4PF_v29jQ\",\"playerParams\":\"YAHIAQE%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=c23e0f17fbf6f634\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}}}},\"trackingParams\":\"CO8BEJmNBRgEIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"videoRenderer\":{\"videoId\":\"tuIozjGR9Pg\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/tuIozjGR9Pg/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLCCc1Z8XFj3NjYV9grW2RjrFHZ0xw\",\"width\":360,\"height\":202},{\"url\":\"https://i.ytimg.com/vi/tuIozjGR9Pg/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLD4S6u9Jmm1cC9Npi1Eug_lYfps8A\",\"width\":720,\"height\":404}]},\"title\":{\"runs\":[{\"text\":\"Brazil vs Argentina 0-1 Hіghlіghts \\u0026 All Goals 2023\"}],\"accessibility\":{\"accessibilityData\":{\"label\":\"Brazil vs Argentina 0-1 Hіghlіghts \\u0026 All Goals 2023 by Arap Soccer 1,701,603 views 1 day ago 8 minutes, 7 seconds\"}}},\"descriptionSnippet\":{\"runs\":[{\"text\":\"#Brazil#Argentina#Messi\\nBrazil vs Argentina 0-1 Hіghlіghts \\u0026 All Goals 2023\"}]},\"longBylineText\":{\"runs\":[{\"text\":\"Arap Soccer \",\"navigationEndpoint\":{\"clickTrackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@Arap-Soccer\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCk77wbekBWzB2JbDmvyCgCQ\",\"canonicalBaseUrl\":\"/@Arap-Soccer\"}}}]},\"publishedTimeText\":{\"simpleText\":\"1 day ago\"},\"lengthText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"8 minutes, 7 seconds\"}},\"simpleText\":\"8:07\"},\"viewCountText\":{\"simpleText\":\"1,701,603 views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=tuIozjGR9Pg\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"tuIozjGR9Pg\",\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=b6e228ce3191f4f8\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"ownerBadges\":[{\"metadataBadgeRenderer\":{\"icon\":{\"iconType\":\"CHECK_CIRCLE_THICK\"},\"style\":\"BADGE_STYLE_TYPE_VERIFIED\",\"tooltip\":\"Verified\",\"trackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibilityData\":{\"label\":\"Verified\"}}}],\"ownerText\":{\"runs\":[{\"text\":\"Arap Soccer \",\"navigationEndpoint\":{\"clickTrackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@Arap-Soccer\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCk77wbekBWzB2JbDmvyCgCQ\",\"canonicalBaseUrl\":\"/@Arap-Soccer\"}}}]},\"shortBylineText\":{\"runs\":[{\"text\":\"Arap Soccer \",\"navigationEndpoint\":{\"clickTrackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@Arap-Soccer\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCk77wbekBWzB2JbDmvyCgCQ\",\"canonicalBaseUrl\":\"/@Arap-Soccer\"}}}]},\"trackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mQPjpx4zjmYrxtgE=\",\"showActionMenu\":false,\"shortViewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"1.7 million views\"}},\"simpleText\":\"1.7M views\"},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Add to queue\"}]},\"icon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CO4BEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CO4BEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"tuIozjGR9Pg\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CO4BEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"tuIozjGR9Pg\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"tuIozjGR9Pg\"]}}]}},\"trackingParams\":\"CO4BEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemDownloadRenderer\":{\"serviceEndpoint\":{\"clickTrackingParams\":\"CO0BENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"offlineVideoEndpoint\":{\"videoId\":\"tuIozjGR9Pg\",\"onAddCommand\":{\"clickTrackingParams\":\"CO0BENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"getDownloadActionCommand\":{\"videoId\":\"tuIozjGR9Pg\",\"params\":\"CAI%3D\"}}}},\"trackingParams\":\"CO0BENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"Cgt0dUlvempHUjlQZw%3D%3D\",\"commands\":[{\"clickTrackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"COwBEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"hasSeparator\":true}}],\"trackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Action menu\"}}}},\"channelThumbnailSupportedRenderers\":{\"channelThumbnailWithLinkRenderer\":{\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://yt3.ggpht.com/3unnsYUedZcqooONTuvayr9MN7H_ki4xUq_9MRPSy38qiXTrSoVaN0DK5GP9ql1cT_g4uG7vqA=s68-c-k-c0x00ffffff-no-rj\",\"width\":68,\"height\":68}]},\"navigationEndpoint\":{\"clickTrackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@Arap-Soccer\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCk77wbekBWzB2JbDmvyCgCQ\",\"canonicalBaseUrl\":\"/@Arap-Soccer\"}},\"accessibility\":{\"accessibilityData\":{\"label\":\"Go to channel\"}}}},\"thumbnailOverlays\":[{\"thumbnailOverlayTimeStatusRenderer\":{\"text\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"8 minutes, 7 seconds\"}},\"simpleText\":\"8:07\"},\"style\":\"DEFAULT\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"isToggled\":false,\"untoggledIcon\":{\"iconType\":\"WATCH_LATER\"},\"toggledIcon\":{\"iconType\":\"CHECK\"},\"untoggledTooltip\":\"Watch later\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"COsBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"addedVideoId\":\"tuIozjGR9Pg\",\"action\":\"ACTION_ADD_VIDEO\"}]}},\"toggledServiceEndpoint\":{\"clickTrackingParams\":\"COsBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"action\":\"ACTION_REMOVE_VIDEO_BY_VIDEO_ID\",\"removedVideoId\":\"tuIozjGR9Pg\"}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Watch later\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"COsBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"untoggledIcon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"toggledIcon\":{\"iconType\":\"PLAYLIST_ADD_CHECK\"},\"untoggledTooltip\":\"Add to queue\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"COoBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"COoBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"tuIozjGR9Pg\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"COoBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"tuIozjGR9Pg\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"tuIozjGR9Pg\"]}}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Add to queue\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"COoBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayNowPlayingRenderer\":{\"text\":{\"runs\":[{\"text\":\"Now playing\"}]}}},{\"thumbnailOverlayLoadingPreviewRenderer\":{\"text\":{\"runs\":[{\"text\":\"Keep hovering to play\"}]}}}],\"richThumbnail\":{\"movingThumbnailRenderer\":{\"movingThumbnailDetails\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/an_webp/tuIozjGR9Pg/mqdefault_6s.webp?du=3000\\u0026sqp=CIDx_aoG\\u0026rs=AOn4CLBjENpqa3JZKZmaaoRP_KGbxUx97g\",\"width\":320,\"height\":180}],\"logAsMovingThumbnail\":true},\"enableHoveredLogging\":true,\"enableOverlay\":true}},\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"COkBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=tuIozjGR9Pg\\u0026pp=YAHIAQE%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"tuIozjGR9Pg\",\"playerParams\":\"YAHIAQE%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=b6e228ce3191f4f8\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}}}},\"trackingParams\":\"COgBEJmNBRgFIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"videoRenderer\":{\"videoId\":\"_DH4WgY8lus\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/_DH4WgY8lus/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLCKxNkAWpENQ1E8YC2BVLNbKqvNjw\",\"width\":360,\"height\":202},{\"url\":\"https://i.ytimg.com/vi/_DH4WgY8lus/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLDX334XswM6wRWd6EwiZXc9oyUXBA\",\"width\":720,\"height\":404}]},\"title\":{\"runs\":[{\"text\":\"Vinz ft Stealth - Hood Life 3\"}],\"accessibility\":{\"accessibilityData\":{\"label\":\"Vinz ft Stealth - Hood Life 3 by HELLBANIANZ 682,252 views 2 days ago 3 minutes, 25 seconds\"}}},\"descriptionSnippet\":{\"runs\":[{\"text\":\"Stream or Download \\\"HOOD LIFE 3\\\" here:\\nhttps://avd.lnk.to/HD3\\n\\nVinz on Instagram: http://instagram.com/selita.ervin\\nStealth on Instagram: http://instagram.com/st3alth.official\\n\\nLyrics: Vinz...\"}]},\"longBylineText\":{\"runs\":[{\"text\":\"HELLBANIANZ\",\"navigationEndpoint\":{\"clickTrackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@hellbanianz7653\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCZTjGQcRN7tjqUNGAv4L6pg\",\"canonicalBaseUrl\":\"/@hellbanianz7653\"}}}]},\"publishedTimeText\":{\"simpleText\":\"2 days ago\"},\"lengthText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"3 minutes, 25 seconds\"}},\"simpleText\":\"3:25\"},\"viewCountText\":{\"simpleText\":\"682,252 views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=_DH4WgY8lus\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"_DH4WgY8lus\",\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=fc31f85a063c96eb\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"ownerBadges\":[{\"metadataBadgeRenderer\":{\"icon\":{\"iconType\":\"CHECK_CIRCLE_THICK\"},\"style\":\"BADGE_STYLE_TYPE_VERIFIED\",\"tooltip\":\"Verified\",\"trackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibilityData\":{\"label\":\"Verified\"}}}],\"ownerText\":{\"runs\":[{\"text\":\"HELLBANIANZ\",\"navigationEndpoint\":{\"clickTrackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@hellbanianz7653\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCZTjGQcRN7tjqUNGAv4L6pg\",\"canonicalBaseUrl\":\"/@hellbanianz7653\"}}}]},\"shortBylineText\":{\"runs\":[{\"text\":\"HELLBANIANZ\",\"navigationEndpoint\":{\"clickTrackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@hellbanianz7653\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCZTjGQcRN7tjqUNGAv4L6pg\",\"canonicalBaseUrl\":\"/@hellbanianz7653\"}}}]},\"trackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mQOut8rGgi_6Y_AE=\",\"showActionMenu\":false,\"shortViewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"682K views\"}},\"simpleText\":\"682K views\"},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Add to queue\"}]},\"icon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"COcBEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"COcBEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"_DH4WgY8lus\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"COcBEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"_DH4WgY8lus\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"_DH4WgY8lus\"]}}]}},\"trackingParams\":\"COcBEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemDownloadRenderer\":{\"serviceEndpoint\":{\"clickTrackingParams\":\"COYBENGqBRgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"offlineVideoEndpoint\":{\"videoId\":\"_DH4WgY8lus\",\"onAddCommand\":{\"clickTrackingParams\":\"COYBENGqBRgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"getDownloadActionCommand\":{\"videoId\":\"_DH4WgY8lus\",\"params\":\"CAI%3D\"}}}},\"trackingParams\":\"COYBENGqBRgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgtfREg0V2dZOGx1cw%3D%3D\",\"commands\":[{\"clickTrackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"COUBEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"hasSeparator\":true}}],\"trackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Action menu\"}}}},\"channelThumbnailSupportedRenderers\":{\"channelThumbnailWithLinkRenderer\":{\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://yt3.ggpht.com/ytc/APkrFKYZPQG2mrZmntMf2bw7vKWpMBJwdn9C0nIawMBk=s68-c-k-c0x00ffffff-no-rj\",\"width\":68,\"height\":68}]},\"navigationEndpoint\":{\"clickTrackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@hellbanianz7653\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCZTjGQcRN7tjqUNGAv4L6pg\",\"canonicalBaseUrl\":\"/@hellbanianz7653\"}},\"accessibility\":{\"accessibilityData\":{\"label\":\"Go to channel\"}}}},\"thumbnailOverlays\":[{\"thumbnailOverlayTimeStatusRenderer\":{\"text\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"3 minutes, 25 seconds\"}},\"simpleText\":\"3:25\"},\"style\":\"DEFAULT\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"isToggled\":false,\"untoggledIcon\":{\"iconType\":\"WATCH_LATER\"},\"toggledIcon\":{\"iconType\":\"CHECK\"},\"untoggledTooltip\":\"Watch later\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"COQBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"addedVideoId\":\"_DH4WgY8lus\",\"action\":\"ACTION_ADD_VIDEO\"}]}},\"toggledServiceEndpoint\":{\"clickTrackingParams\":\"COQBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"action\":\"ACTION_REMOVE_VIDEO_BY_VIDEO_ID\",\"removedVideoId\":\"_DH4WgY8lus\"}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Watch later\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"COQBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"untoggledIcon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"toggledIcon\":{\"iconType\":\"PLAYLIST_ADD_CHECK\"},\"untoggledTooltip\":\"Add to queue\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"COMBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"COMBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"_DH4WgY8lus\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"COMBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"_DH4WgY8lus\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"_DH4WgY8lus\"]}}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Add to queue\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"COMBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayNowPlayingRenderer\":{\"text\":{\"runs\":[{\"text\":\"Now playing\"}]}}},{\"thumbnailOverlayLoadingPreviewRenderer\":{\"text\":{\"runs\":[{\"text\":\"Keep hovering to play\"}]}}}],\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"COIBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=_DH4WgY8lus\\u0026pp=YAHIAQE%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"_DH4WgY8lus\",\"playerParams\":\"YAHIAQE%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=fc31f85a063c96eb\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}}}},\"trackingParams\":\"COEBEJmNBRgGIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"videoRenderer\":{\"videoId\":\"B9yefLSHzH4\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/B9yefLSHzH4/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLBakD6sRxZAWBZ604OSL2Kht0XI8w\",\"width\":360,\"height\":202},{\"url\":\"https://i.ytimg.com/vi/B9yefLSHzH4/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLA3JnHqbtrcvSRPtC9jG2FnEtGQ2Q\",\"width\":720,\"height\":404}]},\"title\":{\"runs\":[{\"text\":\"Me contro Te - SUPER BABBO NATALE (Canzone Ufficiale)\"}],\"accessibility\":{\"accessibilityData\":{\"label\":\"Me contro Te - SUPER BABBO NATALE (Canzone Ufficiale) by Me contro Te Music 948,051 views 6 days ago 2 minutes, 26 seconds\"}}},\"descriptionSnippet\":{\"runs\":[{\"text\":\"✨ PRENDI IL CD CON TUTTE LE CANZONI DI NATALE DEI ME CONTRO TE! ✨\\nhttps://amzn.to/3QHrji2\\n\\nSuper Babbo Natale è la prima canzone di Natale di Sofì e Luì! Insieme alla loro band suonano...\"}]},\"longBylineText\":{\"runs\":[{\"text\":\"Me contro Te Music\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@MecontroTeMusic\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCwjrf475hoHRJZc5SMnZzng\",\"canonicalBaseUrl\":\"/@MecontroTeMusic\"}}}]},\"publishedTimeText\":{\"simpleText\":\"6 days ago\"},\"lengthText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"2 minutes, 26 seconds\"}},\"simpleText\":\"2:26\"},\"viewCountText\":{\"simpleText\":\"948,051 views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=B9yefLSHzH4\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"B9yefLSHzH4\",\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=07dc9e7cb487cc7e\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"ownerBadges\":[{\"metadataBadgeRenderer\":{\"icon\":{\"iconType\":\"CHECK_CIRCLE_THICK\"},\"style\":\"BADGE_STYLE_TYPE_VERIFIED\",\"tooltip\":\"Verified\",\"trackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibilityData\":{\"label\":\"Verified\"}}}],\"ownerText\":{\"runs\":[{\"text\":\"Me contro Te Music\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@MecontroTeMusic\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCwjrf475hoHRJZc5SMnZzng\",\"canonicalBaseUrl\":\"/@MecontroTeMusic\"}}}]},\"shortBylineText\":{\"runs\":[{\"text\":\"Me contro Te Music\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@MecontroTeMusic\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCwjrf475hoHRJZc5SMnZzng\",\"canonicalBaseUrl\":\"/@MecontroTeMusic\"}}}]},\"trackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mQP6Yn6TLz6fuBw==\",\"showActionMenu\":false,\"shortViewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"948K views\"}},\"simpleText\":\"948K views\"},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Add to queue\"}]},\"icon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"COABEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"COABEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"B9yefLSHzH4\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"COABEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"B9yefLSHzH4\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"B9yefLSHzH4\"]}}]}},\"trackingParams\":\"COABEP6YBBgJIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemDownloadRenderer\":{\"serviceEndpoint\":{\"clickTrackingParams\":\"CN8BENGqBRgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"offlineVideoEndpoint\":{\"videoId\":\"B9yefLSHzH4\",\"onAddCommand\":{\"clickTrackingParams\":\"CN8BENGqBRgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"getDownloadActionCommand\":{\"videoId\":\"B9yefLSHzH4\",\"params\":\"CAI%3D\"}}}},\"trackingParams\":\"CN8BENGqBRgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgtCOXllZkxTSHpINA%3D%3D\",\"commands\":[{\"clickTrackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CN4BEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"hasSeparator\":true}}],\"trackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Action menu\"}}}},\"channelThumbnailSupportedRenderers\":{\"channelThumbnailWithLinkRenderer\":{\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://yt3.ggpht.com/ytc/APkrFKbtqbjd2ogi9BFlRLBP7SY1tvOi2XomZFZ5VVmBFQ=s68-c-k-c0x00ffffff-no-rj\",\"width\":68,\"height\":68}]},\"navigationEndpoint\":{\"clickTrackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@MecontroTeMusic\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCwjrf475hoHRJZc5SMnZzng\",\"canonicalBaseUrl\":\"/@MecontroTeMusic\"}},\"accessibility\":{\"accessibilityData\":{\"label\":\"Go to channel\"}}}},\"thumbnailOverlays\":[{\"thumbnailOverlayTimeStatusRenderer\":{\"text\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"2 minutes, 26 seconds\"}},\"simpleText\":\"2:26\"},\"style\":\"DEFAULT\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"isToggled\":false,\"untoggledIcon\":{\"iconType\":\"WATCH_LATER\"},\"toggledIcon\":{\"iconType\":\"CHECK\"},\"untoggledTooltip\":\"Watch later\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CN0BEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"addedVideoId\":\"B9yefLSHzH4\",\"action\":\"ACTION_ADD_VIDEO\"}]}},\"toggledServiceEndpoint\":{\"clickTrackingParams\":\"CN0BEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"action\":\"ACTION_REMOVE_VIDEO_BY_VIDEO_ID\",\"removedVideoId\":\"B9yefLSHzH4\"}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Watch later\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CN0BEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"untoggledIcon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"toggledIcon\":{\"iconType\":\"PLAYLIST_ADD_CHECK\"},\"untoggledTooltip\":\"Add to queue\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CNwBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CNwBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"B9yefLSHzH4\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CNwBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"B9yefLSHzH4\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"B9yefLSHzH4\"]}}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Add to queue\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CNwBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayNowPlayingRenderer\":{\"text\":{\"runs\":[{\"text\":\"Now playing\"}]}}},{\"thumbnailOverlayLoadingPreviewRenderer\":{\"text\":{\"runs\":[{\"text\":\"Keep hovering to play\"}]}}}],\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CNsBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=B9yefLSHzH4\\u0026pp=YAHIAQE%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"B9yefLSHzH4\",\"playerParams\":\"YAHIAQE%3D\",\"playerExtraUrlParams\":[{\"key\":\"inline\",\"value\":\"1\"}],\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr2---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=07dc9e7cb487cc7e\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}}}},\"trackingParams\":\"CNoBEJmNBRgHIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"richItemRenderer\":{\"content\":{\"videoRenderer\":{\"videoId\":\"36UhfL7rr0c\",\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/36UhfL7rr0c/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLAxUzLamZ2OBFkMnT_b3G3E9a3XYQ\",\"width\":360,\"height\":202},{\"url\":\"https://i.ytimg.com/vi/36UhfL7rr0c/hq720.jpg?sqp=-oaymwEcCNAFEJQDSFXyq4qpAw4IARUAAIhCGAFwAcABBg==\\u0026rs=AOn4CLAtHke8YGjOnAMBsB5n30a9mMi_ag\",\"width\":720,\"height\":404}]},\"title\":{\"runs\":[{\"text\":\"Michele Bravi, imparare ad amarsi - One More Time\"}],\"accessibility\":{\"accessibilityData\":{\"label\":\"Michele Bravi, imparare ad amarsi - One More Time by PODCAST ONE MORE TIME di Luca Casadei 54,289 views 2 days ago 1 hour, 43 minutes\"}}},\"descriptionSnippet\":{\"runs\":[{\"text\":\"#adv\\nLink allo shop ufficiale: https://www.onemoretime.me\\nLink al canale Telegram: https://t.me/podcastonemoretime\\nCi trovi anche qui: https://linktr.ee/podcastonemoretime\\n\\nStorie di vita raccontat...\"}]},\"longBylineText\":{\"runs\":[{\"text\":\"PODCAST ONE MORE TIME di Luca Casadei\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@OneMoreTimePodcast\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCXuc_HVyuWFoWQa1zyyuqJw\",\"canonicalBaseUrl\":\"/@OneMoreTimePodcast\"}}}]},\"publishedTimeText\":{\"simpleText\":\"2 days ago\"},\"lengthText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"1 hour, 43 minutes, 39 seconds\"}},\"simpleText\":\"1:43:39\"},\"viewCountText\":{\"simpleText\":\"54,289 views\"},\"navigationEndpoint\":{\"clickTrackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=36UhfL7rr0c\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"36UhfL7rr0c\",\"watchEndpointSupportedOnesieConfig\":{\"html5PlaybackOnesieConfig\":{\"commonConfig\":{\"url\":\"https://rr1---sn-8vq54voxpu-bv5e.googlevideo.com/initplayback?source=youtube\\u0026oeis=1\\u0026c=WEB\\u0026oad=3200\\u0026ovd=3200\\u0026oaad=11000\\u0026oavd=11000\\u0026ocs=700\\u0026oewis=1\\u0026oputc=1\\u0026ofpcc=1\\u0026msp=1\\u0026odepv=1\\u0026id=dfa5217cbeebaf47\\u0026ip=[scrubbed]\\u0026initcwndbps=1773750\\u0026mt=1700763661\\u0026oweuc=\"}}}}},\"ownerBadges\":[{\"metadataBadgeRenderer\":{\"icon\":{\"iconType\":\"CHECK_CIRCLE_THICK\"},\"style\":\"BADGE_STYLE_TYPE_VERIFIED\",\"tooltip\":\"Verified\",\"trackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibilityData\":{\"label\":\"Verified\"}}}],\"ownerText\":{\"runs\":[{\"text\":\"PODCAST ONE MORE TIME di Luca Casadei\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@OneMoreTimePodcast\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCXuc_HVyuWFoWQa1zyyuqJw\",\"canonicalBaseUrl\":\"/@OneMoreTimePodcast\"}}}]},\"shortBylineText\":{\"runs\":[{\"text\":\"PODCAST ONE MORE TIME di Luca Casadei\",\"navigationEndpoint\":{\"clickTrackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@OneMoreTimePodcast\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCXuc_HVyuWFoWQa1zyyuqJw\",\"canonicalBaseUrl\":\"/@OneMoreTimePodcast\"}}}]},\"trackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mQMfervfLr8jS3wE=\",\"showActionMenu\":false,\"shortViewCountText\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"54K views\"}},\"simpleText\":\"54K views\"},\"menu\":{\"menuRenderer\":{\"items\":[{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Add to queue\"}]},\"icon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CNkBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CNkBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"36UhfL7rr0c\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CNkBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"36UhfL7rr0c\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"36UhfL7rr0c\"]}}]}},\"trackingParams\":\"CNkBEP6YBBgKIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemDownloadRenderer\":{\"serviceEndpoint\":{\"clickTrackingParams\":\"CNgBENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"offlineVideoEndpoint\":{\"videoId\":\"36UhfL7rr0c\",\"onAddCommand\":{\"clickTrackingParams\":\"CNgBENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"getDownloadActionCommand\":{\"videoId\":\"36UhfL7rr0c\",\"params\":\"CAI%3D\"}}}},\"trackingParams\":\"CNgBENGqBRgLIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"menuServiceItemRenderer\":{\"text\":{\"runs\":[{\"text\":\"Share\"}]},\"icon\":{\"iconType\":\"SHARE\"},\"serviceEndpoint\":{\"clickTrackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/share/get_share_panel\"}},\"shareEntityServiceEndpoint\":{\"serializedShareEntity\":\"CgszNlVoZkw3cnIwYw%3D%3D\",\"commands\":[{\"clickTrackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"openPopupAction\":{\"popup\":{\"unifiedSharePanelRenderer\":{\"trackingParams\":\"CNcBEI5iIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"showLoadingSpinner\":true}},\"popupType\":\"DIALOG\",\"beReused\":true}}]}},\"trackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"hasSeparator\":true}}],\"trackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"accessibility\":{\"accessibilityData\":{\"label\":\"Action menu\"}}}},\"channelThumbnailSupportedRenderers\":{\"channelThumbnailWithLinkRenderer\":{\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://yt3.ggpht.com/r6YN_GfewFFSOgFus14GXKWBqSYvs9O74SaqG9ffuSbKaUOWrihMgrdYMLUE_umCRBVoK_qPzg=s68-c-k-c0x00ffffff-no-rj\",\"width\":68,\"height\":68}]},\"navigationEndpoint\":{\"clickTrackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/@OneMoreTimePodcast\",\"webPageType\":\"WEB_PAGE_TYPE_CHANNEL\",\"rootVe\":3611,\"apiUrl\":\"/youtubei/v1/browse\"}},\"browseEndpoint\":{\"browseId\":\"UCXuc_HVyuWFoWQa1zyyuqJw\",\"canonicalBaseUrl\":\"/@OneMoreTimePodcast\"}},\"accessibility\":{\"accessibilityData\":{\"label\":\"Go to channel\"}}}},\"thumbnailOverlays\":[{\"thumbnailOverlayTimeStatusRenderer\":{\"text\":{\"accessibility\":{\"accessibilityData\":{\"label\":\"1 hour, 43 minutes, 39 seconds\"}},\"simpleText\":\"1:43:39\"},\"style\":\"DEFAULT\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"isToggled\":false,\"untoggledIcon\":{\"iconType\":\"WATCH_LATER\"},\"toggledIcon\":{\"iconType\":\"CHECK\"},\"untoggledTooltip\":\"Watch later\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CNYBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"addedVideoId\":\"36UhfL7rr0c\",\"action\":\"ACTION_ADD_VIDEO\"}]}},\"toggledServiceEndpoint\":{\"clickTrackingParams\":\"CNYBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/browse/edit_playlist\"}},\"playlistEditEndpoint\":{\"playlistId\":\"WL\",\"actions\":[{\"action\":\"ACTION_REMOVE_VIDEO_BY_VIDEO_ID\",\"removedVideoId\":\"36UhfL7rr0c\"}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Watch later\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CNYBEPnnAxgCIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayToggleButtonRenderer\":{\"untoggledIcon\":{\"iconType\":\"ADD_TO_QUEUE_TAIL\"},\"toggledIcon\":{\"iconType\":\"PLAYLIST_ADD_CHECK\"},\"untoggledTooltip\":\"Add to queue\",\"toggledTooltip\":\"Added\",\"untoggledServiceEndpoint\":{\"clickTrackingParams\":\"CNUBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true}},\"signalServiceEndpoint\":{\"signal\":\"CLIENT_SIGNAL\",\"actions\":[{\"clickTrackingParams\":\"CNUBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"addToPlaylistCommand\":{\"openMiniplayer\":true,\"videoId\":\"36UhfL7rr0c\",\"listType\":\"PLAYLIST_EDIT_LIST_TYPE_QUEUE\",\"onCreateListCommand\":{\"clickTrackingParams\":\"CNUBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\",\"commandMetadata\":{\"webCommandMetadata\":{\"sendPost\":true,\"apiUrl\":\"/youtubei/v1/playlist/create\"}},\"createPlaylistServiceEndpoint\":{\"videoIds\":[\"36UhfL7rr0c\"],\"params\":\"CAQ%3D\"}},\"videoIds\":[\"36UhfL7rr0c\"]}}]}},\"untoggledAccessibility\":{\"accessibilityData\":{\"label\":\"Add to queue\"}},\"toggledAccessibility\":{\"accessibilityData\":{\"label\":\"Added\"}},\"trackingParams\":\"CNUBEMfsBBgDIhMIk87x0N_aggMVjV96BR0_MQ6m\"}},{\"thumbnailOverlayNowPlayingRenderer\":{\"text\":{\"runs\":[{\"text\":\"Now playing\"}]}}},{\"thumbnailOverlayLoadingPreviewRenderer\":{\"text\":{\"runs\":[{\"text\":\"Keep hovering to play\"}]}}}],\"richThumbnail\":{\"movingThumbnailRenderer\":{\"movingThumbnailDetails\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/an_webp/36UhfL7rr0c/mqdefault_6s.webp?du=3000\\u0026sqp=COaw_qoG\\u0026rs=AOn4CLBs0Mk7E2PFTuia9-uDIljsBDNcqQ\",\"width\":320,\"height\":180}],\"logAsMovingThumbnail\":true},\"enableHoveredLogging\":true,\"enableOverlay\":true}},\"inlinePlaybackEndpoint\":{\"clickTrackingParams\":\"CNQBENwwIhMIk87x0N_aggMVjV96BR0_MQ6mMgpnLWhpZ2gtdHJ2Wg9GRXdoYXRfdG9fd2F0Y2iaAQYQjh4Y-QE=\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v=36UhfL7rr0c\\u0026pp=YAHIAQE%3D\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"36UhfL7rr0c\",\"playerParams\":\"YAHIAQE%3D\",\"pla","body_is_truncated":true,"code":200,"headers_list":[["Accept-Ch","Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-WoW64, Sec-CH-UA-Form-Factor, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version"],["Accept-Ranges","none"],["Alt-Svc","h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000"],["Cache-Control","no-cache, no-store, max-age=0, must-revalidate"],["Content-Type","text/html; charset=utf-8"],["Cross-Origin-Opener-Policy","same-origin-allow-popups; report-to=\"youtube_main\""],["Date","Thu, 23 Nov 2023 18:26:40 GMT"],["Expires","Mon, 01 Jan 1990 00:00:00 GMT"],["Origin-Trial","AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"],["P3p","CP=\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en for more info.\""],["Permissions-Policy","ch-ua-arch=*, ch-ua-bitness=*, ch-ua-full-version=*, ch-ua-full-version-list=*, ch-ua-model=*, ch-ua-wow64=*, ch-ua-form-factor=*, ch-ua-platform=*, ch-ua-platform-version=*"],["Pragma","no-cache"],["Report-To","{\"group\":\"youtube_main\",\"max_age\":2592000,\"endpoints\":[{\"url\":\"https://csp.withgoogle.com/csp/report-to/youtube_main\"}]}"],["Server","ESF"],["Set-Cookie","YSC=Fz-8xRP8Jo0; Domain=.youtube.com; Path=/; Secure; HttpOnly; SameSite=none"],["Set-Cookie","__Secure-YEC=CgswU3lVbTdZdlY4RSjgsv6qBjIICgJJVBICEgA%3D; Domain=.youtube.com; Expires=Sun, 22-Dec-2024 18:26:39 GMT; Path=/; Secure; HttpOnly; SameSite=lax"],["Set-Cookie","VISITOR_PRIVACY_METADATA=CgJJVBICEgA%3D; Domain=.youtube.com; Expires=Sun, 22-Dec-2024 18:26:40 GMT; Path=/; Secure; HttpOnly; SameSite=lax"],["Set-Cookie","VISITOR_INFO1_LIVE=; Domain=.youtube.com; Expires=Fri, 26-Feb-2021 18:26:40 GMT; Path=/; Secure; HttpOnly; SameSite=none"],["Set-Cookie","CONSENT=PENDING+074; expires=Sat, 22-Nov-2025 18:26:40 GMT; path=/; domain=.youtube.com; Secure"],["Strict-Transport-Security","max-age=31536000"],["Vary","Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-WoW64, Sec-CH-UA-Form-Factor, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version,Accept-Encoding"],["X-Content-Type-Options","nosniff"],["X-Frame-Options","SAMEORIGIN"],["X-Xss-Protection","0"]],"headers":{"Accept-Ch":"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-WoW64, Sec-CH-UA-Form-Factor, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version","Accept-Ranges":"none","Alt-Svc":"h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000","Cache-Control":"no-cache, no-store, max-age=0, must-revalidate","Content-Type":"text/html; charset=utf-8","Cross-Origin-Opener-Policy":"same-origin-allow-popups; report-to=\"youtube_main\"","Date":"Thu, 23 Nov 2023 18:26:40 GMT","Expires":"Mon, 01 Jan 1990 00:00:00 GMT","Origin-Trial":"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9","P3p":"CP=\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en for more info.\"","Permissions-Policy":"ch-ua-arch=*, ch-ua-bitness=*, ch-ua-full-version=*, ch-ua-full-version-list=*, ch-ua-model=*, ch-ua-wow64=*, ch-ua-form-factor=*, ch-ua-platform=*, ch-ua-platform-version=*","Pragma":"no-cache","Report-To":"{\"group\":\"youtube_main\",\"max_age\":2592000,\"endpoints\":[{\"url\":\"https://csp.withgoogle.com/csp/report-to/youtube_main\"}]}","Server":"ESF","Set-Cookie":"YSC=Fz-8xRP8Jo0; Domain=.youtube.com; Path=/; Secure; HttpOnly; SameSite=none","Strict-Transport-Security":"max-age=31536000","Vary":"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-WoW64, Sec-CH-UA-Form-Factor, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version,Accept-Encoding","X-Content-Type-Options":"nosniff","X-Frame-Options":"SAMEORIGIN","X-Xss-Protection":"0"}},"t0":0.452397,"t":1.492867,"tags":[],"transaction_id":7},{"network":"tcp","address":"[2a00:1450:4002:414::200e]:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.477564,"t":0.477564,"tags":[],"transaction_id":12},{"network":"tcp","address":"216.58.204.142:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.476504,"t":0.476504,"tags":[],"transaction_id":8},{"network":"tcp","address":"216.58.205.46:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.475418,"t":0.475418,"tags":[],"transaction_id":5},{"network":"tcp","address":"142.250.180.142:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.475041,"t":0.475041,"tags":[],"transaction_id":15},{"network":"tcp","address":"142.251.209.14:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.475032,"t":0.475032,"tags":[],"transaction_id":14},{"network":"tcp","address":"[2a00:1450:4002:402::200e]:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.473319,"t":0.473319,"tags":[],"transaction_id":13},{"network":"tcp","address":"[2a00:1450:4002:403::200e]:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.472926,"t":0.472926,"tags":[],"transaction_id":9},{"network":"tcp","address":"[2a00:1450:4002:410::200e]:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.472585,"t":0.472585,"tags":[],"transaction_id":10},{"network":"tcp","address":"[2a00:1450:4002:416::200e]:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.472387,"t":0.472387,"tags":[],"transaction_id":11},{"network":"tcp","address":"142.250.180.174:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.47142,"t":0.47142,"tags":[],"transaction_id":4},{"network":"tcp","address":"142.251.209.46:443","failure":"unknown_failure: http_request_canceled","request":{"body":"","body_is_truncated":false,"headers_list":[["Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],["Accept-Language","en-US,en;q=0.9"],["Host","www.youtube.com"],["Referer",""],["User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"]],"headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9","Host":"www.youtube.com","Referer":"","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36"},"method":"GET","tor":{"exit_ip":null,"exit_name":null,"is_tor":false},"x_transport":"tcp","url":"https://www.youtube.com/"},"response":{"body":"","body_is_truncated":false,"code":0,"headers_list":[],"headers":{}},"t0":0.470667,"t":0.470667,"tags":[],"transaction_id":6}],"tcp_connect":[{"ip":"216.58.209.46","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.396053,"t":0.411923,"tags":[],"transaction_id":7},{"ip":"142.251.209.46","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.395832,"t":0.413203,"tags":[],"transaction_id":6},{"ip":"2a00:1450:4002:402::200e","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.395951,"t":0.415468,"tags":[],"transaction_id":13},{"ip":"142.250.180.174","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.39635,"t":0.41553,"tags":[],"transaction_id":4},{"ip":"2a00:1450:4002:403::200e","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.396408,"t":0.416441,"tags":[],"transaction_id":9},{"ip":"2a00:1450:4002:416::200e","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.396461,"t":0.416484,"tags":[],"transaction_id":11},{"ip":"2a00:1450:4002:410::200e","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.396471,"t":0.417629,"tags":[],"transaction_id":10},{"ip":"142.250.180.142","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.396707,"t":0.418861,"tags":[],"transaction_id":15},{"ip":"2a00:1450:4002:414::200e","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.396723,"t":0.418956,"tags":[],"transaction_id":12},{"ip":"216.58.204.142","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.395722,"t":0.419464,"tags":[],"transaction_id":8},{"ip":"142.251.209.14","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.395747,"t":0.41948,"tags":[],"transaction_id":14},{"ip":"216.58.205.46","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":0.395701,"t":0.421933,"tags":[],"transaction_id":5},{"ip":"142.250.200.46","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.8941940000000002,"t":1.9308939999999999,"tags":[],"transaction_id":23},{"ip":"2a00:1450:4009:81e::200e","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.894023,"t":1.930973,"tags":[],"transaction_id":25},{"ip":"142.250.179.238","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.89411,"t":1.931396,"tags":[],"transaction_id":22},{"ip":"142.250.200.14","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.8946960000000002,"t":1.93338,"tags":[],"transaction_id":20},{"ip":"216.58.204.78","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.89452,"t":1.9342679999999999,"tags":[],"transaction_id":21},{"ip":"2a00:1450:4009:815::200e","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.8944800000000002,"t":1.935353,"tags":[],"transaction_id":31},{"ip":"216.58.212.238","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.894834,"t":1.936283,"tags":[],"transaction_id":28},{"ip":"142.250.187.238","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.894889,"t":1.936306,"tags":[],"transaction_id":26},{"ip":"2a00:1450:4009:81f::200e","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.89456,"t":1.938354,"tags":[],"transaction_id":27},{"ip":"172.217.169.14","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.89481,"t":1.939539,"tags":[],"transaction_id":16},{"ip":"142.250.187.206","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.895168,"t":1.939568,"tags":[],"transaction_id":18},{"ip":"142.250.178.14","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.8953090000000001,"t":1.939593,"tags":[],"transaction_id":30},{"ip":"216.58.201.110","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.895193,"t":1.939627,"tags":[],"transaction_id":24},{"ip":"142.250.180.14","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.895467,"t":1.940271,"tags":[],"transaction_id":29},{"ip":"172.217.16.238","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.895386,"t":1.940296,"tags":[],"transaction_id":19},{"ip":"2a00:1450:4009:820::200e","port":443,"status":{"blocked":false,"failure":null,"success":true},"t0":1.895162,"t":1.940325,"tags":[],"transaction_id":17}],"tls_handshakes":[{"network":"tcp","address":"216.58.209.46:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.411989,"t":0.452334,"tags":[],"tls_version":"TLSv1.3","transaction_id":7},{"network":"tcp","address":"142.251.209.46:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.41324,"t":0.460508,"tags":[],"tls_version":"TLSv1.3","transaction_id":6},{"network":"tcp","address":"142.250.180.174:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.415573,"t":0.461278,"tags":[],"tls_version":"TLSv1.3","transaction_id":4},{"network":"tcp","address":"[2a00:1450:4002:416::200e]:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.416512,"t":0.462307,"tags":[],"tls_version":"TLSv1.3","transaction_id":11},{"network":"tcp","address":"[2a00:1450:4002:410::200e]:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.417656,"t":0.462505,"tags":[],"tls_version":"TLSv1.3","transaction_id":10},{"network":"tcp","address":"[2a00:1450:4002:403::200e]:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.416468,"t":0.46288,"tags":[],"tls_version":"TLSv1.3","transaction_id":9},{"network":"tcp","address":"[2a00:1450:4002:402::200e]:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.415515,"t":0.463236,"tags":[],"tls_version":"TLSv1.3","transaction_id":13},{"network":"tcp","address":"142.251.209.14:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.419504,"t":0.464932,"tags":[],"tls_version":"TLSv1.3","transaction_id":14},{"network":"tcp","address":"142.250.180.142:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.418894,"t":0.465008,"tags":[],"tls_version":"TLSv1.3","transaction_id":15},{"network":"tcp","address":"216.58.205.46:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.421961,"t":0.465331,"tags":[],"tls_version":"TLSv1.3","transaction_id":5},{"network":"tcp","address":"216.58.204.142:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.419487,"t":0.466341,"tags":[],"tls_version":"TLSv1.3","transaction_id":8},{"network":"tcp","address":"[2a00:1450:4002:414::200e]:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":0.419044,"t":0.467401,"tags":[],"tls_version":"TLSv1.3","transaction_id":12},{"network":"tcp","address":"142.250.200.14:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.9334069999999999,"t":1.984044,"tags":[],"tls_version":"TLSv1.3","transaction_id":20},{"network":"tcp","address":"142.250.200.46:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.930963,"t":1.990323,"tags":[],"tls_version":"TLSv1.3","transaction_id":23},{"network":"tcp","address":"142.250.179.238:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.9314230000000001,"t":1.990783,"tags":[],"tls_version":"TLSv1.3","transaction_id":22},{"network":"tcp","address":"216.58.204.78:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.934302,"t":1.990915,"tags":[],"tls_version":"TLSv1.3","transaction_id":21},{"network":"tcp","address":"216.58.212.238:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.936303,"t":1.992747,"tags":[],"tls_version":"TLSv1.3","transaction_id":28},{"network":"tcp","address":"[2a00:1450:4009:81e::200e]:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.9310070000000001,"t":1.993483,"tags":[],"tls_version":"TLSv1.3","transaction_id":25},{"network":"tcp","address":"142.250.187.238:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.936323,"t":1.993995,"tags":[],"tls_version":"TLSv1.3","transaction_id":26},{"network":"tcp","address":"[2a00:1450:4009:815::200e]:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.935376,"t":1.994195,"tags":[],"tls_version":"TLSv1.3","transaction_id":31},{"network":"tcp","address":"216.58.201.110:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.9396879999999999,"t":1.994988,"tags":[],"tls_version":"TLSv1.3","transaction_id":24},{"network":"tcp","address":"142.250.178.14:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.939614,"t":1.995451,"tags":[],"tls_version":"TLSv1.3","transaction_id":30},{"network":"tcp","address":"142.250.187.206:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.939584,"t":1.995897,"tags":[],"tls_version":"TLSv1.3","transaction_id":18},{"network":"tcp","address":"[2a00:1450:4009:81f::200e]:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.9384000000000001,"t":1.99783,"tags":[],"tls_version":"TLSv1.3","transaction_id":27},{"network":"tcp","address":"172.217.169.14:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.939556,"t":1.99845,"tags":[],"tls_version":"TLSv1.3","transaction_id":16},{"network":"tcp","address":"142.250.180.14:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.94029,"t":1.999167,"tags":[],"tls_version":"TLSv1.3","transaction_id":29},{"network":"tcp","address":"172.217.16.238:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.9403190000000001,"t":1.9993750000000001,"tags":[],"tls_version":"TLSv1.3","transaction_id":19},{"network":"tcp","address":"[2a00:1450:4009:820::200e]:443","cipher_suite":"TLS_AES_128_GCM_SHA256","failure":null,"negotiated_protocol":"h2","no_tls_verify":false,"peer_certificates":[{"data":"MIIOOjCCDSKgAwIBAgIRAIs+mCLMW+1cCl7dwvqQLe4wDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjMxMDIzMTExODI0WhcNMjQwMTE1MTExODIzWjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFkJP4ajCGcFu/dhDICgGR1D8gXKRbXr+9snEjrW23dyYy8ECV0dSw/xRprfep7Tstl4B58Yv/idte6cxHVTKVo4IMGzCCDBcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAwF+qpbtYBZSyha62gYCxXYB/HZMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIIJzQYDVR0RBIIJxDCCCcCCDCouZ29vZ2xlLmNvbYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5nb29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNhggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4qLmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWCDyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20ubXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5kZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29nbGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCEiouZ29vZ2xlYWRhcGlzLmNvbYIPKi5nb29nbGVhcGlzLmNughEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNughAqLmdzdGF0aWMtY24uY29tgg9nb29nbGVjbmFwcHMuY26CESouZ29vZ2xlY25hcHBzLmNughFnb29nbGVhcHBzLWNuLmNvbYITKi5nb29nbGVhcHBzLWNuLmNvbYIMZ2tlY25hcHBzLmNugg4qLmdrZWNuYXBwcy5jboISZ29vZ2xlZG93bmxvYWRzLmNughQqLmdvb2dsZWRvd25sb2Fkcy5jboIQcmVjYXB0Y2hhLm5ldC5jboISKi5yZWNhcHRjaGEubmV0LmNughByZWNhcHRjaGEtY24ubmV0ghIqLnJlY2FwdGNoYS1jbi5uZXSCC3dpZGV2aW5lLmNugg0qLndpZGV2aW5lLmNughFhbXBwcm9qZWN0Lm9yZy5jboITKi5hbXBwcm9qZWN0Lm9yZy5jboIRYW1wcHJvamVjdC5uZXQuY26CEyouYW1wcHJvamVjdC5uZXQuY26CF2dvb2dsZS1hbmFseXRpY3MtY24uY29tghkqLmdvb2dsZS1hbmFseXRpY3MtY24uY29tghdnb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIZKi5nb29nbGVhZHNlcnZpY2VzLWNuLmNvbYIRZ29vZ2xldmFkcy1jbi5jb22CEyouZ29vZ2xldmFkcy1jbi5jb22CEWdvb2dsZWFwaXMtY24uY29tghMqLmdvb2dsZWFwaXMtY24uY29tghVnb29nbGVvcHRpbWl6ZS1jbi5jb22CFyouZ29vZ2xlb3B0aW1pemUtY24uY29tghJkb3VibGVjbGljay1jbi5uZXSCFCouZG91YmxlY2xpY2stY24ubmV0ghgqLmZscy5kb3VibGVjbGljay1jbi5uZXSCFiouZy5kb3VibGVjbGljay1jbi5uZXSCDmRvdWJsZWNsaWNrLmNughAqLmRvdWJsZWNsaWNrLmNughQqLmZscy5kb3VibGVjbGljay5jboISKi5nLmRvdWJsZWNsaWNrLmNughFkYXJ0c2VhcmNoLWNuLm5ldIITKi5kYXJ0c2VhcmNoLWNuLm5ldIIdZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CHyouZ29vZ2xldHJhdmVsYWRzZXJ2aWNlcy1jbi5jb22CGGdvb2dsZXRhZ3NlcnZpY2VzLWNuLmNvbYIaKi5nb29nbGV0YWdzZXJ2aWNlcy1jbi5jb22CF2dvb2dsZXRhZ21hbmFnZXItY24uY29tghkqLmdvb2dsZXRhZ21hbmFnZXItY24uY29tghhnb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CGiouZ29vZ2xlc3luZGljYXRpb24tY24uY29tgiQqLnNhZmVmcmFtZS5nb29nbGVzeW5kaWNhdGlvbi1jbi5jb22CFmFwcC1tZWFzdXJlbWVudC1jbi5jb22CGCouYXBwLW1lYXN1cmVtZW50LWNuLmNvbYILZ3Z0MS1jbi5jb22CDSouZ3Z0MS1jbi5jb22CC2d2dDItY24uY29tgg0qLmd2dDItY24uY29tggsybWRuLWNuLm5ldIINKi4ybWRuLWNuLm5ldIIUZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCFiouZ29vZ2xlZmxpZ2h0cy1jbi5uZXSCDGFkbW9iLWNuLmNvbYIOKi5hZG1vYi1jbi5jb22CFGdvb2dsZXNhbmRib3gtY24uY29tghYqLmdvb2dsZXNhbmRib3gtY24uY29tgh4qLnNhZmVudXAuZ29vZ2xlc2FuZGJveC1jbi5jb22CDSouZ3N0YXRpYy5jb22CFCoubWV0cmljLmdzdGF0aWMuY29tggoqLmd2dDEuY29tghEqLmdjcGNkbi5ndnQxLmNvbYIKKi5ndnQyLmNvbYIOKi5nY3AuZ3Z0Mi5jb22CECoudXJsLmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CCyoueXRpbWcuY29tggthbmRyb2lkLmNvbYINKi5hbmRyb2lkLmNvbYITKi5mbGFzaC5hbmRyb2lkLmNvbYIEZy5jboIGKi5nLmNuggRnLmNvggYqLmcuY2+CBmdvby5nbIIKd3d3Lmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CFiouZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIUKi5nb29nbGVjb21tZXJjZS5jb22CCGdncGh0LmNuggoqLmdncGh0LmNuggp1cmNoaW4uY29tggwqLnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYINKi55b3V0dWJlLmNvbYIUeW91dHViZWVkdWNhdGlvbi5jb22CFioueW91dHViZWVkdWNhdGlvbi5jb22CD3lvdXR1YmVraWRzLmNvbYIRKi55b3V0dWJla2lkcy5jb22CBXl0LmJlggcqLnl0LmJlghphbmRyb2lkLmNsaWVudHMuZ29vZ2xlLmNvbYIbZGV2ZWxvcGVyLmFuZHJvaWQuZ29vZ2xlLmNughxkZXZlbG9wZXJzLmFuZHJvaWQuZ29vZ2xlLmNughhzb3VyY2UuYW5kcm9pZC5nb29nbGUuY24wIQYDVR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAHWeQIFAzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3Jscy5wa2kuZ29vZy9ndHMxYzMvbW9WRGZJU2lhMmsuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGLXHjeOgAABAMARjBEAiA5xkLry/jLvTgkNitDIuFmwVuL3SVofIIa9S9BX0aAlQIgWnF3vOB4zocZKrj1Ou4RgpTEZslWMbTi36QHOmI2rc8AdQDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYtceN4RAAAEAwBGMEQCIGNaR2SEb6EgAXBGxhriVs6xEmMSfNl+gxHXsAT1D26qAiB/nSwVTXKptImly3Nj1RlIBQ49kG6pLVjwM7pFTFFHgDANBgkqhkiG9w0BAQsFAAOCAQEA2zTHxu4FM4XJYuFVpYaFR+Rt4j27U4UZ/ju4CyY1h8PozUgpap6bKvsknfpltdaoHPqMBg7XdSX1hXpVJctAxPp/QgC6mYTlLGIk095lqyWYYH1HR/kf7VSBJDy8KYx44WliqK3kleYxbnz6BqEa8z9P0bILW8KvHyZt5tPYBvV2R42gueVgnJT9Kht3Pv0ZblajN0Ium+S03sDdMYT4nsKU5agIfeiO/nIgF14Zn+zKg0ilSZzum8pB0UgENi5CsowoNyOkdXOcIGMfOvy6hhXckE32lJu4gVL1W2fSeii8K9y7pMGNUMbV+h2sF24EGxP5zlhruE2lJGRgONjFpA==","format":"base64"},{"data":"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd","format":"base64"},{"data":"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=","format":"base64"}],"server_name":"www.youtube.com","t0":1.940346,"t":2.00063,"tags":[],"tls_version":"TLSv1.3","transaction_id":17}],"x_control_request":{"http_request":"https://www.youtube.com/","http_request_headers":{"Accept":["text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"],"Accept-Language":["en-US,en;q=0.9"],"User-Agent":["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"]},"tcp_connect":["142.250.180.174:443","142.250.180.174:80","216.58.205.46:443","216.58.205.46:80","142.251.209.46:443","142.251.209.46:80","216.58.209.46:443","216.58.209.46:80","216.58.204.142:443","216.58.204.142:80","[2a00:1450:4002:403::200e]:443","[2a00:1450:4002:403::200e]:80","[2a00:1450:4002:410::200e]:443","[2a00:1450:4002:410::200e]:80","[2a00:1450:4002:416::200e]:443","[2a00:1450:4002:416::200e]:80","[2a00:1450:4002:414::200e]:443","[2a00:1450:4002:414::200e]:80","[2a00:1450:4002:402::200e]:443","[2a00:1450:4002:402::200e]:80","142.251.209.14:443","142.251.209.14:80","142.250.180.142:443","142.250.180.142:80"],"x_quic_enabled":false},"control":{"tcp_connect":{"142.250.178.14:443":{"status":true,"failure":null},"142.250.179.238:443":{"status":true,"failure":null},"142.250.180.142:443":{"status":true,"failure":null},"142.250.180.14:443":{"status":true,"failure":null},"142.250.180.174:443":{"status":true,"failure":null},"142.250.187.206:443":{"status":true,"failure":null},"142.250.187.238:443":{"status":true,"failure":null},"142.250.200.14:443":{"status":true,"failure":null},"142.250.200.46:443":{"status":true,"failure":null},"142.251.209.14:443":{"status":true,"failure":null},"142.251.209.46:443":{"status":true,"failure":null},"172.217.16.238:443":{"status":true,"failure":null},"172.217.169.14:443":{"status":true,"failure":null},"216.58.201.110:443":{"status":true,"failure":null},"216.58.204.142:443":{"status":true,"failure":null},"216.58.204.78:443":{"status":true,"failure":null},"216.58.205.46:443":{"status":true,"failure":null},"216.58.209.46:443":{"status":true,"failure":null},"216.58.212.238:443":{"status":true,"failure":null},"[2a00:1450:4002:402::200e]:443":{"status":true,"failure":null},"[2a00:1450:4002:403::200e]:443":{"status":true,"failure":null},"[2a00:1450:4002:410::200e]:443":{"status":true,"failure":null},"[2a00:1450:4002:414::200e]:443":{"status":true,"failure":null},"[2a00:1450:4002:416::200e]:443":{"status":true,"failure":null},"[2a00:1450:4009:815::200e]:443":{"status":true,"failure":null},"[2a00:1450:4009:81e::200e]:443":{"status":true,"failure":null},"[2a00:1450:4009:81f::200e]:443":{"status":true,"failure":null},"[2a00:1450:4009:820::200e]:443":{"status":true,"failure":null}},"tls_handshake":{"142.250.178.14:443":{"server_name":"www.youtube.com","status":true,"failure":null},"142.250.179.238:443":{"server_name":"www.youtube.com","status":true,"failure":null},"142.250.180.142:443":{"server_name":"www.youtube.com","status":true,"failure":null},"142.250.180.14:443":{"server_name":"www.youtube.com","status":true,"failure":null},"142.250.180.174:443":{"server_name":"www.youtube.com","status":true,"failure":null},"142.250.187.206:443":{"server_name":"www.youtube.com","status":true,"failure":null},"142.250.187.238:443":{"server_name":"www.youtube.com","status":true,"failure":null},"142.250.200.14:443":{"server_name":"www.youtube.com","status":true,"failure":null},"142.250.200.46:443":{"server_name":"www.youtube.com","status":true,"failure":null},"142.251.209.14:443":{"server_name":"www.youtube.com","status":true,"failure":null},"142.251.209.46:443":{"server_name":"www.youtube.com","status":true,"failure":null},"172.217.16.238:443":{"server_name":"www.youtube.com","status":true,"failure":null},"172.217.169.14:443":{"server_name":"www.youtube.com","status":true,"failure":null},"216.58.201.110:443":{"server_name":"www.youtube.com","status":true,"failure":null},"216.58.204.142:443":{"server_name":"www.youtube.com","status":true,"failure":null},"216.58.204.78:443":{"server_name":"www.youtube.com","status":true,"failure":null},"216.58.205.46:443":{"server_name":"www.youtube.com","status":true,"failure":null},"216.58.209.46:443":{"server_name":"www.youtube.com","status":true,"failure":null},"216.58.212.238:443":{"server_name":"www.youtube.com","status":true,"failure":null},"[2a00:1450:4002:402::200e]:443":{"server_name":"www.youtube.com","status":true,"failure":null},"[2a00:1450:4002:403::200e]:443":{"server_name":"www.youtube.com","status":true,"failure":null},"[2a00:1450:4002:410::200e]:443":{"server_name":"www.youtube.com","status":true,"failure":null},"[2a00:1450:4002:414::200e]:443":{"server_name":"www.youtube.com","status":true,"failure":null},"[2a00:1450:4002:416::200e]:443":{"server_name":"www.youtube.com","status":true,"failure":null},"[2a00:1450:4009:815::200e]:443":{"server_name":"www.youtube.com","status":true,"failure":null},"[2a00:1450:4009:81e::200e]:443":{"server_name":"www.youtube.com","status":true,"failure":null},"[2a00:1450:4009:81f::200e]:443":{"server_name":"www.youtube.com","status":true,"failure":null},"[2a00:1450:4009:820::200e]:443":{"server_name":"www.youtube.com","status":true,"failure":null}},"quic_handshake":{},"http_request":{"body_length":928046,"discovered_h3_endpoint":"www.youtube.com:443","failure":null,"title":"YouTube","headers":{"Accept-Ch":"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-WoW64, Sec-CH-UA-Form-Factor, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version","Accept-Ranges":"none","Alt-Svc":"h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000","Cache-Control":"no-cache, no-store, max-age=0, must-revalidate","Content-Type":"text/html; charset=utf-8","Cross-Origin-Opener-Policy":"same-origin-allow-popups; report-to=\"youtube_main\"","Date":"Thu, 23 Nov 2023 18:26:41 GMT","Expires":"Mon, 01 Jan 1990 00:00:00 GMT","Origin-Trial":"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9","P3p":"CP=\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en for more info.\"","Permissions-Policy":"ch-ua-arch=*, ch-ua-bitness=*, ch-ua-full-version=*, ch-ua-full-version-list=*, ch-ua-model=*, ch-ua-wow64=*, ch-ua-form-factor=*, ch-ua-platform=*, ch-ua-platform-version=*","Pragma":"no-cache","Report-To":"{\"group\":\"youtube_main\",\"max_age\":2592000,\"endpoints\":[{\"url\":\"https://csp.withgoogle.com/csp/report-to/youtube_main\"}]}","Server":"ESF","Set-Cookie":"YSC=fdjkg7HJcyY; Domain=.youtube.com; Path=/; Secure; HttpOnly; SameSite=none","Strict-Transport-Security":"max-age=31536000","Vary":"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-WoW64, Sec-CH-UA-Form-Factor, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version,Accept-Encoding","X-Content-Type-Options":"nosniff","X-Frame-Options":"SAMEORIGIN","X-Xss-Protection":"0"},"status_code":200},"http3_request":null,"dns":{"failure":null,"addrs":["216.58.212.238","142.250.179.238","142.250.180.14","142.250.187.206","142.250.187.238","142.250.178.14","172.217.16.238","142.250.200.14","142.250.200.46","216.58.201.110","216.58.204.78","172.217.169.14","2a00:1450:4009:81e::200e","2a00:1450:4009:81f::200e","2a00:1450:4009:820::200e","2a00:1450:4009:815::200e"]},"ip_info":{"142.250.178.14":{"asn":15169,"flags":10},"142.250.179.238":{"asn":15169,"flags":10},"142.250.180.14":{"asn":15169,"flags":10},"142.250.180.142":{"asn":15169,"flags":9},"142.250.180.174":{"asn":15169,"flags":9},"142.250.187.206":{"asn":15169,"flags":10},"142.250.187.238":{"asn":15169,"flags":10},"142.250.200.14":{"asn":15169,"flags":10},"142.250.200.46":{"asn":15169,"flags":10},"142.251.209.14":{"asn":15169,"flags":9},"142.251.209.46":{"asn":15169,"flags":9},"172.217.16.238":{"asn":15169,"flags":10},"172.217.169.14":{"asn":15169,"flags":10},"216.58.201.110":{"asn":15169,"flags":10},"216.58.204.142":{"asn":15169,"flags":9},"216.58.204.78":{"asn":15169,"flags":10},"216.58.205.46":{"asn":15169,"flags":9},"216.58.209.46":{"asn":15169,"flags":9},"216.58.212.238":{"asn":15169,"flags":10},"2a00:1450:4002:402::200e":{"asn":15169,"flags":9},"2a00:1450:4002:403::200e":{"asn":15169,"flags":9},"2a00:1450:4002:410::200e":{"asn":15169,"flags":9},"2a00:1450:4002:414::200e":{"asn":15169,"flags":9},"2a00:1450:4002:416::200e":{"asn":15169,"flags":9},"2a00:1450:4009:815::200e":{"asn":15169,"flags":10},"2a00:1450:4009:81e::200e":{"asn":15169,"flags":10},"2a00:1450:4009:81f::200e":{"asn":15169,"flags":10},"2a00:1450:4009:820::200e":{"asn":15169,"flags":10}}},"x_conn_priority_log":[{"msg":"create with [{Addr:142.250.180.174 Flags:7} {Addr:216.58.205.46 Flags:7} {Addr:142.251.209.46 Flags:7} {Addr:216.58.209.46 Flags:3} {Addr:216.58.204.142 Flags:7} {Addr:2a00:1450:4002:403::200e Flags:7} {Addr:2a00:1450:4002:410::200e Flags:3} {Addr:2a00:1450:4002:416::200e Flags:7} {Addr:2a00:1450:4002:414::200e Flags:4} {Addr:2a00:1450:4002:402::200e Flags:7} {Addr:142.251.209.14 Flags:7} {Addr:142.250.180.142 Flags:7}]","t":0.394935},{"msg":"conn 216.58.209.46:443: granted permission: true","t":0.452358},{"msg":"conn 142.251.209.46:443: denied permission: timed out sending","t":0.470646},{"msg":"conn 142.250.180.174:443: denied permission: timed out sending","t":0.471405},{"msg":"conn [2a00:1450:4002:416::200e]:443: denied permission: timed out sending","t":0.472374},{"msg":"conn [2a00:1450:4002:410::200e]:443: denied permission: timed out sending","t":0.472574},{"msg":"conn [2a00:1450:4002:403::200e]:443: denied permission: timed out sending","t":0.472918},{"msg":"conn [2a00:1450:4002:402::200e]:443: denied permission: timed out sending","t":0.473309},{"msg":"conn 142.251.209.14:443: denied permission: timed out sending","t":0.475022},{"msg":"conn 142.250.180.142:443: denied permission: timed out sending","t":0.475034},{"msg":"conn 216.58.205.46:443: denied permission: timed out sending","t":0.475404},{"msg":"conn 216.58.204.142:443: denied permission: timed out sending","t":0.476496},{"msg":"conn [2a00:1450:4002:414::200e]:443: denied permission: timed out sending","t":0.477555},{"msg":"conn 142.250.200.14:443: denied permission: timed out sending","t":1.995075},{"msg":"conn 142.250.200.46:443: denied permission: timed out sending","t":2.000614},{"msg":"conn 142.250.179.238:443: denied permission: timed out sending","t":2.000956},{"msg":"conn 216.58.204.78:443: denied permission: timed out sending","t":2.000999},{"msg":"conn 216.58.212.238:443: denied permission: timed out sending","t":2.003022},{"msg":"conn [2a00:1450:4009:81e::200e]:443: denied permission: timed out sending","t":2.003587},{"msg":"conn 142.250.187.238:443: denied permission: timed out sending","t":2.004086},{"msg":"conn [2a00:1450:4009:815::200e]:443: denied permission: timed out sending","t":2.004241},{"msg":"conn 216.58.201.110:443: denied permission: timed out sending","t":2.005122},{"msg":"conn 142.250.178.14:443: denied permission: timed out sending","t":2.005525},{"msg":"conn 142.250.187.206:443: denied permission: timed out sending","t":2.005979},{"msg":"conn [2a00:1450:4009:81f::200e]:443: denied permission: timed out sending","t":2.008104},{"msg":"conn 172.217.169.14:443: denied permission: timed out sending","t":2.00853},{"msg":"conn 142.250.180.14:443: denied permission: timed out sending","t":2.009284},{"msg":"conn 172.217.16.238:443: denied permission: timed out sending","t":2.009404},{"msg":"conn [2a00:1450:4009:820::200e]:443: denied permission: timed out sending","t":2.010817}],"control_failure":null,"x_dns_flags":0,"dns_experiment_failure":null,"dns_consistency":"consistent","http_experiment_failure":"unknown_failure: http_request_canceled","x_blocking_flags":0,"x_null_null_flags":0,"body_length_match":null,"headers_match":null,"status_code_match":null,"title_match":null,"blocking":null,"accessible":null},"test_name":"web_connectivity","test_runtime":2.011304875,"test_start_time":"2023-11-23 18:26:40","test_version":"0.5.26"} diff --git a/internal/pipeline/testdata/youtube_db.json b/internal/pipeline/testdata/youtube_db.json new file mode 100644 index 000000000..8c0a18da9 --- /dev/null +++ b/internal/pipeline/testdata/youtube_db.json @@ -0,0 +1 @@ +{"XdnsByTxID":{"1":{"TransactionID":1,"QueryType":"AAAA","Failure":null,"Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782},"2":{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264},"3":{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}},"XthEpntByEpnt":{"142.250.178.14:443/tcp":{"Proto":"tcp","IPAddress":"142.250.178.14","Port":"443","Endpoint":"142.250.178.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.179.238:443/tcp":{"Proto":"tcp","IPAddress":"142.250.179.238","Port":"443","Endpoint":"142.250.179.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.180.142:443/tcp":{"Proto":"tcp","IPAddress":"142.250.180.142","Port":"443","Endpoint":"142.250.180.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.180.14:443/tcp":{"Proto":"tcp","IPAddress":"142.250.180.14","Port":"443","Endpoint":"142.250.180.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.180.174:443/tcp":{"Proto":"tcp","IPAddress":"142.250.180.174","Port":"443","Endpoint":"142.250.180.174:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.187.206:443/tcp":{"Proto":"tcp","IPAddress":"142.250.187.206","Port":"443","Endpoint":"142.250.187.206:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.187.238:443/tcp":{"Proto":"tcp","IPAddress":"142.250.187.238","Port":"443","Endpoint":"142.250.187.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.200.14:443/tcp":{"Proto":"tcp","IPAddress":"142.250.200.14","Port":"443","Endpoint":"142.250.200.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.200.46:443/tcp":{"Proto":"tcp","IPAddress":"142.250.200.46","Port":"443","Endpoint":"142.250.200.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.251.209.14:443/tcp":{"Proto":"tcp","IPAddress":"142.251.209.14","Port":"443","Endpoint":"142.251.209.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.251.209.46:443/tcp":{"Proto":"tcp","IPAddress":"142.251.209.46","Port":"443","Endpoint":"142.251.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"172.217.16.238:443/tcp":{"Proto":"tcp","IPAddress":"172.217.16.238","Port":"443","Endpoint":"172.217.16.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"172.217.169.14:443/tcp":{"Proto":"tcp","IPAddress":"172.217.169.14","Port":"443","Endpoint":"172.217.169.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.201.110:443/tcp":{"Proto":"tcp","IPAddress":"216.58.201.110","Port":"443","Endpoint":"216.58.201.110:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.204.142:443/tcp":{"Proto":"tcp","IPAddress":"216.58.204.142","Port":"443","Endpoint":"216.58.204.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.204.78:443/tcp":{"Proto":"tcp","IPAddress":"216.58.204.78","Port":"443","Endpoint":"216.58.204.78:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.205.46:443/tcp":{"Proto":"tcp","IPAddress":"216.58.205.46","Port":"443","Endpoint":"216.58.205.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.209.46:443/tcp":{"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.212.238:443/tcp":{"Proto":"tcp","IPAddress":"216.58.212.238","Port":"443","Endpoint":"216.58.212.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4002:402::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:402::200e","Port":"443","Endpoint":"[2a00:1450:4002:402::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4002:403::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:403::200e","Port":"443","Endpoint":"[2a00:1450:4002:403::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4002:410::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:410::200e","Port":"443","Endpoint":"[2a00:1450:4002:410::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4002:414::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:414::200e","Port":"443","Endpoint":"[2a00:1450:4002:414::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4002:416::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:416::200e","Port":"443","Endpoint":"[2a00:1450:4002:416::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4009:815::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:815::200e","Port":"443","Endpoint":"[2a00:1450:4009:815::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4009:81e::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81e::200e","Port":"443","Endpoint":"[2a00:1450:4009:81e::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4009:81f::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81f::200e","Port":"443","Endpoint":"[2a00:1450:4009:81f::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4009:820::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:820::200e","Port":"443","Endpoint":"[2a00:1450:4009:820::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"}},"XthWeb":{"HTTPFailure":null,"HTTPResponseStatusCode":200,"HTTPResponseBodyLength":928046,"HTTPResponseHeadersKeys":{"Accept-Ch":2,"Accept-Ranges":2,"Alt-Svc":2,"Cache-Control":2,"Content-Type":2,"Cross-Origin-Opener-Policy":2,"Date":2,"Expires":2,"Origin-Trial":2,"P3p":2,"Permissions-Policy":2,"Pragma":2,"Report-To":2,"Server":2,"Set-Cookie":2,"Strict-Transport-Security":2,"Vary":2,"X-Content-Type-Options":2,"X-Frame-Options":2,"X-Xss-Protection":2},"HTTPResponseTitle":"YouTube"},"XwebByTxID":{"10":{"TransactionID":10,"Proto":"tcp","IPAddress":"2a00:1450:4002:410::200e","Port":"443","Endpoint":"[2a00:1450:4002:410::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396471,"TCPConnectT":0.417629,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","Failure":null,"Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.417656,"TLSHandshakeT":0.462505,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:410::200e","Port":"443","Endpoint":"[2a00:1450:4002:410::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"11":{"TransactionID":11,"Proto":"tcp","IPAddress":"2a00:1450:4002:416::200e","Port":"443","Endpoint":"[2a00:1450:4002:416::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396461,"TCPConnectT":0.416484,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","Failure":null,"Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.416512,"TLSHandshakeT":0.462307,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:416::200e","Port":"443","Endpoint":"[2a00:1450:4002:416::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"12":{"TransactionID":12,"Proto":"tcp","IPAddress":"2a00:1450:4002:414::200e","Port":"443","Endpoint":"[2a00:1450:4002:414::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396723,"TCPConnectT":0.418956,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.419044,"TLSHandshakeT":0.467401,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:414::200e","Port":"443","Endpoint":"[2a00:1450:4002:414::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"13":{"TransactionID":13,"Proto":"tcp","IPAddress":"2a00:1450:4002:402::200e","Port":"443","Endpoint":"[2a00:1450:4002:402::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395951,"TCPConnectT":0.415468,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","Failure":null,"Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.415515,"TLSHandshakeT":0.463236,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:402::200e","Port":"443","Endpoint":"[2a00:1450:4002:402::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"14":{"TransactionID":14,"Proto":"tcp","IPAddress":"142.251.209.14","Port":"443","Endpoint":"142.251.209.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395747,"TCPConnectT":0.41948,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.419504,"TLSHandshakeT":0.464932,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.251.209.14","Port":"443","Endpoint":"142.251.209.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"15":{"TransactionID":15,"Proto":"tcp","IPAddress":"142.250.180.142","Port":"443","Endpoint":"142.250.180.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396707,"TCPConnectT":0.418861,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.418894,"TLSHandshakeT":0.465008,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.180.142","Port":"443","Endpoint":"142.250.180.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"16":{"TransactionID":16,"Proto":"tcp","IPAddress":"172.217.169.14","Port":"443","Endpoint":"172.217.169.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89481,"TCPConnectT":1.939539,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.939556,"TLSHandshakeT":1.99845,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"172.217.169.14","Port":"443","Endpoint":"172.217.169.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"17":{"TransactionID":17,"Proto":"tcp","IPAddress":"2a00:1450:4009:820::200e","Port":"443","Endpoint":"[2a00:1450:4009:820::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895162,"TCPConnectT":1.940325,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.940346,"TLSHandshakeT":2.00063,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:820::200e","Port":"443","Endpoint":"[2a00:1450:4009:820::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"18":{"TransactionID":18,"Proto":"tcp","IPAddress":"142.250.187.206","Port":"443","Endpoint":"142.250.187.206:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895168,"TCPConnectT":1.939568,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.939584,"TLSHandshakeT":1.995897,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.187.206","Port":"443","Endpoint":"142.250.187.206:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"19":{"TransactionID":19,"Proto":"tcp","IPAddress":"172.217.16.238","Port":"443","Endpoint":"172.217.16.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895386,"TCPConnectT":1.940296,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9403190000000001,"TLSHandshakeT":1.9993750000000001,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"172.217.16.238","Port":"443","Endpoint":"172.217.16.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"20":{"TransactionID":20,"Proto":"tcp","IPAddress":"142.250.200.14","Port":"443","Endpoint":"142.250.200.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8946960000000002,"TCPConnectT":1.93338,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9334069999999999,"TLSHandshakeT":1.984044,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.200.14","Port":"443","Endpoint":"142.250.200.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"21":{"TransactionID":21,"Proto":"tcp","IPAddress":"216.58.204.78","Port":"443","Endpoint":"216.58.204.78:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89452,"TCPConnectT":1.9342679999999999,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.934302,"TLSHandshakeT":1.990915,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.204.78","Port":"443","Endpoint":"216.58.204.78:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"22":{"TransactionID":22,"Proto":"tcp","IPAddress":"142.250.179.238","Port":"443","Endpoint":"142.250.179.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89411,"TCPConnectT":1.931396,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9314230000000001,"TLSHandshakeT":1.990783,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.179.238","Port":"443","Endpoint":"142.250.179.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"23":{"TransactionID":23,"Proto":"tcp","IPAddress":"142.250.200.46","Port":"443","Endpoint":"142.250.200.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8941940000000002,"TCPConnectT":1.9308939999999999,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.930963,"TLSHandshakeT":1.990323,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.200.46","Port":"443","Endpoint":"142.250.200.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"24":{"TransactionID":24,"Proto":"tcp","IPAddress":"216.58.201.110","Port":"443","Endpoint":"216.58.201.110:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895193,"TCPConnectT":1.939627,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9396879999999999,"TLSHandshakeT":1.994988,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.201.110","Port":"443","Endpoint":"216.58.201.110:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"25":{"TransactionID":25,"Proto":"tcp","IPAddress":"2a00:1450:4009:81e::200e","Port":"443","Endpoint":"[2a00:1450:4009:81e::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.894023,"TCPConnectT":1.930973,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9310070000000001,"TLSHandshakeT":1.993483,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81e::200e","Port":"443","Endpoint":"[2a00:1450:4009:81e::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"26":{"TransactionID":26,"Proto":"tcp","IPAddress":"142.250.187.238","Port":"443","Endpoint":"142.250.187.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.894889,"TCPConnectT":1.936306,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.936323,"TLSHandshakeT":1.993995,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.187.238","Port":"443","Endpoint":"142.250.187.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"27":{"TransactionID":27,"Proto":"tcp","IPAddress":"2a00:1450:4009:81f::200e","Port":"443","Endpoint":"[2a00:1450:4009:81f::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89456,"TCPConnectT":1.938354,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9384000000000001,"TLSHandshakeT":1.99783,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81f::200e","Port":"443","Endpoint":"[2a00:1450:4009:81f::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"28":{"TransactionID":28,"Proto":"tcp","IPAddress":"216.58.212.238","Port":"443","Endpoint":"216.58.212.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.894834,"TCPConnectT":1.936283,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.936303,"TLSHandshakeT":1.992747,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.212.238","Port":"443","Endpoint":"216.58.212.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"29":{"TransactionID":29,"Proto":"tcp","IPAddress":"142.250.180.14","Port":"443","Endpoint":"142.250.180.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895467,"TCPConnectT":1.940271,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.94029,"TLSHandshakeT":1.999167,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.180.14","Port":"443","Endpoint":"142.250.180.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"30":{"TransactionID":30,"Proto":"tcp","IPAddress":"142.250.178.14","Port":"443","Endpoint":"142.250.178.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8953090000000001,"TCPConnectT":1.939593,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.939614,"TLSHandshakeT":1.995451,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.178.14","Port":"443","Endpoint":"142.250.178.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"31":{"TransactionID":31,"Proto":"tcp","IPAddress":"2a00:1450:4009:815::200e","Port":"443","Endpoint":"[2a00:1450:4009:815::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8944800000000002,"TCPConnectT":1.935353,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.935376,"TLSHandshakeT":1.994195,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:815::200e","Port":"443","Endpoint":"[2a00:1450:4009:815::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"4":{"TransactionID":4,"Proto":"tcp","IPAddress":"142.250.180.174","Port":"443","Endpoint":"142.250.180.174:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.39635,"TCPConnectT":0.41553,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.415573,"TLSHandshakeT":0.461278,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.180.174","Port":"443","Endpoint":"142.250.180.174:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"5":{"TransactionID":5,"Proto":"tcp","IPAddress":"216.58.205.46","Port":"443","Endpoint":"216.58.205.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395701,"TCPConnectT":0.421933,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.421961,"TLSHandshakeT":0.465331,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.205.46","Port":"443","Endpoint":"216.58.205.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"6":{"TransactionID":6,"Proto":"tcp","IPAddress":"142.251.209.46","Port":"443","Endpoint":"142.251.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395832,"TCPConnectT":0.413203,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.41324,"TLSHandshakeT":0.460508,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.251.209.46","Port":"443","Endpoint":"142.251.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"7":{"TransactionID":7,"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396053,"TCPConnectT":0.411923,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.411989,"TLSHandshakeT":0.452334,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":null,"HTTPResponseStatusCode":200,"HTTPResponseBodyLength":524298,"HTTPResponseBodyIsTruncated":true,"HTTPResponseHeadersKeys":{"Accept-Ch":1,"Accept-Ranges":1,"Alt-Svc":1,"Cache-Control":1,"Content-Type":1,"Cross-Origin-Opener-Policy":1,"Date":1,"Expires":1,"Origin-Trial":1,"P3p":1,"Permissions-Policy":1,"Pragma":1,"Report-To":1,"Server":1,"Set-Cookie":1,"Strict-Transport-Security":1,"Vary":1,"X-Content-Type-Options":1,"X-Frame-Options":1,"X-Xss-Protection":1},"HTTPResponseTitle":"YouTube"},"8":{"TransactionID":8,"Proto":"tcp","IPAddress":"216.58.204.142","Port":"443","Endpoint":"216.58.204.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395722,"TCPConnectT":0.419464,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.419487,"TLSHandshakeT":0.466341,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.204.142","Port":"443","Endpoint":"216.58.204.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"9":{"TransactionID":9,"Proto":"tcp","IPAddress":"2a00:1450:4002:403::200e","Port":"443","Endpoint":"[2a00:1450:4002:403::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396408,"TCPConnectT":0.416441,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","Failure":null,"Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.416468,"TLSHandshakeT":0.46288,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:403::200e","Port":"443","Endpoint":"[2a00:1450:4002:403::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null}}} \ No newline at end of file diff --git a/internal/pipeline/th.go b/internal/pipeline/th.go new file mode 100644 index 000000000..099d84727 --- /dev/null +++ b/internal/pipeline/th.go @@ -0,0 +1,152 @@ +package pipeline + +import ( + "errors" + "fmt" + "net" + + "github.com/ooni/probe-cli/v3/internal/geoipx" + "github.com/ooni/probe-cli/v3/internal/model" + "github.com/ooni/probe-cli/v3/internal/netxlite" + "github.com/ooni/probe-cli/v3/internal/optional" +) + +// EndpointObservationTH is an endpoint observation made by the test helper (TH). +// +// Optional values represent data that may not be there if we do not +// find the expected events. Non-optional data should always be there. +// +// This type is inspired by and adapted from https://github.com/ooni/data +// and adapts the WebControlObservation type to probe-engine. +type EndpointObservationTH struct { + // Proto is "tcp" (http/https) or "udp" (http/3). + Proto string + + // IPAddress is the IPv4/IPv6 address. + IPAddress string + + // Port is the TCP/UDP port. + Port string + + // Endpoint summarizes IPAddress, Port, and Proto. + Endpoint string + + // IPAddressASN is the IPAddress of the ASN. + IPAddressASN optional.Value[int64] + + // IPAddressIsBogon indicates that the IP address is a bogon. + IPAddressIsBogon bool + + // TCPConnectFailure is the error that occurred. + TCPConnectFailure optional.Value[*string] + + // QUICHandshakeFailure is the error that occurred. + QUICHandshakeFailure optional.Value[*string] + + // TLSHandshakeFailure is the error that occurred. + TLSHandshakeFailure optional.Value[*string] + + // TLSServerName is the SNI value. + TLSServerName optional.Value[string] +} + +// WebObservationTH is a web observation made by the TH. +// +// Optional values represent data that may not be there if we do not +// find the expected events. Non-optional data should always be there. +// +// This type is inspired by and adapted from https://github.com/ooni/data +// and adapts the WebControlObservation type to probe-engine. +type WebObservationTH struct { + // HTTPFailure is the error that occurred. + HTTPFailure optional.Value[*string] + + // HTTPResponseStatusCode is the response status code. + HTTPResponseStatusCode optional.Value[int64] + + // HTTPResponseBodyLength is the length of the response body. + HTTPResponseBodyLength optional.Value[int64] + + // HTTPResponseHeadersKeys contains the response headers keys. + HTTPResponseHeadersKeys map[string]HeaderOrigin + + // HTTPResponseTitle contains the response title. + HTTPResponseTitle optional.Value[string] +} + +func (db *DB) thAddDNS(resp *model.THResponse) error { + db.thDNSFailure = resp.DNS.Failure + for _, addr := range resp.DNS.Addrs { + db.thDNSAddrs[addr] = true + } + return nil +} + +var errInconsistentTHResponse = errors.New("analysis: inconsistent TH response") + +func (db *DB) thAddTCPConnect(resp *model.THResponse) error { + for addrport, status := range resp.TCPConnect { + addr, port, err := net.SplitHostPort(addrport) + if err != nil { + return err + } + + endpoint := fmt.Sprintf("%s/tcp", addrport) + var asn optional.Value[int64] + if v, _, err := geoipx.LookupASN(addr); err == nil { + asn = optional.Some(int64(v)) + } + + // Implementation note: because we're reading a map, we can't have duplicates + // so we can blindly insert into the destination map here + db.thEpntByEpnt[endpoint] = &EndpointObservationTH{ + Proto: "tcp", + IPAddress: addr, + Port: port, + Endpoint: endpoint, + IPAddressASN: asn, + IPAddressIsBogon: netxlite.IsBogon(addr), + TCPConnectFailure: optional.Some(status.Failure), + } + } + return nil +} + +func (db *DB) thAddTLSHandshake(resp *model.THResponse) error { + for addrport, status := range resp.TLSHandshake { + endpoint := fmt.Sprintf("%s/tcp", addrport) + + entry, found := db.thEpntByEpnt[endpoint] + if !found { + return errInconsistentTHResponse + } + + entry.TLSServerName = optional.Some(status.ServerName) + entry.TLSHandshakeFailure = optional.Some(status.Failure) + } + return nil +} + +var errAlreadyExistingTHWeb = errors.New("analysis: thWeb already exists") + +func (db *DB) thAddHTTPResponse(resp *model.THResponse) error { + if !db.thWeb.IsNone() { + return errAlreadyExistingTHWeb + } + + db.thWeb = optional.Some(&WebObservationTH{ + HTTPFailure: optional.Some(resp.HTTPRequest.Failure), + HTTPResponseStatusCode: optional.Some(resp.HTTPRequest.StatusCode), + HTTPResponseBodyLength: optional.Some(resp.HTTPRequest.BodyLength), + HTTPResponseHeadersKeys: func() (out map[string]HeaderOrigin) { + out = make(map[string]HeaderOrigin) + for key := range resp.HTTPRequest.Headers { + out[key] = HeaderOriginTH + } + return + }(), + HTTPResponseTitle: optional.Some(resp.HTTPRequest.Title), + }) + + return nil +} diff --git a/internal/pipeline/web.go b/internal/pipeline/web.go new file mode 100644 index 000000000..22cda3c4b --- /dev/null +++ b/internal/pipeline/web.go @@ -0,0 +1,246 @@ +package pipeline + +import ( + "errors" + "fmt" + "net" + + "github.com/ooni/probe-cli/v3/internal/geoipx" + "github.com/ooni/probe-cli/v3/internal/measurexlite" + "github.com/ooni/probe-cli/v3/internal/model" + "github.com/ooni/probe-cli/v3/internal/netxlite" + "github.com/ooni/probe-cli/v3/internal/optional" +) + +// WebEndpointObservation is an endpoint observation made by the probe. +// +// Optional values represent data that may not be there if we do not +// find the expected events. Non-optional data should always be there. +// +// This type is inspired by and adapted from https://github.com/ooni/data +// and adapts the WebObservation type to probe-engine. +type WebEndpointObservation struct { + // TransactionID is the ID of the transaction. + TransactionID int64 + + // Proto is "tcp" (http/https) or "udp" (http/3). + Proto string + + // IPAddress is the IPv4/IPv6 address. + IPAddress string + + // Port is the TCP/UDP port. + Port string + + // Endpoint summarizes IPAddress, Port, and Proto. + Endpoint string + + // IPAddressASN is the IPAddress of the ASN. + IPAddressASN optional.Value[int64] + + // IPAddressIsBogon indicates that the IP address is a bogon. + IPAddressIsBogon bool + + // TCPConnectT0 is when we started connecting. + TCPConnectT0 optional.Value[float64] + + // TCPConnectT is when connect returned. + TCPConnectT optional.Value[float64] + + // TCPConnectFailure is the error that occurred. + TCPConnectFailure optional.Value[*string] + + // DNSDomainName is the domain name that produced this IP address. + DNSDomainName optional.Value[string] + + // DNSLookupGetaddrinfoXref contains references to the getaddrinfo + // based DNS lookups that produced this IP address. + DNSLookupGetaddrinfoXref []*DNSObservation + + // DNSLookupUDPXref contains references to the DNS-over-UDP + // based DNS lookups that produced this IP address. + DNSLookupUDPXref []*DNSObservation + + // DNSLookupHTTPSXref contains references to the DNS-over-HTTPS + // based DNS lookups that produced this IP address. + DNSLookupHTTPSXref []*DNSObservation + + // DNSLookupTHXref is true when this address was discovered by the TH + DNSLookupTHXref bool + + // QUICHandshakeT0 is when we started handshaking. + QUICHandshakeT0 optional.Value[float64] + + // QUICHandshakeT is when the QUIC handshake finished. + QUICHandshakeT optional.Value[float64] + + // QUICHandshakeFailure is the error that occurred. + QUICHandshakeFailure optional.Value[*string] + + // TLSHandshakeT0 is when we started handshaking. + TLSHandshakeT0 optional.Value[float64] + + // TLSHandshakeT is when the TLS handshake finished. + TLSHandshakeT optional.Value[float64] + + // TLSHandshakeFailure is the error that occurred. + TLSHandshakeFailure optional.Value[*string] + + // TLSServerName is the SNI value. + TLSServerName optional.Value[string] + + // TLSVersion is the negotiated TLS version. + TLSVersion optional.Value[string] + + // TLSCipherSuite is the negotiated TLS cipher suite. + TLSCipherSuite optional.Value[string] + + // TLSNegotiatedProtocol is the negotiated TLS protocol. + TLSNegotiatedProtocol optional.Value[string] + + // THEndpointXref is a reference to the corresponding TH endpoint. + THEndpointXref optional.Value[*EndpointObservationTH] + + // HTTPRequestURL is the HTTP request URL. + HTTPRequestURL optional.Value[string] + + // HTTPFailure is the error that occurred. + HTTPFailure optional.Value[*string] + + // HTTPResponseStatusCode is the response status code. + HTTPResponseStatusCode optional.Value[int64] + + // HTTPResponseBodyLength is the length of the response body. + HTTPResponseBodyLength optional.Value[int64] + + // HTTPResponseBodyIsTruncated indicates whether the response body is truncated. + HTTPResponseBodyIsTruncated optional.Value[bool] + + // HTTPResponseHeadersKeys contains the response headers keys. + HTTPResponseHeadersKeys map[string]HeaderOrigin + + // HTTPResponseTitle contains the response title. + HTTPResponseTitle optional.Value[string] +} + +func (db *DB) addNetworkEventsTCPConnect(evs ...*model.ArchivalNetworkEvent) error { + for _, ev := range evs { + switch { + case ev.Operation == netxlite.ConnectOperation && ev.Proto == "tcp": + wobs, err := db.newWebEndpointObservation(ev.TransactionID) + if err != nil { + return err + } + addr, port, err := net.SplitHostPort(ev.Address) + if err != nil { + return err + } + wobs.Proto = "tcp" + wobs.IPAddress = addr + wobs.Port = port + wobs.Endpoint = fmt.Sprintf("%s/%s", ev.Address, ev.Proto) + if asn, _, err := geoipx.LookupASN(addr); err == nil { + wobs.IPAddressASN = optional.Some(int64(asn)) + } + wobs.IPAddressIsBogon = netxlite.IsBogon(addr) + wobs.TCPConnectT0 = optional.Some(ev.T0) + wobs.TCPConnectT = optional.Some(ev.T) + wobs.TCPConnectFailure = optional.Some(ev.Failure) + + default: + // nothing + } + } + return nil +} + +func (db *DB) addTLSHandshakeEvents(evs ...*model.ArchivalTLSOrQUICHandshakeResult) error { + for _, ev := range evs { + wobs, err := db.getWebEndpointObservation(ev.TransactionID) + if err != nil { + return err + } + wobs.TLSHandshakeT0 = optional.Some(ev.T0) + wobs.TLSHandshakeT = optional.Some(ev.T) + wobs.TLSHandshakeFailure = optional.Some(ev.Failure) + wobs.TLSServerName = optional.Some(ev.ServerName) + wobs.TLSVersion = optional.Some(ev.TLSVersion) + wobs.TLSCipherSuite = optional.Some(ev.CipherSuite) + wobs.TLSNegotiatedProtocol = optional.Some(ev.NegotiatedProtocol) + } + return nil +} + +func (db *DB) addQUICHandshakeEvents(evs ...*model.ArchivalTLSOrQUICHandshakeResult) error { + for _, ev := range evs { + wobs, err := db.newWebEndpointObservation(ev.TransactionID) + if err != nil { + return err + } + addr, port, err := net.SplitHostPort(ev.Address) + if err != nil { + return err + } + wobs.Proto = ev.Network + wobs.IPAddress = addr + wobs.Port = port + wobs.Endpoint = fmt.Sprintf("%s/%s", ev.Address, ev.Network) + if asn, _, err := geoipx.LookupASN(addr); err == nil { + wobs.IPAddressASN = optional.Some(int64(asn)) + } + wobs.IPAddressIsBogon = netxlite.IsBogon(addr) + wobs.QUICHandshakeT0 = optional.Some(ev.T0) + wobs.QUICHandshakeT = optional.Some(ev.T) + wobs.QUICHandshakeFailure = optional.Some(ev.Failure) + wobs.TLSServerName = optional.Some(ev.ServerName) + wobs.TLSVersion = optional.Some(ev.TLSVersion) + wobs.TLSCipherSuite = optional.Some(ev.CipherSuite) + wobs.TLSNegotiatedProtocol = optional.Some(ev.NegotiatedProtocol) + } + return nil +} + +func (db *DB) addHTTPRoundTrips(evs ...*model.ArchivalHTTPRequestResult) error { + for _, ev := range evs { + wobs, err := db.getWebEndpointObservation(ev.TransactionID) + if err != nil { + return err + } + wobs.HTTPRequestURL = optional.Some(ev.Request.URL) + wobs.HTTPFailure = optional.Some(ev.Failure) + wobs.HTTPResponseStatusCode = optional.Some(ev.Response.Code) + wobs.HTTPResponseBodyLength = optional.Some(int64(len(ev.Response.Body))) + wobs.HTTPResponseBodyIsTruncated = optional.Some(ev.Response.BodyIsTruncated) + wobs.HTTPResponseHeadersKeys = make(map[string]HeaderOrigin) + for key := range ev.Response.Headers { + wobs.HTTPResponseHeadersKeys[key] = HeaderOriginProbe + } + if title := measurexlite.WebGetTitle(string(ev.Response.Body)); title != "" { + wobs.HTTPResponseTitle = optional.Some(title) + } + } + return nil +} + +var errNoSuchTransaction = errors.New("analysis: no such transaction") + +func (db *DB) getWebEndpointObservation(txid int64) (*WebEndpointObservation, error) { + wobs, good := db.webByTxID[txid] + if !good { + return nil, errNoSuchTransaction + } + return wobs, nil +} + +var errTransactionAlreadyExists = errors.New("analysis: transaction already exists") + +func (db *DB) newWebEndpointObservation(txid int64) (*WebEndpointObservation, error) { + if _, good := db.webByTxID[txid]; good { + return nil, errTransactionAlreadyExists + } + wobs := &WebEndpointObservation{ + TransactionID: txid, + } + db.webByTxID[txid] = wobs + return wobs, nil +} From 6aff4f0820f12572db874c0c89fbe7217a0aee08 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Fri, 24 Nov 2023 01:20:21 +0100 Subject: [PATCH 13/66] convert more of v0.5's analysis to the ooni/data-like style --- internal/pipeline/analysiscore.go | 79 +++++++++ internal/pipeline/analysisdns.go | 221 ++++++++++++++++++++++++++ internal/pipeline/analysishttpcore.go | 57 +++++++ internal/pipeline/analysishttpdiff.go | 1 + internal/pipeline/analysistcpip.go | 50 ++++++ internal/pipeline/analysistls.go | 38 +++++ internal/pipeline/db.go | 4 +- internal/pipeline/dns.go | 13 ++ internal/pipeline/headers.go | 12 -- internal/pipeline/origin.go | 12 ++ internal/pipeline/th.go | 8 +- internal/pipeline/web.go | 6 +- 12 files changed, 480 insertions(+), 21 deletions(-) create mode 100644 internal/pipeline/analysiscore.go create mode 100644 internal/pipeline/analysisdns.go create mode 100644 internal/pipeline/analysishttpcore.go create mode 100644 internal/pipeline/analysishttpdiff.go create mode 100644 internal/pipeline/analysistcpip.go create mode 100644 internal/pipeline/analysistls.go delete mode 100644 internal/pipeline/headers.go create mode 100644 internal/pipeline/origin.go diff --git a/internal/pipeline/analysiscore.go b/internal/pipeline/analysiscore.go new file mode 100644 index 000000000..642997247 --- /dev/null +++ b/internal/pipeline/analysiscore.go @@ -0,0 +1,79 @@ +package pipeline + +import ( + "github.com/ooni/probe-cli/v3/internal/optional" +) + +// TODO(bassosimone): we are not extracting the data required to produce +// duplicate-response based failure, which is also not implemented inside +// of the v0.5 codebase, hence we're not regressing here. + +// Analysis aggregates the results of several analysis algorithms. +// +// Some values are optional. When a value IsNone, it means we could not run the +// corresponding analysis algorithm, so we don't basically know. +// +// All the methods in this struct ARE NOT goroutine safe. +// +// The zero value of this struct is ready to use. +type Analysis struct { + // DNSUnexpectedAddr lists all the DNS transaction IDs with unexpected addrs (i.e., IP + // addrs that have not have been also resolved by the TH). + DNSUnexpectedAddr []int64 + + // DNSUnexpectedAddrASN lists all the DNS transaction IDS with unexpected addrs ASNs. + DNSUnexpectedAddrASN []int64 + + // DNSUnexpectedBogon lists all the DNS transaction IDs for which we saw unexpected bogons. + DNSUnexpectedBogon []int64 + + // DNSUnexpectedFailure lists all the DNS transaction IDs containing unexpected DNS lookup failures. + DNSUnexpectedFailure []int64 + + // DNSWithTLSHandshakeFailureAddr lists all the DNS transaction IDs containing IP addresses + // for which the TH could perform a successful TLS handshake where the probe failed. + DNSWithTLSHandshakeFailureAddr []int64 + + // DNSExperimentFailure is a backward-compatibility value that contains the + // failure obtained when using getaddrinfo for the URL's domain + DNSExperimentFailure optional.Value[*string] + + // HTTPExperimentFailure is a backward-compatibility value that contains the + // failure obtained for the final HTTP request made by the probe + HTTPExperimentFailure optional.Value[*string] + + // HTTPUnexpectedFailure contains all the endpoint transaction IDs where + // the TH succeded while the probe failed to fetch a response + HTTPUnexpectedFailure []int64 + + // TCPUnexpectedFailure contains all the endpoint transaction IDs where the TH succeeded + // while the probe failed to connect (excluding obvious IPv6 issues). + TCPUnexpectedFailure []int64 + + // TLSUnexpectedFailure is like TCPUnexpectedFailure but for TLS. + TLSUnexpectedFailure []int64 +} + +// ComputeAll computes all the analysis flags using the DB. +func (ax *Analysis) ComputeAll(db *DB) { + // DNS + ax.ComputeDNSExperimentFailure(db) + ax.ComputeDNSBogon(db) + ax.ComputeDNSUnexpectedFailure(db) + ax.ComputeDNSUnexpectedAddr(db) + ax.ComputeDNSUnexpectedAddrASN(db) + ax.ComputeDNSWithTLSHandshakeFailureAddr(db) + + // TCP/IP + ax.ComputeTCPUnexpectedFailure(db) + + // TLS + ax.ComputeTLSUnexpectedFailure(db) + + // HTTP (core) + ax.ComputeHTTPUnexpectedFailure(db) + ax.ComputeHTTPExperimentFailure(db) + + // HTTP (diff) + +} diff --git a/internal/pipeline/analysisdns.go b/internal/pipeline/analysisdns.go new file mode 100644 index 000000000..da5074727 --- /dev/null +++ b/internal/pipeline/analysisdns.go @@ -0,0 +1,221 @@ +package pipeline + +import ( + "github.com/ooni/probe-cli/v3/internal/geoipx" + "github.com/ooni/probe-cli/v3/internal/netxlite" + "github.com/ooni/probe-cli/v3/internal/optional" +) + +// ComputeDNSExperimentFailure computes DNSExperimentFailure. +func (ax *Analysis) ComputeDNSExperimentFailure(db *DB) { + for _, entry := range db.dnsByTxID { + // skip queries not for the original hostname + if db.urlHostname != entry.QueryHostname { + continue + } + + // skip queries not using getaddrinfo + if dnsNormalizeEngineName(entry.Engine) != "getaddrinfo" { + continue + } + + // skip successful cases + if entry.Failure == nil { + continue + } + + // assign the first failure and return + ax.DNSExperimentFailure = optional.Some(entry.Failure) + return + } +} + +// ComputeDNSUnexpectedBogon computes DNSUnexpectedBogon. +func (ax *Analysis) ComputeDNSBogon(db *DB) { + for _, entry := range db.webByTxID { + // skip all the entries without a bogon + if !entry.IPAddressIsBogon { + continue + } + + // skip cases where the TH also resolved the same bogon (e.g., as of 2023-11-23, the + // polito.it domain legitimately resolves to 192.168.59.6 and 192.168.40.1) + if entry.DNSLookupTHXref { + continue + } + + // register the transaction containing the bogon. + ax.DNSUnexpectedBogon = append(ax.DNSUnexpectedBogon, entry.TransactionID) + } +} + +// ComputeDNSUnexpectedFailure computes DNSUnexpectedFailure. +func (ax *Analysis) ComputeDNSUnexpectedFailure(db *DB) { + // we cannot run this algorithm if the control failed or returned no IP addresses. + if db.thDNSFailure != nil { + return + } + + // we cannot run this algorithm if the control returned no IP addresses. + if len(db.thDNSAddrs) <= 0 { + return + } + + // inspect DNS lookup results + for _, entry := range db.dnsByTxID { + // skip cases without failures + if entry.Failure == nil { + continue + } + + // skip cases that query the wrong domain name + if entry.QueryHostname != db.urlHostname { + continue + } + + // A DoH failure is not information about the DNS blocking of the URL hostname + // we're measuring but rather about the DoH service being blocked. + // + // See https://github.com/ooni/probe/issues/2274 + if entry.Engine == "doh" { + continue + } + + // skip cases where there's no IPv6 addresses for a domain + if entry.QueryType == "AAAA" && *entry.Failure == netxlite.FailureDNSNoAnswer { + continue + } + + // register the transaction as containing an unexpected DNS failure + ax.DNSUnexpectedFailure = append(ax.DNSUnexpectedFailure, entry.TransactionID) + } +} + +func (ax *Analysis) dnsDiffHelper(db *DB, fx func(db *DB, entry *DNSObservation)) { + // we cannot run this algorithm if the control failed or returned no IP addresses. + if db.thDNSFailure != nil { + return + } + + // we cannot run this algorithm if the control returned no IP addresses. + if len(db.thDNSAddrs) <= 0 { + return + } + + // inspect DNS lookup results + for _, entry := range db.dnsByTxID { + // skip cases witht failures + if entry.Failure != nil { + continue + } + + // skip cases that query the wrong domain name + if entry.QueryHostname != db.urlHostname { + continue + } + + // Note: we include DoH-resolved addresses in this comparison + // because they should be ~as good as the TH addresses. + + // invoke user defined function + fx(db, entry) + } +} + +// ComputeDNSUnexpectedAddr computes DNSUnexpectedAddr. +func (ax *Analysis) ComputeDNSUnexpectedAddr(db *DB) { + ax.dnsDiffHelper(db, func(db *DB, entry *DNSObservation) { + state := make(map[string]Origin) + + for _, addr := range entry.IPAddrs { + state[addr] |= OriginProbe + } + + for addr := range db.thDNSAddrs { + state[addr] |= OriginTH + } + + for _, flags := range state { + if (flags & OriginTH) == 0 { + ax.DNSUnexpectedAddr = append(ax.DNSUnexpectedAddr, entry.TransactionID) + return + } + } + }) +} + +// ComputeDNSUnexpectedAddrASN computes DNSUnexpectedAddrASN. +func (ax *Analysis) ComputeDNSUnexpectedAddrASN(db *DB) { + ax.dnsDiffHelper(db, func(db *DB, entry *DNSObservation) { + state := make(map[int64]Origin) + + for _, addr := range entry.IPAddrs { + if asn, _, err := geoipx.LookupASN(addr); err == nil { + state[int64(asn)] |= OriginProbe + } + } + + for addr := range db.thDNSAddrs { + if asn, _, err := geoipx.LookupASN(addr); err == nil { + state[int64(asn)] |= OriginTH + } + } + + for _, flags := range state { + if (flags & OriginTH) == 0 { + ax.DNSUnexpectedAddrASN = append(ax.DNSUnexpectedAddrASN, entry.TransactionID) + return + } + } + }) +} + +// ComputeDNSWithTLSHandshakeFailureAddr computes DNSWithTLSHandshakeFailureAddr. +func (ax *Analysis) ComputeDNSWithTLSHandshakeFailureAddr(db *DB) { + ax.dnsDiffHelper(db, func(db *DB, dns *DNSObservation) { + // walk through each resolved address in this DNS lookup + for _, addr := range dns.IPAddrs { + + // find the corresponding endpoint measurement + for _, epnt := range db.webByTxID { + + // skip entries related to a different address + if epnt.IPAddress != addr { + continue + } + + // skip entries where we did not attempt a TLS handshake + if epnt.TLSHandshakeFailure.IsNone() { + continue + } + + // skip entries where the handshake succeded + if epnt.TLSHandshakeFailure.Unwrap() == nil { + continue + } + + // find the related TH measurement + thEpnt, good := db.thEpntByEpnt[epnt.Endpoint] + + // skip cases where there's no TH entry + if !good { + continue + } + + // skip cases where the TH did not perform an handshake (a bug?) + if thEpnt.TLSHandshakeFailure.IsNone() { + continue + } + + // skip cases where the TH's handshake also failed + if thEpnt.TLSHandshakeFailure.Unwrap() != nil { + continue + } + + // mark the DNS transaction as bad and stop + ax.DNSWithTLSHandshakeFailureAddr = append(ax.DNSWithTLSHandshakeFailureAddr, dns.TransactionID) + return + } + } + }) +} diff --git a/internal/pipeline/analysishttpcore.go b/internal/pipeline/analysishttpcore.go new file mode 100644 index 000000000..24fc6dd22 --- /dev/null +++ b/internal/pipeline/analysishttpcore.go @@ -0,0 +1,57 @@ +package pipeline + +import "github.com/ooni/probe-cli/v3/internal/optional" + +func (ax *Analysis) httpExperimentFailureHelper(db *DB, fx func(txId int64, probeFailure *string)) { + // skip if there's no final request + if db.webFinalRequest.IsNone() { + return + } + probeFR := db.webFinalRequest.Unwrap() + + // skip if the HTTP failure is not defined (bug?) + if probeFR.HTTPFailure.IsNone() { + return + } + + // skip if the final request succeded + // TODO(bassosimone): say that the probe succeeds and the TH fails, then what? + probeFailure := probeFR.HTTPFailure.Unwrap() + if probeFailure == nil { + return + } + + // skip if the final request is not defined for the TH + if db.thWeb.IsNone() { + return + } + thFR := db.thWeb.Unwrap() + + // skip if the failure is not defined for the TH + if thFR.HTTPFailure.IsNone() { + return + } + + // skip if also the TH's HTTP request failed + thFailure := thFR.HTTPFailure.Unwrap() + if thFailure != nil { + return + } + + // invoke user defined func + fx(probeFR.TransactionID, probeFailure) +} + +// ComputeHTTPUnexpectedFailure computes HTTPUnexpectedFailure. +func (ax *Analysis) ComputeHTTPUnexpectedFailure(db *DB) { + ax.httpExperimentFailureHelper(db, func(txId int64, probeFailure *string) { + ax.HTTPUnexpectedFailure = append(ax.HTTPUnexpectedFailure, txId) + }) +} + +// ComputeHTTPExperimentFailure computes HTTPExperimentFailure. +func (ax *Analysis) ComputeHTTPExperimentFailure(db *DB) { + ax.httpExperimentFailureHelper(db, func(txId int64, probeFailure *string) { + ax.HTTPExperimentFailure = optional.Some(probeFailure) + }) +} diff --git a/internal/pipeline/analysishttpdiff.go b/internal/pipeline/analysishttpdiff.go new file mode 100644 index 000000000..fb2071c7f --- /dev/null +++ b/internal/pipeline/analysishttpdiff.go @@ -0,0 +1 @@ +package pipeline diff --git a/internal/pipeline/analysistcpip.go b/internal/pipeline/analysistcpip.go new file mode 100644 index 000000000..3ec8c51bc --- /dev/null +++ b/internal/pipeline/analysistcpip.go @@ -0,0 +1,50 @@ +package pipeline + +import "github.com/ooni/probe-cli/v3/internal/netxlite" + +// ComputeTCPUnexpectedFailure computes TCPUnexpectedFailure. +func (ax *Analysis) ComputeTCPUnexpectedFailure(db *DB) { + for _, entry := range db.webByTxID { + // skip all the entries where we did not set a TCP failure + if entry.TCPConnectFailure.IsNone() { + continue + } + + // skip all the entries where connect succeded + // TODO(bassosimone): say that the probe succeeds and the TH fails, then what? + if entry.TCPConnectFailure.Unwrap() == nil { + continue + } + + // get the corresponding TH measurement + th, good := db.thEpntByEpnt[entry.Endpoint] + + // skip if there's no TH data + if !good { + continue + } + + // skip if we don't have a failure defined for TH (bug?) + if th.TCPConnectFailure.IsNone() { + continue + } + + // skip if also the TH failed to connect + if th.TCPConnectFailure.Unwrap() != nil { + continue + } + + // ignore failures that are most likely caused by a broken IPv6 network stack + if ipv6, err := netxlite.IsIPv6(entry.IPAddress); err == nil && ipv6 { + failure := th.TCPConnectFailure.Unwrap() + likelyFalsePositive := (*failure == netxlite.FailureNetworkUnreachable || + *failure == netxlite.FailureHostUnreachable) + if likelyFalsePositive { + continue + } + } + + // mark this entry as problematic + ax.TCPUnexpectedFailure = append(ax.TCPUnexpectedFailure, entry.TransactionID) + } +} diff --git a/internal/pipeline/analysistls.go b/internal/pipeline/analysistls.go new file mode 100644 index 000000000..2c5cb2d87 --- /dev/null +++ b/internal/pipeline/analysistls.go @@ -0,0 +1,38 @@ +package pipeline + +// ComputeTLSUnexpectedFailure computes TLSUnexpectedFailure. +func (ax *Analysis) ComputeTLSUnexpectedFailure(db *DB) { + for _, entry := range db.webByTxID { + // skip all the entries where we did not set a TLS failure + if entry.TLSHandshakeFailure.IsNone() { + continue + } + + // skip all the entries where connect succeded + // TODO(bassosimone): say that the probe succeeds and the TH fails, then what? + if entry.TLSHandshakeFailure.Unwrap() == nil { + continue + } + + // get the corresponding TH measurement + th, good := db.thEpntByEpnt[entry.Endpoint] + + // skip if there's no TH data + if !good { + continue + } + + // skip if we don't have a failure defined for TH (bug?) + if th.TLSHandshakeFailure.IsNone() { + continue + } + + // skip if also the TH failed to handshake + if th.TLSHandshakeFailure.Unwrap() != nil { + continue + } + + // mark this entry as problematic + ax.TLSUnexpectedFailure = append(ax.TLSUnexpectedFailure, entry.TransactionID) + } +} diff --git a/internal/pipeline/db.go b/internal/pipeline/db.go index b13a7ef67..c5cd6ec99 100644 --- a/internal/pipeline/db.go +++ b/internal/pipeline/db.go @@ -113,8 +113,8 @@ func (db *DB) buildXrefsDNS() { addrToUDP := make(map[string][]*DNSObservation) addrToHTTPS := make(map[string][]*DNSObservation) for _, dobs := range db.dnsByTxID { - switch dobs.Engine { - case "system", "getaddrinfo", "golang_net_resolver", "go": + switch dnsNormalizeEngineName(dobs.Engine) { + case "getaddrinfo": for _, addr := range dobs.IPAddrs { addrToGetaddrinfo[addr] = append(addrToGetaddrinfo[addr], dobs) } diff --git a/internal/pipeline/dns.go b/internal/pipeline/dns.go index 55638ee0b..dc8ea7b38 100644 --- a/internal/pipeline/dns.go +++ b/internal/pipeline/dns.go @@ -18,6 +18,9 @@ type DNSObservation struct { // QueryType is the DNS query type (e.g., "A"). QueryType string + // QueryHostname is the hostname inside the query. + QueryHostname string + // Failure is the failure that occurred. Failure *string @@ -44,6 +47,7 @@ func (db *DB) addDNSLookups(evs ...*model.ArchivalDNSLookupResult) error { return err } dobs.QueryType = ev.QueryType + dobs.QueryHostname = ev.Hostname dobs.Failure = ev.Failure dobs.Engine = ev.Engine dobs.ResolverAddress = ev.ResolverAddress @@ -76,3 +80,12 @@ func (db *DB) newDNSObservation(txid int64) (*DNSObservation, error) { db.dnsByTxID[txid] = dobs return dobs, nil } + +func dnsNormalizeEngineName(engine string) string { + switch engine { + case "system", "getaddrinfo", "golang_net_resolver", "go": + return "getaddrinfo" + default: + return engine + } +} diff --git a/internal/pipeline/headers.go b/internal/pipeline/headers.go deleted file mode 100644 index 1a838efdc..000000000 --- a/internal/pipeline/headers.go +++ /dev/null @@ -1,12 +0,0 @@ -package pipeline - -// HeaderOrigin indicates the header origin -type HeaderOrigin int64 - -const ( - // HeaderOriginProbe indicates that the header was seen by the probe - HeaderOriginProbe = HeaderOrigin(1 << iota) - - // HeaderOriginTH indicates that the header was seen by the TH - HeaderOriginTH -) diff --git a/internal/pipeline/origin.go b/internal/pipeline/origin.go new file mode 100644 index 000000000..7c2cc7418 --- /dev/null +++ b/internal/pipeline/origin.go @@ -0,0 +1,12 @@ +package pipeline + +// Origin indicates the header origin +type Origin int64 + +const ( + // OriginProbe indicates that the header was seen by the probe + OriginProbe = Origin(1 << iota) + + // OriginTH indicates that the header was seen by the TH + OriginTH +) diff --git a/internal/pipeline/th.go b/internal/pipeline/th.go index 099d84727..57f9965d0 100644 --- a/internal/pipeline/th.go +++ b/internal/pipeline/th.go @@ -68,7 +68,7 @@ type WebObservationTH struct { HTTPResponseBodyLength optional.Value[int64] // HTTPResponseHeadersKeys contains the response headers keys. - HTTPResponseHeadersKeys map[string]HeaderOrigin + HTTPResponseHeadersKeys map[string]Origin // HTTPResponseTitle contains the response title. HTTPResponseTitle optional.Value[string] @@ -138,10 +138,10 @@ func (db *DB) thAddHTTPResponse(resp *model.THResponse) error { HTTPFailure: optional.Some(resp.HTTPRequest.Failure), HTTPResponseStatusCode: optional.Some(resp.HTTPRequest.StatusCode), HTTPResponseBodyLength: optional.Some(resp.HTTPRequest.BodyLength), - HTTPResponseHeadersKeys: func() (out map[string]HeaderOrigin) { - out = make(map[string]HeaderOrigin) + HTTPResponseHeadersKeys: func() (out map[string]Origin) { + out = make(map[string]Origin) for key := range resp.HTTPRequest.Headers { - out[key] = HeaderOriginTH + out[key] = OriginTH } return }(), diff --git a/internal/pipeline/web.go b/internal/pipeline/web.go index 22cda3c4b..d6b4f44f7 100644 --- a/internal/pipeline/web.go +++ b/internal/pipeline/web.go @@ -117,7 +117,7 @@ type WebEndpointObservation struct { HTTPResponseBodyIsTruncated optional.Value[bool] // HTTPResponseHeadersKeys contains the response headers keys. - HTTPResponseHeadersKeys map[string]HeaderOrigin + HTTPResponseHeadersKeys map[string]Origin // HTTPResponseTitle contains the response title. HTTPResponseTitle optional.Value[string] @@ -211,9 +211,9 @@ func (db *DB) addHTTPRoundTrips(evs ...*model.ArchivalHTTPRequestResult) error { wobs.HTTPResponseStatusCode = optional.Some(ev.Response.Code) wobs.HTTPResponseBodyLength = optional.Some(int64(len(ev.Response.Body))) wobs.HTTPResponseBodyIsTruncated = optional.Some(ev.Response.BodyIsTruncated) - wobs.HTTPResponseHeadersKeys = make(map[string]HeaderOrigin) + wobs.HTTPResponseHeadersKeys = make(map[string]Origin) for key := range ev.Response.Headers { - wobs.HTTPResponseHeadersKeys[key] = HeaderOriginProbe + wobs.HTTPResponseHeadersKeys[key] = OriginProbe } if title := measurexlite.WebGetTitle(string(ev.Response.Body)); title != "" { wobs.HTTPResponseTitle = optional.Some(title) From 94f9fd7c6674f340b1a24e65e71a3593f7b81868 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Fri, 24 Nov 2023 02:36:01 +0100 Subject: [PATCH 14/66] some more progress --- internal/cmd/pipeline/main.go | 25 ++ .../webconnectivitylte/cleartextflow.go | 1 + .../webconnectivitylte/secureflow.go | 1 + internal/pipeline/analysiscore.go | 26 +- internal/pipeline/analysisdns.go | 42 +-- internal/pipeline/analysishttpcore.go | 18 +- internal/pipeline/analysishttpdiff.go | 271 ++++++++++++++++++ internal/pipeline/analysistcpip.go | 18 +- internal/pipeline/analysistls.go | 8 +- internal/pipeline/db.go | 48 ++-- internal/pipeline/dns.go | 8 +- internal/pipeline/failure.go | 12 + internal/pipeline/qa_test.go | 22 +- internal/pipeline/testdata/youtube_ax.json | 1 + internal/pipeline/testdata/youtube_db.json | 2 +- internal/pipeline/th.go | 26 +- internal/pipeline/web.go | 27 +- 17 files changed, 437 insertions(+), 119 deletions(-) create mode 100644 internal/cmd/pipeline/main.go create mode 100644 internal/pipeline/failure.go create mode 100644 internal/pipeline/testdata/youtube_ax.json diff --git a/internal/cmd/pipeline/main.go b/internal/cmd/pipeline/main.go new file mode 100644 index 000000000..a1495649e --- /dev/null +++ b/internal/cmd/pipeline/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "os" + + "github.com/ooni/probe-cli/v3/internal/must" + "github.com/ooni/probe-cli/v3/internal/pipeline" + "github.com/ooni/probe-cli/v3/internal/runtimex" +) + +func main() { + rawMeasurement := must.ReadFile(os.Args[1]) + var canonicalMeasurement pipeline.CanonicalMeasurement + must.UnmarshalJSON(rawMeasurement, &canonicalMeasurement) + + db := pipeline.NewDB() + runtimex.Try0(db.Ingest(&canonicalMeasurement)) + + must.WriteFile("db.json", must.MarshalJSON(db), 0600) + + ax := &pipeline.Analysis{} + ax.ComputeAllValues(db) + + must.WriteFile("ax.json", must.MarshalJSON(ax), 0600) +} diff --git a/internal/experiment/webconnectivitylte/cleartextflow.go b/internal/experiment/webconnectivitylte/cleartextflow.go index 55b4ef1f4..4af51d5c8 100644 --- a/internal/experiment/webconnectivitylte/cleartextflow.go +++ b/internal/experiment/webconnectivitylte/cleartextflow.go @@ -132,6 +132,7 @@ func (t *CleartextFlow) Run(parentCtx context.Context, index int64) error { tcpDialer := trace.NewDialerWithoutResolver(t.Logger) tcpConn, err := tcpDialer.DialContext(tcpCtx, "tcp", t.Address) t.TestKeys.AppendTCPConnectResults(trace.TCPConnects()...) + t.TestKeys.AppendNetworkEvents(trace.NetworkEvents()...) if err != nil { // TODO(bassosimone): document why we're adding a request to the heap here t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index 0540ce077..fcedfde51 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -177,6 +177,7 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { tcpDialer := trace.NewDialerWithoutResolver(t.Logger) tcpConn, err := tcpDialer.DialContext(tcpCtx, "tcp", t.Address) t.TestKeys.AppendTCPConnectResults(trace.TCPConnects()...) + t.TestKeys.AppendNetworkEvents(trace.NetworkEvents()...) if err != nil { // TODO(bassosimone): document why we're adding a request to the heap here if t.PrioSelector != nil { diff --git a/internal/pipeline/analysiscore.go b/internal/pipeline/analysiscore.go index 642997247..9126a366c 100644 --- a/internal/pipeline/analysiscore.go +++ b/internal/pipeline/analysiscore.go @@ -36,11 +36,24 @@ type Analysis struct { // DNSExperimentFailure is a backward-compatibility value that contains the // failure obtained when using getaddrinfo for the URL's domain - DNSExperimentFailure optional.Value[*string] + DNSExperimentFailure optional.Value[Failure] + + // HTTPDiffBodyProportionFactor is the ratio of the two final bodies. + HTTPDiffBodyProportionFactor optional.Value[float64] + + // HTTPDiffTitleMatch indicates whether the titles have common words in them. + HTTPDiffTitleMatch optional.Value[bool] + + // HTTPDiffStatusCodeMatch indicates whether the status code matches taking into + // account some false positives that may arise. + HTTPDiffStatusCodeMatch optional.Value[bool] + + // HTTPDiffUncommonHeadersMatch indicates whether uncommon headers match. + HTTPDiffUncommonHeadersMatch optional.Value[bool] // HTTPExperimentFailure is a backward-compatibility value that contains the // failure obtained for the final HTTP request made by the probe - HTTPExperimentFailure optional.Value[*string] + HTTPExperimentFailure optional.Value[Failure] // HTTPUnexpectedFailure contains all the endpoint transaction IDs where // the TH succeded while the probe failed to fetch a response @@ -54,8 +67,8 @@ type Analysis struct { TLSUnexpectedFailure []int64 } -// ComputeAll computes all the analysis flags using the DB. -func (ax *Analysis) ComputeAll(db *DB) { +// ComputeAllValues computes all the analysis values using the DB. +func (ax *Analysis) ComputeAllValues(db *DB) { // DNS ax.ComputeDNSExperimentFailure(db) ax.ComputeDNSBogon(db) @@ -75,5 +88,8 @@ func (ax *Analysis) ComputeAll(db *DB) { ax.ComputeHTTPExperimentFailure(db) // HTTP (diff) - + ax.ComputeHTTPDiffBodyProportionFactor(db) + ax.ComputeHTTPDiffStatusCodeMatch(db) + ax.ComputeHTTPDiffUncommonHeadersMatch(db) + ax.ComputeHTTPDiffTitleMatch(db) } diff --git a/internal/pipeline/analysisdns.go b/internal/pipeline/analysisdns.go index da5074727..8c06dc001 100644 --- a/internal/pipeline/analysisdns.go +++ b/internal/pipeline/analysisdns.go @@ -8,9 +8,9 @@ import ( // ComputeDNSExperimentFailure computes DNSExperimentFailure. func (ax *Analysis) ComputeDNSExperimentFailure(db *DB) { - for _, entry := range db.dnsByTxID { + for _, entry := range db.DNSByTxID { // skip queries not for the original hostname - if db.urlHostname != entry.QueryHostname { + if db.URLHostname != entry.QueryHostname { continue } @@ -20,7 +20,7 @@ func (ax *Analysis) ComputeDNSExperimentFailure(db *DB) { } // skip successful cases - if entry.Failure == nil { + if entry.Failure == "" { continue } @@ -32,7 +32,7 @@ func (ax *Analysis) ComputeDNSExperimentFailure(db *DB) { // ComputeDNSUnexpectedBogon computes DNSUnexpectedBogon. func (ax *Analysis) ComputeDNSBogon(db *DB) { - for _, entry := range db.webByTxID { + for _, entry := range db.WebByTxID { // skip all the entries without a bogon if !entry.IPAddressIsBogon { continue @@ -52,24 +52,24 @@ func (ax *Analysis) ComputeDNSBogon(db *DB) { // ComputeDNSUnexpectedFailure computes DNSUnexpectedFailure. func (ax *Analysis) ComputeDNSUnexpectedFailure(db *DB) { // we cannot run this algorithm if the control failed or returned no IP addresses. - if db.thDNSFailure != nil { + if db.THDNSFailure != "" { return } // we cannot run this algorithm if the control returned no IP addresses. - if len(db.thDNSAddrs) <= 0 { + if len(db.THDNSAddrs) <= 0 { return } // inspect DNS lookup results - for _, entry := range db.dnsByTxID { + for _, entry := range db.DNSByTxID { // skip cases without failures - if entry.Failure == nil { + if entry.Failure == "" { continue } // skip cases that query the wrong domain name - if entry.QueryHostname != db.urlHostname { + if entry.QueryHostname != db.URLHostname { continue } @@ -82,7 +82,7 @@ func (ax *Analysis) ComputeDNSUnexpectedFailure(db *DB) { } // skip cases where there's no IPv6 addresses for a domain - if entry.QueryType == "AAAA" && *entry.Failure == netxlite.FailureDNSNoAnswer { + if entry.QueryType == "AAAA" && entry.Failure == netxlite.FailureDNSNoAnswer { continue } @@ -93,24 +93,24 @@ func (ax *Analysis) ComputeDNSUnexpectedFailure(db *DB) { func (ax *Analysis) dnsDiffHelper(db *DB, fx func(db *DB, entry *DNSObservation)) { // we cannot run this algorithm if the control failed or returned no IP addresses. - if db.thDNSFailure != nil { + if db.THDNSFailure != "" { return } // we cannot run this algorithm if the control returned no IP addresses. - if len(db.thDNSAddrs) <= 0 { + if len(db.THDNSAddrs) <= 0 { return } // inspect DNS lookup results - for _, entry := range db.dnsByTxID { + for _, entry := range db.DNSByTxID { // skip cases witht failures - if entry.Failure != nil { + if entry.Failure != "" { continue } // skip cases that query the wrong domain name - if entry.QueryHostname != db.urlHostname { + if entry.QueryHostname != db.URLHostname { continue } @@ -131,7 +131,7 @@ func (ax *Analysis) ComputeDNSUnexpectedAddr(db *DB) { state[addr] |= OriginProbe } - for addr := range db.thDNSAddrs { + for addr := range db.THDNSAddrs { state[addr] |= OriginTH } @@ -155,7 +155,7 @@ func (ax *Analysis) ComputeDNSUnexpectedAddrASN(db *DB) { } } - for addr := range db.thDNSAddrs { + for addr := range db.THDNSAddrs { if asn, _, err := geoipx.LookupASN(addr); err == nil { state[int64(asn)] |= OriginTH } @@ -177,7 +177,7 @@ func (ax *Analysis) ComputeDNSWithTLSHandshakeFailureAddr(db *DB) { for _, addr := range dns.IPAddrs { // find the corresponding endpoint measurement - for _, epnt := range db.webByTxID { + for _, epnt := range db.WebByTxID { // skip entries related to a different address if epnt.IPAddress != addr { @@ -190,12 +190,12 @@ func (ax *Analysis) ComputeDNSWithTLSHandshakeFailureAddr(db *DB) { } // skip entries where the handshake succeded - if epnt.TLSHandshakeFailure.Unwrap() == nil { + if epnt.TLSHandshakeFailure.Unwrap() == "" { continue } // find the related TH measurement - thEpnt, good := db.thEpntByEpnt[epnt.Endpoint] + thEpnt, good := db.THEpntByEpnt[epnt.Endpoint] // skip cases where there's no TH entry if !good { @@ -208,7 +208,7 @@ func (ax *Analysis) ComputeDNSWithTLSHandshakeFailureAddr(db *DB) { } // skip cases where the TH's handshake also failed - if thEpnt.TLSHandshakeFailure.Unwrap() != nil { + if thEpnt.TLSHandshakeFailure.Unwrap() != "" { continue } diff --git a/internal/pipeline/analysishttpcore.go b/internal/pipeline/analysishttpcore.go index 24fc6dd22..5ddc259cd 100644 --- a/internal/pipeline/analysishttpcore.go +++ b/internal/pipeline/analysishttpcore.go @@ -2,12 +2,12 @@ package pipeline import "github.com/ooni/probe-cli/v3/internal/optional" -func (ax *Analysis) httpExperimentFailureHelper(db *DB, fx func(txId int64, probeFailure *string)) { +func (ax *Analysis) httpExperimentFailureHelper(db *DB, fx func(txId int64, probeFailure Failure)) { // skip if there's no final request - if db.webFinalRequest.IsNone() { + if db.WebFinalRequest.IsNone() { return } - probeFR := db.webFinalRequest.Unwrap() + probeFR := db.WebFinalRequest.Unwrap() // skip if the HTTP failure is not defined (bug?) if probeFR.HTTPFailure.IsNone() { @@ -17,15 +17,15 @@ func (ax *Analysis) httpExperimentFailureHelper(db *DB, fx func(txId int64, prob // skip if the final request succeded // TODO(bassosimone): say that the probe succeeds and the TH fails, then what? probeFailure := probeFR.HTTPFailure.Unwrap() - if probeFailure == nil { + if probeFailure == "" { return } // skip if the final request is not defined for the TH - if db.thWeb.IsNone() { + if db.THWeb.IsNone() { return } - thFR := db.thWeb.Unwrap() + thFR := db.THWeb.Unwrap() // skip if the failure is not defined for the TH if thFR.HTTPFailure.IsNone() { @@ -34,7 +34,7 @@ func (ax *Analysis) httpExperimentFailureHelper(db *DB, fx func(txId int64, prob // skip if also the TH's HTTP request failed thFailure := thFR.HTTPFailure.Unwrap() - if thFailure != nil { + if thFailure != "" { return } @@ -44,14 +44,14 @@ func (ax *Analysis) httpExperimentFailureHelper(db *DB, fx func(txId int64, prob // ComputeHTTPUnexpectedFailure computes HTTPUnexpectedFailure. func (ax *Analysis) ComputeHTTPUnexpectedFailure(db *DB) { - ax.httpExperimentFailureHelper(db, func(txId int64, probeFailure *string) { + ax.httpExperimentFailureHelper(db, func(txId int64, probeFailure Failure) { ax.HTTPUnexpectedFailure = append(ax.HTTPUnexpectedFailure, txId) }) } // ComputeHTTPExperimentFailure computes HTTPExperimentFailure. func (ax *Analysis) ComputeHTTPExperimentFailure(db *DB) { - ax.httpExperimentFailureHelper(db, func(txId int64, probeFailure *string) { + ax.httpExperimentFailureHelper(db, func(txId int64, probeFailure Failure) { ax.HTTPExperimentFailure = optional.Some(probeFailure) }) } diff --git a/internal/pipeline/analysishttpdiff.go b/internal/pipeline/analysishttpdiff.go index fb2071c7f..d67c46ab5 100644 --- a/internal/pipeline/analysishttpdiff.go +++ b/internal/pipeline/analysishttpdiff.go @@ -1 +1,272 @@ package pipeline + +import ( + "strings" + + "github.com/ooni/probe-cli/v3/internal/optional" +) + +func (ax *Analysis) httpDiffHelper(db *DB, fx func(probeFR *WebEndpointObservation, thFR *WebObservationTH)) { + // skip if there's no final request + if db.WebFinalRequest.IsNone() { + return + } + probeFR := db.WebFinalRequest.Unwrap() + + // skip if the HTTP failure is not defined (bug?) + if probeFR.HTTPFailure.IsNone() { + return + } + + // skip if the final request failed + probeFailure := probeFR.HTTPFailure.Unwrap() + if probeFailure != "" { + return + } + + // skip if the final request is not defined for the TH + if db.THWeb.IsNone() { + return + } + thFR := db.THWeb.Unwrap() + + // skip if the failure is not defined for the TH + if thFR.HTTPFailure.IsNone() { + return + } + + // skip if also the TH's HTTP request failed + thFailure := thFR.HTTPFailure.Unwrap() + if thFailure != "" { + return + } + + // invoke user defined func + fx(probeFR, thFR) +} + +// ComputeHTTPDiffBodyProportionFactor computes HTTPDiffBodyProportionFactor. +func (ax *Analysis) ComputeHTTPDiffBodyProportionFactor(db *DB) { + ax.httpDiffHelper(db, func(probeFT *WebEndpointObservation, thFR *WebObservationTH) { + // skip if there's no length for the TH + if thFR.HTTPResponseBodyLength.IsNone() { + return + } + + // skip if the length has not been computed by the TH + control := thFR.HTTPResponseBodyLength.Unwrap() + if control <= 0 { + return + } + + // skip if we don't know whether the body was truncated + if probeFT.HTTPResponseBodyIsTruncated.IsNone() { + return + } + truncated := probeFT.HTTPResponseBodyIsTruncated.Unwrap() + + // skip if the body was truncated (we cannot trust length in this case) + if truncated { + return + } + + // skip if we don't know the body length + if probeFT.HTTPResponseBodyLength.IsNone() { + return + } + measurement := probeFT.HTTPResponseBodyLength.Unwrap() + + // skip if the length is zero or negative (which doesn't make sense and seems a bug) + if measurement <= 0 { + return + } + + // compute the body proportion factor + var proportion float64 + if measurement >= control { + proportion = float64(control) / float64(measurement) + } else { + proportion = float64(measurement) / float64(control) + } + + // save the body proportion factor + ax.HTTPDiffBodyProportionFactor = optional.Some(proportion) + }) +} + +// ComputeHTTPDiffStatusCodeMatch computes HTTPDiffStatusCodeMatch. +func (ax *Analysis) ComputeHTTPDiffStatusCodeMatch(db *DB) { + ax.httpDiffHelper(db, func(probeFR *WebEndpointObservation, thFR *WebObservationTH) { + // skip if we don't know the control status + if thFR.HTTPResponseStatusCode.IsNone() { + return + } + control := thFR.HTTPResponseStatusCode.Unwrap() + + // skip the control is invalid + if control <= 0 { + return + } + + // skip if we don't know the probe status + if probeFR.HTTPResponseStatusCode.IsNone() { + return + } + measurement := probeFR.HTTPResponseStatusCode.Unwrap() + + // skip if the meaasurement is invalid + if measurement <= 0 { + return + } + + // compute whether there's a match including caveats + good := control == measurement + if !good && control/100 != 2 { + // Avoid comparison if it seems the TH failed _and_ the two + // status codes are not equal. Originally, this algorithm was + // https://github.com/measurement-kit/measurement-kit/blob/b55fbecb205be62c736249b689df0c45ae342804/src/libmeasurement_kit/ooni/web_connectivity.cpp#L60 + // and excluded the case where the TH failed with 5xx. + // + // Then, we discovered when implementing websteps a bunch + // of control failure modes that suggested to be more + // cautious. See https://github.com/bassosimone/websteps-illustrated/blob/632f27443ab9d94fb05efcf5e0b0c1ce190221e2/internal/engine/experiment/websteps/analysisweb.go#L137. + // + // However, it seems a bit retarded to avoid comparison + // when both the TH and the probe failed equally. See + // https://github.com/ooni/probe/issues/2287, which refers + // to a measurement where both the probe and the TH fail + // with 404, but we fail to say "status_code_match = true". + // + // See https://explorer.ooni.org/measurement/20220911T203447Z_webconnectivity_IT_30722_n1_YDZQZOHAziEJk6o9?input=http%3A%2F%2Fwww.webbox.com%2Findex.php + // for a measurement where this was fixed. + return + } + + // store the algorithm result + ax.HTTPDiffStatusCodeMatch = optional.Some(good) + }) +} + +// ComputeHTTPDiffUncommonHeadersMatch computes HTTPDiffUncommonHeadersMatch. +func (ax *Analysis) ComputeHTTPDiffUncommonHeadersMatch(db *DB) { + ax.httpDiffHelper(db, func(probeFR *WebEndpointObservation, thFR *WebObservationTH) { + // skip if we don't know the control headers keys + if len(thFR.HTTPResponseHeadersKeys) <= 0 { + return + } + control := thFR.HTTPResponseHeadersKeys + + // skip if we don't know the probe headers keys + if len(probeFR.HTTPResponseHeadersKeys) <= 0 { + return + } + measurement := probeFR.HTTPResponseHeadersKeys + + commonHeaders := map[string]bool{ + "date": true, + "content-type": true, + "server": true, + "cache-control": true, + "vary": true, + "set-cookie": true, + "location": true, + "expires": true, + "x-powered-by": true, + "content-encoding": true, + "last-modified": true, + "accept-ranges": true, + "pragma": true, + "x-frame-options": true, + "etag": true, + "x-content-type-options": true, + "age": true, + "via": true, + "p3p": true, + "x-xss-protection": true, + "content-language": true, + "cf-ray": true, + "strict-transport-security": true, + "link": true, + "x-varnish": true, + } + + matching := make(map[string]Origin) + for key := range measurement { + key = strings.ToLower(key) + if _, ok := commonHeaders[key]; !ok { + matching[key] |= OriginProbe + } + } + + for key := range control { + key = strings.ToLower(key) + if _, ok := commonHeaders[key]; !ok { + matching[key] |= OriginTH + } + } + + // compute the intersection of uncommon headers + found := false + for _, value := range matching { + if (value & (OriginProbe | OriginTH)) == (OriginProbe | OriginTH) { + found = true + break + } + } + + // store the result + ax.HTTPDiffUncommonHeadersMatch = optional.Some(found) + }) +} + +// ComputeHTTPDiffTitleMatch computes HTTPDiffTitleMatch. +func (ax *Analysis) ComputeHTTPDiffTitleMatch(db *DB) { + ax.httpDiffHelper(db, func(probeFR *WebEndpointObservation, thFR *WebObservationTH) { + // skip if we don't know the TH title + if thFR.HTTPResponseTitle.IsNone() { + return + } + control := thFR.HTTPResponseTitle.Unwrap() + + // skip if we don't know the probe title + if probeFR.HTTPResponseTitle.IsNone() { + return + } + measurement := probeFR.HTTPResponseTitle.Unwrap() + + if control == "" || measurement == "" { + return + } + + words := make(map[string]Origin) + // We don't consider to match words that are shorter than 5 + // characters (5 is the average word length for english) + // + // The original implementation considered the word order but + // considering different languages it seems we could have less + // false positives by ignoring the word order. + const minWordLength = 5 + for _, word := range strings.Split(measurement, " ") { + if len(word) >= minWordLength { + words[strings.ToLower(word)] |= OriginProbe + } + } + for _, word := range strings.Split(control, " ") { + if len(word) >= minWordLength { + words[strings.ToLower(word)] |= OriginTH + } + } + + // check whether there's a long word that does not match + good := true + for _, score := range words { + if (score & (OriginProbe | OriginTH)) != (OriginProbe | OriginTH) { + good = false + break + } + } + + // store the results + ax.HTTPDiffTitleMatch = optional.Some(good) + }) +} diff --git a/internal/pipeline/analysistcpip.go b/internal/pipeline/analysistcpip.go index 3ec8c51bc..6a9a497cf 100644 --- a/internal/pipeline/analysistcpip.go +++ b/internal/pipeline/analysistcpip.go @@ -1,10 +1,12 @@ package pipeline -import "github.com/ooni/probe-cli/v3/internal/netxlite" +import ( + "github.com/ooni/probe-cli/v3/internal/netxlite" +) // ComputeTCPUnexpectedFailure computes TCPUnexpectedFailure. func (ax *Analysis) ComputeTCPUnexpectedFailure(db *DB) { - for _, entry := range db.webByTxID { + for _, entry := range db.WebByTxID { // skip all the entries where we did not set a TCP failure if entry.TCPConnectFailure.IsNone() { continue @@ -12,12 +14,12 @@ func (ax *Analysis) ComputeTCPUnexpectedFailure(db *DB) { // skip all the entries where connect succeded // TODO(bassosimone): say that the probe succeeds and the TH fails, then what? - if entry.TCPConnectFailure.Unwrap() == nil { + if entry.TCPConnectFailure.Unwrap() == "" { continue } // get the corresponding TH measurement - th, good := db.thEpntByEpnt[entry.Endpoint] + th, good := db.THEpntByEpnt[entry.Endpoint] // skip if there's no TH data if !good { @@ -30,15 +32,15 @@ func (ax *Analysis) ComputeTCPUnexpectedFailure(db *DB) { } // skip if also the TH failed to connect - if th.TCPConnectFailure.Unwrap() != nil { + if th.TCPConnectFailure.Unwrap() != "" { continue } // ignore failures that are most likely caused by a broken IPv6 network stack if ipv6, err := netxlite.IsIPv6(entry.IPAddress); err == nil && ipv6 { - failure := th.TCPConnectFailure.Unwrap() - likelyFalsePositive := (*failure == netxlite.FailureNetworkUnreachable || - *failure == netxlite.FailureHostUnreachable) + failure := entry.TCPConnectFailure.Unwrap() + likelyFalsePositive := (failure == netxlite.FailureNetworkUnreachable || + failure == netxlite.FailureHostUnreachable) if likelyFalsePositive { continue } diff --git a/internal/pipeline/analysistls.go b/internal/pipeline/analysistls.go index 2c5cb2d87..98ceb5cf6 100644 --- a/internal/pipeline/analysistls.go +++ b/internal/pipeline/analysistls.go @@ -2,7 +2,7 @@ package pipeline // ComputeTLSUnexpectedFailure computes TLSUnexpectedFailure. func (ax *Analysis) ComputeTLSUnexpectedFailure(db *DB) { - for _, entry := range db.webByTxID { + for _, entry := range db.WebByTxID { // skip all the entries where we did not set a TLS failure if entry.TLSHandshakeFailure.IsNone() { continue @@ -10,12 +10,12 @@ func (ax *Analysis) ComputeTLSUnexpectedFailure(db *DB) { // skip all the entries where connect succeded // TODO(bassosimone): say that the probe succeeds and the TH fails, then what? - if entry.TLSHandshakeFailure.Unwrap() == nil { + if entry.TLSHandshakeFailure.Unwrap() == "" { continue } // get the corresponding TH measurement - th, good := db.thEpntByEpnt[entry.Endpoint] + th, good := db.THEpntByEpnt[entry.Endpoint] // skip if there's no TH data if !good { @@ -28,7 +28,7 @@ func (ax *Analysis) ComputeTLSUnexpectedFailure(db *DB) { } // skip if also the TH failed to handshake - if th.TLSHandshakeFailure.Unwrap() != nil { + if th.TLSHandshakeFailure.Unwrap() != "" { continue } diff --git a/internal/pipeline/db.go b/internal/pipeline/db.go index c5cd6ec99..efb730c60 100644 --- a/internal/pipeline/db.go +++ b/internal/pipeline/db.go @@ -12,27 +12,27 @@ import ( // This struct is not goroutine safe. The zero value is invalid. Use the // [NewDB] to construct a valid instance. type DB struct { - dnsByTxID map[int64]*DNSObservation - thDNSAddrs map[string]bool - thDNSFailure *string - thEpntByEpnt map[string]*EndpointObservationTH - thWeb optional.Value[*WebObservationTH] - urlHostname string - webByTxID map[int64]*WebEndpointObservation - webFinalRequest optional.Value[*WebEndpointObservation] + DNSByTxID map[int64]*DNSObservation + THDNSAddrs map[string]bool + THDNSFailure Failure + THEpntByEpnt map[string]*EndpointObservationTH + THWeb optional.Value[*WebObservationTH] + URLHostname string + WebByTxID map[int64]*WebEndpointObservation + WebFinalRequest optional.Value[*WebEndpointObservation] } // NewObservationsDB constructs a new [*DB] instance. func NewDB() *DB { return &DB{ - dnsByTxID: map[int64]*DNSObservation{}, - thDNSAddrs: map[string]bool{}, - thDNSFailure: nil, - thEpntByEpnt: map[string]*EndpointObservationTH{}, - thWeb: optional.None[*WebObservationTH](), - urlHostname: "", - webByTxID: map[int64]*WebEndpointObservation{}, - webFinalRequest: optional.None[*WebEndpointObservation](), + DNSByTxID: map[int64]*DNSObservation{}, + THDNSAddrs: map[string]bool{}, + THDNSFailure: Failure(""), + THEpntByEpnt: map[string]*EndpointObservationTH{}, + THWeb: optional.None[*WebObservationTH](), + URLHostname: "", + WebByTxID: map[int64]*WebEndpointObservation{}, + WebFinalRequest: optional.None[*WebEndpointObservation](), } } @@ -43,7 +43,7 @@ func (db *DB) Ingest(m *CanonicalMeasurement) error { if err != nil { return err } - db.urlHostname = URL.Hostname() + db.URLHostname = URL.Hostname() // Obtain the test keys or stop early tk := m.TestKeys.UnwrapOr(nil) @@ -112,7 +112,7 @@ func (db *DB) buildXrefsDNS() { addrToGetaddrinfo := make(map[string][]*DNSObservation) addrToUDP := make(map[string][]*DNSObservation) addrToHTTPS := make(map[string][]*DNSObservation) - for _, dobs := range db.dnsByTxID { + for _, dobs := range db.DNSByTxID { switch dnsNormalizeEngineName(dobs.Engine) { case "getaddrinfo": for _, addr := range dobs.IPAddrs { @@ -132,7 +132,7 @@ func (db *DB) buildXrefsDNS() { } // create cross references inside the endpoints - for _, wobs := range db.webByTxID { + for _, wobs := range db.WebByTxID { wobs.DNSLookupGetaddrinfoXref = addrToGetaddrinfo[wobs.IPAddress] wobs.DNSLookupUDPXref = addrToUDP[wobs.IPAddress] wobs.DNSLookupHTTPSXref = addrToHTTPS[wobs.IPAddress] @@ -140,13 +140,13 @@ func (db *DB) buildXrefsDNS() { } func (db *DB) buildXrefTH() { - for _, wobs := range db.webByTxID { + for _, wobs := range db.WebByTxID { // create cross references with TH DNS lookups - _, ok := db.thDNSAddrs[wobs.IPAddress] + _, ok := db.THDNSAddrs[wobs.IPAddress] wobs.DNSLookupTHXref = ok // create cross references with TH endpoints - if xref, ok := db.thEpntByEpnt[wobs.Endpoint]; ok { + if xref, ok := db.THEpntByEpnt[wobs.Endpoint]; ok { wobs.THEndpointXref = optional.Some(xref) } } @@ -157,7 +157,7 @@ var errMultipleFinalRequests = errors.New("analysis: multiple final requests") func (db *DB) maybeFindFinalRequest() error { // find all the possible final request candidates var finals []*WebEndpointObservation - for _, wobs := range db.webByTxID { + for _, wobs := range db.WebByTxID { switch code := wobs.HTTPResponseStatusCode.UnwrapOr(0); code { case 0, 301, 302, 307, 308: // this is a redirect or a nonexisting response in the case of zero @@ -176,7 +176,7 @@ func (db *DB) maybeFindFinalRequest() error { return errMultipleFinalRequests case len(finals) == 1: - db.webFinalRequest = optional.Some(finals[0]) + db.WebFinalRequest = optional.Some(finals[0]) return nil default: diff --git a/internal/pipeline/dns.go b/internal/pipeline/dns.go index dc8ea7b38..c913da7fd 100644 --- a/internal/pipeline/dns.go +++ b/internal/pipeline/dns.go @@ -22,7 +22,7 @@ type DNSObservation struct { QueryHostname string // Failure is the failure that occurred. - Failure *string + Failure Failure // Engine is the engined used by the probe to lookup. Engine string @@ -48,7 +48,7 @@ func (db *DB) addDNSLookups(evs ...*model.ArchivalDNSLookupResult) error { } dobs.QueryType = ev.QueryType dobs.QueryHostname = ev.Hostname - dobs.Failure = ev.Failure + dobs.Failure = NewFailure(ev.Failure) dobs.Engine = ev.Engine dobs.ResolverAddress = ev.ResolverAddress dobs.T0 = ev.T0 @@ -71,13 +71,13 @@ func (db *DB) addDNSLookups(evs ...*model.ArchivalDNSLookupResult) error { } func (db *DB) newDNSObservation(txid int64) (*DNSObservation, error) { - if _, good := db.webByTxID[txid]; good { + if _, good := db.WebByTxID[txid]; good { return nil, errTransactionAlreadyExists } dobs := &DNSObservation{ TransactionID: txid, } - db.dnsByTxID[txid] = dobs + db.DNSByTxID[txid] = dobs return dobs, nil } diff --git a/internal/pipeline/failure.go b/internal/pipeline/failure.go new file mode 100644 index 000000000..212e553b5 --- /dev/null +++ b/internal/pipeline/failure.go @@ -0,0 +1,12 @@ +package pipeline + +// Failure is a failure string. The empty string represents the absence of failure. +type Failure string + +// NewFailure constructs a new [Failure] instance. +func NewFailure(in *string) (out Failure) { + if in != nil { + out = Failure(*in) + } + return +} diff --git a/internal/pipeline/qa_test.go b/internal/pipeline/qa_test.go index 466938979..875ebbbae 100644 --- a/internal/pipeline/qa_test.go +++ b/internal/pipeline/qa_test.go @@ -5,17 +5,9 @@ import ( "path/filepath" "github.com/ooni/probe-cli/v3/internal/must" - "github.com/ooni/probe-cli/v3/internal/optional" "github.com/ooni/probe-cli/v3/internal/runtimex" ) -type flatDB struct { - XdnsByTxID map[int64]*DNSObservation - XthEpntByEpnt map[string]*EndpointObservationTH - XthWeb optional.Value[*WebObservationTH] - XwebByTxID map[int64]*WebEndpointObservation -} - func Example() { rawJSON := must.ReadFile(filepath.Join("testdata", "youtube.json")) var meas CanonicalMeasurement @@ -24,15 +16,15 @@ func Example() { db := NewDB() runtimex.Try0(db.Ingest(&meas)) - fdb := &flatDB{ - XdnsByTxID: db.dnsByTxID, - XthEpntByEpnt: db.thEpntByEpnt, - XthWeb: db.thWeb, - XwebByTxID: db.webByTxID, - } - rawDB := must.MarshalJSON(fdb) + rawDB := must.MarshalJSON(db) must.WriteFile(filepath.Join("testdata", "youtube_db.json"), rawDB, 0600) + ax := &Analysis{} + ax.ComputeAllValues(db) + + rawAx := must.MarshalJSON(ax) + must.WriteFile(filepath.Join("testdata", "youtube_ax.json"), rawAx, 0600) + fmt.Printf("true\n") // Output: // true diff --git a/internal/pipeline/testdata/youtube_ax.json b/internal/pipeline/testdata/youtube_ax.json new file mode 100644 index 000000000..71cb3dfb7 --- /dev/null +++ b/internal/pipeline/testdata/youtube_ax.json @@ -0,0 +1 @@ +{"DNSUnexpectedAddr":[1,3,2],"DNSUnexpectedAddrASN":null,"DNSUnexpectedBogon":null,"DNSUnexpectedFailure":null,"DNSWithTLSHandshakeFailureAddr":null,"DNSExperimentFailure":null,"HTTPDiffBodyProportionFactor":null,"HTTPDiffTitleMatch":true,"HTTPDiffStatusCodeMatch":true,"HTTPDiffUncommonHeadersMatch":true,"HTTPExperimentFailure":null,"HTTPUnexpectedFailure":null,"TCPUnexpectedFailure":null,"TLSUnexpectedFailure":null} \ No newline at end of file diff --git a/internal/pipeline/testdata/youtube_db.json b/internal/pipeline/testdata/youtube_db.json index 8c0a18da9..2d4dc3dcc 100644 --- a/internal/pipeline/testdata/youtube_db.json +++ b/internal/pipeline/testdata/youtube_db.json @@ -1 +1 @@ -{"XdnsByTxID":{"1":{"TransactionID":1,"QueryType":"AAAA","Failure":null,"Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782},"2":{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264},"3":{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}},"XthEpntByEpnt":{"142.250.178.14:443/tcp":{"Proto":"tcp","IPAddress":"142.250.178.14","Port":"443","Endpoint":"142.250.178.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.179.238:443/tcp":{"Proto":"tcp","IPAddress":"142.250.179.238","Port":"443","Endpoint":"142.250.179.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.180.142:443/tcp":{"Proto":"tcp","IPAddress":"142.250.180.142","Port":"443","Endpoint":"142.250.180.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.180.14:443/tcp":{"Proto":"tcp","IPAddress":"142.250.180.14","Port":"443","Endpoint":"142.250.180.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.180.174:443/tcp":{"Proto":"tcp","IPAddress":"142.250.180.174","Port":"443","Endpoint":"142.250.180.174:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.187.206:443/tcp":{"Proto":"tcp","IPAddress":"142.250.187.206","Port":"443","Endpoint":"142.250.187.206:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.187.238:443/tcp":{"Proto":"tcp","IPAddress":"142.250.187.238","Port":"443","Endpoint":"142.250.187.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.200.14:443/tcp":{"Proto":"tcp","IPAddress":"142.250.200.14","Port":"443","Endpoint":"142.250.200.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.250.200.46:443/tcp":{"Proto":"tcp","IPAddress":"142.250.200.46","Port":"443","Endpoint":"142.250.200.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.251.209.14:443/tcp":{"Proto":"tcp","IPAddress":"142.251.209.14","Port":"443","Endpoint":"142.251.209.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"142.251.209.46:443/tcp":{"Proto":"tcp","IPAddress":"142.251.209.46","Port":"443","Endpoint":"142.251.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"172.217.16.238:443/tcp":{"Proto":"tcp","IPAddress":"172.217.16.238","Port":"443","Endpoint":"172.217.16.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"172.217.169.14:443/tcp":{"Proto":"tcp","IPAddress":"172.217.169.14","Port":"443","Endpoint":"172.217.169.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.201.110:443/tcp":{"Proto":"tcp","IPAddress":"216.58.201.110","Port":"443","Endpoint":"216.58.201.110:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.204.142:443/tcp":{"Proto":"tcp","IPAddress":"216.58.204.142","Port":"443","Endpoint":"216.58.204.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.204.78:443/tcp":{"Proto":"tcp","IPAddress":"216.58.204.78","Port":"443","Endpoint":"216.58.204.78:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.205.46:443/tcp":{"Proto":"tcp","IPAddress":"216.58.205.46","Port":"443","Endpoint":"216.58.205.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.209.46:443/tcp":{"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"216.58.212.238:443/tcp":{"Proto":"tcp","IPAddress":"216.58.212.238","Port":"443","Endpoint":"216.58.212.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4002:402::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:402::200e","Port":"443","Endpoint":"[2a00:1450:4002:402::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4002:403::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:403::200e","Port":"443","Endpoint":"[2a00:1450:4002:403::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4002:410::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:410::200e","Port":"443","Endpoint":"[2a00:1450:4002:410::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4002:414::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:414::200e","Port":"443","Endpoint":"[2a00:1450:4002:414::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4002:416::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:416::200e","Port":"443","Endpoint":"[2a00:1450:4002:416::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4009:815::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:815::200e","Port":"443","Endpoint":"[2a00:1450:4009:815::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4009:81e::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81e::200e","Port":"443","Endpoint":"[2a00:1450:4009:81e::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4009:81f::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81f::200e","Port":"443","Endpoint":"[2a00:1450:4009:81f::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"[2a00:1450:4009:820::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:820::200e","Port":"443","Endpoint":"[2a00:1450:4009:820::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"}},"XthWeb":{"HTTPFailure":null,"HTTPResponseStatusCode":200,"HTTPResponseBodyLength":928046,"HTTPResponseHeadersKeys":{"Accept-Ch":2,"Accept-Ranges":2,"Alt-Svc":2,"Cache-Control":2,"Content-Type":2,"Cross-Origin-Opener-Policy":2,"Date":2,"Expires":2,"Origin-Trial":2,"P3p":2,"Permissions-Policy":2,"Pragma":2,"Report-To":2,"Server":2,"Set-Cookie":2,"Strict-Transport-Security":2,"Vary":2,"X-Content-Type-Options":2,"X-Frame-Options":2,"X-Xss-Protection":2},"HTTPResponseTitle":"YouTube"},"XwebByTxID":{"10":{"TransactionID":10,"Proto":"tcp","IPAddress":"2a00:1450:4002:410::200e","Port":"443","Endpoint":"[2a00:1450:4002:410::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396471,"TCPConnectT":0.417629,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","Failure":null,"Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.417656,"TLSHandshakeT":0.462505,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:410::200e","Port":"443","Endpoint":"[2a00:1450:4002:410::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"11":{"TransactionID":11,"Proto":"tcp","IPAddress":"2a00:1450:4002:416::200e","Port":"443","Endpoint":"[2a00:1450:4002:416::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396461,"TCPConnectT":0.416484,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","Failure":null,"Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.416512,"TLSHandshakeT":0.462307,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:416::200e","Port":"443","Endpoint":"[2a00:1450:4002:416::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"12":{"TransactionID":12,"Proto":"tcp","IPAddress":"2a00:1450:4002:414::200e","Port":"443","Endpoint":"[2a00:1450:4002:414::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396723,"TCPConnectT":0.418956,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.419044,"TLSHandshakeT":0.467401,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:414::200e","Port":"443","Endpoint":"[2a00:1450:4002:414::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"13":{"TransactionID":13,"Proto":"tcp","IPAddress":"2a00:1450:4002:402::200e","Port":"443","Endpoint":"[2a00:1450:4002:402::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395951,"TCPConnectT":0.415468,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","Failure":null,"Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.415515,"TLSHandshakeT":0.463236,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:402::200e","Port":"443","Endpoint":"[2a00:1450:4002:402::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"14":{"TransactionID":14,"Proto":"tcp","IPAddress":"142.251.209.14","Port":"443","Endpoint":"142.251.209.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395747,"TCPConnectT":0.41948,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.419504,"TLSHandshakeT":0.464932,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.251.209.14","Port":"443","Endpoint":"142.251.209.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"15":{"TransactionID":15,"Proto":"tcp","IPAddress":"142.250.180.142","Port":"443","Endpoint":"142.250.180.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396707,"TCPConnectT":0.418861,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.418894,"TLSHandshakeT":0.465008,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.180.142","Port":"443","Endpoint":"142.250.180.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"16":{"TransactionID":16,"Proto":"tcp","IPAddress":"172.217.169.14","Port":"443","Endpoint":"172.217.169.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89481,"TCPConnectT":1.939539,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.939556,"TLSHandshakeT":1.99845,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"172.217.169.14","Port":"443","Endpoint":"172.217.169.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"17":{"TransactionID":17,"Proto":"tcp","IPAddress":"2a00:1450:4009:820::200e","Port":"443","Endpoint":"[2a00:1450:4009:820::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895162,"TCPConnectT":1.940325,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.940346,"TLSHandshakeT":2.00063,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:820::200e","Port":"443","Endpoint":"[2a00:1450:4009:820::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"18":{"TransactionID":18,"Proto":"tcp","IPAddress":"142.250.187.206","Port":"443","Endpoint":"142.250.187.206:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895168,"TCPConnectT":1.939568,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.939584,"TLSHandshakeT":1.995897,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.187.206","Port":"443","Endpoint":"142.250.187.206:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"19":{"TransactionID":19,"Proto":"tcp","IPAddress":"172.217.16.238","Port":"443","Endpoint":"172.217.16.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895386,"TCPConnectT":1.940296,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9403190000000001,"TLSHandshakeT":1.9993750000000001,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"172.217.16.238","Port":"443","Endpoint":"172.217.16.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"20":{"TransactionID":20,"Proto":"tcp","IPAddress":"142.250.200.14","Port":"443","Endpoint":"142.250.200.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8946960000000002,"TCPConnectT":1.93338,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9334069999999999,"TLSHandshakeT":1.984044,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.200.14","Port":"443","Endpoint":"142.250.200.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"21":{"TransactionID":21,"Proto":"tcp","IPAddress":"216.58.204.78","Port":"443","Endpoint":"216.58.204.78:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89452,"TCPConnectT":1.9342679999999999,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.934302,"TLSHandshakeT":1.990915,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.204.78","Port":"443","Endpoint":"216.58.204.78:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"22":{"TransactionID":22,"Proto":"tcp","IPAddress":"142.250.179.238","Port":"443","Endpoint":"142.250.179.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89411,"TCPConnectT":1.931396,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9314230000000001,"TLSHandshakeT":1.990783,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.179.238","Port":"443","Endpoint":"142.250.179.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"23":{"TransactionID":23,"Proto":"tcp","IPAddress":"142.250.200.46","Port":"443","Endpoint":"142.250.200.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8941940000000002,"TCPConnectT":1.9308939999999999,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.930963,"TLSHandshakeT":1.990323,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.200.46","Port":"443","Endpoint":"142.250.200.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"24":{"TransactionID":24,"Proto":"tcp","IPAddress":"216.58.201.110","Port":"443","Endpoint":"216.58.201.110:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895193,"TCPConnectT":1.939627,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9396879999999999,"TLSHandshakeT":1.994988,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.201.110","Port":"443","Endpoint":"216.58.201.110:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"25":{"TransactionID":25,"Proto":"tcp","IPAddress":"2a00:1450:4009:81e::200e","Port":"443","Endpoint":"[2a00:1450:4009:81e::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.894023,"TCPConnectT":1.930973,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9310070000000001,"TLSHandshakeT":1.993483,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81e::200e","Port":"443","Endpoint":"[2a00:1450:4009:81e::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"26":{"TransactionID":26,"Proto":"tcp","IPAddress":"142.250.187.238","Port":"443","Endpoint":"142.250.187.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.894889,"TCPConnectT":1.936306,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.936323,"TLSHandshakeT":1.993995,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.187.238","Port":"443","Endpoint":"142.250.187.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"27":{"TransactionID":27,"Proto":"tcp","IPAddress":"2a00:1450:4009:81f::200e","Port":"443","Endpoint":"[2a00:1450:4009:81f::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89456,"TCPConnectT":1.938354,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9384000000000001,"TLSHandshakeT":1.99783,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81f::200e","Port":"443","Endpoint":"[2a00:1450:4009:81f::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"28":{"TransactionID":28,"Proto":"tcp","IPAddress":"216.58.212.238","Port":"443","Endpoint":"216.58.212.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.894834,"TCPConnectT":1.936283,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.936303,"TLSHandshakeT":1.992747,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.212.238","Port":"443","Endpoint":"216.58.212.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"29":{"TransactionID":29,"Proto":"tcp","IPAddress":"142.250.180.14","Port":"443","Endpoint":"142.250.180.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895467,"TCPConnectT":1.940271,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.94029,"TLSHandshakeT":1.999167,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.180.14","Port":"443","Endpoint":"142.250.180.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"30":{"TransactionID":30,"Proto":"tcp","IPAddress":"142.250.178.14","Port":"443","Endpoint":"142.250.178.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8953090000000001,"TCPConnectT":1.939593,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.939614,"TLSHandshakeT":1.995451,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.178.14","Port":"443","Endpoint":"142.250.178.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"31":{"TransactionID":31,"Proto":"tcp","IPAddress":"2a00:1450:4009:815::200e","Port":"443","Endpoint":"[2a00:1450:4009:815::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8944800000000002,"TCPConnectT":1.935353,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.935376,"TLSHandshakeT":1.994195,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:815::200e","Port":"443","Endpoint":"[2a00:1450:4009:815::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"4":{"TransactionID":4,"Proto":"tcp","IPAddress":"142.250.180.174","Port":"443","Endpoint":"142.250.180.174:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.39635,"TCPConnectT":0.41553,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.415573,"TLSHandshakeT":0.461278,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.180.174","Port":"443","Endpoint":"142.250.180.174:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"5":{"TransactionID":5,"Proto":"tcp","IPAddress":"216.58.205.46","Port":"443","Endpoint":"216.58.205.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395701,"TCPConnectT":0.421933,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.421961,"TLSHandshakeT":0.465331,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.205.46","Port":"443","Endpoint":"216.58.205.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"6":{"TransactionID":6,"Proto":"tcp","IPAddress":"142.251.209.46","Port":"443","Endpoint":"142.251.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395832,"TCPConnectT":0.413203,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.41324,"TLSHandshakeT":0.460508,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.251.209.46","Port":"443","Endpoint":"142.251.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"7":{"TransactionID":7,"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396053,"TCPConnectT":0.411923,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.411989,"TLSHandshakeT":0.452334,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":null,"HTTPResponseStatusCode":200,"HTTPResponseBodyLength":524298,"HTTPResponseBodyIsTruncated":true,"HTTPResponseHeadersKeys":{"Accept-Ch":1,"Accept-Ranges":1,"Alt-Svc":1,"Cache-Control":1,"Content-Type":1,"Cross-Origin-Opener-Policy":1,"Date":1,"Expires":1,"Origin-Trial":1,"P3p":1,"Permissions-Policy":1,"Pragma":1,"Report-To":1,"Server":1,"Set-Cookie":1,"Strict-Transport-Security":1,"Vary":1,"X-Content-Type-Options":1,"X-Frame-Options":1,"X-Xss-Protection":1},"HTTPResponseTitle":"YouTube"},"8":{"TransactionID":8,"Proto":"tcp","IPAddress":"216.58.204.142","Port":"443","Endpoint":"216.58.204.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395722,"TCPConnectT":0.419464,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","Failure":null,"Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.419487,"TLSHandshakeT":0.466341,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.204.142","Port":"443","Endpoint":"216.58.204.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"9":{"TransactionID":9,"Proto":"tcp","IPAddress":"2a00:1450:4002:403::200e","Port":"443","Endpoint":"[2a00:1450:4002:403::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396408,"TCPConnectT":0.416441,"TCPConnectFailure":null,"DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","Failure":null,"Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","Failure":null,"Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.416468,"TLSHandshakeT":0.46288,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:403::200e","Port":"443","Endpoint":"[2a00:1450:4002:403::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":null,"QUICHandshakeFailure":null,"TLSHandshakeFailure":null,"TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null}}} \ No newline at end of file +{"DNSByTxID":{"1":{"TransactionID":1,"QueryType":"AAAA","QueryHostname":"www.youtube.com","Failure":"","Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782},"2":{"TransactionID":2,"QueryType":"A","QueryHostname":"www.youtube.com","Failure":"","Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264},"3":{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}},"THDNSAddrs":{"142.250.178.14":true,"142.250.179.238":true,"142.250.180.14":true,"142.250.187.206":true,"142.250.187.238":true,"142.250.200.14":true,"142.250.200.46":true,"172.217.16.238":true,"172.217.169.14":true,"216.58.201.110":true,"216.58.204.78":true,"216.58.212.238":true,"2a00:1450:4009:815::200e":true,"2a00:1450:4009:81e::200e":true,"2a00:1450:4009:81f::200e":true,"2a00:1450:4009:820::200e":true},"THDNSFailure":"","THEpntByEpnt":{"142.250.178.14:443/tcp":{"Proto":"tcp","IPAddress":"142.250.178.14","Port":"443","Endpoint":"142.250.178.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"142.250.179.238:443/tcp":{"Proto":"tcp","IPAddress":"142.250.179.238","Port":"443","Endpoint":"142.250.179.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"142.250.180.142:443/tcp":{"Proto":"tcp","IPAddress":"142.250.180.142","Port":"443","Endpoint":"142.250.180.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"142.250.180.14:443/tcp":{"Proto":"tcp","IPAddress":"142.250.180.14","Port":"443","Endpoint":"142.250.180.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"142.250.180.174:443/tcp":{"Proto":"tcp","IPAddress":"142.250.180.174","Port":"443","Endpoint":"142.250.180.174:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"142.250.187.206:443/tcp":{"Proto":"tcp","IPAddress":"142.250.187.206","Port":"443","Endpoint":"142.250.187.206:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"142.250.187.238:443/tcp":{"Proto":"tcp","IPAddress":"142.250.187.238","Port":"443","Endpoint":"142.250.187.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"142.250.200.14:443/tcp":{"Proto":"tcp","IPAddress":"142.250.200.14","Port":"443","Endpoint":"142.250.200.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"142.250.200.46:443/tcp":{"Proto":"tcp","IPAddress":"142.250.200.46","Port":"443","Endpoint":"142.250.200.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"142.251.209.14:443/tcp":{"Proto":"tcp","IPAddress":"142.251.209.14","Port":"443","Endpoint":"142.251.209.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"142.251.209.46:443/tcp":{"Proto":"tcp","IPAddress":"142.251.209.46","Port":"443","Endpoint":"142.251.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"172.217.16.238:443/tcp":{"Proto":"tcp","IPAddress":"172.217.16.238","Port":"443","Endpoint":"172.217.16.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"172.217.169.14:443/tcp":{"Proto":"tcp","IPAddress":"172.217.169.14","Port":"443","Endpoint":"172.217.169.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"216.58.201.110:443/tcp":{"Proto":"tcp","IPAddress":"216.58.201.110","Port":"443","Endpoint":"216.58.201.110:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"216.58.204.142:443/tcp":{"Proto":"tcp","IPAddress":"216.58.204.142","Port":"443","Endpoint":"216.58.204.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"216.58.204.78:443/tcp":{"Proto":"tcp","IPAddress":"216.58.204.78","Port":"443","Endpoint":"216.58.204.78:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"216.58.205.46:443/tcp":{"Proto":"tcp","IPAddress":"216.58.205.46","Port":"443","Endpoint":"216.58.205.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"216.58.209.46:443/tcp":{"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"216.58.212.238:443/tcp":{"Proto":"tcp","IPAddress":"216.58.212.238","Port":"443","Endpoint":"216.58.212.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"[2a00:1450:4002:402::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:402::200e","Port":"443","Endpoint":"[2a00:1450:4002:402::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"[2a00:1450:4002:403::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:403::200e","Port":"443","Endpoint":"[2a00:1450:4002:403::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"[2a00:1450:4002:410::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:410::200e","Port":"443","Endpoint":"[2a00:1450:4002:410::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"[2a00:1450:4002:414::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:414::200e","Port":"443","Endpoint":"[2a00:1450:4002:414::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"[2a00:1450:4002:416::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4002:416::200e","Port":"443","Endpoint":"[2a00:1450:4002:416::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"[2a00:1450:4009:815::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:815::200e","Port":"443","Endpoint":"[2a00:1450:4009:815::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"[2a00:1450:4009:81e::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81e::200e","Port":"443","Endpoint":"[2a00:1450:4009:81e::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"[2a00:1450:4009:81f::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81f::200e","Port":"443","Endpoint":"[2a00:1450:4009:81f::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"[2a00:1450:4009:820::200e]:443/tcp":{"Proto":"tcp","IPAddress":"2a00:1450:4009:820::200e","Port":"443","Endpoint":"[2a00:1450:4009:820::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"}},"THWeb":{"HTTPFailure":"","HTTPResponseStatusCode":200,"HTTPResponseBodyLength":928046,"HTTPResponseHeadersKeys":{"Accept-Ch":2,"Accept-Ranges":2,"Alt-Svc":2,"Cache-Control":2,"Content-Type":2,"Cross-Origin-Opener-Policy":2,"Date":2,"Expires":2,"Origin-Trial":2,"P3p":2,"Permissions-Policy":2,"Pragma":2,"Report-To":2,"Server":2,"Set-Cookie":2,"Strict-Transport-Security":2,"Vary":2,"X-Content-Type-Options":2,"X-Frame-Options":2,"X-Xss-Protection":2},"HTTPResponseTitle":"YouTube"},"URLHostname":"www.youtube.com","WebByTxID":{"10":{"TransactionID":10,"Proto":"tcp","IPAddress":"2a00:1450:4002:410::200e","Port":"443","Endpoint":"[2a00:1450:4002:410::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396471,"TCPConnectT":0.417629,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","QueryHostname":"www.youtube.com","Failure":"","Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.417656,"TLSHandshakeT":0.462505,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:410::200e","Port":"443","Endpoint":"[2a00:1450:4002:410::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"11":{"TransactionID":11,"Proto":"tcp","IPAddress":"2a00:1450:4002:416::200e","Port":"443","Endpoint":"[2a00:1450:4002:416::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396461,"TCPConnectT":0.416484,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","QueryHostname":"www.youtube.com","Failure":"","Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.416512,"TLSHandshakeT":0.462307,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:416::200e","Port":"443","Endpoint":"[2a00:1450:4002:416::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"12":{"TransactionID":12,"Proto":"tcp","IPAddress":"2a00:1450:4002:414::200e","Port":"443","Endpoint":"[2a00:1450:4002:414::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396723,"TCPConnectT":0.418956,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.419044,"TLSHandshakeT":0.467401,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:414::200e","Port":"443","Endpoint":"[2a00:1450:4002:414::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"13":{"TransactionID":13,"Proto":"tcp","IPAddress":"2a00:1450:4002:402::200e","Port":"443","Endpoint":"[2a00:1450:4002:402::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395951,"TCPConnectT":0.415468,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","QueryHostname":"www.youtube.com","Failure":"","Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.415515,"TLSHandshakeT":0.463236,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:402::200e","Port":"443","Endpoint":"[2a00:1450:4002:402::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"14":{"TransactionID":14,"Proto":"tcp","IPAddress":"142.251.209.14","Port":"443","Endpoint":"142.251.209.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395747,"TCPConnectT":0.41948,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","QueryHostname":"www.youtube.com","Failure":"","Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.419504,"TLSHandshakeT":0.464932,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.251.209.14","Port":"443","Endpoint":"142.251.209.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"15":{"TransactionID":15,"Proto":"tcp","IPAddress":"142.250.180.142","Port":"443","Endpoint":"142.250.180.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396707,"TCPConnectT":0.418861,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","QueryHostname":"www.youtube.com","Failure":"","Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.418894,"TLSHandshakeT":0.465008,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.180.142","Port":"443","Endpoint":"142.250.180.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"16":{"TransactionID":16,"Proto":"tcp","IPAddress":"172.217.169.14","Port":"443","Endpoint":"172.217.169.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89481,"TCPConnectT":1.939539,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.939556,"TLSHandshakeT":1.99845,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"172.217.169.14","Port":"443","Endpoint":"172.217.169.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"17":{"TransactionID":17,"Proto":"tcp","IPAddress":"2a00:1450:4009:820::200e","Port":"443","Endpoint":"[2a00:1450:4009:820::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895162,"TCPConnectT":1.940325,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.940346,"TLSHandshakeT":2.00063,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:820::200e","Port":"443","Endpoint":"[2a00:1450:4009:820::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"18":{"TransactionID":18,"Proto":"tcp","IPAddress":"142.250.187.206","Port":"443","Endpoint":"142.250.187.206:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895168,"TCPConnectT":1.939568,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.939584,"TLSHandshakeT":1.995897,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.187.206","Port":"443","Endpoint":"142.250.187.206:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"19":{"TransactionID":19,"Proto":"tcp","IPAddress":"172.217.16.238","Port":"443","Endpoint":"172.217.16.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895386,"TCPConnectT":1.940296,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9403190000000001,"TLSHandshakeT":1.9993750000000001,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"172.217.16.238","Port":"443","Endpoint":"172.217.16.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"20":{"TransactionID":20,"Proto":"tcp","IPAddress":"142.250.200.14","Port":"443","Endpoint":"142.250.200.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8946960000000002,"TCPConnectT":1.93338,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9334069999999999,"TLSHandshakeT":1.984044,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.200.14","Port":"443","Endpoint":"142.250.200.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"21":{"TransactionID":21,"Proto":"tcp","IPAddress":"216.58.204.78","Port":"443","Endpoint":"216.58.204.78:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89452,"TCPConnectT":1.9342679999999999,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.934302,"TLSHandshakeT":1.990915,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.204.78","Port":"443","Endpoint":"216.58.204.78:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"22":{"TransactionID":22,"Proto":"tcp","IPAddress":"142.250.179.238","Port":"443","Endpoint":"142.250.179.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89411,"TCPConnectT":1.931396,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9314230000000001,"TLSHandshakeT":1.990783,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.179.238","Port":"443","Endpoint":"142.250.179.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"23":{"TransactionID":23,"Proto":"tcp","IPAddress":"142.250.200.46","Port":"443","Endpoint":"142.250.200.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8941940000000002,"TCPConnectT":1.9308939999999999,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.930963,"TLSHandshakeT":1.990323,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.200.46","Port":"443","Endpoint":"142.250.200.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"24":{"TransactionID":24,"Proto":"tcp","IPAddress":"216.58.201.110","Port":"443","Endpoint":"216.58.201.110:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895193,"TCPConnectT":1.939627,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9396879999999999,"TLSHandshakeT":1.994988,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.201.110","Port":"443","Endpoint":"216.58.201.110:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"25":{"TransactionID":25,"Proto":"tcp","IPAddress":"2a00:1450:4009:81e::200e","Port":"443","Endpoint":"[2a00:1450:4009:81e::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.894023,"TCPConnectT":1.930973,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9310070000000001,"TLSHandshakeT":1.993483,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81e::200e","Port":"443","Endpoint":"[2a00:1450:4009:81e::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"26":{"TransactionID":26,"Proto":"tcp","IPAddress":"142.250.187.238","Port":"443","Endpoint":"142.250.187.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.894889,"TCPConnectT":1.936306,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.936323,"TLSHandshakeT":1.993995,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.187.238","Port":"443","Endpoint":"142.250.187.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"27":{"TransactionID":27,"Proto":"tcp","IPAddress":"2a00:1450:4009:81f::200e","Port":"443","Endpoint":"[2a00:1450:4009:81f::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.89456,"TCPConnectT":1.938354,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.9384000000000001,"TLSHandshakeT":1.99783,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:81f::200e","Port":"443","Endpoint":"[2a00:1450:4009:81f::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"28":{"TransactionID":28,"Proto":"tcp","IPAddress":"216.58.212.238","Port":"443","Endpoint":"216.58.212.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.894834,"TCPConnectT":1.936283,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.936303,"TLSHandshakeT":1.992747,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.212.238","Port":"443","Endpoint":"216.58.212.238:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"29":{"TransactionID":29,"Proto":"tcp","IPAddress":"142.250.180.14","Port":"443","Endpoint":"142.250.180.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.895467,"TCPConnectT":1.940271,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.94029,"TLSHandshakeT":1.999167,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.180.14","Port":"443","Endpoint":"142.250.180.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"30":{"TransactionID":30,"Proto":"tcp","IPAddress":"142.250.178.14","Port":"443","Endpoint":"142.250.178.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8953090000000001,"TCPConnectT":1.939593,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.939614,"TLSHandshakeT":1.995451,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.178.14","Port":"443","Endpoint":"142.250.178.14:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"31":{"TransactionID":31,"Proto":"tcp","IPAddress":"2a00:1450:4009:815::200e","Port":"443","Endpoint":"[2a00:1450:4009:815::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":1.8944800000000002,"TCPConnectT":1.935353,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":null,"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":true,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":1.935376,"TLSHandshakeT":1.994195,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4009:815::200e","Port":"443","Endpoint":"[2a00:1450:4009:815::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"4":{"TransactionID":4,"Proto":"tcp","IPAddress":"142.250.180.174","Port":"443","Endpoint":"142.250.180.174:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.39635,"TCPConnectT":0.41553,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","QueryHostname":"www.youtube.com","Failure":"","Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.415573,"TLSHandshakeT":0.461278,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.250.180.174","Port":"443","Endpoint":"142.250.180.174:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"5":{"TransactionID":5,"Proto":"tcp","IPAddress":"216.58.205.46","Port":"443","Endpoint":"216.58.205.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395701,"TCPConnectT":0.421933,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","QueryHostname":"www.youtube.com","Failure":"","Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.421961,"TLSHandshakeT":0.465331,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.205.46","Port":"443","Endpoint":"216.58.205.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"6":{"TransactionID":6,"Proto":"tcp","IPAddress":"142.251.209.46","Port":"443","Endpoint":"142.251.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395832,"TCPConnectT":0.413203,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","QueryHostname":"www.youtube.com","Failure":"","Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.41324,"TLSHandshakeT":0.460508,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"142.251.209.46","Port":"443","Endpoint":"142.251.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"7":{"TransactionID":7,"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396053,"TCPConnectT":0.411923,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.411989,"TLSHandshakeT":0.452334,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"","HTTPResponseStatusCode":200,"HTTPResponseBodyLength":524298,"HTTPResponseBodyIsTruncated":true,"HTTPResponseHeadersKeys":{"Accept-Ch":1,"Accept-Ranges":1,"Alt-Svc":1,"Cache-Control":1,"Content-Type":1,"Cross-Origin-Opener-Policy":1,"Date":1,"Expires":1,"Origin-Trial":1,"P3p":1,"Permissions-Policy":1,"Pragma":1,"Report-To":1,"Server":1,"Set-Cookie":1,"Strict-Transport-Security":1,"Vary":1,"X-Content-Type-Options":1,"X-Frame-Options":1,"X-Xss-Protection":1},"HTTPResponseTitle":"YouTube"},"8":{"TransactionID":8,"Proto":"tcp","IPAddress":"216.58.204.142","Port":"443","Endpoint":"216.58.204.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.395722,"TCPConnectT":0.419464,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":[{"TransactionID":2,"QueryType":"A","QueryHostname":"www.youtube.com","Failure":"","Engine":"doh","ResolverAddress":"https://dns.quad9.net/dns-query","IPAddrs":["142.250.180.142","142.250.180.174","142.251.209.14","216.58.205.46","142.251.209.46","216.58.204.142"],"T0":0.00128,"T":0.394264}],"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.419487,"TLSHandshakeT":0.466341,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.204.142","Port":"443","Endpoint":"216.58.204.142:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null},"9":{"TransactionID":9,"Proto":"tcp","IPAddress":"2a00:1450:4002:403::200e","Port":"443","Endpoint":"[2a00:1450:4002:403::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396408,"TCPConnectT":0.416441,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":[{"TransactionID":1,"QueryType":"AAAA","QueryHostname":"www.youtube.com","Failure":"","Engine":"udp","ResolverAddress":"8.8.4.4:53","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e"],"T0":0.000471,"T":0.019782}],"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.416468,"TLSHandshakeT":0.46288,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"2a00:1450:4002:403::200e","Port":"443","Endpoint":"[2a00:1450:4002:403::200e]:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"unknown_failure: http_request_canceled","HTTPResponseStatusCode":0,"HTTPResponseBodyLength":0,"HTTPResponseBodyIsTruncated":false,"HTTPResponseHeadersKeys":{},"HTTPResponseTitle":null}},"WebFinalRequest":{"TransactionID":7,"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectT0":0.396053,"TCPConnectT":0.411923,"TCPConnectFailure":"","DNSDomainName":null,"DNSLookupGetaddrinfoXref":[{"TransactionID":3,"QueryType":"ANY","QueryHostname":"www.youtube.com","Failure":"","Engine":"getaddrinfo","ResolverAddress":"","IPAddrs":["2a00:1450:4002:402::200e","2a00:1450:4002:403::200e","2a00:1450:4002:410::200e","2a00:1450:4002:416::200e","142.250.180.174","216.58.205.46","142.251.209.14","142.251.209.46","216.58.209.46","216.58.204.142","142.250.180.142"],"T0":0.000966,"T":0.020698}],"DNSLookupUDPXref":null,"DNSLookupHTTPSXref":null,"DNSLookupTHXref":false,"QUICHandshakeT0":null,"QUICHandshakeT":null,"QUICHandshakeFailure":null,"TLSHandshakeT0":0.411989,"TLSHandshakeT":0.452334,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com","TLSVersion":"TLSv1.3","TLSCipherSuite":"TLS_AES_128_GCM_SHA256","TLSNegotiatedProtocol":"h2","THEndpointXref":{"Proto":"tcp","IPAddress":"216.58.209.46","Port":"443","Endpoint":"216.58.209.46:443/tcp","IPAddressASN":15169,"IPAddressIsBogon":false,"TCPConnectFailure":"","QUICHandshakeFailure":null,"TLSHandshakeFailure":"","TLSServerName":"www.youtube.com"},"HTTPRequestURL":"https://www.youtube.com/","HTTPFailure":"","HTTPResponseStatusCode":200,"HTTPResponseBodyLength":524298,"HTTPResponseBodyIsTruncated":true,"HTTPResponseHeadersKeys":{"Accept-Ch":1,"Accept-Ranges":1,"Alt-Svc":1,"Cache-Control":1,"Content-Type":1,"Cross-Origin-Opener-Policy":1,"Date":1,"Expires":1,"Origin-Trial":1,"P3p":1,"Permissions-Policy":1,"Pragma":1,"Report-To":1,"Server":1,"Set-Cookie":1,"Strict-Transport-Security":1,"Vary":1,"X-Content-Type-Options":1,"X-Frame-Options":1,"X-Xss-Protection":1},"HTTPResponseTitle":"YouTube"}} \ No newline at end of file diff --git a/internal/pipeline/th.go b/internal/pipeline/th.go index 57f9965d0..8fde14d25 100644 --- a/internal/pipeline/th.go +++ b/internal/pipeline/th.go @@ -38,13 +38,13 @@ type EndpointObservationTH struct { IPAddressIsBogon bool // TCPConnectFailure is the error that occurred. - TCPConnectFailure optional.Value[*string] + TCPConnectFailure optional.Value[Failure] // QUICHandshakeFailure is the error that occurred. - QUICHandshakeFailure optional.Value[*string] + QUICHandshakeFailure optional.Value[Failure] // TLSHandshakeFailure is the error that occurred. - TLSHandshakeFailure optional.Value[*string] + TLSHandshakeFailure optional.Value[Failure] // TLSServerName is the SNI value. TLSServerName optional.Value[string] @@ -59,7 +59,7 @@ type EndpointObservationTH struct { // and adapts the WebControlObservation type to probe-engine. type WebObservationTH struct { // HTTPFailure is the error that occurred. - HTTPFailure optional.Value[*string] + HTTPFailure optional.Value[Failure] // HTTPResponseStatusCode is the response status code. HTTPResponseStatusCode optional.Value[int64] @@ -75,9 +75,9 @@ type WebObservationTH struct { } func (db *DB) thAddDNS(resp *model.THResponse) error { - db.thDNSFailure = resp.DNS.Failure + db.THDNSFailure = NewFailure(resp.DNS.Failure) for _, addr := range resp.DNS.Addrs { - db.thDNSAddrs[addr] = true + db.THDNSAddrs[addr] = true } return nil } @@ -99,14 +99,14 @@ func (db *DB) thAddTCPConnect(resp *model.THResponse) error { // Implementation note: because we're reading a map, we can't have duplicates // so we can blindly insert into the destination map here - db.thEpntByEpnt[endpoint] = &EndpointObservationTH{ + db.THEpntByEpnt[endpoint] = &EndpointObservationTH{ Proto: "tcp", IPAddress: addr, Port: port, Endpoint: endpoint, IPAddressASN: asn, IPAddressIsBogon: netxlite.IsBogon(addr), - TCPConnectFailure: optional.Some(status.Failure), + TCPConnectFailure: optional.Some(NewFailure(status.Failure)), } } return nil @@ -116,13 +116,13 @@ func (db *DB) thAddTLSHandshake(resp *model.THResponse) error { for addrport, status := range resp.TLSHandshake { endpoint := fmt.Sprintf("%s/tcp", addrport) - entry, found := db.thEpntByEpnt[endpoint] + entry, found := db.THEpntByEpnt[endpoint] if !found { return errInconsistentTHResponse } entry.TLSServerName = optional.Some(status.ServerName) - entry.TLSHandshakeFailure = optional.Some(status.Failure) + entry.TLSHandshakeFailure = optional.Some(NewFailure(status.Failure)) } return nil } @@ -130,12 +130,12 @@ func (db *DB) thAddTLSHandshake(resp *model.THResponse) error { var errAlreadyExistingTHWeb = errors.New("analysis: thWeb already exists") func (db *DB) thAddHTTPResponse(resp *model.THResponse) error { - if !db.thWeb.IsNone() { + if !db.THWeb.IsNone() { return errAlreadyExistingTHWeb } - db.thWeb = optional.Some(&WebObservationTH{ - HTTPFailure: optional.Some(resp.HTTPRequest.Failure), + db.THWeb = optional.Some(&WebObservationTH{ + HTTPFailure: optional.Some(NewFailure(resp.HTTPRequest.Failure)), HTTPResponseStatusCode: optional.Some(resp.HTTPRequest.StatusCode), HTTPResponseBodyLength: optional.Some(resp.HTTPRequest.BodyLength), HTTPResponseHeadersKeys: func() (out map[string]Origin) { diff --git a/internal/pipeline/web.go b/internal/pipeline/web.go index d6b4f44f7..584b47a6a 100644 --- a/internal/pipeline/web.go +++ b/internal/pipeline/web.go @@ -48,10 +48,7 @@ type WebEndpointObservation struct { TCPConnectT optional.Value[float64] // TCPConnectFailure is the error that occurred. - TCPConnectFailure optional.Value[*string] - - // DNSDomainName is the domain name that produced this IP address. - DNSDomainName optional.Value[string] + TCPConnectFailure optional.Value[Failure] // DNSLookupGetaddrinfoXref contains references to the getaddrinfo // based DNS lookups that produced this IP address. @@ -75,7 +72,7 @@ type WebEndpointObservation struct { QUICHandshakeT optional.Value[float64] // QUICHandshakeFailure is the error that occurred. - QUICHandshakeFailure optional.Value[*string] + QUICHandshakeFailure optional.Value[Failure] // TLSHandshakeT0 is when we started handshaking. TLSHandshakeT0 optional.Value[float64] @@ -84,7 +81,7 @@ type WebEndpointObservation struct { TLSHandshakeT optional.Value[float64] // TLSHandshakeFailure is the error that occurred. - TLSHandshakeFailure optional.Value[*string] + TLSHandshakeFailure optional.Value[Failure] // TLSServerName is the SNI value. TLSServerName optional.Value[string] @@ -105,7 +102,7 @@ type WebEndpointObservation struct { HTTPRequestURL optional.Value[string] // HTTPFailure is the error that occurred. - HTTPFailure optional.Value[*string] + HTTPFailure optional.Value[Failure] // HTTPResponseStatusCode is the response status code. HTTPResponseStatusCode optional.Value[int64] @@ -145,7 +142,7 @@ func (db *DB) addNetworkEventsTCPConnect(evs ...*model.ArchivalNetworkEvent) err wobs.IPAddressIsBogon = netxlite.IsBogon(addr) wobs.TCPConnectT0 = optional.Some(ev.T0) wobs.TCPConnectT = optional.Some(ev.T) - wobs.TCPConnectFailure = optional.Some(ev.Failure) + wobs.TCPConnectFailure = optional.Some(NewFailure(ev.Failure)) default: // nothing @@ -162,7 +159,7 @@ func (db *DB) addTLSHandshakeEvents(evs ...*model.ArchivalTLSOrQUICHandshakeResu } wobs.TLSHandshakeT0 = optional.Some(ev.T0) wobs.TLSHandshakeT = optional.Some(ev.T) - wobs.TLSHandshakeFailure = optional.Some(ev.Failure) + wobs.TLSHandshakeFailure = optional.Some(NewFailure(ev.Failure)) wobs.TLSServerName = optional.Some(ev.ServerName) wobs.TLSVersion = optional.Some(ev.TLSVersion) wobs.TLSCipherSuite = optional.Some(ev.CipherSuite) @@ -191,7 +188,7 @@ func (db *DB) addQUICHandshakeEvents(evs ...*model.ArchivalTLSOrQUICHandshakeRes wobs.IPAddressIsBogon = netxlite.IsBogon(addr) wobs.QUICHandshakeT0 = optional.Some(ev.T0) wobs.QUICHandshakeT = optional.Some(ev.T) - wobs.QUICHandshakeFailure = optional.Some(ev.Failure) + wobs.QUICHandshakeFailure = optional.Some(NewFailure(ev.Failure)) wobs.TLSServerName = optional.Some(ev.ServerName) wobs.TLSVersion = optional.Some(ev.TLSVersion) wobs.TLSCipherSuite = optional.Some(ev.CipherSuite) @@ -207,7 +204,7 @@ func (db *DB) addHTTPRoundTrips(evs ...*model.ArchivalHTTPRequestResult) error { return err } wobs.HTTPRequestURL = optional.Some(ev.Request.URL) - wobs.HTTPFailure = optional.Some(ev.Failure) + wobs.HTTPFailure = optional.Some(NewFailure(ev.Failure)) wobs.HTTPResponseStatusCode = optional.Some(ev.Response.Code) wobs.HTTPResponseBodyLength = optional.Some(int64(len(ev.Response.Body))) wobs.HTTPResponseBodyIsTruncated = optional.Some(ev.Response.BodyIsTruncated) @@ -225,9 +222,9 @@ func (db *DB) addHTTPRoundTrips(evs ...*model.ArchivalHTTPRequestResult) error { var errNoSuchTransaction = errors.New("analysis: no such transaction") func (db *DB) getWebEndpointObservation(txid int64) (*WebEndpointObservation, error) { - wobs, good := db.webByTxID[txid] + wobs, good := db.WebByTxID[txid] if !good { - return nil, errNoSuchTransaction + return nil, fmt.Errorf("%w: %d", errNoSuchTransaction, txid) } return wobs, nil } @@ -235,12 +232,12 @@ func (db *DB) getWebEndpointObservation(txid int64) (*WebEndpointObservation, er var errTransactionAlreadyExists = errors.New("analysis: transaction already exists") func (db *DB) newWebEndpointObservation(txid int64) (*WebEndpointObservation, error) { - if _, good := db.webByTxID[txid]; good { + if _, good := db.WebByTxID[txid]; good { return nil, errTransactionAlreadyExists } wobs := &WebEndpointObservation{ TransactionID: txid, } - db.webByTxID[txid] = wobs + db.WebByTxID[txid] = wobs return wobs, nil } From ff42f3cb16e17839cae021b7ef1801c6b908ac18 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Fri, 24 Nov 2023 10:15:15 +0100 Subject: [PATCH 15/66] break the code in a different way Because I am dropping the requests again, we break again the tests with the redirects. I could possibly fix it by putting requests back again but I am not super happy about doing this because that would cause the DSL to do some strange work and I'd honestly rather not do this. --- .../webconnectivitylte/analysishttpcore.go | 12 ++ .../webconnectivitylte/cleartextflow.go | 93 ++++++------- .../webconnectivitylte/httpfailure.go | 28 ---- .../webconnectivitylte/httpredirect.go | 65 +++++++++ .../webconnectivitylte/secureflow.go | 127 +++++++++--------- 5 files changed, 188 insertions(+), 137 deletions(-) delete mode 100644 internal/experiment/webconnectivitylte/httpfailure.go create mode 100644 internal/experiment/webconnectivitylte/httpredirect.go diff --git a/internal/experiment/webconnectivitylte/analysishttpcore.go b/internal/experiment/webconnectivitylte/analysishttpcore.go index 794bfbd87..6113489e4 100644 --- a/internal/experiment/webconnectivitylte/analysishttpcore.go +++ b/internal/experiment/webconnectivitylte/analysishttpcore.go @@ -73,6 +73,18 @@ func (tk *TestKeys) analysisHTTPToplevel(logger model.Logger) { return } + // Make sure that the request is "final". This means that the request + // is not a redirect. If it's a redirect we can't compare to the + // final request by the TH. If you find this choice tricky, here's + // why we're doing this. We only save request entries when we actually + // attempt doing HTTP. So, if there is a redirect with a TCP or TLS + // error, there's no request to compare to. Yet, this means that a + // previous request MAY be considered as final and compared against + // the TH response, which would obviously be wrong. + if httpRedirectIsRedirect(finalRequest.Response.Code) { + return + } + // fallback to the HTTP diff algo. tk.analysisHTTPDiff(logger, finalRequest, &ctrl) } diff --git a/internal/experiment/webconnectivitylte/cleartextflow.go b/internal/experiment/webconnectivitylte/cleartextflow.go index 4af51d5c8..264e7553c 100644 --- a/internal/experiment/webconnectivitylte/cleartextflow.go +++ b/internal/experiment/webconnectivitylte/cleartextflow.go @@ -8,7 +8,6 @@ package webconnectivitylte import ( "context" - "errors" "io" "net" "net/http" @@ -132,17 +131,19 @@ func (t *CleartextFlow) Run(parentCtx context.Context, index int64) error { tcpDialer := trace.NewDialerWithoutResolver(t.Logger) tcpConn, err := tcpDialer.DialContext(tcpCtx, "tcp", t.Address) t.TestKeys.AppendTCPConnectResults(trace.TCPConnects()...) - t.TestKeys.AppendNetworkEvents(trace.NetworkEvents()...) + t.TestKeys.AppendNetworkEvents(trace.NetworkEvents()...) // BUGFIX: EXPLAIN if err != nil { - // TODO(bassosimone): document why we're adding a request to the heap here - t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( - trace, - "tcp", - t.Address, - "", - httpReq, - err, - )) + /* + // TODO(bassosimone): document why we're adding a request to the heap here + t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( + trace, + "tcp", + t.Address, + "", + httpReq, + err, + )) + */ ol.Stop(err) return err } @@ -155,15 +156,17 @@ func (t *CleartextFlow) Run(parentCtx context.Context, index int64) error { // Determine whether we're allowed to fetch the webpage if t.PrioSelector == nil || !t.PrioSelector.permissionToFetch(t.Address) { - // TODO(bassosimone): document why we're adding a request to the heap here - t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( - trace, - "tcp", - t.Address, - "", - httpReq, - errors.New("http_request_canceled"), // TODO(bassosimone): define this error - )) + /* + // TODO(bassosimone): document why we're adding a request to the heap here + t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( + trace, + "tcp", + t.Address, + "", + httpReq, + errors.New("http_request_canceled"), // TODO(bassosimone): define this error + )) + */ ol.Stop("stop after TCP connect") return errNotPermittedToFetch } @@ -306,31 +309,29 @@ func (t *CleartextFlow) maybeFollowRedirects(ctx context.Context, resp *http.Res if !t.FollowRedirects || !t.NumRedirects.CanFollowOneMoreRedirect() { return // not configured or too many redirects } - switch resp.StatusCode { - case 301, 302, 307, 308: - location, err := resp.Location() - if err != nil { - return // broken response from server - } - t.Logger.Infof("redirect to: %s", location.String()) - resolvers := &DNSResolvers{ - CookieJar: t.CookieJar, - DNSCache: t.DNSCache, - Domain: location.Hostname(), - IDGenerator: t.IDGenerator, - Logger: t.Logger, - NumRedirects: t.NumRedirects, - TestKeys: t.TestKeys, - URL: location, - ZeroTime: t.ZeroTime, - WaitGroup: t.WaitGroup, - Referer: resp.Request.URL.String(), - Session: nil, // no need to issue another control request - TestHelpers: nil, // ditto - UDPAddress: t.UDPAddress, - } - resolvers.Start(ctx) - default: - // no redirect to follow + + locationx, err := httpRedirectLocation(resp) + if err != nil || locationx.IsNone() { + return + } + location := locationx.Unwrap() + + t.Logger.Infof("redirect to: %s", location.String()) + resolvers := &DNSResolvers{ + CookieJar: t.CookieJar, + DNSCache: t.DNSCache, + Domain: location.Hostname(), + IDGenerator: t.IDGenerator, + Logger: t.Logger, + NumRedirects: t.NumRedirects, + TestKeys: t.TestKeys, + URL: location, + ZeroTime: t.ZeroTime, + WaitGroup: t.WaitGroup, + Referer: resp.Request.URL.String(), + Session: nil, // no need to issue another control request + TestHelpers: nil, // ditto + UDPAddress: t.UDPAddress, } + resolvers.Start(ctx) } diff --git a/internal/experiment/webconnectivitylte/httpfailure.go b/internal/experiment/webconnectivitylte/httpfailure.go deleted file mode 100644 index 4d0ef73cf..000000000 --- a/internal/experiment/webconnectivitylte/httpfailure.go +++ /dev/null @@ -1,28 +0,0 @@ -package webconnectivitylte - -import ( - "net/http" - - "github.com/ooni/probe-cli/v3/internal/measurexlite" - "github.com/ooni/probe-cli/v3/internal/model" -) - -// TODO(bassosimone): document this func -func newArchivalHTTPRequestResultWithError(trace *measurexlite.Trace, network, address, alpn string, - req *http.Request, err error) *model.ArchivalHTTPRequestResult { - duration := trace.TimeSince(trace.ZeroTime()) - return measurexlite.NewArchivalHTTPRequestResult( - trace.Index(), - duration, - network, - address, - alpn, - network, // TODO(bassosimone): get rid of this duplicate field? - req, - nil, - 0, - nil, - err, - duration, - ) -} diff --git a/internal/experiment/webconnectivitylte/httpredirect.go b/internal/experiment/webconnectivitylte/httpredirect.go new file mode 100644 index 000000000..0af52a21c --- /dev/null +++ b/internal/experiment/webconnectivitylte/httpredirect.go @@ -0,0 +1,65 @@ +package webconnectivitylte + +import ( + "net/http" + "net/url" + + "github.com/ooni/probe-cli/v3/internal/optional" +) + +/* +// TODO(bassosimone): document this func +func newArchivalHTTPRequestResultWithError(trace *measurexlite.Trace, network, address, alpn string, + req *http.Request, err error) *model.ArchivalHTTPRequestResult { + duration := trace.TimeSince(trace.ZeroTime()) + return measurexlite.NewArchivalHTTPRequestResult( + trace.Index(), + duration, + network, + address, + alpn, + network, // TODO(bassosimone): get rid of this duplicate field? + req, + nil, + 0, + nil, + err, + duration, + ) +} +*/ + +// httpRedirectIsRedirect returns true if the status code contains a redirect. +func httpRedirectIsRedirect(status int64) bool { + switch status { + case 301, 302, 307, 308: + return true + default: + return false + } +} + +// httpRedirectLocation returns a possibly-empty redirect URL or an error. More specifically: +// +// 1. the redirect URL is empty and the error nil if there's no redirect in resp; +// +// 2. the redirect URL is non-empty and the error is nil if there's a redirect in resp; +// +// 3. the error is non-nil if there's an error. +// +// Note that this function MAY possibly attempt to reconstruct the full redirect URL +// in cases in which we're dealing with a partial redirect such as '/en_US/index.html'. +func httpRedirectLocation(resp *http.Response) (optional.Value[*url.URL], error) { + if !httpRedirectIsRedirect(int64(resp.StatusCode)) { + return optional.None[*url.URL](), nil + } + + location, err := resp.Location() + if err != nil { + return optional.None[*url.URL](), err + } + + // TODO(https://github.com/ooni/probe/issues/2628): we need to handle + // the case where the redirect URL is incomplete + return optional.Some(location), nil +} diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index fcedfde51..a000af66d 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -9,7 +9,6 @@ package webconnectivitylte import ( "context" "crypto/tls" - "errors" "io" "net" "net/http" @@ -177,19 +176,21 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { tcpDialer := trace.NewDialerWithoutResolver(t.Logger) tcpConn, err := tcpDialer.DialContext(tcpCtx, "tcp", t.Address) t.TestKeys.AppendTCPConnectResults(trace.TCPConnects()...) - t.TestKeys.AppendNetworkEvents(trace.NetworkEvents()...) + t.TestKeys.AppendNetworkEvents(trace.NetworkEvents()...) // BUGFIX: EXPLAIN if err != nil { - // TODO(bassosimone): document why we're adding a request to the heap here - if t.PrioSelector != nil { - t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( - trace, - "tcp", - t.Address, - "", - httpReq, - err, - )) - } + /* + // TODO(bassosimone): document why we're adding a request to the heap here + if t.PrioSelector != nil { + t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( + trace, + "tcp", + t.Address, + "", + httpReq, + err, + )) + } + */ ol.Stop(err) return err } @@ -220,17 +221,19 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { tlsConn, err := tlsHandshaker.Handshake(tlsCtx, tcpConn, tlsConfig) t.TestKeys.AppendTLSHandshakes(trace.TLSHandshakes()...) if err != nil { - // TODO(bassosimone): document why we're adding a request to the heap here - if t.PrioSelector != nil { - t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( - trace, - "tcp", - t.Address, - "", - httpReq, - err, - )) - } + /* + // TODO(bassosimone): document why we're adding a request to the heap here + if t.PrioSelector != nil { + t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( + trace, + "tcp", + t.Address, + "", + httpReq, + err, + )) + } + */ ol.Stop(err) return err } @@ -241,17 +244,19 @@ func (t *SecureFlow) Run(parentCtx context.Context, index int64) error { // Determine whether we're allowed to fetch the webpage if t.PrioSelector == nil || !t.PrioSelector.permissionToFetch(t.Address) { - // TODO(bassosimone): document why we're adding a request to the heap here - if t.PrioSelector != nil { - t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( - trace, - "tcp", - t.Address, - "", - httpReq, - errors.New("http_request_canceled"), // TODO(bassosimone): define this error - )) - } + /* + // TODO(bassosimone): document why we're adding a request to the heap here + if t.PrioSelector != nil { + t.TestKeys.PrependRequests(newArchivalHTTPRequestResultWithError( + trace, + "tcp", + t.Address, + "", + httpReq, + errors.New("http_request_canceled"), // TODO(bassosimone): define this error + )) + } + */ ol.Stop("stop after TLS handshake") return errNotPermittedToFetch } @@ -434,33 +439,29 @@ func (t *SecureFlow) maybeFollowRedirects(ctx context.Context, resp *http.Respon if !t.FollowRedirects || !t.NumRedirects.CanFollowOneMoreRedirect() { return // not configured or too many redirects } - switch resp.StatusCode { - case 301, 302, 307, 308: - location, err := resp.Location() - if err != nil { - return // broken response from server - } - // TODO(https://github.com/ooni/probe/issues/2628): we need to handle - // the case where the redirect URL is incomplete - t.Logger.Infof("redirect to: %s", location.String()) - resolvers := &DNSResolvers{ - CookieJar: t.CookieJar, - DNSCache: t.DNSCache, - Domain: location.Hostname(), - IDGenerator: t.IDGenerator, - Logger: t.Logger, - NumRedirects: t.NumRedirects, - TestKeys: t.TestKeys, - URL: location, - ZeroTime: t.ZeroTime, - WaitGroup: t.WaitGroup, - Referer: resp.Request.URL.String(), - Session: nil, // no need to issue another control request - TestHelpers: nil, // ditto - UDPAddress: t.UDPAddress, - } - resolvers.Start(ctx) - default: - // no redirect to follow + + locationx, err := httpRedirectLocation(resp) + if err != nil || locationx.IsNone() { + return + } + location := locationx.Unwrap() + + t.Logger.Infof("redirect to: %s", location.String()) + resolvers := &DNSResolvers{ + CookieJar: t.CookieJar, + DNSCache: t.DNSCache, + Domain: location.Hostname(), + IDGenerator: t.IDGenerator, + Logger: t.Logger, + NumRedirects: t.NumRedirects, + TestKeys: t.TestKeys, + URL: location, + ZeroTime: t.ZeroTime, + WaitGroup: t.WaitGroup, + Referer: resp.Request.URL.String(), + Session: nil, // no need to issue another control request + TestHelpers: nil, // ditto + UDPAddress: t.UDPAddress, } + resolvers.Start(ctx) } From 5ad88d53adf70cff6d1eeae0320e8c206d6bda5d Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Fri, 24 Nov 2023 14:07:58 +0100 Subject: [PATCH 16/66] feat: rewrite the pipeline to match ooni/data more closely --- internal/cmd/minipipeline/main.go | 32 ++ .../webconnectivity/httpanalysis.go | 2 +- .../webconnectivitylte/analysishttpdiff.go | 2 +- internal/measurexlite/web.go | 15 +- internal/measurexlite/web_test.go | 2 +- internal/minipipeline/doc.go | 3 + internal/minipipeline/web.go | 514 ++++++++++++++++++ internal/oohelperd/http.go | 2 +- internal/pipeline/canonical.go | 3 + internal/pipeline/web.go | 2 +- 10 files changed, 566 insertions(+), 11 deletions(-) create mode 100644 internal/cmd/minipipeline/main.go create mode 100644 internal/minipipeline/doc.go create mode 100644 internal/minipipeline/web.go diff --git a/internal/cmd/minipipeline/main.go b/internal/cmd/minipipeline/main.go new file mode 100644 index 000000000..e89a985e6 --- /dev/null +++ b/internal/cmd/minipipeline/main.go @@ -0,0 +1,32 @@ +package main + +import ( + "os" + + "github.com/ooni/probe-cli/v3/internal/minipipeline" + "github.com/ooni/probe-cli/v3/internal/must" + "github.com/ooni/probe-cli/v3/internal/pipeline" +) + +func main() { + rawMeasurement := must.ReadFile(os.Args[1]) + var meas pipeline.CanonicalMeasurement + must.UnmarshalJSON(rawMeasurement, &meas) + + container := minipipeline.NewWebObservationsContainer() + container.CreateDNSLookupFailures(meas.TestKeys.Unwrap().Queries...) + container.CreateKnownIPAddresses(meas.TestKeys.Unwrap().Queries...) + container.CreateKnownTCPEndpoints(meas.TestKeys.Unwrap().TCPConnect...) + container.NoteTLSHandshakeResults(meas.TestKeys.Unwrap().TLSHandshakes...) + container.NoteHTTPRoundTripResults(meas.TestKeys.Unwrap().Requests...) + container.NoteControlResults(meas.TestKeys.Unwrap().XControlRequest.Unwrap(), meas.TestKeys.Unwrap().Control.Unwrap()) + + must.WriteFile("db.json", must.MarshalJSON(container), 0600) + + /* + ax := &pipeline.Analysis{} + ax.ComputeAllValues(db) + + must.WriteFile("ax.json", must.MarshalJSON(ax), 0600) + */ +} diff --git a/internal/experiment/webconnectivity/httpanalysis.go b/internal/experiment/webconnectivity/httpanalysis.go index 65ea775b3..23d27d7ea 100644 --- a/internal/experiment/webconnectivity/httpanalysis.go +++ b/internal/experiment/webconnectivity/httpanalysis.go @@ -202,7 +202,7 @@ func HTTPTitleMatch(tk urlgetter.TestKeys, ctrl ControlResponse) (out *bool) { } control := ctrl.HTTPRequest.Title measurementBody := string(response.Body) - measurement := measurexlite.WebGetTitle(measurementBody) + measurement := measurexlite.WebGetTitleString(measurementBody) if measurement == "" { return } diff --git a/internal/experiment/webconnectivitylte/analysishttpdiff.go b/internal/experiment/webconnectivitylte/analysishttpdiff.go index b25a73950..32475648e 100644 --- a/internal/experiment/webconnectivitylte/analysishttpdiff.go +++ b/internal/experiment/webconnectivitylte/analysishttpdiff.go @@ -231,7 +231,7 @@ func (tk *TestKeys) httpDiffTitleMatch( } control := ctrl.Title measurementBody := string(response.Body) - measurement := measurexlite.WebGetTitle(measurementBody) + measurement := measurexlite.WebGetTitleString(measurementBody) if control == "" || measurement == "" { return } diff --git a/internal/measurexlite/web.go b/internal/measurexlite/web.go index adc03da6e..625cc3d74 100644 --- a/internal/measurexlite/web.go +++ b/internal/measurexlite/web.go @@ -6,12 +6,15 @@ package measurexlite import "regexp" -// WebGetTitle returns the title or an empty string. -func WebGetTitle(measurementBody string) string { - // MK used {1,128} but we're making it larger here to get longer titles - // e.g. 's one - re := regexp.MustCompile(`(?i)([^<]{1,512})`) - v := re.FindStringSubmatch(measurementBody) +// webTitleRegexp is the regexp to extract the title +// +// MK used {1,128} but we're making it larger here to get longer titles +// e.g. 's one +var webTitleRegexp = regexp.MustCompile(`(?i)([^<]{1,512})`) + +// WebGetTitleString returns the title or an empty string. +func WebGetTitleString(measurementBody string) string { + v := webTitleRegexp.FindStringSubmatch(measurementBody) if len(v) < 2 { return "" } diff --git a/internal/measurexlite/web_test.go b/internal/measurexlite/web_test.go index 115ae3410..7f2e8f014 100644 --- a/internal/measurexlite/web_test.go +++ b/internal/measurexlite/web_test.go @@ -54,7 +54,7 @@ func TestWebGetTitle(t *testing.T) { }} for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - gotOut := WebGetTitle(tt.args.body) + gotOut := WebGetTitleString(tt.args.body) if diff := cmp.Diff(tt.wantOut, gotOut); diff != "" { t.Fatal(diff) } diff --git a/internal/minipipeline/doc.go b/internal/minipipeline/doc.go new file mode 100644 index 000000000..4ebc4167f --- /dev/null +++ b/internal/minipipeline/doc.go @@ -0,0 +1,3 @@ +// Package minipipeline implements a minimal data processing pipeline used +// to analyze local measurements collected by OONI Probe. +package minipipeline diff --git a/internal/minipipeline/web.go b/internal/minipipeline/web.go new file mode 100644 index 000000000..23e906746 --- /dev/null +++ b/internal/minipipeline/web.go @@ -0,0 +1,514 @@ +package minipipeline + +import ( + "net" + "net/url" + "strconv" + "strings" + + "github.com/ooni/probe-cli/v3/internal/geoipx" + "github.com/ooni/probe-cli/v3/internal/measurexlite" + "github.com/ooni/probe-cli/v3/internal/model" + "github.com/ooni/probe-cli/v3/internal/netxlite" + "github.com/ooni/probe-cli/v3/internal/optional" +) + +// WebObservation is an observation of the flow that starts with a DNS lookup that +// discovers zero or more IP addresses and proceeds with endpoint operations such as +// TCP connect, TLS handshake, QUIC handshake, and HTTP round trips. +// +// A key property of the [WebObservation] is that there is a single failure mode +// for the whole [WebObservation]. If the DNS fails, there are no IP addresses to +// construct endpoints. If TCP connect fails, there is no connection to use for +// a TLS handshake. If QUIC fails, there is no connection. If there is no connection +// we cannot attempt sending an HTTP request, so there's no HTTP round trip. +// +// We borrow this design from https://github.com/ooni/data. +type WebObservation struct { + // ContainsDNSLookupInfo is true if this record contains DNS lookup information. + ContainsDNSLookupInfo bool + + // DNSTransactionIDs contains the IDs of the DNS transactions that caused this + // specific [WebObservation] to be generated by the mini pipeline. + DNSTransactionIDs []int64 + + // DNSDomain is the domain from which we resolved the IP address. This field + // is empty whne this record wasn't generated by a DNS lookup. + DNSDomain optional.Value[string] + + // DNSLookupFailure is the failure that occurred during the DNS lookup. + DNSLookupFailure optional.Value[string] + + // DNSQueryType is the type of the DNS query. + DNSQueryType optional.Value[string] + + // IPAddress is the optional IP address that this observation is about. We derive this value + // either from one or more DNS lookups, or because it's part of the input URL. When it's + // empty, it means the associated DNS lookup operation failed. + IPAddress optional.Value[string] + + // IPAddressASN is the optional ASN associated to this IP address as discovered by + // the probe while performing the measurement. When this field is empty, it means + // that the probe failed to discover the IP address ASN. + IPAddressASN optional.Value[int64] + + // IPAddressOrg is the optional organization name associated to this IP adddress + // as discovered by the probe while performing the measurement. When this field is + // empty, it means that the probe failed to discover the IP address org. + IPAddressOrg optional.Value[string] + + // IPAddressBogon is true if IPAddres is a bogon. + IPAddressBogon bool + + // EndpointTransactionID is the transaction ID used by this endpoint. + EndpointTransactionID int64 + + // EndpointProto is either "tcp" or "udp". + EndpointProto string + + // EndpointPort is the port used by this endpoint. + EndpointPort string + + // EndpointAddress is "${IPAddress}:${EndpointPort}" where "${IPAddress}" is + // quoted using "[" and "]" in case of IPv6. + EndpointAddress string + + // ContainsTCPConnectInfo is true if this struct contains TCP connect information. + ContainsTCPConnectInfo bool + + // TCPConnectFailure is the optional TCP connect failure. + TCPConnectFailure optional.Value[string] + + // ContainsTLSHandshakeInfo is true if this struct contains TLS handshake information. + ContainsTLSHandshakeInfo bool + + // TLSHandshakeFailure is the optional TLS handshake failure. + TLSHandshakeFailure optional.Value[string] + + // TLSServerName is the optional TLS server name used. + TLSServerName optional.Value[string] + + // ContainsHTTPRoundTripInfo is true if this struct contains HTTP round trip information. + ContainsHTTPRoundTripInfo bool + + // HTTPRequestURL is the HTTP request URL. + HTTPRequestURL optional.Value[string] + + // HTTPFailure is the error that occurred. + HTTPFailure optional.Value[string] + + // HTTPResponseStatusCode is the response status code. + HTTPResponseStatusCode optional.Value[int64] + + // HTTPResponseBodyLength is the length of the response body. + HTTPResponseBodyLength optional.Value[int64] + + // HTTPResponseBodyIsTruncated indicates whether the response body is truncated. + HTTPResponseBodyIsTruncated optional.Value[bool] + + // HTTPResponseHeadersKeys contains the response headers keys. + HTTPResponseHeadersKeys map[string]bool + + // HTTPResponseLocation contains the location we're redirected to. + HTTPResponseLocation optional.Value[string] + + // HTTPResponseTitle contains the response title. + HTTPResponseTitle optional.Value[string] + + // ContainsControlDNSLookupInfo is true if we have DNS lookup info from the control. + ContainsControlDNSLookupInfo bool + + // ControlDNSLookupFailure is the corresponding control DNS lookup failure. + ControlDNSLookupFailure optional.Value[string] + + // ContainsControlTCPConnectInfo is true if we have TCP connect info from the control. + ContainsControlTCPConnectInfo bool + + // ControlTCPConnectFailure is the control's TCP connect failure. + ControlTCPConnectFailure optional.Value[string] + + // MatchWithControlIPAddress is true if also the control resolved this IP address. + MatchWithControlIPAddress optional.Value[bool] + + // MatchWithControlIPAddressASN is true if also the control resolved from the same ASN. + MatchWithControlIPAddressASN optional.Value[bool] + + // ContainsControlTLSHandshakeInfo is true if we have TLS handshake info from the control. + ContainsControlTLSHandshakeInfo bool + + // ControlTLSHandshakeFailure is the control's TLS handshake failure. + ControlTLSHandshakeFailure optional.Value[string] + + // ContainsControlHTTPInfo is true if we have HTTP info from the control. + ContainsControlHTTPInfo bool + + // ControlHTTPFailure is the failure seen by the control. + ControlHTTPFailure optional.Value[string] + + // ControlHTTPResponseStatusCode is the status code seen by the control. + ControlHTTPResponseStatusCode optional.Value[int64] + + // ControlHTTPResponseBodyLength contains the control HTTP response body length. + ControlHTTPResponseBodyLength optional.Value[int64] + + // ControlHTTPResponseHeadersKeys contains the response headers keys. + ControlHTTPResponseHeadersKeys map[string]bool + + // ControlHTTPResponseTitle contains the title seen by the control. + ControlHTTPResponseTitle optional.Value[string] +} + +// WebObservationsContainer contains [*WebObservations]. +// +// The zero value of this struct is not ready to use, please use [NewWebObservationsContainer]. +type WebObservationsContainer struct { + // DNSLookupFailures maps domain names to DNS lookup failures. + DNSLookupFailures map[int64]*WebObservation + + // KnownTCPEndpoints maps a transaction ID to the corresponding observation. + KnownTCPEndpoints map[int64]*WebObservation + + // knownIPAddresses maps an IP address to the corresponding observation. + knownIPAddresses map[string]*WebObservation +} + +// NewWebObservationsContainer constructs a [*WebObservationsContainer]. +func NewWebObservationsContainer() *WebObservationsContainer { + return &WebObservationsContainer{ + DNSLookupFailures: map[int64]*WebObservation{}, + KnownTCPEndpoints: map[int64]*WebObservation{}, + knownIPAddresses: map[string]*WebObservation{}, + } +} + +// CreateDNSLookupFailures creates records for failed DNS lookups. +func (c *WebObservationsContainer) CreateDNSLookupFailures(evs ...*model.ArchivalDNSLookupResult) { + for _, ev := range evs { + // skip all the succesful queries + if ev.Failure == nil { + continue + } + + // create record + obs := &WebObservation{ + ContainsDNSLookupInfo: true, + DNSTransactionIDs: []int64{ev.TransactionID}, + DNSDomain: optional.Some(ev.Hostname), + DNSLookupFailure: optional.Some(*ev.Failure), + DNSQueryType: optional.Some(ev.QueryType), + } + + // add record + c.DNSLookupFailures[ev.TransactionID] = obs + } +} + +// CreateKnownIPAddresses creates known IP addresses from succesful DNS lookups. +func (c *WebObservationsContainer) CreateKnownIPAddresses(evs ...*model.ArchivalDNSLookupResult) { + for _, ev := range evs { + // skip all the failed queries + if ev.Failure != nil { + continue + } + + // walk through the answers + for _, answer := range ev.Answers { + // extract the IP address we resolved + var addr string + switch answer.AnswerType { + case "A": + addr = answer.IPv4 + case "AAAA": + addr = answer.IPv6 + default: + continue + } + + // create or fetch a record + obs, found := c.knownIPAddresses[addr] + if !found { + obs = &WebObservation{} + c.knownIPAddresses[addr] = obs + } + + // update the record + obs.ContainsDNSLookupInfo = true + obs.DNSTransactionIDs = append(obs.DNSTransactionIDs, ev.TransactionID) + obs.DNSDomain = optional.Some(ev.Hostname) + obs.DNSLookupFailure = optional.None[string]() + obs.DNSQueryType = optional.Some(ev.QueryType) + obs.IPAddress = optional.Some(addr) + if asn := answer.ASN; asn != 0 { + obs.IPAddressASN = optional.Some(int64(asn)) + } + if org := answer.ASOrgName; org != "" { + obs.IPAddressOrg = optional.Some(org) + } + obs.IPAddressBogon = netxlite.IsBogon(addr) + } + } +} + +// CreateKnownTCPEndpoints creates known TCP endpoints from TCP connect attempts. +func (c *WebObservationsContainer) CreateKnownTCPEndpoints(evs ...*model.ArchivalTCPConnectResult) { + for _, ev := range evs { + // create or fetch a record + obs, found := c.knownIPAddresses[ev.IP] + if !found { + obs = &WebObservation{ + IPAddress: optional.Some(ev.IP), + IPAddressBogon: netxlite.IsBogon(ev.IP), + } + if asn, asOrg, err := geoipx.LookupASN(ev.IP); err == nil { + obs.IPAddressASN = optional.Some(int64(asn)) + obs.IPAddressOrg = optional.Some(asOrg) + } + } + + // clone the record because the same IP address MAY belong + // to multiple endpoints across the same measurement + // + // while there also fill endpoint specific info + portString := strconv.Itoa(ev.Port) + obs = &WebObservation{ + ContainsDNSLookupInfo: obs.ContainsDNSLookupInfo, + DNSTransactionIDs: append([]int64{}, obs.DNSTransactionIDs...), + DNSDomain: obs.DNSDomain, + DNSLookupFailure: obs.DNSLookupFailure, + IPAddress: obs.IPAddress, + IPAddressASN: obs.IPAddressASN, + IPAddressOrg: obs.IPAddressOrg, + IPAddressBogon: obs.IPAddressBogon, + EndpointTransactionID: ev.TransactionID, + EndpointProto: "tcp", + EndpointPort: portString, + EndpointAddress: net.JoinHostPort(ev.IP, portString), + ContainsTCPConnectInfo: true, + TCPConnectFailure: optional.None[string](), + } + + // finish filling the endpoint + if value := ev.Status.Failure; value != nil { + obs.TCPConnectFailure = optional.Some(*value) + } + + // register the observation + c.KnownTCPEndpoints[ev.TransactionID] = obs + } +} + +// NoteTLSHandshakeResults updates endpoints taking into account TLS handshake results. +func (c *WebObservationsContainer) NoteTLSHandshakeResults(evs ...*model.ArchivalTLSOrQUICHandshakeResult) { + for _, ev := range evs { + // find the corresponding obs + obs, found := c.KnownTCPEndpoints[ev.TransactionID] + if !found { + continue + } + + // update the record + obs.ContainsTLSHandshakeInfo = true + if value := ev.Failure; value != nil { + obs.TLSHandshakeFailure = optional.Some(*value) + } + if value := ev.ServerName; value != "" { + obs.TLSServerName = optional.Some(value) + } + } +} + +// NoteHTTPRoundTripResults updates endpoints taking into account HTTP round trip results. +func (c *WebObservationsContainer) NoteHTTPRoundTripResults(evs ...*model.ArchivalHTTPRequestResult) { + for _, ev := range evs { + // find the corresponding obs + obs, found := c.KnownTCPEndpoints[ev.TransactionID] + if !found { + continue + } + + // update the record + obs.ContainsHTTPRoundTripInfo = true + obs.HTTPRequestURL = optional.Some(ev.Request.URL) + if value := ev.Failure; value != nil { + obs.HTTPFailure = optional.Some(*value) + } + if value := ev.Response.Code; value != 0 { + obs.HTTPResponseStatusCode = optional.Some(value) + } + if value := int64(len(ev.Response.Body)); value > 0 { + obs.HTTPResponseBodyLength = optional.Some(value) + } + obs.HTTPResponseBodyIsTruncated = optional.Some(ev.Request.BodyIsTruncated) + obs.HTTPResponseHeadersKeys = make(map[string]bool) + for key := range ev.Response.Headers { + obs.HTTPResponseHeadersKeys[key] = true + } + if value := measurexlite.WebGetTitleString(string(ev.Response.Body)); value != "" { + obs.HTTPResponseTitle = optional.Some(value) + } + for key, value := range ev.Response.Headers { + if strings.ToLower(key) == "location" { + obs.HTTPResponseLocation = optional.Some(string(value)) + } + } + } +} + +// NoteControlResults takes note of the control's results and updates observations accordingly. +func (c *WebObservationsContainer) NoteControlResults(req *model.THRequest, resp *model.THResponse) error { + + URL, err := url.Parse(req.HTTPRequest) + if err != nil { + return err + } + inputDomain := URL.Hostname() + + c.controlXrefDNSFailures(inputDomain, resp) + c.controlMatchDNSLookupResults(inputDomain, resp) + c.controlXrefEndpointFailures(resp) + c.controlXrefFinalHTTPResponse(resp) + + return nil +} + +func (c *WebObservationsContainer) controlMatchDNSLookupResults(inputDomain string, resp *model.THResponse) { + // rebuild the list of ASNs using the probe's database because we want to + // use the same exact database we used for processing the measurement + thASNMap := make(map[string]int64) + for _, addr := range resp.DNS.Addrs { + if asn, _, err := geoipx.LookupASN(addr); err == nil && asn != 0 { + thASNMap[addr] = int64(asn) + } + } + + // walk through the list of known observations + for _, obs := range c.KnownTCPEndpoints { + // skip entries without a domain to resolve (likely a bug) + domain := obs.DNSDomain.UnwrapOr("") + if domain == "" { + continue + } + + // skip entries using a different domain than the one used by the TH + if domain != inputDomain { + continue + } + + // skip entries without an IP address (likely a bug) + addr := obs.IPAddress.UnwrapOr("") + if addr == "" { + continue + } + + // attempt to access the TH's ASN map for the probe's address + thASN, found := thASNMap[addr] + + // register whether they both resolved the same IP address + obs.MatchWithControlIPAddress = optional.Some(found) + + // cannot continue unless we know the probe's ASN + ourASN := obs.IPAddressASN.UnwrapOr(0) + if ourASN == 0 { + continue + } + + // register whether there is matching in terms of the ASNs + obs.MatchWithControlIPAddressASN = optional.Some(thASN == ourASN) + } +} + +func (c *WebObservationsContainer) controlXrefDNSFailures(inputDomain string, resp *model.THResponse) { + for _, obs := range c.DNSLookupFailures { + // skip cases where we don't know the domain we were using (bug) + domain := obs.DNSDomain.UnwrapOr("") + if domain == "" { + continue + } + + // skip cases where the DNS lookup did not fail (bug) + probeFailure := obs.DNSLookupFailure.UnwrapOr("") + if probeFailure == "" { + continue + } + + // skip cases where the domain is different + if domain != inputDomain { + continue + } + + // register the corresponding DNS lookup failure + obs.ContainsControlDNSLookupInfo = true + if value := resp.DNS.Failure; value != nil { + obs.ControlDNSLookupFailure = optional.Some(*value) + } + } +} + +func (c *WebObservationsContainer) controlXrefEndpointFailures(resp *model.THResponse) { + for _, obs := range c.KnownTCPEndpoints { + // search for the corresponding control TCP connect entry + if tcp, found := resp.TCPConnect[obs.EndpointAddress]; found { + obs.ContainsControlTCPConnectInfo = true + if value := tcp.Failure; value != nil { + obs.ControlTCPConnectFailure = optional.Some(*value) + } + } + + // search for the corresponding TLS handshake entry for the same server name + if serverName := obs.TLSServerName.UnwrapOr(""); serverName != "" { + if tls, found := resp.TLSHandshake[obs.EndpointAddress]; found && tls.ServerName == serverName { + obs.ContainsControlTLSHandshakeInfo = true + if value := tls.Failure; value != nil { + obs.ControlTLSHandshakeFailure = optional.Some(*value) + } + } + } + } +} + +func (c *WebObservationsContainer) controlXrefFinalHTTPResponse(resp *model.THResponse) { + obs := c.findFinalHTTPResponse().UnwrapOr(nil) + if obs == nil { + return + } + obs.ContainsControlHTTPInfo = true + if value := resp.HTTPRequest.Failure; value != nil { + obs.ControlHTTPFailure = optional.Some(*value) + } + if value := resp.HTTPRequest.StatusCode; value > 0 { + obs.ControlHTTPResponseStatusCode = optional.Some(value) + } + if value := resp.HTTPRequest.BodyLength; value > 0 { + obs.ControlHTTPResponseBodyLength = optional.Some(value) + } + obs.ControlHTTPResponseHeadersKeys = make(map[string]bool) + for key := range resp.HTTPRequest.Headers { + obs.ControlHTTPResponseHeadersKeys[key] = true + } + if v := resp.HTTPRequest.Title; v != "" { + obs.ControlHTTPResponseTitle = optional.Some(v) + } +} + +func (c *WebObservationsContainer) findFinalHTTPResponse() optional.Value[*WebObservation] { + // find all the possible final request candidates + var candidates []*WebObservation + for _, wobs := range c.KnownTCPEndpoints { + switch code := wobs.HTTPResponseStatusCode.UnwrapOr(0); code { + case 0, 301, 302, 307, 308: + // this is a redirect or a nonexisting response in the case of zero + + default: + // found candidate + candidates = append(candidates, wobs) + } + } + + // Implementation note: the final request is a request that is not a redirect and + // we expect to see just one of them. This code is written assuming we will have + // more than a final request in the future and to fail in such a case. + if len(candidates) != 1 { + return optional.None[*WebObservation]() + } + return optional.Some(candidates[0]) +} diff --git a/internal/oohelperd/http.go b/internal/oohelperd/http.go index e6867187e..0b9d221a7 100644 --- a/internal/oohelperd/http.go +++ b/internal/oohelperd/http.go @@ -120,7 +120,7 @@ func httpDo(ctx context.Context, config *httpConfig) { Failure: httpMapFailure(err), StatusCode: int64(resp.StatusCode), Headers: headers, - Title: measurexlite.WebGetTitle(string(data)), + Title: measurexlite.WebGetTitleString(string(data)), } } diff --git a/internal/pipeline/canonical.go b/internal/pipeline/canonical.go index 39fe839a5..1cc5ec7d6 100644 --- a/internal/pipeline/canonical.go +++ b/internal/pipeline/canonical.go @@ -39,4 +39,7 @@ type CanonicalTestKeys struct { // QUICHandshakes contains the QUIC handshakes results. QUICHandshakes []*model.ArchivalTLSOrQUICHandshakeResult `json:"quic_handshakes"` + + // XControlRequest contains the OPTIONAL TH request. + XControlRequest optional.Value[*model.THRequest] `json:"x_control_request"` } diff --git a/internal/pipeline/web.go b/internal/pipeline/web.go index 584b47a6a..1e811bb3e 100644 --- a/internal/pipeline/web.go +++ b/internal/pipeline/web.go @@ -212,7 +212,7 @@ func (db *DB) addHTTPRoundTrips(evs ...*model.ArchivalHTTPRequestResult) error { for key := range ev.Response.Headers { wobs.HTTPResponseHeadersKeys[key] = OriginProbe } - if title := measurexlite.WebGetTitle(string(ev.Response.Body)); title != "" { + if title := measurexlite.WebGetTitleString(string(ev.Response.Body)); title != "" { wobs.HTTPResponseTitle = optional.Some(title) } } From 132ba4dd4a7a89825c25d4eb563fca820506bfce Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Fri, 24 Nov 2023 18:50:38 +0100 Subject: [PATCH 17/66] also implement the analysis --- internal/cmd/minipipeline/main.go | 20 +- .../webconnectivitylte/analysiscore.go | 15 +- .../webconnectivitylte/analysiscorev2.go | 404 +++++++++++++++ internal/minipipeline/analysis.go | 485 ++++++++++++++++++ .../minipipeline/{web.go => observation.go} | 264 +++++----- internal/minipipeline/utils.go | 8 + 6 files changed, 1039 insertions(+), 157 deletions(-) create mode 100644 internal/experiment/webconnectivitylte/analysiscorev2.go create mode 100644 internal/minipipeline/analysis.go rename internal/minipipeline/{web.go => observation.go} (67%) create mode 100644 internal/minipipeline/utils.go diff --git a/internal/cmd/minipipeline/main.go b/internal/cmd/minipipeline/main.go index e89a985e6..dd21eaead 100644 --- a/internal/cmd/minipipeline/main.go +++ b/internal/cmd/minipipeline/main.go @@ -21,12 +21,20 @@ func main() { container.NoteHTTPRoundTripResults(meas.TestKeys.Unwrap().Requests...) container.NoteControlResults(meas.TestKeys.Unwrap().XControlRequest.Unwrap(), meas.TestKeys.Unwrap().Control.Unwrap()) - must.WriteFile("db.json", must.MarshalJSON(container), 0600) + must.WriteFile("observation.json", must.MarshalJSON(container), 0600) - /* - ax := &pipeline.Analysis{} - ax.ComputeAllValues(db) + analysis := &minipipeline.WebAnalysis{} + analysis.ComputeDNSExperimentFailure(container) + analysis.ComputeDNSTransactionsWithBogons(container) + analysis.ComputeDNSTransactionsWithUnexpectedFailures(container) + analysis.ComputeDNSPossiblyInvalidAddrs(container) + analysis.ComputeTCPTransactionsWithUnexpectedTCPConnectFailures(container) + analysis.ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures(container) + analysis.ComputeTCPTransactionsWithUnexpectedHTTPFailures(container) + analysis.ComputeHTTPDiffBodyProportionFactor(container) + analysis.ComputeHTTPDiffStatusCodeMatch(container) + analysis.ComputeHTTPDiffUncommonHeadersIntersection(container) + analysis.ComputeHTTPDiffTitleDifferentLongWords(container) - must.WriteFile("ax.json", must.MarshalJSON(ax), 0600) - */ + must.WriteFile("analysis.json", must.MarshalJSON(analysis), 0600) } diff --git a/internal/experiment/webconnectivitylte/analysiscore.go b/internal/experiment/webconnectivitylte/analysiscore.go index 3c745ccd0..2109c9120 100644 --- a/internal/experiment/webconnectivitylte/analysiscore.go +++ b/internal/experiment/webconnectivitylte/analysiscore.go @@ -36,6 +36,9 @@ const ( analysisFlagSuccess ) +// AnalysisUseV2 indicates whether to use V2 of the analysis algorithm. +var AnalysisUseV2 = true + // analysisToplevel is the toplevel function that analyses the results // of the experiment once all network tasks have completed. // @@ -99,10 +102,14 @@ func (tk *TestKeys) analysisToplevel(logger model.Logger) { // not going to use any form of locking here. // these functions compute the value of XBlockingFlags - tk.analysisDNSToplevel(logger, model.GeoIPASNLookupperFunc(geoipx.LookupASN)) - tk.analysisTCPIPToplevel(logger) - tk.analysisTLSToplevel(logger) - tk.analysisHTTPToplevel(logger) + if AnalysisUseV2 { + tk.analysisToplevelV2(logger) + } else { + tk.analysisDNSToplevel(logger, model.GeoIPASNLookupperFunc(geoipx.LookupASN)) + tk.analysisTCPIPToplevel(logger) + tk.analysisTLSToplevel(logger) + tk.analysisHTTPToplevel(logger) + } // now, let's determine .Accessible and .Blocking switch { diff --git a/internal/experiment/webconnectivitylte/analysiscorev2.go b/internal/experiment/webconnectivitylte/analysiscorev2.go new file mode 100644 index 000000000..86624d3f5 --- /dev/null +++ b/internal/experiment/webconnectivitylte/analysiscorev2.go @@ -0,0 +1,404 @@ +package webconnectivitylte + +import ( + "fmt" + + "github.com/ooni/probe-cli/v3/internal/minipipeline" + "github.com/ooni/probe-cli/v3/internal/model" + "github.com/ooni/probe-cli/v3/internal/must" + "github.com/ooni/probe-cli/v3/internal/netxlite" + "github.com/ooni/probe-cli/v3/internal/runtimex" +) + +// analysisToplevelV2 is an alternative version of the analysis code that +// uses the [minipipeline] package for processing. +func (tk *TestKeys) analysisToplevelV2(logger model.Logger) { + // Since we run after all tasks have completed (or so we assume) we're + // not going to use any form of locking here. + + container := minipipeline.NewWebObservationsContainer() + container.CreateDNSLookupFailures(tk.Queries...) + container.CreateKnownIPAddresses(tk.Queries...) + container.CreateKnownTCPEndpoints(tk.TCPConnect...) + container.NoteTLSHandshakeResults(tk.TLSHandshakes...) + container.NoteHTTPRoundTripResults(tk.Requests...) + + // be defensive in case the control request or control are not defined + if tk.ControlRequest != nil && tk.Control != nil { + // Implementation note: the only error that can happen here is when the input + // doesn't parse as a URL, which should have triggered previous errors + runtimex.Try0(container.NoteControlResults(tk.ControlRequest, tk.Control)) + } + + // dump the pipeline results for debugging purposes + fmt.Printf("%s\n", must.MarshalJSON(container)) + + // run top-level protocol-specific analysis algorithms + tk.analysisDNSToplevelV2(container, logger) + tk.analysisTCPIPToplevelV2(container, logger) + tk.analysisTLSToplevelV2(container, logger) + tk.analysisHTTPToplevelV2(container, logger) +} + +// analysisDNSToplevelV2 is the toplevel analysis function for DNS results. +// +// Note: this function DOES NOT consider failed DNS-over-HTTPS (DoH) submeasurements +// and ONLY considers the IP addrs they have resolved. Failing to contact a DoH service +// provides info about such a DoH service rather than on the measured URL. See the +// https://github.com/ooni/probe/issues/2274 issue for more info. +// +// The goals of this function are the following: +// +// 1. Set the legacy .DNSExperimentFailure field to the failure value of the +// first DNS query that failed among the ones using getaddrinfo. This field is +// legacy because now we perform several DNS lookups. +// +// 2. Compute the XDNSFlags value. +// +// From the XDNSFlags value, we determine, in turn DNSConsistency and +// XBlockingFlags according to the following decision table: +// +// +-----------+----------------+---------------------+ +// | XDNSFlags | DNSConsistency | XBlockingFlags | +// +-----------+----------------+---------------------+ +// | 0 | "consistent" | no change | +// +-----------+----------------+---------------------+ +// | nonzero | "inconsistent" | set FlagDNSBlocking | +// +-----------+----------------+---------------------+ +// +// We explain how XDNSFlags is determined in the documentation of +// the functions that this function calls to do its job. +func (tk *TestKeys) analysisDNSToplevelV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { + + // run the analysis algorithms + tk.analysisDNSExperimentFailureV2(container) + tk.analysisDNSBogonV2(container, logger) + //tk.analysisDNSDuplicateResponsesV2() // TODO(bassosimone): implement + tk.analysisDNSUnexpectedFailureV2(container, logger) + tk.analysisDNSUnexpectedAddrsV2(container, logger) + + // compute DNS consistency + if tk.DNSFlags != 0 { + logger.Warn("DNSConsistency: inconsistent") + tk.DNSConsistency = "inconsistent" + tk.BlockingFlags |= analysisFlagDNSBlocking + } else { + logger.Info("DNSConsistency: consistent") + tk.DNSConsistency = "consistent" + } + +} + +func (tk *TestKeys) analysisDNSExperimentFailureV2(container *minipipeline.WebObservationsContainer) { + for _, obs := range container.DNSLookupFailures { + // skip if we don't know the engine + if obs.DNSEngine.IsNone() { + continue + } + + // make sure we only include the system resolver + switch obs.DNSEngine.Unwrap() { + case "getaddrinfo", "golang_net_resolver": + + // skip cases where the failure is not set, which is a bug + if obs.DNSLookupFailure.IsNone() { + continue + } + failure := obs.DNSLookupFailure.Unwrap() + + // skip cases where the query type is not set, which is a bug + if obs.DNSQueryType.IsNone() { + continue + } + queryType := obs.DNSQueryType.Unwrap() + + // skip cases where there's no DNS record for AAAA + if queryType == "AAAA" && failure == netxlite.FailureDNSNoAnswer { + continue + } + + // set the failure proper + tk.DNSExperimentFailure = &failure + + default: + // nothing + } + } +} + +func (tk *TestKeys) analysisDNSBogonV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { + // Implementation note: any bogon IP address resolved by a DoH service + // is STILL suspicious since it should not happen. TODO(bassosimone): an + // even better algorithm could possibly check whether also the TH has + // observed bogon IP addrs and avoid flagging in such a case. + // + // See https://github.com/ooni/probe/issues/2274 for more information. + + for _, obs := range container.KnownTCPEndpoints { + // skip cases where there's no bogon + if obs.IPAddressBogon.IsNone() { + continue + } + if !obs.IPAddressBogon.Unwrap() { + continue + } + + // skip cases where the IP address is not defined (likely a bug) + if obs.IPAddress.IsNone() { + continue + } + addr := obs.IPAddress.Unwrap() + + // skip cases where the domain is not known (likely a bug) + if obs.DNSDomain.IsNone() { + continue + } + domain := obs.DNSDomain.Unwrap() + + // log and make sure we set the correct flag + logger.Warnf("DNS: got BOGON answer %s for domain %s (see %v)", addr, domain, obs.DNSTransactionIDs) + tk.DNSFlags |= AnalysisDNSBogon + + // continue processing so we print all the bogons we have + } +} + +func (tk *TestKeys) analysisDNSUnexpectedFailureV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { + for _, obs := range container.DNSLookupFailures { + // skip cases with no failures + if obs.DNSLookupFailure.IsNone() { + continue + } + failure := obs.DNSLookupFailure.Unwrap() + if failure == "" { + continue + } + + // skip cases where also the control failed + if obs.ControlDNSLookupFailure.IsNone() { + continue + } + if obs.ControlDNSLookupFailure.Unwrap() != "" { + continue + } + + // A DoH failure is not information about the URL we're measuring + // but about the DoH service being blocked. + // + // See https://github.com/ooni/probe/issues/2274 + if obs.DNSEngine.IsNone() { + continue + } + engine := obs.DNSEngine.Unwrap() + if engine == "doh" { + continue + } + + // skip cases where the query type is not set, which is a bug + if obs.DNSQueryType.IsNone() { + continue + } + queryType := obs.DNSQueryType.Unwrap() + + // skip cases where there's no DNS record for AAAA + if queryType == "AAAA" && failure == netxlite.FailureDNSNoAnswer { + continue + } + + // log and make sure we set the correct flag + logger.Warnf("DNS: unexpected failure %s in %v", failure, obs.DNSTransactionIDs) + tk.DNSFlags |= AnalysisDNSUnexpectedFailure + + // continue processing so we print all the unexpected failures + } +} + +func (tk *TestKeys) analysisDNSUnexpectedAddrsV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { + // Implementation note: in the case in which DoH returned answers, here + // it still feels okay to consider them. We should avoid flagging DoH + // failures as measurement failures but if DoH returns us some unexpected + // even-non-bogon addr, it seems worth flagging for now. + // + // See https://github.com/ooni/probe/issues/2274 + + for _, obs := range container.KnownTCPEndpoints { + // skip the cases with no address (which would be a bug) + if obs.IPAddress.IsNone() { + continue + } + addr := obs.IPAddress.Unwrap() + + // if the address was also resolved by the control, we're good + if !obs.MatchWithControlIPAddress.IsNone() { + if obs.MatchWithControlIPAddress.Unwrap() { + continue + } + logger.Infof("DNS: address %s: not resolved by TH", addr) + } + + // if we have a succesful TLS handshake for this addr, we're good + // + // note: this check is before the ASN check to avoid emitting a + // warning indicating an ASN mismatch when we do not have an ASN + if !obs.TLSHandshakeFailure.IsNone() { + if obs.TLSHandshakeFailure.Unwrap() == "" { + continue + } + logger.Infof("DNS: address %s: cannot confirm using TLS handshake", addr) + } + + // we must have a valid ASN at this point (or bug!) + if obs.IPAddressASN.IsNone() { + continue + } + asn := obs.IPAddressASN.Unwrap() + + // if the ASN was also observed by the control, we're good + if obs.MatchWithControlIPAddressASN.IsNone() { + continue + } + if obs.MatchWithControlIPAddressASN.Unwrap() { + continue + } + + // log and make sure we set the correct flag + logger.Warnf( + "DNS: address %s has unexpected AS%d and we cannot use TLS to confirm it", + addr, asn, + ) + tk.DNSFlags |= AnalysisDNSUnexpectedAddrs + + // continue processing so we print all the unexpected failures + } +} + +// analysisTCPIPToplevelV2 is the toplevel analysis function for TCP/IP results. +func (tk *TestKeys) analysisTCPIPToplevelV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { + for _, obs := range container.KnownTCPEndpoints { + // skip cases with no failures + if obs.TCPConnectFailure.IsNone() { + continue + } + failure := obs.TCPConnectFailure.Unwrap() + if failure == "" { + continue + } + + // skip cases where also the control failed + if obs.ControlTCPConnectFailure.IsNone() { + continue + } + if obs.ControlTCPConnectFailure.Unwrap() != "" { + continue + } + + // TODO(bassosimone): how do we set the .Blocked flag? + // maybe we can use the transactionID to go back to the right + // data structure and set the value or we can deprecate it + // and just ignore this corner case? + + // log and make sure we set the correct flag + logger.Warnf( + "TCP/IP: unexpected failure %s for %s (see %d)", + failure, + obs.EndpointAddress, + obs.EndpointTransactionID, + ) + tk.BlockingFlags |= analysisFlagTCPIPBlocking + + // continue processing so we print all the unexpected failures + } +} + +// analysisTLSToplevelV2 is the toplevel analysis function for TLS results. +func (tk *TestKeys) analysisTLSToplevelV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { + for _, obs := range container.KnownTCPEndpoints { + // skip cases with no failures + if obs.TLSHandshakeFailure.IsNone() { + continue + } + failure := obs.TLSHandshakeFailure.Unwrap() + if failure == "" { + continue + } + + // skip cases where also the control failed + if obs.ControlTLSHandshakeFailure.IsNone() { + continue + } + if obs.ControlTLSHandshakeFailure.Unwrap() != "" { + continue + } + + // log and make sure we set the correct flag + logger.Warnf( + "TLS: unexpected failure %s for %s (see %d)", + failure, + obs.EndpointAddress, + obs.EndpointTransactionID, + ) + tk.BlockingFlags |= analysisFlagTLSBlocking + + // continue processing so we print all the unexpected failures + } +} + +// analysisHTTPToplevelV2 is the toplevel analysis function for HTTP results. +func (tk *TestKeys) analysisHTTPToplevelV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { + tk.analysisHTTPUnexpectedFailureV2(container, logger) + tk.analysisHTTPDiffV2(container, logger) +} + +func (tk *TestKeys) analysisHTTPUnexpectedFailureV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { + for _, obs := range container.KnownTCPEndpoints { + // skip cases with no failures + if obs.HTTPFailure.IsNone() { + continue + } + failure := obs.HTTPFailure.Unwrap() + if failure == "" { + continue + } + + // skip cases where also the control failed + if obs.ControlHTTPFailure.IsNone() { + continue + } + if obs.ControlHTTPFailure.UnwrapOr("") != "" { + continue + } + + // log and make sure we set the correct flag + logger.Warnf( + "TLS: unexpected failure %s for %s (see %d)", + failure, + obs.EndpointAddress, + obs.EndpointTransactionID, + ) + tk.BlockingFlags |= analysisFlagTLSBlocking + + // continue processing so we print all the unexpected failures + } +} + +func (tk *TestKeys) analysisHTTPDiffV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { + for _, obs := range container.KnownTCPEndpoints { + // skip cases with failures + if obs.HTTPFailure.IsNone() { + continue + } + failure := obs.HTTPFailure.Unwrap() + if failure != "" { + continue + } + + // skip cases where the control failed + if obs.ControlHTTPFailure.IsNone() { + continue + } + if obs.ControlHTTPFailure.UnwrapOr("") != "" { + continue + } + + } +} diff --git a/internal/minipipeline/analysis.go b/internal/minipipeline/analysis.go new file mode 100644 index 000000000..1132445b4 --- /dev/null +++ b/internal/minipipeline/analysis.go @@ -0,0 +1,485 @@ +package minipipeline + +import ( + "strings" + + "github.com/ooni/probe-cli/v3/internal/netxlite" + "github.com/ooni/probe-cli/v3/internal/optional" +) + +// WebAnalysis summarizes the content of [*WebObservationsContainer]. +// +// The zero value of this struct is ready to use. +type WebAnalysis struct { + // DNSExperimentFailure is the first failure experienced by a getaddrinfo-like resolver. + DNSExperimentFailure optional.Value[string] + + // DNSTransactionsWithBogons contains the list of DNS transactions containing bogons. + DNSTransactionsWithBogons optional.Value[map[int64]bool] + + // DNSTransactionsWithUnexpectedFailures contains the DNS transaction IDs that + // contain failures while the control measurement succeeded. Note that we don't + // include DNS-over-HTTPS failures inside this value. + DNSTransactionsWithUnexpectedFailures optional.Value[map[int64]bool] + + // DNSPossiblyInvalidAddrs contains the addresses that are not valid for the + // domain. An addres is valid for the domain if: + // + // 1. we can TLS handshake with the expected SNI using this address; + // + // 2. the address was resolved by the TH; + // + // 3. the address ASN was also observed by TH. + DNSPossiblyInvalidAddrs optional.Value[map[string]bool] + + // HTTPDiffBodyProportionFactor is the body proportion factor. + // + // The generation algorithm assumes there's a single "final" response. + HTTPDiffBodyProportionFactor optional.Value[float64] + + // HTTPDiffStatusCodeMatch returns whether the status code match modulo some + // false positive cases that causes this value to remain null. + // + // The generation algorithm assumes there's a single "final" response. + HTTPDiffStatusCodeMatch optional.Value[bool] + + // HTTPDiffTitleDifferentLongWords contains the words longer than 4 characters + // that appear in the probe's "final" response title but don't appear in the TH title. + // + // The generation algorithm assumes there's a single "final" response. + HTTPDiffTitleDifferentLongWords optional.Value[map[string]bool] + + // HTTPDiffUncommonHeadersIntersection contains the uncommon headers intersection. + // + // The generation algorithm assumes there's a single "final" response. + HTTPDiffUncommonHeadersIntersection optional.Value[map[string]bool] + + // TCPTransactionsWithUnexpectedTCPConnectFailures contains the TCP transaction IDs that + // contain TCP connect failures while the control measurement succeeded. + TCPTransactionsWithUnexpectedTCPConnectFailures optional.Value[map[int64]bool] + + // TCPTransactionsWithUnexpectedTLSHandshakeFailures contains the TCP transaction IDs that + // contain TLS handshake failures while the control measurement succeeded. + TCPTransactionsWithUnexpectedTLSHandshakeFailures optional.Value[map[int64]bool] + + // TCPSTransactionsWithUnexpectedHTTPFailures contains the TCP transaction IDs that + // contain HTTP failures while the control measurement succeeded. + TCPTransactionsWithUnexpectedHTTPFailures optional.Value[map[int64]bool] +} + +func analysisDNSLookupFailureIsDNSNoAnswerForAAAA(obs *WebObservation) bool { + return obs.DNSQueryType.UnwrapOr("") == "AAAA" && obs.DNSLookupFailure.UnwrapOr("") == netxlite.FailureDNSNoAnswer +} + +// ComputeDNSExperimentFailure computes the DNSExperimentFailure field. +func (wa *WebAnalysis) ComputeDNSExperimentFailure(c *WebObservationsContainer) { + + for _, obs := range c.DNSLookupFailures { + // make sure we only include the system resolver + switch obs.DNSEngine.UnwrapOr("") { + case "getaddrinfo", "golang_net_resolver": + + // skip cases where there's no DNS record for AAAA, which is a false positive + if analysisDNSLookupFailureIsDNSNoAnswerForAAAA(obs) { + continue + } + + // only record the first failure + wa.DNSExperimentFailure = obs.DNSLookupFailure + return + + default: + // nothing + } + } +} + +func analysisForEachDNSTransactionID(obs *WebObservation, f func(id int64)) { + for _, id := range obs.DNSTransactionIDs.UnwrapOr(nil) { + f(id) + } +} + +// ComputeDNSTransactionsWithBogons computes the DNSTransactionsWithBogons field. +func (wa *WebAnalysis) ComputeDNSTransactionsWithBogons(c *WebObservationsContainer) { + // Implementation note: any bogon IP address resolved by a DoH service + // is STILL suspicious since it should not happen. TODO(bassosimone): an + // even better algorithm could possibly check whether also the TH has + // observed bogon IP addrs and avoid flagging in such a case. + // + // See https://github.com/ooni/probe/issues/2274 for more information. + + state := make(map[int64]bool) + + for _, obs := range c.KnownTCPEndpoints { + // we're only interested in cases when there's a bogon + if !obs.IPAddressBogon.UnwrapOr(false) { + continue + } + + // update state + analysisForEachDNSTransactionID(obs, func(id int64) { + state[id] = true + }) + } + + wa.DNSTransactionsWithBogons = optional.Some(state) +} + +func analysisDNSEngineIsDNSOverHTTPS(obs *WebObservation) bool { + return obs.DNSEngine.UnwrapOr("") == "doh" +} + +// ComputeDNSTransactionsWithUnexpectedFailures computes the DNSTransactionsWithUnexpectedFailures field. +func (wa *WebAnalysis) ComputeDNSTransactionsWithUnexpectedFailures(c *WebObservationsContainer) { + // Implementation note: a DoH failure is not information about the URL we're + // measuring but about the DoH service being blocked. + // + // See https://github.com/ooni/probe/issues/2274 + + state := make(map[int64]bool) + + for _, obs := range c.DNSLookupFailures { + // skip cases where the control failed as well + if obs.ControlDNSLookupFailure.UnwrapOr("") != "" { + continue + } + + // skip cases where the engine is doh (see above comment) + if analysisDNSEngineIsDNSOverHTTPS(obs) { + continue + } + + // skip cases where there's no DNS record for AAAA, which is a false positive + if analysisDNSLookupFailureIsDNSNoAnswerForAAAA(obs) { + continue + } + + // update state + analysisForEachDNSTransactionID(obs, func(id int64) { + state[id] = true + }) + } + + wa.DNSTransactionsWithBogons = optional.Some(state) +} + +// ComputeDNSPossiblyInvalidAddrs computes the DNSPossiblyInvalidAddrs field. +func (wa *WebAnalysis) ComputeDNSPossiblyInvalidAddrs(c *WebObservationsContainer) { + // Implementation note: in the case in which DoH returned answers, here + // it still feels okay to consider them. We should avoid flagging DoH + // failures as measurement failures but if DoH returns us some unexpected + // even-non-bogon addr, it seems worth flagging for now. + // + // See https://github.com/ooni/probe/issues/2274 + + state := make(map[string]bool) + + for _, obs := range c.KnownTCPEndpoints { + addr := obs.IPAddress.Unwrap() + + // if the address was also resolved by the control, we're good + if obs.MatchWithControlIPAddress.UnwrapOr(false) { + continue + } + + // if we have a succesful TLS handshake for this addr, we're good + if obs.TLSHandshakeFailure.UnwrapOr("unknown_failure") == "" { + // just in case another transaction succeded, clear the address from the state + delete(state, addr) + continue + } + + // if there's an ASN match with the control, we're good + if obs.MatchWithControlIPAddressASN.UnwrapOr(false) { + continue + } + + // update state + state[addr] = true + } + + wa.DNSPossiblyInvalidAddrs = optional.Some(state) +} + +// ComputeTCPTransactionsWithUnexpectedTCPConnectFailures computes the TCPTransactionsWithUnexpectedTCPConnectFailures field. +func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedTCPConnectFailures(c *WebObservationsContainer) { + state := make(map[int64]bool) + + for _, obs := range c.KnownTCPEndpoints { + // skip cases with no failures + if obs.TCPConnectFailure.UnwrapOr("") == "" { + continue + } + + // skip cases where also the control failed + if obs.ControlTCPConnectFailure.UnwrapOr("unknown_failure") != "" { + continue + } + + // update state + state[obs.EndpointTransactionID.Unwrap()] = true + } + + wa.TCPTransactionsWithUnexpectedTCPConnectFailures = optional.Some(state) +} + +// ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures computes the TCPTransactionsWithUnexpectedTLSHandshakeFailures field. +func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures(c *WebObservationsContainer) { + state := make(map[int64]bool) + + for _, obs := range c.KnownTCPEndpoints { + // skip cases with no failures + if obs.TLSHandshakeFailure.UnwrapOr("") == "" { + continue + } + + // skip cases where also the control failed + if obs.ControlTLSHandshakeFailure.UnwrapOr("unknown_failure") != "" { + continue + } + + // update state + state[obs.EndpointTransactionID.Unwrap()] = true + } + + wa.TCPTransactionsWithUnexpectedTLSHandshakeFailures = optional.Some(state) +} + +// ComputeTCPTransactionsWithUnexpectedHTTPFailures computes the TCPTransactionsWithUnexpectedHTTPFailures field. +func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedHTTPFailures(c *WebObservationsContainer) { + state := make(map[int64]bool) + + for _, obs := range c.KnownTCPEndpoints { + // skip cases with no failures + if obs.HTTPFailure.UnwrapOr("") == "" { + continue + } + + // skip cases where also the control failed + if obs.ControlHTTPFailure.UnwrapOr("unknown_failure") != "" { + continue + } + + // update state + state[obs.EndpointTransactionID.Unwrap()] = true + } + + wa.TCPTransactionsWithUnexpectedHTTPFailures = optional.Some(state) +} + +// ComputeHTTPDiffBodyProportionFactor computes the HTTPDiffBodyProportionFactor field. +func (wa *WebAnalysis) ComputeHTTPDiffBodyProportionFactor(c *WebObservationsContainer) { + for _, obs := range c.KnownTCPEndpoints { + // we need a valid body length and the body must not be truncated + measurement := obs.HTTPResponseBodyLength.UnwrapOr(0) + if measurement <= 0 || obs.HTTPResponseBodyIsTruncated.UnwrapOr(true) { + continue + } + + // we also need a valid control body length + control := obs.ControlHTTPResponseBodyLength.UnwrapOr(0) + if control <= 0 { + continue + } + + // compute the body proportion factor + var proportion float64 + if measurement >= control { + proportion = float64(control) / float64(measurement) + } else { + proportion = float64(measurement) / float64(control) + } + + // update state + wa.HTTPDiffBodyProportionFactor = optional.Some(proportion) + + // Implementation note: we only process the first observation that matches. + // + // This is fine(TM) as long as we have a single "final" response. + break + } +} + +// ComputeHTTPDiffStatusCodeMatch computes the HTTPDiffStatusCodeMatch field. +func (wa *WebAnalysis) ComputeHTTPDiffStatusCodeMatch(c *WebObservationsContainer) { + for _, obs := range c.KnownTCPEndpoints { + // we need a positive status code for both + measurement := obs.HTTPResponseStatusCode.UnwrapOr(0) + if measurement <= 0 { + continue + } + control := obs.ControlHTTPResponseStatusCode.UnwrapOr(0) + if control <= 0 { + continue + } + + // compute whether there's a match including caveats + good := control == measurement + if !good && control/100 != 2 { + // Avoid comparison if it seems the TH failed _and_ the two + // status codes are not equal. Originally, this algorithm was + // https://github.com/measurement-kit/measurement-kit/blob/b55fbecb205be62c736249b689df0c45ae342804/src/libmeasurement_kit/ooni/web_connectivity.cpp#L60 + // and excluded the case where the TH failed with 5xx. + // + // Then, we discovered when implementing websteps a bunch + // of control failure modes that suggested to be more + // cautious. See https://github.com/bassosimone/websteps-illustrated/blob/632f27443ab9d94fb05efcf5e0b0c1ce190221e2/internal/engine/experiment/websteps/analysisweb.go#L137. + // + // However, it seems a bit retarded to avoid comparison + // when both the TH and the probe failed equally. See + // https://github.com/ooni/probe/issues/2287, which refers + // to a measurement where both the probe and the TH fail + // with 404, but we fail to say "status_code_match = true". + // + // See https://explorer.ooni.org/measurement/20220911T203447Z_webconnectivity_IT_30722_n1_YDZQZOHAziEJk6o9?input=http%3A%2F%2Fwww.webbox.com%2Findex.php + // for a measurement where this was fixed. + return + } + + // update state + wa.HTTPDiffStatusCodeMatch = optional.Some(good) + + // Implementation note: we only process the first observation that matches. + // + // This is fine(TM) as long as we have a single "final" request. + break + } +} + +var analysisCommonHeaders = map[string]bool{ + "date": true, + "content-type": true, + "server": true, + "cache-control": true, + "vary": true, + "set-cookie": true, + "location": true, + "expires": true, + "x-powered-by": true, + "content-encoding": true, + "last-modified": true, + "accept-ranges": true, + "pragma": true, + "x-frame-options": true, + "etag": true, + "x-content-type-options": true, + "age": true, + "via": true, + "p3p": true, + "x-xss-protection": true, + "content-language": true, + "cf-ray": true, + "strict-transport-security": true, + "link": true, + "x-varnish": true, +} + +// ComputeHTTPDiffUncommonHeadersIntersection computes the HTTPDiffUncommonHeadersIntersection field. +func (wa *WebAnalysis) ComputeHTTPDiffUncommonHeadersIntersection(c *WebObservationsContainer) { + state := make(map[string]bool) + + for _, obs := range c.KnownTCPEndpoints { + // we should only have control headers for the "final" response + measurement := obs.HTTPResponseHeadersKeys.UnwrapOr(nil) + if len(measurement) <= 0 { + continue + } + control := obs.ControlHTTPResponseHeadersKeys.UnwrapOr(nil) + if len(control) <= 0 { + continue + } + + const ( + byProbe = 1 << iota + byTH + ) + + matching := make(map[string]int64) + for key := range measurement { + key = strings.ToLower(key) + if _, ok := analysisCommonHeaders[key]; !ok { + matching[key] |= byProbe + } + } + + for key := range control { + key = strings.ToLower(key) + if _, ok := analysisCommonHeaders[key]; !ok { + matching[key] |= byTH + } + } + + // compute the intersection of uncommon headers + for key, value := range matching { + if (value & (byProbe | byTH)) == (byProbe | byTH) { + state[key] = true + } + } + + // Implementation note: we only process the first observation that matches. + // + // This is fine(TM) as long as we have a single "final" request. + break + } + + wa.HTTPDiffUncommonHeadersIntersection = optional.Some(state) +} + +// ComputeHTTPDiffTitleDifferentLongWords computes the HTTPDiffTitleDifferentLongWords field. +func (wa *WebAnalysis) ComputeHTTPDiffTitleDifferentLongWords(c *WebObservationsContainer) { + state := make(map[string]bool) + + for _, obs := range c.KnownTCPEndpoints { + // we should only have control headers for the "final" response + measurement := obs.HTTPResponseTitle.UnwrapOr("") + if measurement == "" { + continue + } + control := obs.ControlHTTPResponseTitle.UnwrapOr("") + if control == "" { + continue + } + + const ( + byProbe = 1 << iota + byTH + ) + + // Implementation note + // + // We don't consider to match words that are shorter than 5 + // characters (5 is the average word length for english) + // + // The original implementation considered the word order but + // considering different languages it seems we could have less + // false positives by ignoring the word order. + words := make(map[string]int64) + const minWordLength = 5 + for _, word := range strings.Split(measurement, " ") { + if len(word) >= minWordLength { + words[strings.ToLower(word)] |= byProbe + } + } + for _, word := range strings.Split(control, " ") { + if len(word) >= minWordLength { + words[strings.ToLower(word)] |= byTH + } + } + + // check whether there's a long word that does not match + for word, score := range words { + if (score & (byProbe | byTH)) != (byProbe | byTH) { + state[word] = true + break + } + } + + // Implementation note: we only process the first observation that matches. + // + // This is fine(TM) as long as we have a single "final" request. + break + } + + wa.HTTPDiffTitleDifferentLongWords = optional.Some(state) +} diff --git a/internal/minipipeline/web.go b/internal/minipipeline/observation.go similarity index 67% rename from internal/minipipeline/web.go rename to internal/minipipeline/observation.go index 23e906746..8b1d8c0cf 100644 --- a/internal/minipipeline/web.go +++ b/internal/minipipeline/observation.go @@ -25,12 +25,9 @@ import ( // // We borrow this design from https://github.com/ooni/data. type WebObservation struct { - // ContainsDNSLookupInfo is true if this record contains DNS lookup information. - ContainsDNSLookupInfo bool - // DNSTransactionIDs contains the IDs of the DNS transactions that caused this // specific [WebObservation] to be generated by the mini pipeline. - DNSTransactionIDs []int64 + DNSTransactionIDs optional.Value[[]int64] // DNSDomain is the domain from which we resolved the IP address. This field // is empty whne this record wasn't generated by a DNS lookup. @@ -42,6 +39,9 @@ type WebObservation struct { // DNSQueryType is the type of the DNS query. DNSQueryType optional.Value[string] + // DNSEngine is the DNS engine that we're using. + DNSEngine optional.Value[string] + // IPAddress is the optional IP address that this observation is about. We derive this value // either from one or more DNS lookups, or because it's part of the input URL. When it's // empty, it means the associated DNS lookup operation failed. @@ -58,39 +58,30 @@ type WebObservation struct { IPAddressOrg optional.Value[string] // IPAddressBogon is true if IPAddres is a bogon. - IPAddressBogon bool + IPAddressBogon optional.Value[bool] // EndpointTransactionID is the transaction ID used by this endpoint. - EndpointTransactionID int64 + EndpointTransactionID optional.Value[int64] // EndpointProto is either "tcp" or "udp". - EndpointProto string + EndpointProto optional.Value[string] // EndpointPort is the port used by this endpoint. - EndpointPort string + EndpointPort optional.Value[string] // EndpointAddress is "${IPAddress}:${EndpointPort}" where "${IPAddress}" is // quoted using "[" and "]" in case of IPv6. - EndpointAddress string - - // ContainsTCPConnectInfo is true if this struct contains TCP connect information. - ContainsTCPConnectInfo bool + EndpointAddress optional.Value[string] // TCPConnectFailure is the optional TCP connect failure. TCPConnectFailure optional.Value[string] - // ContainsTLSHandshakeInfo is true if this struct contains TLS handshake information. - ContainsTLSHandshakeInfo bool - // TLSHandshakeFailure is the optional TLS handshake failure. TLSHandshakeFailure optional.Value[string] // TLSServerName is the optional TLS server name used. TLSServerName optional.Value[string] - // ContainsHTTPRoundTripInfo is true if this struct contains HTTP round trip information. - ContainsHTTPRoundTripInfo bool - // HTTPRequestURL is the HTTP request URL. HTTPRequestURL optional.Value[string] @@ -107,7 +98,7 @@ type WebObservation struct { HTTPResponseBodyIsTruncated optional.Value[bool] // HTTPResponseHeadersKeys contains the response headers keys. - HTTPResponseHeadersKeys map[string]bool + HTTPResponseHeadersKeys optional.Value[map[string]bool] // HTTPResponseLocation contains the location we're redirected to. HTTPResponseLocation optional.Value[string] @@ -115,15 +106,9 @@ type WebObservation struct { // HTTPResponseTitle contains the response title. HTTPResponseTitle optional.Value[string] - // ContainsControlDNSLookupInfo is true if we have DNS lookup info from the control. - ContainsControlDNSLookupInfo bool - // ControlDNSLookupFailure is the corresponding control DNS lookup failure. ControlDNSLookupFailure optional.Value[string] - // ContainsControlTCPConnectInfo is true if we have TCP connect info from the control. - ContainsControlTCPConnectInfo bool - // ControlTCPConnectFailure is the control's TCP connect failure. ControlTCPConnectFailure optional.Value[string] @@ -133,15 +118,9 @@ type WebObservation struct { // MatchWithControlIPAddressASN is true if also the control resolved from the same ASN. MatchWithControlIPAddressASN optional.Value[bool] - // ContainsControlTLSHandshakeInfo is true if we have TLS handshake info from the control. - ContainsControlTLSHandshakeInfo bool - // ControlTLSHandshakeFailure is the control's TLS handshake failure. ControlTLSHandshakeFailure optional.Value[string] - // ContainsControlHTTPInfo is true if we have HTTP info from the control. - ContainsControlHTTPInfo bool - // ControlHTTPFailure is the failure seen by the control. ControlHTTPFailure optional.Value[string] @@ -152,7 +131,7 @@ type WebObservation struct { ControlHTTPResponseBodyLength optional.Value[int64] // ControlHTTPResponseHeadersKeys contains the response headers keys. - ControlHTTPResponseHeadersKeys map[string]bool + ControlHTTPResponseHeadersKeys optional.Value[map[string]bool] // ControlHTTPResponseTitle contains the title seen by the control. ControlHTTPResponseTitle optional.Value[string] @@ -191,11 +170,11 @@ func (c *WebObservationsContainer) CreateDNSLookupFailures(evs ...*model.Archiva // create record obs := &WebObservation{ - ContainsDNSLookupInfo: true, - DNSTransactionIDs: []int64{ev.TransactionID}, - DNSDomain: optional.Some(ev.Hostname), - DNSLookupFailure: optional.Some(*ev.Failure), - DNSQueryType: optional.Some(ev.QueryType), + DNSTransactionIDs: optional.Some([]int64{ev.TransactionID}), + DNSDomain: optional.Some(ev.Hostname), + DNSLookupFailure: optional.Some(utilsStringPointerToString(ev.Failure)), + DNSQueryType: optional.Some(ev.QueryType), + DNSEngine: optional.Some(ev.Engine), } // add record @@ -232,19 +211,17 @@ func (c *WebObservationsContainer) CreateKnownIPAddresses(evs ...*model.Archival } // update the record - obs.ContainsDNSLookupInfo = true - obs.DNSTransactionIDs = append(obs.DNSTransactionIDs, ev.TransactionID) + obs.DNSTransactionIDs = optional.Some(append(obs.DNSTransactionIDs.UnwrapOr([]int64{}), ev.TransactionID)) obs.DNSDomain = optional.Some(ev.Hostname) - obs.DNSLookupFailure = optional.None[string]() + obs.DNSLookupFailure = optional.Some("") obs.DNSQueryType = optional.Some(ev.QueryType) + obs.DNSEngine = optional.Some(ev.Engine) obs.IPAddress = optional.Some(addr) - if asn := answer.ASN; asn != 0 { + if asn, asOrg, err := geoipx.LookupASN(addr); err == nil { obs.IPAddressASN = optional.Some(int64(asn)) + obs.IPAddressOrg = optional.Some(asOrg) } - if org := answer.ASOrgName; org != "" { - obs.IPAddressOrg = optional.Some(org) - } - obs.IPAddressBogon = netxlite.IsBogon(addr) + obs.IPAddressBogon = optional.Some(netxlite.IsBogon(addr)) } } } @@ -257,7 +234,7 @@ func (c *WebObservationsContainer) CreateKnownTCPEndpoints(evs ...*model.Archiva if !found { obs = &WebObservation{ IPAddress: optional.Some(ev.IP), - IPAddressBogon: netxlite.IsBogon(ev.IP), + IPAddressBogon: optional.Some(netxlite.IsBogon(ev.IP)), } if asn, asOrg, err := geoipx.LookupASN(ev.IP); err == nil { obs.IPAddressASN = optional.Some(int64(asn)) @@ -271,25 +248,18 @@ func (c *WebObservationsContainer) CreateKnownTCPEndpoints(evs ...*model.Archiva // while there also fill endpoint specific info portString := strconv.Itoa(ev.Port) obs = &WebObservation{ - ContainsDNSLookupInfo: obs.ContainsDNSLookupInfo, - DNSTransactionIDs: append([]int64{}, obs.DNSTransactionIDs...), - DNSDomain: obs.DNSDomain, - DNSLookupFailure: obs.DNSLookupFailure, - IPAddress: obs.IPAddress, - IPAddressASN: obs.IPAddressASN, - IPAddressOrg: obs.IPAddressOrg, - IPAddressBogon: obs.IPAddressBogon, - EndpointTransactionID: ev.TransactionID, - EndpointProto: "tcp", - EndpointPort: portString, - EndpointAddress: net.JoinHostPort(ev.IP, portString), - ContainsTCPConnectInfo: true, - TCPConnectFailure: optional.None[string](), - } - - // finish filling the endpoint - if value := ev.Status.Failure; value != nil { - obs.TCPConnectFailure = optional.Some(*value) + DNSTransactionIDs: optional.Some(append([]int64{}, obs.DNSTransactionIDs.UnwrapOr([]int64{})...)), + DNSDomain: obs.DNSDomain, + DNSLookupFailure: obs.DNSLookupFailure, + IPAddress: obs.IPAddress, + IPAddressASN: obs.IPAddressASN, + IPAddressOrg: obs.IPAddressOrg, + IPAddressBogon: obs.IPAddressBogon, + EndpointTransactionID: optional.Some(ev.TransactionID), + EndpointProto: optional.Some("tcp"), + EndpointPort: optional.Some(portString), + EndpointAddress: optional.Some(net.JoinHostPort(ev.IP, portString)), + TCPConnectFailure: optional.Some(utilsStringPointerToString(ev.Status.Failure)), } // register the observation @@ -307,13 +277,8 @@ func (c *WebObservationsContainer) NoteTLSHandshakeResults(evs ...*model.Archiva } // update the record - obs.ContainsTLSHandshakeInfo = true - if value := ev.Failure; value != nil { - obs.TLSHandshakeFailure = optional.Some(*value) - } - if value := ev.ServerName; value != "" { - obs.TLSServerName = optional.Some(value) - } + obs.TLSHandshakeFailure = optional.Some(utilsStringPointerToString(ev.Failure)) + obs.TLSServerName = optional.Some(ev.ServerName) } } @@ -327,22 +292,18 @@ func (c *WebObservationsContainer) NoteHTTPRoundTripResults(evs ...*model.Archiv } // update the record - obs.ContainsHTTPRoundTripInfo = true obs.HTTPRequestURL = optional.Some(ev.Request.URL) - if value := ev.Failure; value != nil { - obs.HTTPFailure = optional.Some(*value) - } - if value := ev.Response.Code; value != 0 { - obs.HTTPResponseStatusCode = optional.Some(value) - } - if value := int64(len(ev.Response.Body)); value > 0 { - obs.HTTPResponseBodyLength = optional.Some(value) - } + obs.HTTPFailure = optional.Some(utilsStringPointerToString(ev.Failure)) + obs.HTTPResponseStatusCode = optional.Some(ev.Response.Code) + obs.HTTPResponseBodyLength = optional.Some(int64(len(ev.Response.Body))) obs.HTTPResponseBodyIsTruncated = optional.Some(ev.Request.BodyIsTruncated) - obs.HTTPResponseHeadersKeys = make(map[string]bool) + + httpResponseHeadersKeys := make(map[string]bool) for key := range ev.Response.Headers { - obs.HTTPResponseHeadersKeys[key] = true + httpResponseHeadersKeys[key] = true } + obs.HTTPResponseHeadersKeys = optional.Some(httpResponseHeadersKeys) + if value := measurexlite.WebGetTitleString(string(ev.Response.Body)); value != "" { obs.HTTPResponseTitle = optional.Some(value) } @@ -365,126 +326,135 @@ func (c *WebObservationsContainer) NoteControlResults(req *model.THRequest, resp c.controlXrefDNSFailures(inputDomain, resp) c.controlMatchDNSLookupResults(inputDomain, resp) - c.controlXrefEndpointFailures(resp) + c.controlXrefTCPIPFailures(resp) + c.controlXrefTLSFailures(resp) c.controlXrefFinalHTTPResponse(resp) return nil } func (c *WebObservationsContainer) controlMatchDNSLookupResults(inputDomain string, resp *model.THResponse) { - // rebuild the list of ASNs using the probe's database because we want to - // use the same exact database we used for processing the measurement - thASNMap := make(map[string]int64) + // map out all the IP addresses resolved by the TH + thAddrMap := make(map[string]bool) + for _, addr := range resp.DNS.Addrs { + thAddrMap[addr] = true + } + + // map out all the ASN discovered by the TH using the same ASN + // database used to build the probe's ASN mapping + thASNMap := make(map[int64]bool) for _, addr := range resp.DNS.Addrs { if asn, _, err := geoipx.LookupASN(addr); err == nil && asn != 0 { - thASNMap[addr] = int64(asn) + thASNMap[int64(asn)] = true } } // walk through the list of known observations for _, obs := range c.KnownTCPEndpoints { - // skip entries without a domain to resolve (likely a bug) - domain := obs.DNSDomain.UnwrapOr("") - if domain == "" { - continue - } - // skip entries using a different domain than the one used by the TH - if domain != inputDomain { - continue - } - - // skip entries without an IP address (likely a bug) - addr := obs.IPAddress.UnwrapOr("") - if addr == "" { + domain := obs.DNSDomain.UnwrapOr("") + if domain == "" || domain != inputDomain { continue } - // attempt to access the TH's ASN map for the probe's address - thASN, found := thASNMap[addr] + // obtain the IP address + addr := obs.IPAddress.Unwrap() - // register whether they both resolved the same IP address - obs.MatchWithControlIPAddress = optional.Some(found) + // compute whether also the TH observed this addr + obs.MatchWithControlIPAddress = optional.Some(thAddrMap[addr]) // cannot continue unless we know the probe's ASN ourASN := obs.IPAddressASN.UnwrapOr(0) - if ourASN == 0 { + if ourASN <= 0 { continue } // register whether there is matching in terms of the ASNs - obs.MatchWithControlIPAddressASN = optional.Some(thASN == ourASN) + obs.MatchWithControlIPAddressASN = optional.Some(thASNMap[ourASN]) } } func (c *WebObservationsContainer) controlXrefDNSFailures(inputDomain string, resp *model.THResponse) { for _, obs := range c.DNSLookupFailures { - // skip cases where we don't know the domain we were using (bug) - domain := obs.DNSDomain.UnwrapOr("") - if domain == "" { + // skip cases where the input domain is different + if obs.DNSDomain.Unwrap() != inputDomain { continue } - // skip cases where the DNS lookup did not fail (bug) - probeFailure := obs.DNSLookupFailure.UnwrapOr("") - if probeFailure == "" { - continue - } + // register the corresponding DNS lookup failure + obs.ControlDNSLookupFailure = optional.Some(utilsStringPointerToString(resp.DNS.Failure)) + } +} - // skip cases where the domain is different - if domain != inputDomain { +func (c *WebObservationsContainer) controlXrefTCPIPFailures(resp *model.THResponse) { + for _, obs := range c.KnownTCPEndpoints { + endpointAddress := obs.EndpointAddress.Unwrap() + + // skip when we don't have a record + tcp, found := resp.TCPConnect[endpointAddress] + if !found { continue } - // register the corresponding DNS lookup failure - obs.ContainsControlDNSLookupInfo = true - if value := resp.DNS.Failure; value != nil { - obs.ControlDNSLookupFailure = optional.Some(*value) - } + // if there is a failure, save it + obs.ControlTCPConnectFailure = optional.Some(utilsStringPointerToString(tcp.Failure)) } } -func (c *WebObservationsContainer) controlXrefEndpointFailures(resp *model.THResponse) { +func (c *WebObservationsContainer) controlXrefTLSFailures(resp *model.THResponse) { for _, obs := range c.KnownTCPEndpoints { - // search for the corresponding control TCP connect entry - if tcp, found := resp.TCPConnect[obs.EndpointAddress]; found { - obs.ContainsControlTCPConnectInfo = true - if value := tcp.Failure; value != nil { - obs.ControlTCPConnectFailure = optional.Some(*value) - } + endpointAddress := obs.EndpointAddress.Unwrap() + + // skip entries without a TLS server name (e.g., entries where we did not TLS handshake) + // + // this check should be ~first to exclude cases w/o TLS + if obs.TLSServerName.IsNone() { + continue } + serverName := obs.TLSServerName.Unwrap() - // search for the corresponding TLS handshake entry for the same server name - if serverName := obs.TLSServerName.UnwrapOr(""); serverName != "" { - if tls, found := resp.TLSHandshake[obs.EndpointAddress]; found && tls.ServerName == serverName { - obs.ContainsControlTLSHandshakeInfo = true - if value := tls.Failure; value != nil { - obs.ControlTLSHandshakeFailure = optional.Some(*value) - } - } + // skip when we don't have a record + tls, found := resp.TLSHandshake[endpointAddress] + if !found { + continue + } + + // skip when the server name does not match + if tls.ServerName != serverName { + continue } + + // if there is a failure, save it + obs.ControlTLSHandshakeFailure = optional.Some(utilsStringPointerToString(tls.Failure)) } } func (c *WebObservationsContainer) controlXrefFinalHTTPResponse(resp *model.THResponse) { - obs := c.findFinalHTTPResponse().UnwrapOr(nil) - if obs == nil { + obsx := c.findFinalHTTPResponse() + if obsx.IsNone() { return } - obs.ContainsControlHTTPInfo = true - if value := resp.HTTPRequest.Failure; value != nil { - obs.ControlHTTPFailure = optional.Some(*value) - } + obs := obsx.Unwrap() + + // Implementation note: the TH response does not have a clear semantics for "missing" values + // therefore we are accepting as valid only values within the correct range + + obs.ControlHTTPFailure = optional.Some(utilsStringPointerToString(resp.HTTPRequest.Failure)) if value := resp.HTTPRequest.StatusCode; value > 0 { obs.ControlHTTPResponseStatusCode = optional.Some(value) } - if value := resp.HTTPRequest.BodyLength; value > 0 { + if value := resp.HTTPRequest.BodyLength; value >= 0 { obs.ControlHTTPResponseBodyLength = optional.Some(value) } - obs.ControlHTTPResponseHeadersKeys = make(map[string]bool) + + controlHTTPResponseHeadersKeys := make(map[string]bool) for key := range resp.HTTPRequest.Headers { - obs.ControlHTTPResponseHeadersKeys[key] = true + controlHTTPResponseHeadersKeys[key] = true + } + if len(controlHTTPResponseHeadersKeys) > 0 { + obs.ControlHTTPResponseHeadersKeys = optional.Some(controlHTTPResponseHeadersKeys) } + if v := resp.HTTPRequest.Title; v != "" { obs.ControlHTTPResponseTitle = optional.Some(v) } diff --git a/internal/minipipeline/utils.go b/internal/minipipeline/utils.go new file mode 100644 index 000000000..f439000db --- /dev/null +++ b/internal/minipipeline/utils.go @@ -0,0 +1,8 @@ +package minipipeline + +func utilsStringPointerToString(failure *string) (out string) { + if failure != nil { + out = *failure + } + return +} From be189473fbe54626b59ed289dd601485b49bd0f6 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Fri, 24 Nov 2023 19:19:38 +0100 Subject: [PATCH 18/66] work --- .../webconnectivitylte/analysiscorev2.go | 371 ++++-------------- 1 file changed, 66 insertions(+), 305 deletions(-) diff --git a/internal/experiment/webconnectivitylte/analysiscorev2.go b/internal/experiment/webconnectivitylte/analysiscorev2.go index 86624d3f5..f2acb629b 100644 --- a/internal/experiment/webconnectivitylte/analysiscorev2.go +++ b/internal/experiment/webconnectivitylte/analysiscorev2.go @@ -6,7 +6,6 @@ import ( "github.com/ooni/probe-cli/v3/internal/minipipeline" "github.com/ooni/probe-cli/v3/internal/model" "github.com/ooni/probe-cli/v3/internal/must" - "github.com/ooni/probe-cli/v3/internal/netxlite" "github.com/ooni/probe-cli/v3/internal/runtimex" ) @@ -33,11 +32,28 @@ func (tk *TestKeys) analysisToplevelV2(logger model.Logger) { // dump the pipeline results for debugging purposes fmt.Printf("%s\n", must.MarshalJSON(container)) + // produce the analysis based on the observations + analysis := &minipipeline.WebAnalysis{} + analysis.ComputeDNSExperimentFailure(container) + analysis.ComputeDNSTransactionsWithBogons(container) + analysis.ComputeDNSTransactionsWithUnexpectedFailures(container) + analysis.ComputeDNSPossiblyInvalidAddrs(container) + analysis.ComputeTCPTransactionsWithUnexpectedTCPConnectFailures(container) + analysis.ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures(container) + analysis.ComputeTCPTransactionsWithUnexpectedHTTPFailures(container) + analysis.ComputeHTTPDiffBodyProportionFactor(container) + analysis.ComputeHTTPDiffStatusCodeMatch(container) + analysis.ComputeHTTPDiffUncommonHeadersIntersection(container) + analysis.ComputeHTTPDiffTitleDifferentLongWords(container) + + // dump the analysis results for debugging purposes + fmt.Printf("%s\n", must.MarshalJSON(analysis)) + // run top-level protocol-specific analysis algorithms - tk.analysisDNSToplevelV2(container, logger) - tk.analysisTCPIPToplevelV2(container, logger) - tk.analysisTLSToplevelV2(container, logger) - tk.analysisHTTPToplevelV2(container, logger) + tk.analysisDNSToplevelV2(analysis, logger) + tk.analysisTCPIPToplevelV2(analysis, logger) + tk.analysisTLSToplevelV2(analysis, logger) + tk.analysisHTTPToplevelV2(analysis, logger) } // analysisDNSToplevelV2 is the toplevel analysis function for DNS results. @@ -68,14 +84,22 @@ func (tk *TestKeys) analysisToplevelV2(logger model.Logger) { // // We explain how XDNSFlags is determined in the documentation of // the functions that this function calls to do its job. -func (tk *TestKeys) analysisDNSToplevelV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { +func (tk *TestKeys) analysisDNSToplevelV2(analysis *minipipeline.WebAnalysis, logger model.Logger) { + // TODO(bassosimone): we should probably keep logging as before here - // run the analysis algorithms - tk.analysisDNSExperimentFailureV2(container) - tk.analysisDNSBogonV2(container, logger) - //tk.analysisDNSDuplicateResponsesV2() // TODO(bassosimone): implement - tk.analysisDNSUnexpectedFailureV2(container, logger) - tk.analysisDNSUnexpectedAddrsV2(container, logger) + // assign flags depending on the analysis + if v := analysis.DNSExperimentFailure.UnwrapOr(""); v != "" { + tk.DNSExperimentFailure = &v + } + if v := analysis.DNSTransactionsWithBogons.UnwrapOr(nil); len(v) > 0 { + tk.DNSFlags |= AnalysisDNSBogon + } + if v := analysis.DNSTransactionsWithUnexpectedFailures.UnwrapOr(nil); len(v) > 0 { + tk.DNSFlags |= AnalysisDNSUnexpectedFailure + } + if v := analysis.DNSPossiblyInvalidAddrs.UnwrapOr(nil); len(v) > 0 { + tk.DNSFlags |= AnalysisDNSUnexpectedAddrs + } // compute DNS consistency if tk.DNSFlags != 0 { @@ -86,319 +110,56 @@ func (tk *TestKeys) analysisDNSToplevelV2(container *minipipeline.WebObservation logger.Info("DNSConsistency: consistent") tk.DNSConsistency = "consistent" } - -} - -func (tk *TestKeys) analysisDNSExperimentFailureV2(container *minipipeline.WebObservationsContainer) { - for _, obs := range container.DNSLookupFailures { - // skip if we don't know the engine - if obs.DNSEngine.IsNone() { - continue - } - - // make sure we only include the system resolver - switch obs.DNSEngine.Unwrap() { - case "getaddrinfo", "golang_net_resolver": - - // skip cases where the failure is not set, which is a bug - if obs.DNSLookupFailure.IsNone() { - continue - } - failure := obs.DNSLookupFailure.Unwrap() - - // skip cases where the query type is not set, which is a bug - if obs.DNSQueryType.IsNone() { - continue - } - queryType := obs.DNSQueryType.Unwrap() - - // skip cases where there's no DNS record for AAAA - if queryType == "AAAA" && failure == netxlite.FailureDNSNoAnswer { - continue - } - - // set the failure proper - tk.DNSExperimentFailure = &failure - - default: - // nothing - } - } -} - -func (tk *TestKeys) analysisDNSBogonV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { - // Implementation note: any bogon IP address resolved by a DoH service - // is STILL suspicious since it should not happen. TODO(bassosimone): an - // even better algorithm could possibly check whether also the TH has - // observed bogon IP addrs and avoid flagging in such a case. - // - // See https://github.com/ooni/probe/issues/2274 for more information. - - for _, obs := range container.KnownTCPEndpoints { - // skip cases where there's no bogon - if obs.IPAddressBogon.IsNone() { - continue - } - if !obs.IPAddressBogon.Unwrap() { - continue - } - - // skip cases where the IP address is not defined (likely a bug) - if obs.IPAddress.IsNone() { - continue - } - addr := obs.IPAddress.Unwrap() - - // skip cases where the domain is not known (likely a bug) - if obs.DNSDomain.IsNone() { - continue - } - domain := obs.DNSDomain.Unwrap() - - // log and make sure we set the correct flag - logger.Warnf("DNS: got BOGON answer %s for domain %s (see %v)", addr, domain, obs.DNSTransactionIDs) - tk.DNSFlags |= AnalysisDNSBogon - - // continue processing so we print all the bogons we have - } -} - -func (tk *TestKeys) analysisDNSUnexpectedFailureV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { - for _, obs := range container.DNSLookupFailures { - // skip cases with no failures - if obs.DNSLookupFailure.IsNone() { - continue - } - failure := obs.DNSLookupFailure.Unwrap() - if failure == "" { - continue - } - - // skip cases where also the control failed - if obs.ControlDNSLookupFailure.IsNone() { - continue - } - if obs.ControlDNSLookupFailure.Unwrap() != "" { - continue - } - - // A DoH failure is not information about the URL we're measuring - // but about the DoH service being blocked. - // - // See https://github.com/ooni/probe/issues/2274 - if obs.DNSEngine.IsNone() { - continue - } - engine := obs.DNSEngine.Unwrap() - if engine == "doh" { - continue - } - - // skip cases where the query type is not set, which is a bug - if obs.DNSQueryType.IsNone() { - continue - } - queryType := obs.DNSQueryType.Unwrap() - - // skip cases where there's no DNS record for AAAA - if queryType == "AAAA" && failure == netxlite.FailureDNSNoAnswer { - continue - } - - // log and make sure we set the correct flag - logger.Warnf("DNS: unexpected failure %s in %v", failure, obs.DNSTransactionIDs) - tk.DNSFlags |= AnalysisDNSUnexpectedFailure - - // continue processing so we print all the unexpected failures - } -} - -func (tk *TestKeys) analysisDNSUnexpectedAddrsV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { - // Implementation note: in the case in which DoH returned answers, here - // it still feels okay to consider them. We should avoid flagging DoH - // failures as measurement failures but if DoH returns us some unexpected - // even-non-bogon addr, it seems worth flagging for now. - // - // See https://github.com/ooni/probe/issues/2274 - - for _, obs := range container.KnownTCPEndpoints { - // skip the cases with no address (which would be a bug) - if obs.IPAddress.IsNone() { - continue - } - addr := obs.IPAddress.Unwrap() - - // if the address was also resolved by the control, we're good - if !obs.MatchWithControlIPAddress.IsNone() { - if obs.MatchWithControlIPAddress.Unwrap() { - continue - } - logger.Infof("DNS: address %s: not resolved by TH", addr) - } - - // if we have a succesful TLS handshake for this addr, we're good - // - // note: this check is before the ASN check to avoid emitting a - // warning indicating an ASN mismatch when we do not have an ASN - if !obs.TLSHandshakeFailure.IsNone() { - if obs.TLSHandshakeFailure.Unwrap() == "" { - continue - } - logger.Infof("DNS: address %s: cannot confirm using TLS handshake", addr) - } - - // we must have a valid ASN at this point (or bug!) - if obs.IPAddressASN.IsNone() { - continue - } - asn := obs.IPAddressASN.Unwrap() - - // if the ASN was also observed by the control, we're good - if obs.MatchWithControlIPAddressASN.IsNone() { - continue - } - if obs.MatchWithControlIPAddressASN.Unwrap() { - continue - } - - // log and make sure we set the correct flag - logger.Warnf( - "DNS: address %s has unexpected AS%d and we cannot use TLS to confirm it", - addr, asn, - ) - tk.DNSFlags |= AnalysisDNSUnexpectedAddrs - - // continue processing so we print all the unexpected failures - } } // analysisTCPIPToplevelV2 is the toplevel analysis function for TCP/IP results. -func (tk *TestKeys) analysisTCPIPToplevelV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { - for _, obs := range container.KnownTCPEndpoints { - // skip cases with no failures - if obs.TCPConnectFailure.IsNone() { - continue - } - failure := obs.TCPConnectFailure.Unwrap() - if failure == "" { - continue - } - - // skip cases where also the control failed - if obs.ControlTCPConnectFailure.IsNone() { - continue - } - if obs.ControlTCPConnectFailure.Unwrap() != "" { - continue - } +func (tk *TestKeys) analysisTCPIPToplevelV2(analysis *minipipeline.WebAnalysis, logger model.Logger) { + // TODO(bassosimone): we should probably keep logging as before here + // TODO(bassosimone): we're ignoring .Status here - // TODO(bassosimone): how do we set the .Blocked flag? - // maybe we can use the transactionID to go back to the right - // data structure and set the value or we can deprecate it - // and just ignore this corner case? - - // log and make sure we set the correct flag - logger.Warnf( - "TCP/IP: unexpected failure %s for %s (see %d)", - failure, - obs.EndpointAddress, - obs.EndpointTransactionID, - ) + if v := analysis.TCPTransactionsWithUnexpectedTCPConnectFailures.UnwrapOr(nil); len(v) > 0 { tk.BlockingFlags |= analysisFlagTCPIPBlocking - - // continue processing so we print all the unexpected failures } } // analysisTLSToplevelV2 is the toplevel analysis function for TLS results. -func (tk *TestKeys) analysisTLSToplevelV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { - for _, obs := range container.KnownTCPEndpoints { - // skip cases with no failures - if obs.TLSHandshakeFailure.IsNone() { - continue - } - failure := obs.TLSHandshakeFailure.Unwrap() - if failure == "" { - continue - } - - // skip cases where also the control failed - if obs.ControlTLSHandshakeFailure.IsNone() { - continue - } - if obs.ControlTLSHandshakeFailure.Unwrap() != "" { - continue - } +func (tk *TestKeys) analysisTLSToplevelV2(analysis *minipipeline.WebAnalysis, logger model.Logger) { + // TODO(bassosimone): we should probably keep logging as before here - // log and make sure we set the correct flag - logger.Warnf( - "TLS: unexpected failure %s for %s (see %d)", - failure, - obs.EndpointAddress, - obs.EndpointTransactionID, - ) + if v := analysis.TCPTransactionsWithUnexpectedTLSHandshakeFailures.UnwrapOr(nil); len(v) > 0 { tk.BlockingFlags |= analysisFlagTLSBlocking - - // continue processing so we print all the unexpected failures } } // analysisHTTPToplevelV2 is the toplevel analysis function for HTTP results. -func (tk *TestKeys) analysisHTTPToplevelV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { - tk.analysisHTTPUnexpectedFailureV2(container, logger) - tk.analysisHTTPDiffV2(container, logger) -} - -func (tk *TestKeys) analysisHTTPUnexpectedFailureV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { - for _, obs := range container.KnownTCPEndpoints { - // skip cases with no failures - if obs.HTTPFailure.IsNone() { - continue - } - failure := obs.HTTPFailure.Unwrap() - if failure == "" { - continue - } +func (tk *TestKeys) analysisHTTPToplevelV2(analysis *minipipeline.WebAnalysis, logger model.Logger) { + // TODO(bassosimone): we should probably keep logging as before here + // TODO(bassosimone): we're missing the success with HTTPS flag... - // skip cases where also the control failed - if obs.ControlHTTPFailure.IsNone() { - continue - } - if obs.ControlHTTPFailure.UnwrapOr("") != "" { - continue - } + if v := analysis.TCPTransactionsWithUnexpectedHTTPFailures.UnwrapOr(nil); len(v) > 0 { + tk.BlockingFlags |= analysisFlagHTTPBlocking + } - // log and make sure we set the correct flag - logger.Warnf( - "TLS: unexpected failure %s for %s (see %d)", - failure, - obs.EndpointAddress, - obs.EndpointTransactionID, - ) - tk.BlockingFlags |= analysisFlagTLSBlocking + // same code structure as before + if !analysis.HTTPDiffStatusCodeMatch.IsNone() { + if analysis.HTTPDiffStatusCodeMatch.Unwrap() { - // continue processing so we print all the unexpected failures - } -} + if analysis.HTTPDiffBodyProportionFactor.UnwrapOr(0) > 0.7 { + tk.BlockingFlags |= analysisFlagSuccess + return + } -func (tk *TestKeys) analysisHTTPDiffV2(container *minipipeline.WebObservationsContainer, logger model.Logger) { - for _, obs := range container.KnownTCPEndpoints { - // skip cases with failures - if obs.HTTPFailure.IsNone() { - continue - } - failure := obs.HTTPFailure.Unwrap() - if failure != "" { - continue - } + if v := analysis.HTTPDiffUncommonHeadersIntersection.UnwrapOr(nil); len(v) > 0 { + tk.BlockingFlags |= analysisFlagSuccess + return + } - // skip cases where the control failed - if obs.ControlHTTPFailure.IsNone() { - continue - } - if obs.ControlHTTPFailure.UnwrapOr("") != "" { - continue + if !analysis.HTTPDiffTitleDifferentLongWords.IsNone() && + len(analysis.HTTPDiffTitleDifferentLongWords.Unwrap()) <= 0 { + tk.BlockingFlags |= analysisFlagSuccess + return + } } - } + tk.BlockingFlags |= analysisFlagHTTPDiff } From 18da855076cda3d944248141dbc82b70f48a91b5 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Sat, 25 Nov 2023 14:42:54 +0100 Subject: [PATCH 19/66] we're mostly done in terms of passing the existing QA tests --- .../webconnectivitylte/analysiscorev2.go | 38 ++++- .../webconnectivityqa/dnsblocking.go | 7 +- internal/minipipeline/analysis.go | 145 ++++++++++++++++-- internal/minipipeline/observation.go | 78 ++++------ 4 files changed, 206 insertions(+), 62 deletions(-) diff --git a/internal/experiment/webconnectivitylte/analysiscorev2.go b/internal/experiment/webconnectivitylte/analysiscorev2.go index f2acb629b..5fac262fa 100644 --- a/internal/experiment/webconnectivitylte/analysiscorev2.go +++ b/internal/experiment/webconnectivitylte/analysiscorev2.go @@ -45,6 +45,9 @@ func (tk *TestKeys) analysisToplevelV2(logger model.Logger) { analysis.ComputeHTTPDiffStatusCodeMatch(container) analysis.ComputeHTTPDiffUncommonHeadersIntersection(container) analysis.ComputeHTTPDiffTitleDifferentLongWords(container) + analysis.ComputeHTTPFinalResponses(container) + analysis.ComputeTCPTransactionsWithUnexplainedUnexpectedFailures(container) + analysis.ComputeHTTPFinalResponsesWithTLS(container) // dump the analysis results for debugging purposes fmt.Printf("%s\n", must.MarshalJSON(analysis)) @@ -140,6 +143,39 @@ func (tk *TestKeys) analysisHTTPToplevelV2(analysis *minipipeline.WebAnalysis, l tk.BlockingFlags |= analysisFlagHTTPBlocking } + // Detect cases where an error occurred during a redirect. For this to happen, we + // need to observe (1) no "final" responses and (2) unexpected, unexplained failures + numFinals := len(analysis.HTTPFinalResponses.UnwrapOr(nil)) + numUnexpectedUnexplained := len(analysis.TCPTransactionsWithUnexplainedUnexpectedFailures.UnwrapOr(nil)) + if numFinals <= 0 && numUnexpectedUnexplained > 0 { + tk.BlockingFlags |= analysisFlagHTTPBlocking + } + + // Special case for HTTPS + if len(analysis.HTTPFinalResponsesWithTLS.UnwrapOr(nil)) > 0 { + tk.BlockingFlags |= analysisFlagSuccess + } + + // attempt to fill the comparisons about the body + // + // XXX this code should probably always run + if !analysis.HTTPDiffStatusCodeMatch.IsNone() { + value := analysis.HTTPDiffStatusCodeMatch.Unwrap() + tk.StatusCodeMatch = &value + } + if !analysis.HTTPDiffBodyProportionFactor.IsNone() { + value := analysis.HTTPDiffBodyProportionFactor.UnwrapOr(0) > 0.7 + tk.BodyLengthMatch = &value + } + if !analysis.HTTPDiffUncommonHeadersIntersection.IsNone() { + value := len(analysis.HTTPDiffUncommonHeadersIntersection.Unwrap()) > 0 + tk.HeadersMatch = &value + } + if !analysis.HTTPDiffTitleDifferentLongWords.IsNone() { + value := len(analysis.HTTPDiffTitleDifferentLongWords.Unwrap()) <= 0 + tk.TitleMatch = &value + } + // same code structure as before if !analysis.HTTPDiffStatusCodeMatch.IsNone() { if analysis.HTTPDiffStatusCodeMatch.Unwrap() { @@ -160,6 +196,6 @@ func (tk *TestKeys) analysisHTTPToplevelV2(analysis *minipipeline.WebAnalysis, l return } } + tk.BlockingFlags |= analysisFlagHTTPDiff } - tk.BlockingFlags |= analysisFlagHTTPDiff } diff --git a/internal/experiment/webconnectivityqa/dnsblocking.go b/internal/experiment/webconnectivityqa/dnsblocking.go index dc27caa9b..fd971d6a9 100644 --- a/internal/experiment/webconnectivityqa/dnsblocking.go +++ b/internal/experiment/webconnectivityqa/dnsblocking.go @@ -47,12 +47,15 @@ func dnsBlockingNXDOMAIN() *TestCase { Flags: 0, Input: "https://www.example.com/", Configure: func(env *netemx.QAEnv) { - // remove the record so that the DNS query returns NXDOMAIN, which is then - // converted into android_dns_cache_no_data by the emulation layer + // remove the record so that the DNS query returns NXDOMAIN env.ISPResolverConfig().RemoveRecord("www.example.com") }, ExpectErr: false, ExpectTestKeys: &testKeys{ + BodyLengthMatch: true, + StatusCodeMatch: true, + HeadersMatch: true, + TitleMatch: true, DNSExperimentFailure: "dns_nxdomain_error", DNSConsistency: "inconsistent", XStatus: 2080, // StatusExperimentDNS | StatusAnomalyDNS diff --git a/internal/minipipeline/analysis.go b/internal/minipipeline/analysis.go index 1132445b4..be0404e09 100644 --- a/internal/minipipeline/analysis.go +++ b/internal/minipipeline/analysis.go @@ -54,6 +54,15 @@ type WebAnalysis struct { // The generation algorithm assumes there's a single "final" response. HTTPDiffUncommonHeadersIntersection optional.Value[map[string]bool] + // HTTPFinalResponses contains the transaction IDs of "final" responses (i.e., responses + // that are like 2xx, 4xx, or 5xx). Typically, we expect to have a single response that + // if final when we're analyzing Web Connectivity LTE. + HTTPFinalResponses optional.Value[map[int64]bool] + + // HTTPFinalResponsesWithTLS is like HTTPFinalResponses but only includes the + // cases where we're using TLS to fetch the final response. + HTTPFinalResponsesWithTLS optional.Value[map[int64]bool] + // TCPTransactionsWithUnexpectedTCPConnectFailures contains the TCP transaction IDs that // contain TCP connect failures while the control measurement succeeded. TCPTransactionsWithUnexpectedTCPConnectFailures optional.Value[map[int64]bool] @@ -65,6 +74,11 @@ type WebAnalysis struct { // TCPSTransactionsWithUnexpectedHTTPFailures contains the TCP transaction IDs that // contain HTTP failures while the control measurement succeeded. TCPTransactionsWithUnexpectedHTTPFailures optional.Value[map[int64]bool] + + // TCPTransactionsWithUnexplainedUnexpectedFailures contains the TCP transaction IDs for + // which we cannot explain failures with the control information, but for which we expect + // to see a success because the control succeeded. + TCPTransactionsWithUnexplainedUnexpectedFailures optional.Value[map[int64]bool] } func analysisDNSLookupFailureIsDNSNoAnswerForAAAA(obs *WebObservation) bool { @@ -161,7 +175,7 @@ func (wa *WebAnalysis) ComputeDNSTransactionsWithUnexpectedFailures(c *WebObserv }) } - wa.DNSTransactionsWithBogons = optional.Some(state) + wa.DNSTransactionsWithUnexpectedFailures = optional.Some(state) } // ComputeDNSPossiblyInvalidAddrs computes the DNSPossiblyInvalidAddrs field. @@ -178,11 +192,6 @@ func (wa *WebAnalysis) ComputeDNSPossiblyInvalidAddrs(c *WebObservationsContaine for _, obs := range c.KnownTCPEndpoints { addr := obs.IPAddress.Unwrap() - // if the address was also resolved by the control, we're good - if obs.MatchWithControlIPAddress.UnwrapOr(false) { - continue - } - // if we have a succesful TLS handshake for this addr, we're good if obs.TLSHandshakeFailure.UnwrapOr("unknown_failure") == "" { // just in case another transaction succeded, clear the address from the state @@ -190,8 +199,13 @@ func (wa *WebAnalysis) ComputeDNSPossiblyInvalidAddrs(c *WebObservationsContaine continue } + // if the address was also resolved by the control, we're good + if obs.MatchWithControlIPAddress.UnwrapOr(true) { + continue + } + // if there's an ASN match with the control, we're good - if obs.MatchWithControlIPAddressASN.UnwrapOr(false) { + if obs.MatchWithControlIPAddressASN.UnwrapOr(true) { continue } @@ -271,6 +285,11 @@ func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexpectedHTTPFailures(c *WebOb // ComputeHTTPDiffBodyProportionFactor computes the HTTPDiffBodyProportionFactor field. func (wa *WebAnalysis) ComputeHTTPDiffBodyProportionFactor(c *WebObservationsContainer) { for _, obs := range c.KnownTCPEndpoints { + // we should only perform the comparison for a final response + if !obs.HTTPResponseIsFinal.UnwrapOr(false) { + continue + } + // we need a valid body length and the body must not be truncated measurement := obs.HTTPResponseBodyLength.UnwrapOr(0) if measurement <= 0 || obs.HTTPResponseBodyIsTruncated.UnwrapOr(true) { @@ -304,6 +323,11 @@ func (wa *WebAnalysis) ComputeHTTPDiffBodyProportionFactor(c *WebObservationsCon // ComputeHTTPDiffStatusCodeMatch computes the HTTPDiffStatusCodeMatch field. func (wa *WebAnalysis) ComputeHTTPDiffStatusCodeMatch(c *WebObservationsContainer) { for _, obs := range c.KnownTCPEndpoints { + // we should only perform the comparison for a final response + if !obs.HTTPResponseIsFinal.UnwrapOr(false) { + continue + } + // we need a positive status code for both measurement := obs.HTTPResponseStatusCode.UnwrapOr(0) if measurement <= 0 { @@ -380,7 +404,11 @@ func (wa *WebAnalysis) ComputeHTTPDiffUncommonHeadersIntersection(c *WebObservat state := make(map[string]bool) for _, obs := range c.KnownTCPEndpoints { - // we should only have control headers for the "final" response + // we should only perform the comparison for a final response + if !obs.HTTPResponseIsFinal.UnwrapOr(false) { + continue + } + measurement := obs.HTTPResponseHeadersKeys.UnwrapOr(nil) if len(measurement) <= 0 { continue @@ -420,10 +448,9 @@ func (wa *WebAnalysis) ComputeHTTPDiffUncommonHeadersIntersection(c *WebObservat // Implementation note: we only process the first observation that matches. // // This is fine(TM) as long as we have a single "final" request. + wa.HTTPDiffUncommonHeadersIntersection = optional.Some(state) break } - - wa.HTTPDiffUncommonHeadersIntersection = optional.Some(state) } // ComputeHTTPDiffTitleDifferentLongWords computes the HTTPDiffTitleDifferentLongWords field. @@ -431,7 +458,11 @@ func (wa *WebAnalysis) ComputeHTTPDiffTitleDifferentLongWords(c *WebObservations state := make(map[string]bool) for _, obs := range c.KnownTCPEndpoints { - // we should only have control headers for the "final" response + // we should only perform the comparison for a final response + if !obs.HTTPResponseIsFinal.UnwrapOr(false) { + continue + } + measurement := obs.HTTPResponseTitle.UnwrapOr("") if measurement == "" { continue @@ -478,8 +509,98 @@ func (wa *WebAnalysis) ComputeHTTPDiffTitleDifferentLongWords(c *WebObservations // Implementation note: we only process the first observation that matches. // // This is fine(TM) as long as we have a single "final" request. + wa.HTTPDiffTitleDifferentLongWords = optional.Some(state) break } +} + +// ComputeHTTPFinalResponses computes the HTTPFinalResponses field. +func (wa *WebAnalysis) ComputeHTTPFinalResponses(c *WebObservationsContainer) { + state := make(map[int64]bool) + + for _, obs := range c.KnownTCPEndpoints { + txid := obs.EndpointTransactionID.UnwrapOr(0) + if txid <= 0 { + continue + } + if obs.HTTPResponseIsFinal.UnwrapOr(false) { + state[txid] = true + continue + } + } + + wa.HTTPFinalResponses = optional.Some(state) +} + +// ComputeTCPTransactionsWithUnexplainedUnexpectedFailures computes the TCPTransactionsWithUnexplainedUnexpectedFailures field. +func (wa *WebAnalysis) ComputeTCPTransactionsWithUnexplainedUnexpectedFailures(c *WebObservationsContainer) { + state := make(map[int64]bool) + + for _, obs := range c.KnownTCPEndpoints { + // exclude the cases where we have an expectation for TCP connect + // because in those cases we can provide an explanation + if !obs.ControlTCPConnectFailure.IsNone() { + continue + } + + // exclude the cases where we have an expectation for TLS handshake + // because in those cases we can provide an explanation + if !obs.ControlTLSHandshakeFailure.IsNone() { + continue + } + + // exclude the cases where the control failed because we are + // only interested into unexpected failures + if obs.ControlHTTPFailure.UnwrapOr("unknown_error") != "" { + continue + } + + // obtain the transaction ID + txid := obs.EndpointTransactionID.UnwrapOr(0) + if txid <= 0 { + continue + } + + // TODO(bassosimone): we need to remember about broken IPv6 here + + // include the cases where there was a TCP connect failure + if obs.TCPConnectFailure.UnwrapOr("") != "" { + state[txid] = true + continue + } + + // include the cases where there was a TLS handshake failure + if obs.TLSHandshakeFailure.UnwrapOr("") != "" { + state[txid] = true + continue + } + + // include the cases where there was an HTTP failure + if obs.HTTPFailure.UnwrapOr("") != "" { + state[txid] = true + continue + } + } + + wa.TCPTransactionsWithUnexplainedUnexpectedFailures = optional.Some(state) +} + +// ComputeHTTPFinalResponsesWithTLS computes the HTTPFinalResponsesWithTLS field. +func (wa *WebAnalysis) ComputeHTTPFinalResponsesWithTLS(c *WebObservationsContainer) { + state := make(map[int64]bool) + + for _, obs := range c.KnownTCPEndpoints { + txid := obs.EndpointTransactionID.UnwrapOr(0) + if txid <= 0 { + continue + } + isFinal := obs.HTTPResponseIsFinal.UnwrapOr(false) + tlsSuccess := obs.TLSHandshakeFailure.UnwrapOr("unknown_failure") == "" + if isFinal && tlsSuccess { + state[txid] = true + continue + } + } - wa.HTTPDiffTitleDifferentLongWords = optional.Some(state) + wa.HTTPFinalResponsesWithTLS = optional.Some(state) } diff --git a/internal/minipipeline/observation.go b/internal/minipipeline/observation.go index 8b1d8c0cf..ac8af9cda 100644 --- a/internal/minipipeline/observation.go +++ b/internal/minipipeline/observation.go @@ -106,6 +106,9 @@ type WebObservation struct { // HTTPResponseTitle contains the response title. HTTPResponseTitle optional.Value[string] + // HTTPResponseIsFinal is true if the status code is 2xx, 4xx, or 5xx. + HTTPResponseIsFinal optional.Value[bool] + // ControlDNSLookupFailure is the corresponding control DNS lookup failure. ControlDNSLookupFailure optional.Value[string] @@ -312,6 +315,15 @@ func (c *WebObservationsContainer) NoteHTTPRoundTripResults(evs ...*model.Archiv obs.HTTPResponseLocation = optional.Some(string(value)) } } + + obs.HTTPResponseIsFinal = optional.Some((func() bool { + switch ev.Response.Code / 100 { + case 2, 4, 5: + return true + default: + return false + } + }())) } } @@ -328,7 +340,7 @@ func (c *WebObservationsContainer) NoteControlResults(req *model.THRequest, resp c.controlMatchDNSLookupResults(inputDomain, resp) c.controlXrefTCPIPFailures(resp) c.controlXrefTLSFailures(resp) - c.controlXrefFinalHTTPResponse(resp) + c.controlSetHTTPFinalResponseExpectation(resp) return nil } @@ -429,56 +441,28 @@ func (c *WebObservationsContainer) controlXrefTLSFailures(resp *model.THResponse } } -func (c *WebObservationsContainer) controlXrefFinalHTTPResponse(resp *model.THResponse) { - obsx := c.findFinalHTTPResponse() - if obsx.IsNone() { - return - } - obs := obsx.Unwrap() - +func (c *WebObservationsContainer) controlSetHTTPFinalResponseExpectation(resp *model.THResponse) { // Implementation note: the TH response does not have a clear semantics for "missing" values // therefore we are accepting as valid only values within the correct range + for _, obs := range c.KnownTCPEndpoints { + obs.ControlHTTPFailure = optional.Some(utilsStringPointerToString(resp.HTTPRequest.Failure)) + if value := resp.HTTPRequest.StatusCode; value > 0 { + obs.ControlHTTPResponseStatusCode = optional.Some(value) + } + if value := resp.HTTPRequest.BodyLength; value >= 0 { + obs.ControlHTTPResponseBodyLength = optional.Some(value) + } - obs.ControlHTTPFailure = optional.Some(utilsStringPointerToString(resp.HTTPRequest.Failure)) - if value := resp.HTTPRequest.StatusCode; value > 0 { - obs.ControlHTTPResponseStatusCode = optional.Some(value) - } - if value := resp.HTTPRequest.BodyLength; value >= 0 { - obs.ControlHTTPResponseBodyLength = optional.Some(value) - } - - controlHTTPResponseHeadersKeys := make(map[string]bool) - for key := range resp.HTTPRequest.Headers { - controlHTTPResponseHeadersKeys[key] = true - } - if len(controlHTTPResponseHeadersKeys) > 0 { - obs.ControlHTTPResponseHeadersKeys = optional.Some(controlHTTPResponseHeadersKeys) - } - - if v := resp.HTTPRequest.Title; v != "" { - obs.ControlHTTPResponseTitle = optional.Some(v) - } -} - -func (c *WebObservationsContainer) findFinalHTTPResponse() optional.Value[*WebObservation] { - // find all the possible final request candidates - var candidates []*WebObservation - for _, wobs := range c.KnownTCPEndpoints { - switch code := wobs.HTTPResponseStatusCode.UnwrapOr(0); code { - case 0, 301, 302, 307, 308: - // this is a redirect or a nonexisting response in the case of zero - - default: - // found candidate - candidates = append(candidates, wobs) + controlHTTPResponseHeadersKeys := make(map[string]bool) + for key := range resp.HTTPRequest.Headers { + controlHTTPResponseHeadersKeys[key] = true + } + if len(controlHTTPResponseHeadersKeys) > 0 { + obs.ControlHTTPResponseHeadersKeys = optional.Some(controlHTTPResponseHeadersKeys) } - } - // Implementation note: the final request is a request that is not a redirect and - // we expect to see just one of them. This code is written assuming we will have - // more than a final request in the future and to fail in such a case. - if len(candidates) != 1 { - return optional.None[*WebObservation]() + if v := resp.HTTPRequest.Title; v != "" { + obs.ControlHTTPResponseTitle = optional.Some(v) + } } - return optional.Some(candidates[0]) } From e7764c8b9fa7ffde349d92974d17864a475303bb Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Sat, 25 Nov 2023 14:55:09 +0100 Subject: [PATCH 20/66] tests now green what remains to be done now is to make sure we make green all the tests that are currently skipped we also need to account for differences between the two --- internal/experiment/webconnectivityqa/badssl.go | 4 ++++ internal/experiment/webconnectivityqa/dnsblocking.go | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/internal/experiment/webconnectivityqa/badssl.go b/internal/experiment/webconnectivityqa/badssl.go index 573cec49c..3347df595 100644 --- a/internal/experiment/webconnectivityqa/badssl.go +++ b/internal/experiment/webconnectivityqa/badssl.go @@ -89,6 +89,10 @@ func badSSLWithUnknownAuthorityWithInconsistentDNS() *TestCase { }, ExpectErr: false, ExpectTestKeys: &testKeys{ + BodyLengthMatch: true, + StatusCodeMatch: true, + HeadersMatch: true, + TitleMatch: true, DNSConsistency: "inconsistent", HTTPExperimentFailure: "ssl_unknown_authority", XStatus: 9248, // StatusExperimentHTTP | StatusAnomalyTLSHandshake | StatusAnomalyDNS diff --git a/internal/experiment/webconnectivityqa/dnsblocking.go b/internal/experiment/webconnectivityqa/dnsblocking.go index fd971d6a9..ef2d70b25 100644 --- a/internal/experiment/webconnectivityqa/dnsblocking.go +++ b/internal/experiment/webconnectivityqa/dnsblocking.go @@ -21,6 +21,10 @@ func dnsBlockingAndroidDNSCacheNoData() *TestCase { }, ExpectErr: false, ExpectTestKeys: &testKeys{ + BodyLengthMatch: true, + StatusCodeMatch: true, + HeadersMatch: true, + TitleMatch: true, DNSExperimentFailure: "android_dns_cache_no_data", DNSConsistency: "inconsistent", XStatus: 2080, // StatusExperimentDNS | StatusAnomalyDNS From dac41708fcc1bb24c9166be5191eea883cd93b35 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Sun, 26 Nov 2023 11:49:00 +0100 Subject: [PATCH 21/66] make more test cases work with LTE --- .../experiment/webconnectivityqa/badssl.go | 18 +++++++++--------- .../experiment/webconnectivityqa/control.go | 7 ++++--- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/internal/experiment/webconnectivityqa/badssl.go b/internal/experiment/webconnectivityqa/badssl.go index 3347df595..6043d586b 100644 --- a/internal/experiment/webconnectivityqa/badssl.go +++ b/internal/experiment/webconnectivityqa/badssl.go @@ -10,7 +10,7 @@ import ( func badSSLWithExpiredCertificate() *TestCase { return &TestCase{ Name: "badSSLWithExpiredCertificate", - Flags: TestCaseFlagNoLTE, // LTE flags it correctly but let's focus on v0.4 for now + Flags: 0, Input: "https://expired.badssl.com/", Configure: func(env *netemx.QAEnv) { // nothing @@ -21,8 +21,8 @@ func badSSLWithExpiredCertificate() *TestCase { HTTPExperimentFailure: "ssl_invalid_certificate", XStatus: 16, // StatusAnomalyControlFailure XNullNullFlags: 4, // analysisFlagNullNullTLSMisconfigured - Accessible: nil, - Blocking: nil, + Accessible: false, + Blocking: false, }, } } @@ -32,7 +32,7 @@ func badSSLWithExpiredCertificate() *TestCase { func badSSLWithWrongServerName() *TestCase { return &TestCase{ Name: "badSSLWithWrongServerName", - Flags: TestCaseFlagNoLTE, // LTE flags it correctly but let's focus on v0.4 for now + Flags: 0, Input: "https://wrong.host.badssl.com/", Configure: func(env *netemx.QAEnv) { // nothing @@ -43,8 +43,8 @@ func badSSLWithWrongServerName() *TestCase { HTTPExperimentFailure: "ssl_invalid_hostname", XStatus: 16, // StatusAnomalyControlFailure XNullNullFlags: 4, // analysisFlagNullNullTLSMisconfigured - Accessible: nil, - Blocking: nil, + Accessible: false, + Blocking: false, }, } } @@ -53,7 +53,7 @@ func badSSLWithWrongServerName() *TestCase { func badSSLWithUnknownAuthorityWithConsistentDNS() *TestCase { return &TestCase{ Name: "badSSLWithUnknownAuthorityWithConsistentDNS", - Flags: TestCaseFlagNoLTE, // LTE flags it correctly but let's focus on v0.4 for now + Flags: 0, Input: "https://untrusted-root.badssl.com/", Configure: func(env *netemx.QAEnv) { // nothing @@ -64,8 +64,8 @@ func badSSLWithUnknownAuthorityWithConsistentDNS() *TestCase { HTTPExperimentFailure: "ssl_unknown_authority", XStatus: 16, // StatusAnomalyControlFailure XNullNullFlags: 4, // analysisFlagNullNullTLSMisconfigured - Accessible: nil, - Blocking: nil, + Accessible: false, + Blocking: false, }, } } diff --git a/internal/experiment/webconnectivityqa/control.go b/internal/experiment/webconnectivityqa/control.go index a831bc156..9c59ac368 100644 --- a/internal/experiment/webconnectivityqa/control.go +++ b/internal/experiment/webconnectivityqa/control.go @@ -56,7 +56,7 @@ func controlFailureWithSuccessfulHTTPWebsite() *TestCase { func controlFailureWithSuccessfulHTTPSWebsite() *TestCase { return &TestCase{ Name: "controlFailureWithSuccessfulHTTPSWebsite", - Flags: TestCaseFlagNoLTE, // because it (correctly!) sets the DNS as consistent thanks to TLS + Flags: 0, Input: "https://www.example.org/", Configure: func(env *netemx.QAEnv) { @@ -89,8 +89,9 @@ func controlFailureWithSuccessfulHTTPSWebsite() *TestCase { ExpectErr: false, ExpectTestKeys: &testKeys{ ControlFailure: "unknown_failure: httpapi: all endpoints failed: [ connection_reset; connection_reset; connection_reset; connection_reset;]", - XStatus: 1, // StatusSuccessSecure - XNullNullFlags: 8, // analysisFlagNullNullSuccessfulHTTPS + DNSConsistency: "consistent", + XStatus: 1, // StatusSuccessSecure + XBlockingFlags: 32, // analysisFlagSuccess Accessible: true, Blocking: false, }, From 258d7fb4ae9ebbdd7c08fa8ea08d93bd0cfa1ec9 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 27 Nov 2023 12:27:32 +0100 Subject: [PATCH 22/66] we now pass all tests then next step is to sort out this mess :-) --- .../experiment/webconnectivityqa/control.go | 3 +- .../webconnectivityqa/dnshijacking.go | 16 +++++------ .../experiment/webconnectivityqa/httpdiff.go | 6 ++-- .../experiment/webconnectivityqa/redirect.go | 14 ++++------ .../experiment/webconnectivityqa/success.go | 6 ++-- .../webconnectivityqa/tcpblocking.go | 6 +++- .../experiment/webconnectivityqa/testcase.go | 4 +-- internal/minipipeline/analysis.go | 28 +++++++++++++++---- internal/minipipeline/observation.go | 12 ++++++-- 9 files changed, 61 insertions(+), 34 deletions(-) diff --git a/internal/experiment/webconnectivityqa/control.go b/internal/experiment/webconnectivityqa/control.go index 9c59ac368..376703206 100644 --- a/internal/experiment/webconnectivityqa/control.go +++ b/internal/experiment/webconnectivityqa/control.go @@ -11,7 +11,7 @@ import ( func controlFailureWithSuccessfulHTTPWebsite() *TestCase { return &TestCase{ Name: "controlFailureWithSuccessfulHTTPWebsite", - Flags: TestCaseFlagNoLTE, // BUG: has "consistent" DNS but still blocking=null and accessible=null + Flags: 0, Input: "http://www.example.org/", Configure: func(env *netemx.QAEnv) { @@ -44,6 +44,7 @@ func controlFailureWithSuccessfulHTTPWebsite() *TestCase { ExpectErr: false, ExpectTestKeys: &testKeys{ ControlFailure: "unknown_failure: httpapi: all endpoints failed: [ connection_reset; connection_reset; connection_reset; connection_reset;]", + DNSConsistency: "consistent", XStatus: 8, // StatusAnomalyControlUnreachable Accessible: nil, Blocking: nil, diff --git a/internal/experiment/webconnectivityqa/dnshijacking.go b/internal/experiment/webconnectivityqa/dnshijacking.go index 75a0cbf66..df2264ab3 100644 --- a/internal/experiment/webconnectivityqa/dnshijacking.go +++ b/internal/experiment/webconnectivityqa/dnshijacking.go @@ -12,7 +12,7 @@ func dnsHijackingToProxyWithHTTPURL() *TestCase { // transparent TLS proxy really makes our analysis a bit more complex return &TestCase{ Name: "dnsHijackingToProxyWithHTTPURL", - Flags: TestCaseFlagNoLTE, // BUG: LTE thinks the DNS is consistent + Flags: 0, Input: "http://www.example.com/", Configure: func(env *netemx.QAEnv) { @@ -33,11 +33,11 @@ func dnsHijackingToProxyWithHTTPURL() *TestCase { StatusCodeMatch: true, HeadersMatch: true, TitleMatch: true, - XStatus: 2, // StatusSuccessCleartext - XDNSFlags: 0, - XBlockingFlags: 32, // analysisFlagSuccess - Accessible: true, - Blocking: false, + XStatus: 2, // StatusSuccessCleartext + XDNSFlags: 4, // AnalysisDNSUnexpectedAddrs + XBlockingFlags: 33, // AnalysisFlagDNSBlocking | analysisFlagSuccess + Accessible: false, // FIXME: this is probably incorrect! + Blocking: "dns", }, } } @@ -49,7 +49,7 @@ func dnsHijackingToProxyWithHTTPSURL() *TestCase { // transparent TLS proxy really makes our analysis a bit more complex return &TestCase{ Name: "dnsHijackingToProxyWithHTTPSURL", - Flags: TestCaseFlagNoLTE, // BUG: LTE thinks the DNS is consistent + Flags: 0, Input: "https://www.example.com/", Configure: func(env *netemx.QAEnv) { @@ -64,7 +64,7 @@ func dnsHijackingToProxyWithHTTPSURL() *TestCase { }, ExpectErr: false, ExpectTestKeys: &testKeys{ - DNSConsistency: "inconsistent", + DNSConsistency: "consistent", BodyLengthMatch: true, BodyProportion: 1, StatusCodeMatch: true, diff --git a/internal/experiment/webconnectivityqa/httpdiff.go b/internal/experiment/webconnectivityqa/httpdiff.go index 2a619337f..aa6650e94 100644 --- a/internal/experiment/webconnectivityqa/httpdiff.go +++ b/internal/experiment/webconnectivityqa/httpdiff.go @@ -11,7 +11,7 @@ import ( func httpDiffWithConsistentDNS() *TestCase { return &TestCase{ Name: "httpDiffWithConsistentDNS", - Flags: TestCaseFlagNoLTE, // BUG: LTE does not set whether the headers match + Flags: 0, Input: "http://www.example.com/", Configure: func(env *netemx.QAEnv) { @@ -49,7 +49,7 @@ func httpDiffWithConsistentDNS() *TestCase { func httpDiffWithInconsistentDNS() *TestCase { return &TestCase{ Name: "httpDiffWithInconsistentDNS", - Flags: TestCaseFlagNoLTE, // BUG: LTE does not detect any HTTP diff here + Flags: 0, Input: "http://www.example.com/", Configure: func(env *netemx.QAEnv) { @@ -92,7 +92,7 @@ func httpDiffWithInconsistentDNS() *TestCase { TitleMatch: false, XStatus: 96, // StatusAnomalyHTTPDiff | StatusAnomalyDNS XDNSFlags: 4, // AnalysisDNSUnexpectedAddrs - XBlockingFlags: 35, // analysisFlagSuccess | analysisFlagDNSBlocking | analysisFlagTCPIPBlocking + XBlockingFlags: 17, // analysisFlagDNSBlocking | analysisFlagHTTPDiff Accessible: false, Blocking: "dns", }, diff --git a/internal/experiment/webconnectivityqa/redirect.go b/internal/experiment/webconnectivityqa/redirect.go index 248a3c29e..4be8315e7 100644 --- a/internal/experiment/webconnectivityqa/redirect.go +++ b/internal/experiment/webconnectivityqa/redirect.go @@ -162,12 +162,8 @@ func redirectWithConsistentDNSAndThenConnectionResetForHTTPS() *TestCase { // works but then there's NXDOMAIN for the URL's domain func redirectWithConsistentDNSAndThenNXDOMAIN() *TestCase { return &TestCase{ - Name: "redirectWithConsistentDNSAndThenNXDOMAIN", - // TODO(bassosimone): this test case cannot be fixed by providing a suitable HTTP - // response because we do not create any HTTP response during the DNS step. We would - // need to create one in order for this test case to become green. In turn, I think - // to overcome this case, we need to restructure LTE's implementation a bit. - Flags: TestCaseFlagNoLTE, + Name: "redirectWithConsistentDNSAndThenNXDOMAIN", + Flags: 0, Input: "https://bit.ly/21645", Configure: func(env *netemx.QAEnv) { @@ -182,11 +178,11 @@ func redirectWithConsistentDNSAndThenNXDOMAIN() *TestCase { ExpectErr: false, ExpectTestKeys: &testKeys{ DNSExperimentFailure: nil, - DNSConsistency: "consistent", + DNSConsistency: "inconsistent", HTTPExperimentFailure: "dns_nxdomain_error", XStatus: 8224, // StatusExperimentHTTP | StatusAnomalyDNS - XDNSFlags: 0, - XBlockingFlags: 8, // analysisFlagHTTPBlocking + XDNSFlags: 2, // AnalysisDNSUnexpectedFailure + XBlockingFlags: 1, // analysisFlagDNSBlocking Accessible: false, Blocking: "dns", }, diff --git a/internal/experiment/webconnectivityqa/success.go b/internal/experiment/webconnectivityqa/success.go index e2e628cbf..25906d0df 100644 --- a/internal/experiment/webconnectivityqa/success.go +++ b/internal/experiment/webconnectivityqa/success.go @@ -1,7 +1,7 @@ package webconnectivityqa // successWithHTTP ensures we can successfully measure an HTTP URL. -func sucessWithHTTP() *TestCase { +func successWithHTTP() *TestCase { return &TestCase{ Name: "successWithHTTP", Flags: 0, @@ -24,10 +24,10 @@ func sucessWithHTTP() *TestCase { } // successWithHTTPS ensures we can successfully measure an HTTPS URL. -func sucessWithHTTPS() *TestCase { +func successWithHTTPS() *TestCase { return &TestCase{ Name: "successWithHTTPS", - Flags: TestCaseFlagNoLTE, // it does not set any HTTP comparison value with HTTPS + Flags: 0, Input: "https://www.example.com/", Configure: nil, ExpectErr: false, diff --git a/internal/experiment/webconnectivityqa/tcpblocking.go b/internal/experiment/webconnectivityqa/tcpblocking.go index 9bc89515e..dca273d33 100644 --- a/internal/experiment/webconnectivityqa/tcpblocking.go +++ b/internal/experiment/webconnectivityqa/tcpblocking.go @@ -44,7 +44,7 @@ func tcpBlockingConnectTimeout() *TestCase { func tcpBlockingConnectionRefusedWithInconsistentDNS() *TestCase { return &TestCase{ Name: "tcpBlockingConnectionRefusedWithInconsistentDNS", - Flags: TestCaseFlagNoLTE, // with LTE we can bypass the blocking + Flags: 0, Input: "http://www.example.org/", Configure: func(env *netemx.QAEnv) { @@ -67,6 +67,10 @@ func tcpBlockingConnectionRefusedWithInconsistentDNS() *TestCase { }, ExpectErr: false, ExpectTestKeys: &testKeys{ + BodyLengthMatch: true, + StatusCodeMatch: true, + HeadersMatch: true, + TitleMatch: true, DNSExperimentFailure: nil, DNSConsistency: "inconsistent", HTTPExperimentFailure: "connection_refused", diff --git a/internal/experiment/webconnectivityqa/testcase.go b/internal/experiment/webconnectivityqa/testcase.go index 37ef5919d..d9f7545f0 100644 --- a/internal/experiment/webconnectivityqa/testcase.go +++ b/internal/experiment/webconnectivityqa/testcase.go @@ -64,8 +64,8 @@ func AllTestCases() []*TestCase { redirectWithConsistentDNSAndThenTimeoutForHTTP(), redirectWithConsistentDNSAndThenTimeoutForHTTPS(), - sucessWithHTTP(), - sucessWithHTTPS(), + successWithHTTP(), + successWithHTTPS(), tcpBlockingConnectTimeout(), tcpBlockingConnectionRefusedWithInconsistentDNS(), diff --git a/internal/minipipeline/analysis.go b/internal/minipipeline/analysis.go index be0404e09..152ce905f 100644 --- a/internal/minipipeline/analysis.go +++ b/internal/minipipeline/analysis.go @@ -89,6 +89,20 @@ func analysisDNSLookupFailureIsDNSNoAnswerForAAAA(obs *WebObservation) bool { func (wa *WebAnalysis) ComputeDNSExperimentFailure(c *WebObservationsContainer) { for _, obs := range c.DNSLookupFailures { + // we should only consider the first DNS lookup to be consistent with + // what was previously returned by Web Connectivity v0.4 + probeDomain := obs.DNSDomain.UnwrapOr("") + if probeDomain == "" { + continue + } + thDomain := obs.ControlDNSDomain.UnwrapOr("") + if thDomain == "" { + continue + } + if probeDomain != thDomain { + continue + } + // make sure we only include the system resolver switch obs.DNSEngine.UnwrapOr("") { case "getaddrinfo", "golang_net_resolver": @@ -409,14 +423,18 @@ func (wa *WebAnalysis) ComputeHTTPDiffUncommonHeadersIntersection(c *WebObservat continue } - measurement := obs.HTTPResponseHeadersKeys.UnwrapOr(nil) - if len(measurement) <= 0 { + // We should only perform the comparison if we have valid control data. Because + // the headers could legitimately be empty, let's use the status code here. + if obs.ControlHTTPResponseStatusCode.UnwrapOr(0) <= 0 { continue } + + // Implementation note: here we need to continue running when either + // headers are empty in order to produce an empty intersection. If we'd stop + // after noticing that either dictionary is empty, we'd product a nil + // analysis result, which causes QA differences with v0.4. + measurement := obs.HTTPResponseHeadersKeys.UnwrapOr(nil) control := obs.ControlHTTPResponseHeadersKeys.UnwrapOr(nil) - if len(control) <= 0 { - continue - } const ( byProbe = 1 << iota diff --git a/internal/minipipeline/observation.go b/internal/minipipeline/observation.go index ac8af9cda..43b3fc9c2 100644 --- a/internal/minipipeline/observation.go +++ b/internal/minipipeline/observation.go @@ -109,6 +109,11 @@ type WebObservation struct { // HTTPResponseIsFinal is true if the status code is 2xx, 4xx, or 5xx. HTTPResponseIsFinal optional.Value[bool] + // ControlDNSDomain is the domain used by the control for its DNS lookup. This + // field is set only when the domain used by the control matches the domain + // used by the probe. So, we won't see this record for redirects using a different domain. + ControlDNSDomain optional.Value[string] + // ControlDNSLookupFailure is the corresponding control DNS lookup failure. ControlDNSLookupFailure optional.Value[string] @@ -336,7 +341,7 @@ func (c *WebObservationsContainer) NoteControlResults(req *model.THRequest, resp } inputDomain := URL.Hostname() - c.controlXrefDNSFailures(inputDomain, resp) + c.controlXrefDNSQueries(inputDomain, resp) c.controlMatchDNSLookupResults(inputDomain, resp) c.controlXrefTCPIPFailures(resp) c.controlXrefTLSFailures(resp) @@ -386,13 +391,16 @@ func (c *WebObservationsContainer) controlMatchDNSLookupResults(inputDomain stri } } -func (c *WebObservationsContainer) controlXrefDNSFailures(inputDomain string, resp *model.THResponse) { +func (c *WebObservationsContainer) controlXrefDNSQueries(inputDomain string, resp *model.THResponse) { for _, obs := range c.DNSLookupFailures { // skip cases where the input domain is different if obs.DNSDomain.Unwrap() != inputDomain { continue } + // register the corresponding DNS domain used by the control + obs.ControlDNSDomain = optional.Some(inputDomain) + // register the corresponding DNS lookup failure obs.ControlDNSLookupFailure = optional.Some(utilsStringPointerToString(resp.DNS.Failure)) } From c6a49ff9b119f9aa70a147d15591214ef4114ee5 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 27 Nov 2023 12:46:26 +0100 Subject: [PATCH 23/66] [ci skip] remove TODO --- internal/experiment/webconnectivityqa/tcpblocking.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/internal/experiment/webconnectivityqa/tcpblocking.go b/internal/experiment/webconnectivityqa/tcpblocking.go index dca273d33..3dfdbc596 100644 --- a/internal/experiment/webconnectivityqa/tcpblocking.go +++ b/internal/experiment/webconnectivityqa/tcpblocking.go @@ -11,11 +11,7 @@ import ( // where the connection is timed out. func tcpBlockingConnectTimeout() *TestCase { return &TestCase{ - Name: "tcpBlockingConnectTimeout", - // TODO(bassosimone): this test case transitions from 2 (TCP/IP blocking) to - // 10 (both TCP/IP blocking and HTTP blocking). The reason why this happens is - // that we're now adding an HTTP request to the mix. This is unfortunate. We - // should not flag HTTP failures here inside of the bitmask. + Name: "tcpBlockingConnectTimeout", Flags: 0, Input: "https://www.example.com/", Configure: func(env *netemx.QAEnv) { From 8d25a65d8eb13f4b457e3b29b8dd38f040ec4f74 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 27 Nov 2023 15:12:40 +0100 Subject: [PATCH 24/66] fix tricky case with order of DNS processing (I am thankful there's a ~comprehensive test suite.) --- .../webconnectivityqa/dnshijacking.go | 12 ++++++------ internal/minipipeline/analysis.go | 18 ++++++++++++++++-- internal/minipipeline/observation.go | 18 ++++++++++++++---- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/internal/experiment/webconnectivityqa/dnshijacking.go b/internal/experiment/webconnectivityqa/dnshijacking.go index df2264ab3..612d9ab98 100644 --- a/internal/experiment/webconnectivityqa/dnshijacking.go +++ b/internal/experiment/webconnectivityqa/dnshijacking.go @@ -27,17 +27,17 @@ func dnsHijackingToProxyWithHTTPURL() *TestCase { }, ExpectErr: false, ExpectTestKeys: &testKeys{ - DNSConsistency: "inconsistent", + DNSConsistency: "consistent", BodyLengthMatch: true, BodyProportion: 1, StatusCodeMatch: true, HeadersMatch: true, TitleMatch: true, - XStatus: 2, // StatusSuccessCleartext - XDNSFlags: 4, // AnalysisDNSUnexpectedAddrs - XBlockingFlags: 33, // AnalysisFlagDNSBlocking | analysisFlagSuccess - Accessible: false, // FIXME: this is probably incorrect! - Blocking: "dns", + XStatus: 2, // StatusSuccessCleartext + XDNSFlags: 0, + XBlockingFlags: 32, // analysisFlagSuccess + Accessible: true, + Blocking: false, }, } } diff --git a/internal/minipipeline/analysis.go b/internal/minipipeline/analysis.go index 152ce905f..dd5a77d31 100644 --- a/internal/minipipeline/analysis.go +++ b/internal/minipipeline/analysis.go @@ -203,13 +203,12 @@ func (wa *WebAnalysis) ComputeDNSPossiblyInvalidAddrs(c *WebObservationsContaine state := make(map[string]bool) + // pass 1: insert candidates into the state map for _, obs := range c.KnownTCPEndpoints { addr := obs.IPAddress.Unwrap() // if we have a succesful TLS handshake for this addr, we're good if obs.TLSHandshakeFailure.UnwrapOr("unknown_failure") == "" { - // just in case another transaction succeded, clear the address from the state - delete(state, addr) continue } @@ -227,6 +226,21 @@ func (wa *WebAnalysis) ComputeDNSPossiblyInvalidAddrs(c *WebObservationsContaine state[addr] = true } + // pass 2: remove IP addresses we could validate using TLS handshakes + // + // we need to perform this second step because the order with which we walk + // through c.KnownTCPEndpoints is not fixed _and_ in any case, there is no + // guarantee that we'll observe 80/tcp entries _before_ 443/tcp ones. So, by + // applying this algorithm as a second step, we ensure that we're always + // able to remove TLS-validate addresses from the "bad" set. + for _, obs := range c.KnownTCPEndpoints { + addr := obs.IPAddress.Unwrap() + if obs.TLSHandshakeFailure.UnwrapOr("") != "" { + continue + } + delete(state, addr) + } + wa.DNSPossiblyInvalidAddrs = optional.Some(state) } diff --git a/internal/minipipeline/observation.go b/internal/minipipeline/observation.go index 43b3fc9c2..298f0b0ab 100644 --- a/internal/minipipeline/observation.go +++ b/internal/minipipeline/observation.go @@ -368,15 +368,25 @@ func (c *WebObservationsContainer) controlMatchDNSLookupResults(inputDomain stri // walk through the list of known observations for _, obs := range c.KnownTCPEndpoints { - // skip entries using a different domain than the one used by the TH + // obtain the domain from which we obtained the endpoint's address domain := obs.DNSDomain.UnwrapOr("") - if domain == "" || domain != inputDomain { - continue - } // obtain the IP address addr := obs.IPAddress.Unwrap() + // handle the case from which the IP address has been provided by the control, which + // is a case where the domain is empty and the IP address is in thAddrMap + if domain == "" && thAddrMap[addr] { + obs.MatchWithControlIPAddress = optional.Some(true) + obs.MatchWithControlIPAddressASN = optional.Some(true) + continue + } + + // skip entries using a different domain than the one used by the TH + if domain == "" || domain != inputDomain { + continue + } + // compute whether also the TH observed this addr obs.MatchWithControlIPAddress = optional.Some(thAddrMap[addr]) From 44541ea15df700a70f53377699d82669f3155252 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 27 Nov 2023 15:21:56 +0100 Subject: [PATCH 25/66] adjust test case where actually dns is consistent with lte this happens because LTE sucessfully handshakes with the wrong address --- internal/experiment/webconnectivityqa/httpdiff.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/experiment/webconnectivityqa/httpdiff.go b/internal/experiment/webconnectivityqa/httpdiff.go index aa6650e94..32514ab2f 100644 --- a/internal/experiment/webconnectivityqa/httpdiff.go +++ b/internal/experiment/webconnectivityqa/httpdiff.go @@ -54,7 +54,7 @@ func httpDiffWithInconsistentDNS() *TestCase { Configure: func(env *netemx.QAEnv) { // add DPI rule to force all the cleartext DNS queries to - // point the client to used the ISPProxyAddress + // point the client to use the ISPProxyAddress env.DPIEngine().AddRule(&netem.DPISpoofDNSResponse{ Addresses: []string{netemx.ISPProxyAddress}, Logger: env.Logger(), @@ -83,7 +83,7 @@ func httpDiffWithInconsistentDNS() *TestCase { ExpectErr: false, ExpectTestKeys: &testKeys{ DNSExperimentFailure: nil, - DNSConsistency: "inconsistent", + DNSConsistency: "consistent", HTTPExperimentFailure: nil, BodyLengthMatch: false, BodyProportion: 0.12263535551206783, @@ -91,10 +91,10 @@ func httpDiffWithInconsistentDNS() *TestCase { HeadersMatch: false, TitleMatch: false, XStatus: 96, // StatusAnomalyHTTPDiff | StatusAnomalyDNS - XDNSFlags: 4, // AnalysisDNSUnexpectedAddrs - XBlockingFlags: 17, // analysisFlagDNSBlocking | analysisFlagHTTPDiff + XDNSFlags: 0, + XBlockingFlags: 16, // analysisFlagHTTPDiff Accessible: false, - Blocking: "dns", + Blocking: "http-diff", }, } } From 183f5242b6b8dbef90f218810b5d8babdbc25ffc Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 27 Nov 2023 15:37:48 +0100 Subject: [PATCH 26/66] make all lte tests pass consistently --- internal/experiment/webconnectivityqa/tcpblocking.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/experiment/webconnectivityqa/tcpblocking.go b/internal/experiment/webconnectivityqa/tcpblocking.go index 3dfdbc596..c48a878d2 100644 --- a/internal/experiment/webconnectivityqa/tcpblocking.go +++ b/internal/experiment/webconnectivityqa/tcpblocking.go @@ -68,13 +68,13 @@ func tcpBlockingConnectionRefusedWithInconsistentDNS() *TestCase { HeadersMatch: true, TitleMatch: true, DNSExperimentFailure: nil, - DNSConsistency: "inconsistent", + DNSConsistency: "consistent", HTTPExperimentFailure: "connection_refused", XStatus: 4256, // StatusExperimentConnect | StatusAnomalyConnect | StatusAnomalyDNS - XDNSFlags: 4, // AnalysisDNSUnexpectedAddrs - XBlockingFlags: 35, // analysisFlagSuccess | analysisFlagDNSBlocking | analysisFlagTCPIPBlocking + XDNSFlags: 0, + XBlockingFlags: 34, // analysisFlagSuccess | analysisFlagTCPIPBlocking Accessible: false, - Blocking: "dns", + Blocking: "tcp_ip", }, } } From a4bedcc4143872c22eca687ab02997580ac99cfb Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 27 Nov 2023 16:41:44 +0100 Subject: [PATCH 27/66] x --- .../experiment/webconnectivity/httpanalysis.go | 2 +- .../webconnectivitylte/analysishttpdiff.go | 2 +- internal/experiment/webconnectivityqa/badssl.go | 12 +++++++----- internal/experiment/webconnectivityqa/control.go | 12 ++++++++---- .../experiment/webconnectivityqa/dnsblocking.go | 12 ++++++++---- .../experiment/webconnectivityqa/dnshijacking.go | 14 ++++++++------ internal/experiment/webconnectivityqa/httpdiff.go | 10 ++++++++-- internal/experiment/webconnectivityqa/redirect.go | 6 ++++-- .../experiment/webconnectivityqa/tcpblocking.go | 6 ++++-- internal/measurexlite/web.go | 4 ++-- internal/measurexlite/web_test.go | 2 +- internal/minipipeline/observation.go | 2 +- internal/oohelperd/http.go | 2 +- internal/pipeline/web.go | 2 +- 14 files changed, 55 insertions(+), 33 deletions(-) diff --git a/internal/experiment/webconnectivity/httpanalysis.go b/internal/experiment/webconnectivity/httpanalysis.go index 23d27d7ea..65ea775b3 100644 --- a/internal/experiment/webconnectivity/httpanalysis.go +++ b/internal/experiment/webconnectivity/httpanalysis.go @@ -202,7 +202,7 @@ func HTTPTitleMatch(tk urlgetter.TestKeys, ctrl ControlResponse) (out *bool) { } control := ctrl.HTTPRequest.Title measurementBody := string(response.Body) - measurement := measurexlite.WebGetTitleString(measurementBody) + measurement := measurexlite.WebGetTitle(measurementBody) if measurement == "" { return } diff --git a/internal/experiment/webconnectivitylte/analysishttpdiff.go b/internal/experiment/webconnectivitylte/analysishttpdiff.go index 32475648e..b25a73950 100644 --- a/internal/experiment/webconnectivitylte/analysishttpdiff.go +++ b/internal/experiment/webconnectivitylte/analysishttpdiff.go @@ -231,7 +231,7 @@ func (tk *TestKeys) httpDiffTitleMatch( } control := ctrl.Title measurementBody := string(response.Body) - measurement := measurexlite.WebGetTitleString(measurementBody) + measurement := measurexlite.WebGetTitle(measurementBody) if control == "" || measurement == "" { return } diff --git a/internal/experiment/webconnectivityqa/badssl.go b/internal/experiment/webconnectivityqa/badssl.go index 6043d586b..014ed1462 100644 --- a/internal/experiment/webconnectivityqa/badssl.go +++ b/internal/experiment/webconnectivityqa/badssl.go @@ -10,7 +10,7 @@ import ( func badSSLWithExpiredCertificate() *TestCase { return &TestCase{ Name: "badSSLWithExpiredCertificate", - Flags: 0, + Flags: TestCaseFlagNoV04, // v0.4 does not set accessible and blocking in this case Input: "https://expired.badssl.com/", Configure: func(env *netemx.QAEnv) { // nothing @@ -32,7 +32,7 @@ func badSSLWithExpiredCertificate() *TestCase { func badSSLWithWrongServerName() *TestCase { return &TestCase{ Name: "badSSLWithWrongServerName", - Flags: 0, + Flags: TestCaseFlagNoV04, // v0.4 does not set accessible and blocking in this case Input: "https://wrong.host.badssl.com/", Configure: func(env *netemx.QAEnv) { // nothing @@ -53,7 +53,7 @@ func badSSLWithWrongServerName() *TestCase { func badSSLWithUnknownAuthorityWithConsistentDNS() *TestCase { return &TestCase{ Name: "badSSLWithUnknownAuthorityWithConsistentDNS", - Flags: 0, + Flags: TestCaseFlagNoV04, // v0.4 does not set accessible and blocking in this case Input: "https://untrusted-root.badssl.com/", Configure: func(env *netemx.QAEnv) { // nothing @@ -73,8 +73,10 @@ func badSSLWithUnknownAuthorityWithConsistentDNS() *TestCase { // This test case models when we're redirected to a blockpage website using a custom CA. func badSSLWithUnknownAuthorityWithInconsistentDNS() *TestCase { return &TestCase{ - Name: "badSSLWithUnknownAuthorityWithInconsistentDNS", - Flags: 0, + Name: "badSSLWithUnknownAuthorityWithInconsistentDNS", + // v0.4 cannot set BodyLengthMatch, StatusCodeMatch, HeadersMatch, and TitleMatch while v0.5 + // can do that because it also uses IP addrs from DoH and the TH + Flags: TestCaseFlagNoV04, Input: "https://www.example.com/", Configure: func(env *netemx.QAEnv) { diff --git a/internal/experiment/webconnectivityqa/control.go b/internal/experiment/webconnectivityqa/control.go index 376703206..de8d3de9f 100644 --- a/internal/experiment/webconnectivityqa/control.go +++ b/internal/experiment/webconnectivityqa/control.go @@ -10,8 +10,10 @@ import ( // where we cannot reach the control server but the website measurement is OK. func controlFailureWithSuccessfulHTTPWebsite() *TestCase { return &TestCase{ - Name: "controlFailureWithSuccessfulHTTPWebsite", - Flags: 0, + Name: "controlFailureWithSuccessfulHTTPWebsite", + // We must disable v0.4 because v0.5 is able to determine that DNS is consistent + // since it also performs TLS handshakes, while v0.4 cannot + Flags: TestCaseFlagNoV04, Input: "http://www.example.org/", Configure: func(env *netemx.QAEnv) { @@ -56,8 +58,10 @@ func controlFailureWithSuccessfulHTTPWebsite() *TestCase { // where we cannot reach the control server but the website measurement is OK. func controlFailureWithSuccessfulHTTPSWebsite() *TestCase { return &TestCase{ - Name: "controlFailureWithSuccessfulHTTPSWebsite", - Flags: 0, + Name: "controlFailureWithSuccessfulHTTPSWebsite", + // With v0.5 we can determine that the DNS is consistent using TLS, while v0.5 cannot + // do this inference, so we need to disable v0.4 now. + Flags: TestCaseFlagNoV04, Input: "https://www.example.org/", Configure: func(env *netemx.QAEnv) { diff --git a/internal/experiment/webconnectivityqa/dnsblocking.go b/internal/experiment/webconnectivityqa/dnsblocking.go index ef2d70b25..c26577473 100644 --- a/internal/experiment/webconnectivityqa/dnsblocking.go +++ b/internal/experiment/webconnectivityqa/dnsblocking.go @@ -8,8 +8,10 @@ import ( // resolver returns the android_dns_cache_no_data error. func dnsBlockingAndroidDNSCacheNoData() *TestCase { return &TestCase{ - Name: "dnsBlockingAndroidDNSCacheNoData", - Flags: 0, + Name: "dnsBlockingAndroidDNSCacheNoData", + // With v0.5 we can still fetch a webpage because we use multiple resolvers + // but it's not possible to do the same with v0.4, so we disable it. + Flags: TestCaseFlagNoV04, Input: "https://www.example.com/", Configure: func(env *netemx.QAEnv) { // make sure the env knows we want to emulate our getaddrinfo wrapper behavior @@ -47,8 +49,10 @@ func dnsBlockingNXDOMAIN() *TestCase { See . */ return &TestCase{ - Name: "dnsBlockingNXDOMAIN", - Flags: 0, + Name: "dnsBlockingNXDOMAIN", + // With v0.5 we can still fetch a webpage because we use multiple resolvers + // but it's not possible to do the same with v0.4, so we disable it. + Flags: TestCaseFlagNoV04, Input: "https://www.example.com/", Configure: func(env *netemx.QAEnv) { // remove the record so that the DNS query returns NXDOMAIN diff --git a/internal/experiment/webconnectivityqa/dnshijacking.go b/internal/experiment/webconnectivityqa/dnshijacking.go index 612d9ab98..8ef8c3e7e 100644 --- a/internal/experiment/webconnectivityqa/dnshijacking.go +++ b/internal/experiment/webconnectivityqa/dnshijacking.go @@ -8,11 +8,11 @@ import ( // dnsHijackingToProxyWithHTTPURL is the case where an ISP rule forces clients to always // use an explicity passthrough proxy for a given domain. func dnsHijackingToProxyWithHTTPURL() *TestCase { - // TODO(bassosimone): it's debateable whether this case is actually WAI but the - // transparent TLS proxy really makes our analysis a bit more complex return &TestCase{ - Name: "dnsHijackingToProxyWithHTTPURL", - Flags: 0, + Name: "dnsHijackingToProxyWithHTTPURL", + // Disable v0.4 because it cannot detect that the DNS is consistent + // by using the results of the TLS handshake. + Flags: TestCaseFlagNoV04, Input: "http://www.example.com/", Configure: func(env *netemx.QAEnv) { @@ -48,8 +48,10 @@ func dnsHijackingToProxyWithHTTPSURL() *TestCase { // TODO(bassosimone): it's debateable whether this case is actually WAI but the // transparent TLS proxy really makes our analysis a bit more complex return &TestCase{ - Name: "dnsHijackingToProxyWithHTTPSURL", - Flags: 0, + Name: "dnsHijackingToProxyWithHTTPSURL", + // Disable v0.4 because it cannot detect that the DNS is consistent + // by using the results of the TLS handshake. + Flags: TestCaseFlagNoV04, Input: "https://www.example.com/", Configure: func(env *netemx.QAEnv) { diff --git a/internal/experiment/webconnectivityqa/httpdiff.go b/internal/experiment/webconnectivityqa/httpdiff.go index 32514ab2f..0dfb7f541 100644 --- a/internal/experiment/webconnectivityqa/httpdiff.go +++ b/internal/experiment/webconnectivityqa/httpdiff.go @@ -48,8 +48,14 @@ func httpDiffWithConsistentDNS() *TestCase { // but the addresses returned by the DNS resolver are inconsistent. func httpDiffWithInconsistentDNS() *TestCase { return &TestCase{ - Name: "httpDiffWithInconsistentDNS", - Flags: 0, + Name: "httpDiffWithInconsistentDNS", + // With v0.5 we conclude that the DNS is consistent because we can still + // perform TLS connections with the given addresses. Disable v0.4 because + // it does not reach to the same conclusion. + // + // TODO(bassosimone): maybe we should create another test case where + // we end up with having a truly inconsistent DNS. + Flags: TestCaseFlagNoV04, Input: "http://www.example.com/", Configure: func(env *netemx.QAEnv) { diff --git a/internal/experiment/webconnectivityqa/redirect.go b/internal/experiment/webconnectivityqa/redirect.go index 4be8315e7..44f97d3cb 100644 --- a/internal/experiment/webconnectivityqa/redirect.go +++ b/internal/experiment/webconnectivityqa/redirect.go @@ -162,8 +162,10 @@ func redirectWithConsistentDNSAndThenConnectionResetForHTTPS() *TestCase { // works but then there's NXDOMAIN for the URL's domain func redirectWithConsistentDNSAndThenNXDOMAIN() *TestCase { return &TestCase{ - Name: "redirectWithConsistentDNSAndThenNXDOMAIN", - Flags: 0, + Name: "redirectWithConsistentDNSAndThenNXDOMAIN", + // LTE correctly sees that there is DNS error during the redirect, while v0.4 + // does not have visibility into this event, so let's disable v0.4. + Flags: TestCaseFlagNoV04, Input: "https://bit.ly/21645", Configure: func(env *netemx.QAEnv) { diff --git a/internal/experiment/webconnectivityqa/tcpblocking.go b/internal/experiment/webconnectivityqa/tcpblocking.go index c48a878d2..03fbc9f63 100644 --- a/internal/experiment/webconnectivityqa/tcpblocking.go +++ b/internal/experiment/webconnectivityqa/tcpblocking.go @@ -39,8 +39,10 @@ func tcpBlockingConnectTimeout() *TestCase { // where the DNS is inconsistent and there's TCP blocking. func tcpBlockingConnectionRefusedWithInconsistentDNS() *TestCase { return &TestCase{ - Name: "tcpBlockingConnectionRefusedWithInconsistentDNS", - Flags: 0, + Name: "tcpBlockingConnectionRefusedWithInconsistentDNS", + // With LTE we can see a body because we use multiple resolvers and we conclude that the + // DNS is consistent using TLS handshakes. Let's disable v0.4, which cannot do that. + Flags: TestCaseFlagNoV04, Input: "http://www.example.org/", Configure: func(env *netemx.QAEnv) { diff --git a/internal/measurexlite/web.go b/internal/measurexlite/web.go index 625cc3d74..02b9daf6e 100644 --- a/internal/measurexlite/web.go +++ b/internal/measurexlite/web.go @@ -12,8 +12,8 @@ import "regexp" // e.g. 's one var webTitleRegexp = regexp.MustCompile(`(?i)([^<]{1,512})`) -// WebGetTitleString returns the title or an empty string. -func WebGetTitleString(measurementBody string) string { +// WebGetTitle returns the title or an empty string. +func WebGetTitle(measurementBody string) string { v := webTitleRegexp.FindStringSubmatch(measurementBody) if len(v) < 2 { return "" diff --git a/internal/measurexlite/web_test.go b/internal/measurexlite/web_test.go index 7f2e8f014..115ae3410 100644 --- a/internal/measurexlite/web_test.go +++ b/internal/measurexlite/web_test.go @@ -54,7 +54,7 @@ func TestWebGetTitle(t *testing.T) { }} for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - gotOut := WebGetTitleString(tt.args.body) + gotOut := WebGetTitle(tt.args.body) if diff := cmp.Diff(tt.wantOut, gotOut); diff != "" { t.Fatal(diff) } diff --git a/internal/minipipeline/observation.go b/internal/minipipeline/observation.go index 298f0b0ab..104c4fd16 100644 --- a/internal/minipipeline/observation.go +++ b/internal/minipipeline/observation.go @@ -312,7 +312,7 @@ func (c *WebObservationsContainer) NoteHTTPRoundTripResults(evs ...*model.Archiv } obs.HTTPResponseHeadersKeys = optional.Some(httpResponseHeadersKeys) - if value := measurexlite.WebGetTitleString(string(ev.Response.Body)); value != "" { + if value := measurexlite.WebGetTitle(string(ev.Response.Body)); value != "" { obs.HTTPResponseTitle = optional.Some(value) } for key, value := range ev.Response.Headers { diff --git a/internal/oohelperd/http.go b/internal/oohelperd/http.go index 0b9d221a7..e6867187e 100644 --- a/internal/oohelperd/http.go +++ b/internal/oohelperd/http.go @@ -120,7 +120,7 @@ func httpDo(ctx context.Context, config *httpConfig) { Failure: httpMapFailure(err), StatusCode: int64(resp.StatusCode), Headers: headers, - Title: measurexlite.WebGetTitleString(string(data)), + Title: measurexlite.WebGetTitle(string(data)), } } diff --git a/internal/pipeline/web.go b/internal/pipeline/web.go index 1e811bb3e..584b47a6a 100644 --- a/internal/pipeline/web.go +++ b/internal/pipeline/web.go @@ -212,7 +212,7 @@ func (db *DB) addHTTPRoundTrips(evs ...*model.ArchivalHTTPRequestResult) error { for key := range ev.Response.Headers { wobs.HTTPResponseHeadersKeys[key] = OriginProbe } - if title := measurexlite.WebGetTitleString(string(ev.Response.Body)); title != "" { + if title := measurexlite.WebGetTitle(string(ev.Response.Body)); title != "" { wobs.HTTPResponseTitle = optional.Some(title) } } From 3ded2830b81e90add4bb648eaa4078d8352efd59 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 27 Nov 2023 17:14:30 +0100 Subject: [PATCH 28/66] start generating test cases for the minipipeline --- internal/cmd/xo/main.go | 215 ++++ .../experiment/webconnectivityqa/session.go | 2 +- internal/minipipeline/analysis.go | 20 + internal/minipipeline/measurement.go | 45 + internal/minipipeline/observation.go | 30 + .../analysis.json | 16 + .../measurement.json | 371 +++++++ .../observations.json | 87 ++ .../analysis.json | 16 + .../measurement.json | 598 +++++++++++ .../observations.json | 128 +++ .../analysis.json | 25 + .../measurement.json | 726 ++++++++++++++ .../observations.json | 140 +++ .../badSSLWithWrongServerName/analysis.json | 16 + .../measurement.json | 361 +++++++ .../observations.json | 87 ++ .../analysis.json | 20 + .../measurement.json | 478 +++++++++ .../observations.json | 92 ++ .../analysis.json | 18 + .../measurement.json | 498 ++++++++++ .../observations.json | 133 +++ .../analysis.json | 25 + .../measurement.json | 501 ++++++++++ .../observations.json | 136 +++ .../dnsBlockingNXDOMAIN/analysis.json | 25 + .../dnsBlockingNXDOMAIN/measurement.json | 511 ++++++++++ .../dnsBlockingNXDOMAIN/observations.json | 136 +++ .../analysis.json | 23 + .../measurement.json | 694 +++++++++++++ .../observations.json | 140 +++ .../analysis.json | 20 + .../measurement.json | 738 ++++++++++++++ .../observations.json | 228 +++++ .../httpDiffWithConsistentDNS/analysis.json | 20 + .../measurement.json | 520 ++++++++++ .../observations.json | 138 +++ .../httpDiffWithInconsistentDNS/analysis.json | 20 + .../measurement.json | 740 ++++++++++++++ .../observations.json | 224 +++++ .../analysis.json | 19 + .../measurement.json | 664 +++++++++++++ .../observations.json | 228 +++++ .../analysis.json | 18 + .../measurement.json | 643 ++++++++++++ .../observations.json | 182 ++++ .../analysis.json | 21 + .../measurement.json | 814 +++++++++++++++ .../observations.json | 228 +++++ .../analysis.json | 18 + .../measurement.json | 700 +++++++++++++ .../observations.json | 182 ++++ .../analysis.json | 21 + .../measurement.json | 814 +++++++++++++++ .../observations.json | 228 +++++ .../analysis.json | 18 + .../measurement.json | 700 +++++++++++++ .../observations.json | 182 ++++ .../analysis.json | 19 + .../measurement.json | 637 ++++++++++++ .../observations.json | 176 ++++ .../analysis.json | 21 + .../measurement.json | 824 ++++++++++++++++ .../observations.json | 228 +++++ .../analysis.json | 18 + .../measurement.json | 927 ++++++++++++++++++ .../observations.json | 223 +++++ .../generated/successWithHTTP/analysis.json | 21 + .../successWithHTTP/measurement.json | 543 ++++++++++ .../successWithHTTP/observations.json | 143 +++ .../generated/successWithHTTPS/analysis.json | 23 + .../successWithHTTPS/measurement.json | 499 ++++++++++ .../successWithHTTPS/observations.json | 97 ++ .../tcpBlockingConnectTimeout/analysis.json | 18 + .../measurement.json | 281 ++++++ .../observations.json | 92 ++ .../analysis.json | 23 + .../measurement.json | 626 ++++++++++++ .../observations.json | 229 +++++ .../analysis.json | 18 + .../measurement.json | 339 +++++++ .../observations.json | 92 ++ .../analysis.json | 21 + .../measurement.json | 469 +++++++++ .../observations.json | 135 +++ .../websiteDownNXDOMAIN/analysis.json | 16 + .../websiteDownNXDOMAIN/measurement.json | 216 ++++ .../websiteDownNXDOMAIN/observations.json | 85 ++ 89 files changed, 21699 insertions(+), 1 deletion(-) create mode 100644 internal/cmd/xo/main.go create mode 100644 internal/minipipeline/measurement.go create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/observations.json diff --git a/internal/cmd/xo/main.go b/internal/cmd/xo/main.go new file mode 100644 index 000000000..d3446fb17 --- /dev/null +++ b/internal/cmd/xo/main.go @@ -0,0 +1,215 @@ +package main + +import ( + "context" + "fmt" + "os" + "path/filepath" + "time" + + "github.com/apex/log" + "github.com/ooni/probe-cli/v3/internal/experiment/webconnectivitylte" + "github.com/ooni/probe-cli/v3/internal/experiment/webconnectivityqa" + "github.com/ooni/probe-cli/v3/internal/logx" + "github.com/ooni/probe-cli/v3/internal/minipipeline" + "github.com/ooni/probe-cli/v3/internal/mocks" + "github.com/ooni/probe-cli/v3/internal/model" + "github.com/ooni/probe-cli/v3/internal/must" + "github.com/ooni/probe-cli/v3/internal/netemx" + "github.com/ooni/probe-cli/v3/internal/netxlite" + "github.com/ooni/probe-cli/v3/internal/runtimex" + "github.com/ooni/probe-cli/v3/internal/version" +) + +// newMeasurement constructs a new [model.Measurement]. +func newMeasurement(input string, measurer model.ExperimentMeasurer, t0 time.Time) *model.Measurement { + return &model.Measurement{ + Annotations: nil, + DataFormatVersion: "0.2.0", + Extensions: nil, + ID: "", + Input: model.MeasurementTarget(input), + InputHashes: nil, + MeasurementStartTime: t0.Format(model.MeasurementDateFormat), + MeasurementStartTimeSaved: t0, + Options: []string{}, + ProbeASN: "AS137", + ProbeCC: "IT", + ProbeCity: "", + ProbeIP: "127.0.0.1", + ProbeNetworkName: "Consortium GARR", + ReportID: "", + ResolverASN: "AS137", + ResolverIP: netemx.ISPResolverAddress, + ResolverNetworkName: "Consortium GARR", + SoftwareName: "ooniprobe", + SoftwareVersion: version.Version, + TestHelpers: map[string]any{ + "backend": map[string]string{ + "address": "https://0.th.ooni.org", + "type": "https", + }, + }, + TestKeys: nil, + TestName: measurer.ExperimentName(), + MeasurementRuntime: 0, + TestStartTime: t0.Format(model.MeasurementDateFormat), + TestVersion: measurer.ExperimentVersion(), + } +} + +// newSession creates a new [model.ExperimentSession]. +func newSession(client model.HTTPClient, logger model.Logger) model.ExperimentSession { + return &mocks.Session{ + MockGetTestHelpersByName: func(name string) ([]model.OOAPIService, bool) { + output := []model.OOAPIService{{ + Address: "https://0.th.ooni.org/", + Type: "https", + Front: "", + }, { + Address: "https://1.th.ooni.org/", + Type: "https", + Front: "", + }, { + Address: "https://2.th.ooni.org/", + Type: "https", + Front: "", + }, { + Address: "https://3.th.ooni.org/", + Type: "https", + Front: "", + }} + return output, true + }, + + MockDefaultHTTPClient: func() model.HTTPClient { + return client + }, + + MockFetchPsiphonConfig: nil, + + MockFetchTorTargets: nil, + + MockKeyValueStore: nil, + + MockLogger: func() model.Logger { + return logger + }, + + MockMaybeResolverIP: nil, + + MockProbeASNString: nil, + + MockProbeCC: nil, + + MockProbeIP: nil, + + MockProbeNetworkName: nil, + + MockProxyURL: nil, + + MockResolverIP: func() string { + return netemx.ISPResolverAddress + }, + + MockSoftwareName: nil, + + MockSoftwareVersion: nil, + + MockTempDir: nil, + + MockTorArgs: nil, + + MockTorBinary: nil, + + MockTunnelDir: nil, + + MockUserAgent: func() string { + return model.HTTPHeaderUserAgent + }, + + MockNewExperimentBuilder: nil, + + MockNewSubmitter: nil, + + MockCheckIn: nil, + } +} + +func mustSaveAnalysis(destdir string, rawMeasurement []byte) { + var meas minipipeline.Measurement + must.UnmarshalJSON(rawMeasurement, &meas) + container := runtimex.Try1(minipipeline.LoadWebMeasurement(&meas)) + must.WriteFile( + filepath.Join(destdir, "observations.json"), + must.MarshalAndIndentJSON(container, "", " "), + 0600, + ) + analysis := minipipeline.AnalyzeWebMeasurement(container) + must.WriteFile( + filepath.Join(destdir, "analysis.json"), + must.MarshalAndIndentJSON(analysis, "", " "), + 0600, + ) +} + +func runTestCase(tc *webconnectivityqa.TestCase) { + measurer := webconnectivitylte.NewExperimentMeasurer(&webconnectivitylte.Config{}) + + // configure the netemx scenario + env := netemx.MustNewScenario(netemx.InternetScenario) + defer env.Close() + if tc.Configure != nil { + tc.Configure(env) + } + + // create the measurement skeleton + t0 := time.Now().UTC() + measurement := newMeasurement(tc.Input, measurer, t0) + + // create a logger for the probe + prefixLogger := &logx.PrefixLogger{ + Prefix: fmt.Sprintf("%-16s", "PROBE"), + Logger: log.Log, + } + + var err error + env.Do(func() { + // create an HTTP client inside the env.Do function so we're using netem + // TODO(https://github.com/ooni/probe/issues/2534): NewHTTPClientStdlib has QUIRKS but they're not needed here + httpClient := netxlite.NewHTTPClientStdlib(prefixLogger) + arguments := &model.ExperimentArgs{ + Callbacks: model.NewPrinterCallbacks(prefixLogger), + Measurement: measurement, + Session: newSession(httpClient, prefixLogger), + } + + // run the experiment + ctx := context.Background() + err = measurer.Run(ctx, arguments) + + // compute the total measurement runtime + runtime := time.Since(t0) + measurement.MeasurementRuntime = runtime.Seconds() + }) + + // handle the case of unexpected result + runtimex.PanicOnError(err, "measurer.Run failed") + + destdir := filepath.Join( + "internal", "minipipeline", "testdata", "generated", "webconnectivity", + tc.Name, + ) + runtimex.Try0(os.MkdirAll(destdir, 0700)) + + rawMeasurement := must.MarshalAndIndentJSON(measurement, "", " ") + must.WriteFile(filepath.Join(destdir, "measurement.json"), rawMeasurement, 0600) + + mustSaveAnalysis(destdir, rawMeasurement) +} + +func main() { + for _, tc := range webconnectivityqa.AllTestCases() { + runTestCase(tc) + } +} diff --git a/internal/experiment/webconnectivityqa/session.go b/internal/experiment/webconnectivityqa/session.go index 0abb31496..5af5eb514 100644 --- a/internal/experiment/webconnectivityqa/session.go +++ b/internal/experiment/webconnectivityqa/session.go @@ -6,7 +6,7 @@ import ( "github.com/ooni/probe-cli/v3/internal/netemx" ) -// nwSession creates a new [model.ExperimentSession]. +// newSession creates a new [model.ExperimentSession]. func newSession(client model.HTTPClient, logger model.Logger) model.ExperimentSession { return &mocks.Session{ MockGetTestHelpersByName: func(name string) ([]model.OOAPIService, bool) { diff --git a/internal/minipipeline/analysis.go b/internal/minipipeline/analysis.go index dd5a77d31..21311dfc5 100644 --- a/internal/minipipeline/analysis.go +++ b/internal/minipipeline/analysis.go @@ -7,6 +7,26 @@ import ( "github.com/ooni/probe-cli/v3/internal/optional" ) +// AnalyzeWebMeasurement generates a [*WebAnalysis] from a [*WebObservationsContainer]. +func AnalyzeWebMeasurement(container *WebObservationsContainer) *WebAnalysis { + analysis := &WebAnalysis{} + analysis.ComputeDNSExperimentFailure(container) + analysis.ComputeDNSTransactionsWithBogons(container) + analysis.ComputeDNSTransactionsWithUnexpectedFailures(container) + analysis.ComputeDNSPossiblyInvalidAddrs(container) + analysis.ComputeTCPTransactionsWithUnexpectedTCPConnectFailures(container) + analysis.ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures(container) + analysis.ComputeTCPTransactionsWithUnexpectedHTTPFailures(container) + analysis.ComputeHTTPDiffBodyProportionFactor(container) + analysis.ComputeHTTPDiffStatusCodeMatch(container) + analysis.ComputeHTTPDiffUncommonHeadersIntersection(container) + analysis.ComputeHTTPDiffTitleDifferentLongWords(container) + analysis.ComputeHTTPFinalResponses(container) + analysis.ComputeTCPTransactionsWithUnexplainedUnexpectedFailures(container) + analysis.ComputeHTTPFinalResponsesWithTLS(container) + return analysis +} + // WebAnalysis summarizes the content of [*WebObservationsContainer]. // // The zero value of this struct is ready to use. diff --git a/internal/minipipeline/measurement.go b/internal/minipipeline/measurement.go new file mode 100644 index 000000000..31ddd9fbf --- /dev/null +++ b/internal/minipipeline/measurement.go @@ -0,0 +1,45 @@ +package minipipeline + +import ( + "github.com/ooni/probe-cli/v3/internal/model" + "github.com/ooni/probe-cli/v3/internal/optional" +) + +// Measurement is the canonical measurement structure assumed +// by the probe-engine mini processing pipeline. +type Measurement struct { + // Input contains the input we measured. + Input string `json:"input"` + + // TestKeys contains the test-specific measurements. + TestKeys optional.Value[*MeasurementTestKeys] `json:"test_keys"` +} + +// MeasurementTestKeys is the canonical container for observations +// generated by most OONI experiments. This is the data format ingested +// by this package for generating, e.g., [*WebEndpointObservations] +type MeasurementTestKeys struct { + // Control contains the OPTIONAL TH response. + Control optional.Value[*model.THResponse] `json:"control"` + + // NetworkEvents contains I/O events. + NetworkEvents []*model.ArchivalNetworkEvent `json:"network_events"` + + // Queries contains the DNS queries results. + Queries []*model.ArchivalDNSLookupResult `json:"queries"` + + // Requests contains HTTP request results. + Requests []*model.ArchivalHTTPRequestResult `json:"requests"` + + // TCPConnect contains the TCP connect results. + TCPConnect []*model.ArchivalTCPConnectResult `json:"tcp_connect"` + + // TLSHandshakes contains the TLS handshakes results. + TLSHandshakes []*model.ArchivalTLSOrQUICHandshakeResult `json:"tls_handshakes"` + + // QUICHandshakes contains the QUIC handshakes results. + QUICHandshakes []*model.ArchivalTLSOrQUICHandshakeResult `json:"quic_handshakes"` + + // XControlRequest contains the OPTIONAL TH request. + XControlRequest optional.Value[*model.THRequest] `json:"x_control_request"` +} diff --git a/internal/minipipeline/observation.go b/internal/minipipeline/observation.go index 104c4fd16..3ab83ddb5 100644 --- a/internal/minipipeline/observation.go +++ b/internal/minipipeline/observation.go @@ -1,6 +1,7 @@ package minipipeline import ( + "errors" "net" "net/url" "strconv" @@ -13,6 +14,35 @@ import ( "github.com/ooni/probe-cli/v3/internal/optional" ) +// ErrNoTestKeys indicates that a [*Measurement] does not contain [*MeasurementTestKeys]. +var ErrNoTestKeys = errors.New("minipipeline: no test keys") + +// LoadWebMeasurement loads a [*Measurement] into a [*WebObservationsContainter]. +func LoadWebMeasurement(meas *Measurement) (*WebObservationsContainer, error) { + tk := meas.TestKeys.UnwrapOr(nil) + if tk == nil { + return nil, ErrNoTestKeys + } + + container := NewWebObservationsContainer() + container.CreateDNSLookupFailures(tk.Queries...) + container.CreateKnownIPAddresses(tk.Queries...) + container.CreateKnownTCPEndpoints(tk.TCPConnect...) + container.NoteTLSHandshakeResults(tk.TLSHandshakes...) + container.NoteHTTPRoundTripResults(tk.Requests...) + + // be defensive in case the control request or control are not defined + if !tk.XControlRequest.IsNone() && !tk.Control.IsNone() { + // Implementation note: the only error that can happen here is when the input + // doesn't parse as a URL, which should have triggered previous errors + if err := container.NoteControlResults(tk.XControlRequest.Unwrap(), tk.Control.Unwrap()); err != nil { + return nil, err + } + } + + return container, nil +} + // WebObservation is an observation of the flow that starts with a DNS lookup that // discovers zero or more IP addresses and proceeds with endpoint operations such as // TCP connect, TLS handshake, QUIC handshake, and HTTP round trips. diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/analysis.json new file mode 100644 index 000000000..9f5839859 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/analysis.json @@ -0,0 +1,16 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/measurement.json new file mode 100644 index 000000000..46e6510b9 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/measurement.json @@ -0,0 +1,371 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://expired.badssl.com/", + "measurement_start_time": "2023-11-27 16:09:20", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "104.154.89.105:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.012388, + "t": 0.018204, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.018223, + "t": 0.018223, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 284, + "operation": "write", + "proto": "tcp", + "t0": 0.01832, + "t": 0.018333, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.018335, + "t": 0.028379, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.02848, + "t": 0.028481, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 814, + "operation": "read", + "proto": "tcp", + "t0": 0.028482, + "t": 0.028631, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 30, + "operation": "write", + "proto": "tcp", + "t0": 0.028667, + "t": 0.028673, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.028678, + "t": 0.028678, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 2262, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.028705, + "t": 0.028705, + "transaction_id": 3 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000079, + "t": 0.000079, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 36, + "operation": "write", + "proto": "udp", + "t0": 0.000141, + "t": 0.000163, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 36, + "operation": "write", + "proto": "udp", + "t0": 0.000177, + "t": 0.00018, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 70, + "operation": "read", + "proto": "udp", + "t0": 0.000167, + "t": 0.005941, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 36, + "operation": "read", + "proto": "udp", + "t0": 0.000185, + "t": 0.006411, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006429, + "t": 0.006429, + "transaction_id": 2 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "104.154.89.105", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "expired.badssl.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000073, + "t": 0.006194, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "104.154.89.105", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "expired.badssl.com", + "query_type": "A", + "raw_response": "H7yBAAABAAEAAAAAB2V4cGlyZWQGYmFkc3NsA2NvbQAAAQABB2V4cGlyZWQGYmFkc3NsA2NvbQAAAQABAAAOEAAEaJpZaQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000108, + "t": 0.005951, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "expired.badssl.com", + "query_type": "AAAA", + "raw_response": "6S+BAAABAAAAAAAAB2V4cGlyZWQGYmFkc3NsA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000088, + "t": 0.006414, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "104.154.89.105", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.012388, + "t": 0.018204, + "tags": [], + "transaction_id": 3 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "104.154.89.105:443", + "cipher_suite": "", + "failure": "ssl_invalid_certificate", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDeDCCAmCgAwIBAgIUdy1x/phnrpcqdQvIUsu5q8NTQTMwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMTcwNzE2MjMwMDAwWhcNMTcwNzE3MDEwMDAwWjA1MRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRswGQYDVQQDExJleHBpcmVkLmJhZHNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCecNcNpVEktYPpuGXZhjnUeUdtuhUHb2jRFp4/tc2qI4zJVaFhBd/5Bn2WbJmZ8qp1L5mgP0dtStQ7gGZYjcd3OAn5afsZLZ70JamNxxaPf5r9Svv3VsEWHW1fuxFVp4ezOKSuc/6kex/1CqwD/f7pL2+nN7JceBMunKruRzuFrRwdOnRlYjNkVZvxaOU5kxHeOPmkLhQbksQ612cTMRAFBPCOb6lkoJv/q2b7nSqSy9x8fIXk/k3HWEQqMBBbkJ+gdtglgXzS8S4vUMDDdNlzBtqwTK6/JFvn2IG6V6UnKQn8fdoSPX9dBx0LxnEN3P4EB1Xpib9hUcvlZq6cidIbAgMBAAGjgZUwgZIwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPUn6yJSFh4YYyAGoXElUCu6X8jjMB8GA1UdIwQYMBaAFHxWKnWgGFUvsm/63RDxBV2mW+DnMB0GA1UdEQQWMBSCEmV4cGlyZWQuYmFkc3NsLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAUayxX0qvnVNEHKWaMFxmUvy/jXv+hoERFSupI5/NDRFz8uyIOe1SWyDTiXPY1b2rpMMuF+61vYU0Q0I2dKAhOmC8zYkymKJn2eBe6X0i+F61jKe4//uo8L9xesJaz4rOfXdZo6VPXFT/U1g2KPOIDJpcbtiO8ZhLhYmCL4Kw8OX0wFxx52sSc0qMyhzTcHAkE1WRYdBhpJQ5Ip2udToaKnLsRfDGknA6i3jMnAkRhWP9xB5ARbIcEkiBAPpaWDc/mjlSy78OoPu5sbuXEv3m6i5guvY792pLC1Rm1+XYzH2Ux7K6x5vd8zsQ9lb7Nmo69ICnmejWFE5KTAAMy2GHtQ==", + "format": "base64" + } + ], + "server_name": "expired.badssl.com", + "t0": 0.018223, + "t": 0.028678, + "tags": [], + "tls_version": "", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://expired.badssl.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "104.154.89.105:443", + "104.154.89.105:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "104.154.89.105:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "104.154.89.105:443": { + "server_name": "expired.badssl.com", + "status": false, + "failure": "ssl_invalid_certificate" + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": -1, + "discovered_h3_endpoint": "", + "failure": "unknown_error", + "title": "", + "headers": {}, + "status_code": -1 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "104.154.89.105" + ] + }, + "ip_info": { + "104.154.89.105": { + "asn": 396982, + "flags": 3 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:104.154.89.105 Flags:3}]", + "t": 0.012338 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 0, + "x_null_null_flags": 4, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": false, + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.506694, + "test_start_time": "2023-11-27 16:09:20", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/observations.json new file mode 100644 index 000000000..7eaf82d2a --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithExpiredCertificate/observations.json @@ -0,0 +1,87 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "expired.badssl.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "expired.badssl.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "expired.badssl.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "104.154.89.105", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "104.154.89.105:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "ssl_invalid_certificate", + "TLSServerName": "expired.badssl.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "ssl_invalid_certificate", + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/analysis.json new file mode 100644 index 000000000..9f5839859 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/analysis.json @@ -0,0 +1,16 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/measurement.json new file mode 100644 index 000000000..e949ca79e --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/measurement.json @@ -0,0 +1,598 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://untrusted-root.badssl.com/", + "measurement_start_time": "2023-11-27 16:09:18", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "104.154.89.105:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.03414, + "t": 0.040181, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.040197, + "t": 0.040197, + "transaction_id": 4 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 291, + "operation": "write", + "proto": "tcp", + "t0": 0.040291, + "t": 0.040298, + "transaction_id": 4 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.0403, + "t": 0.589184, + "transaction_id": 4 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 1701, + "operation": "read", + "proto": "tcp", + "t0": 0.589309, + "t": 0.589311, + "transaction_id": 4 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 30, + "operation": "write", + "proto": "tcp", + "t0": 0.590433, + "t": 0.590444, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.590456, + "t": 0.590456, + "transaction_id": 4 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 2277, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.590494, + "t": 0.590494, + "transaction_id": 4 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000384, + "t": 0.000384, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.007252, + "t": 0.013418, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.013457, + "t": 0.013457, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 279, + "operation": "write", + "proto": "tcp", + "t0": 0.013675, + "t": 0.013686, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.013689, + "t": 0.020979, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.021124, + "t": 0.021125, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 820, + "operation": "read", + "proto": "tcp", + "t0": 0.021126, + "t": 0.021817, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.022744, + "t": 0.022751, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.022754, + "t": 0.022754, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 384, + "operation": "write", + "proto": "tcp", + "t0": 0.022834, + "t": 0.022883, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 180, + "operation": "read", + "proto": "tcp", + "t0": 0.022887, + "t": 0.028535, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 384, + "operation": "write", + "proto": "tcp", + "t0": 0.028602, + "t": 0.028609, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 221, + "operation": "read", + "proto": "tcp", + "t0": 0.028584, + "t": 0.03381, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.033862, + "t": 0.033862, + "transaction_id": 3 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.033867, + "t": 0.033914, + "transaction_id": 3 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 19281, + "as_org_name": "Quad9", + "answer_type": "A", + "ipv4": "9.9.9.9", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "dns.quad9.net", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.001333, + "t": 0.007164, + "tags": [], + "transaction_id": 3 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "9.9.9.9", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.007252, + "t": 0.013418, + "tags": [], + "transaction_id": 3 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "9.9.9.9:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDbjCCAlagAwIBAgIULv/8mGpIFiYyKNKep+aGpos+itgwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTE4WhcNMjMxMTI3MTcwOTE4WjAwMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRYwFAYDVQQDEw1kbnMucXVhZDkubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7V+WmYwUhqXsyZx4ILyGp/RSn4XPh2eHqBCh9cLwKj/6vfOHEX0crPqkL+iKqkW0gB7JxcdVB24ts3i5TatkJ+sRAUvbcYefXKj53Yb5PPEVjxB9IFAl0xZY+uVQOOCXtAIgnxerZFmA7ctdKmlO5QFkOWqAIYJNCh8LjuOjxhwh/Zo7yRduHJLl/mtwGat9RxSeA2sW+MN5akrfCcmbNQV/ZZDLAGd1jH9n/8JBXTatXlxQLNxi1DpEj9IPd4iwpHfoN3144sjm+FV9xc4uQ0RC2CP/XMpbaGXerVgYfsnb0h/e5IqDPX35ci9sbe21TxJvgnfC0Azd7fVoIDao9QIDAQABo4GQMIGNMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQb+3f/KRvydyIxVWOLIW9m6ErMszAfBgNVHSMEGDAWgBSNNCopm1uyFHej2mn4ObPaaqcBPDAYBgNVHREEETAPgg1kbnMucXVhZDkubmV0MA0GCSqGSIb3DQEBCwUAA4IBAQClEzAXhVp1iBW4KnLZs+OrwSr/dwxJ9wvkJ/iqrWEjWXIKdpWBK4xH8hXEbdhsjxXv0ctJSIIHmWxmJXDcdg/jD89suE/RO3fFp1X34EGOUSSeB33k97xwRK47lyDKyMlQvLKEp9G3EBUppfwR/794dBNKS8WO1IokKwyHyCVkga3FGpIGgsQ90m4PWrZ8tpMEuwgiSFCknSdTdL9rbMvGxBWX7k2703JwewB0EPa4U2nH41YBEU2aaABWnBwilwR/4t+jbdgnGRP4DukJjTSp7rAX9ziIpyapozT1TGtI50TfzaybGpgTYYWbOBqNcVbMW+VFP8lO0xXU8UuujlNl", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAJrNwOd5pP29YhXwxg8gFPakHinWMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkxOFoXDTIzMTEyODE2MDkxOFowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDgBWE6YS29sSjWbrpfIHkH+/DSq6qV2RIiIKrR8X8QlJJa0tq1po/TAIMghxGkKsrNNE5z8ACWj+b+SqU0F2mU7wgAdzwXPSDGiNynu66UhpAoQ2Us8TAyWI9mOvIK5G/TLKtF+kwNL+sC+Ebn1MI9A3UFD6n7kyJCz5J9g873CL7QoiaZWPNEjo6Rv74AnGziHOuDuw2xjVZqPuPQcOQuf9BJt+ktLJ6pTE0LZ3hrxjL+sDszC+wT1Nw/q5Ryc/zr5ZUFEyPrW857v522+MamPOd4EUNLOj9ogrDR1Ayl5Fre6zm8R3eqU073nl8a65Czl48YXTkjDAPxC7toJItxAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSNNCopm1uyFHej2mn4ObPaaqcBPDAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAB2vy15NjwK9sRH01oPkHRxkTHAPGTZx7JOmPGBCBNfiXvWD6dXpyEpVHBb73hsS8FZUjOnTKCOVyXLdQYlk8FOJMjGYqUaqPAMQnbsKPrD9VNK+rE2YfwPLLxDJOqDqE0csMcsXt+q4Fx+1pqYYfl0sSFbOaX2keBUcPfv+fXVPk/0USlnT4AbhbzOCqshaxp3mff7hEsxNcri/KDffjIpWHyMd5Wm5Fbr8QJQU8kSvjUlA0TkDi8CXZO9wl5Lso5g7660kqd2OpFwN8qfc43H7TeNuFh6exET1oCGDCTraf8Wjc7qfEhkGwntRsOBTPm78pDI3L1jng9kWP4m3Yjg==", + "format": "base64" + } + ], + "server_name": "dns.quad9.net", + "t0": 0.013457, + "t": 0.022754, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + } + ] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000388, + "t": 0.000388, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 43, + "operation": "write", + "proto": "udp", + "t0": 0.000915, + "t": 0.001029, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 43, + "operation": "write", + "proto": "udp", + "t0": 0.001064, + "t": 0.001069, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 84, + "operation": "read", + "proto": "udp", + "t0": 0.001035, + "t": 0.005864, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 43, + "operation": "read", + "proto": "udp", + "t0": 0.001088, + "t": 0.006681, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006741, + "t": 0.006741, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "104.154.89.105", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "untrusted-root.badssl.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000476, + "t": 0.006567, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "104.154.89.105", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "untrusted-root.badssl.com", + "query_type": "A", + "raw_response": "wK2BAAABAAEAAAAADnVudHJ1c3RlZC1yb290BmJhZHNzbANjb20AAAEAAQ51bnRydXN0ZWQtcm9vdAZiYWRzc2wDY29tAAABAAEAAA4QAARomllp", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000564, + "t": 0.00589, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "untrusted-root.badssl.com", + "query_type": "AAAA", + "raw_response": "8juBAAABAAAAAAAADnVudHJ1c3RlZC1yb290BmJhZHNzbANjb20AABwAAQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.00057, + "t": 0.006692, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "doh", + "failure": "dns_no_answer", + "hostname": "untrusted-root.badssl.com", + "query_type": "AAAA", + "raw_response": "6cmBAAABAAAAAAAADnVudHJ1c3RlZC1yb290BmJhZHNzbANjb20AABwAAQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.quad9.net/dns-query", + "t0": 0.000544, + "t": 0.028588, + "tags": [], + "transaction_id": 3 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "104.154.89.105", + "ttl": null + } + ], + "engine": "doh", + "failure": null, + "hostname": "untrusted-root.badssl.com", + "query_type": "A", + "raw_response": "s5CBAAABAAEAAAAADnVudHJ1c3RlZC1yb290BmJhZHNzbANjb20AAAEAAQ51bnRydXN0ZWQtcm9vdAZiYWRzc2wDY29tAAABAAEAAA4QAARomllp", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.quad9.net/dns-query", + "t0": 0.000541, + "t": 0.033837, + "tags": [], + "transaction_id": 3 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "104.154.89.105", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.03414, + "t": 0.040181, + "tags": [], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "104.154.89.105:443", + "cipher_suite": "", + "failure": "ssl_unknown_authority", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDNTCCAh2gAwIBAgIUGLp03a+bpUIERelYfkm4umIfdHgwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTE5WhcNMjMxMTI4MTYwOTE5WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALm6o9CQ+1ntt/mmxq5ctUSMA3RLYvFOqqWPqcZB6PvX40amKBo/UwUlx07SZfI/XY4g5bI72zn0gr+dvngItqhgNZDoBOkS6uxsxFN7DLL0O6V7541ms6Il9vIOTiG9nDPHeC6TygGHad4+ruhB8Kjrls6xjrN9h7FHm9qt9EpsnrUJ5/rbw8mnhQC/O7kxXHO0bFpODx0N6cDTwvYabM5Uj4seSr/wlzjx4B6PKxM0Xj3wKM4PSfRs3Lp/Lv60xivvD+ZcvMT3QKf6VLkLbAvZHerrvtwX850qWXwCIzEgMi+TmKhpg6aD2ahNR0E2nSBt4IpNFLaO1uxYjhpvHwECAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEgk2VsJBP06jg/WngVGYqwYZ4pKMBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQAtq+8Eg15s5BkuLOmHnPfAwLO9kZmw/FqzVVJ8sPV5sY6SQiqByTr4CRjgLj51nqUeDqIOOcmqMqsrHBVMg88JZlO5FC/YO4yyUzn9TET42OuHnsytgT0OIjnc3WsAUui8u/L6b5pEw+Zrt+CBgk/Z294XkmrC4Ew2grG+C8i7LsoOM9goo6j1lgG6CEvmWrccs9urOlm0by3687BeI2GKILfrVp2sxqOVNhjfKbBMhg9F0GRZIOX/Tx8+mJcLLX9QMHS5MYPFp3PsodZUX/osPT9oe8aS7mmkCZrL4TbbimEcuR5lsd8dWxR5rMbu6wTXpFxzIyJBpVfqFMXVKod4", + "format": "base64" + } + ], + "server_name": "untrusted-root.badssl.com", + "t0": 0.040197, + "t": 0.590456, + "tags": [], + "tls_version": "", + "transaction_id": 4 + } + ], + "x_control_request": { + "http_request": "https://untrusted-root.badssl.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "104.154.89.105:443", + "104.154.89.105:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "104.154.89.105:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "104.154.89.105:443": { + "server_name": "untrusted-root.badssl.com", + "status": false, + "failure": "ssl_unknown_authority" + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": -1, + "discovered_h3_endpoint": "", + "failure": "unknown_error", + "title": "", + "headers": {}, + "status_code": -1 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "104.154.89.105" + ] + }, + "ip_info": { + "104.154.89.105": { + "asn": 396982, + "flags": 3 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:104.154.89.105 Flags:7}]", + "t": 0.033953 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 0, + "x_null_null_flags": 4, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": false, + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 1.036687, + "test_start_time": "2023-11-27 16:09:18", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/observations.json new file mode 100644 index 000000000..c1f632d33 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithConsistentDNS/observations.json @@ -0,0 +1,128 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "untrusted-root.badssl.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "untrusted-root.badssl.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "3": { + "DNSTransactionIDs": [ + 3 + ], + "DNSDomain": "untrusted-root.badssl.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "untrusted-root.badssl.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "4": { + "DNSTransactionIDs": [ + 2, + 1, + 3 + ], + "DNSDomain": "untrusted-root.badssl.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "104.154.89.105", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "104.154.89.105:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "ssl_unknown_authority", + "TLSServerName": "untrusted-root.badssl.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "ssl_unknown_authority", + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/analysis.json new file mode 100644 index 000000000..4b299dbc2 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/analysis.json @@ -0,0 +1,25 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": { + "104.154.89.105": true + }, + "HTTPDiffBodyProportionFactor": 1, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": {}, + "HTTPDiffUncommonHeadersIntersection": { + "alt-svc": true, + "content-length": true + }, + "HTTPFinalResponses": { + "4": true + }, + "HTTPFinalResponsesWithTLS": { + "4": true + }, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/measurement.json new file mode 100644 index 000000000..930f82616 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/measurement.json @@ -0,0 +1,726 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.com/", + "measurement_start_time": "2023-11-27 16:09:22", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "104.154.89.105:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.012569, + "t": 0.018747, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.018763, + "t": 0.018763, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.018849, + "t": 0.018857, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.01886, + "t": 0.491165, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 1681, + "operation": "read", + "proto": "tcp", + "t0": 0.491282, + "t": 0.491284, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 30, + "operation": "write", + "proto": "tcp", + "t0": 0.492139, + "t": 0.492146, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.492158, + "t": 0.492158, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 2257, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.492208, + "t": 0.492208, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.513861, + "t": 0.519134, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.519153, + "t": 0.519153, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.519252, + "t": 0.519261, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.519263, + "t": 0.526805, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.526886, + "t": 0.526886, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 867, + "operation": "read", + "proto": "tcp", + "t0": 0.526888, + "t": 0.527522, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.528385, + "t": 0.528393, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.528396, + "t": 0.528396, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2315, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.545118, + "t": 0.545118, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2315, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.666065, + "t": 0.666065, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2315, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.780548, + "t": 0.780548, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2315, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.931532, + "t": 0.931532, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2315, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.011548, + "t": 1.011548, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 1.02844, + "t": 1.02844, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 305, + "operation": "write", + "proto": "tcp", + "t0": 1.028532, + "t": 1.028581, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 1208, + "operation": "read", + "proto": "tcp", + "t0": 1.028541, + "t": 1.034292, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 507, + "operation": "read", + "proto": "tcp", + "t0": 1.034349, + "t": 1.034506, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 1.034524, + "t": 1.034524, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 1.034545, + "t": 1.034554, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 4030, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.034564, + "t": 1.034564, + "transaction_id": 4 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000079, + "t": 0.000079, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000127, + "t": 0.00013, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000177, + "t": 0.0002, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000134, + "t": 0.003138, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000205, + "t": 0.003478, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.003502, + "t": 0.003502, + "transaction_id": 2 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [ + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "tX+BAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.003156, + "t": 0.005165, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "rD+BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.003495, + "t": 0.005527, + "tags": [], + "transaction_id": 2 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "104.154.89.105", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "tX+BAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEaJpZaQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000108, + "t": 0.003147, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "rD+BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000087, + "t": 0.003483, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "104.154.89.105", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000069, + "t": 0.003968, + "tags": [], + "transaction_id": 1 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 1.02844, + "t": 1.034524, + "tags": [], + "transaction_id": 4 + } + ], + "tcp_connect": [ + { + "ip": "104.154.89.105", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.012569, + "t": 0.018747, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.513861, + "t": 0.519134, + "tags": [], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "104.154.89.105:443", + "cipher_suite": "", + "failure": "ssl_unknown_authority", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDNTCCAh2gAwIBAgIUQD0gLqOEPkW4VAJVc5udifzb+GwwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTIyWhcNMjMxMTI4MTYwOTIyWjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANCBkwJSCzwpILsPABXWdNiSqVxKrY995FKcpGp47sY7590i2nuGWNM2FFpV55KlZKeotEsJIi8dZGuwhIBaczZcl0FFOGbCOnmeAAmvf8+EWVM1oWTYWlaPlgcl90UlCv0URAip+/JX+rJR8BJJFjlyUhK/wDM1sr+HF/qMB9yq0JuzpOQoZCAeC9JvhcnxI4/aFEjK5lJLrn7qkF6xITzxXPUxZrh+VyoK7wcM6/r2DoWqpXNl0SSsZfD4vKaQPHqydRigdDrLJIW5EE+FnvHTfhsshRYztVZcX79WMS5aqJZhAxQwHgYN0gQ75y8qslZ8DAE6eCg5PUNbXH8SSMMCAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFITkHD6uG0O3BqWvkOPis/cxYAP3MBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQBSDRB6fQl02SGA0G3eLq5Tt5221auhgcD9xAUnvaTtYXWSGBFcDV9gtnYcT5eMxED3xTqE9va/B3fcVVKlaW6Rs8U4XqgcFMYogx7rNxeKacTyVXgisGpSv5cd7L1jmAoCam0KobubtM3dgjJ1hcHvtft1+roNmrFVm6AE/2P63560xEQD0tDk17NVxVCWyaFYnDMUJT3AUM1D4JLmnFjpjtWIFOjSLWXz81NsfKMPbj2Vz96L1shETCKnZFqo5JKNexI8XAaSiEvqi+dAy/iu6n6/DQp1Hytl6wPbCLWmb6WxkOSlwj1tZ9l/vhQ4PC30X3pq3QodJlRr8hW37pXe", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.018763, + "t": 0.492158, + "tags": [], + "tls_version": "", + "transaction_id": 3 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnTCCAoWgAwIBAgIUaUWP6ZpUon4feRIg9Fq+FEqwwu4wDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTIyWhcNMjMxMTI3MTcwOTIyWjAyMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCiDsh0CI+fCydobNRI5KHAnGgxP0qbGWZ7EI9Zh6rZQGBpCwcbd6QujyoVlBeBw9MqwWP0Zvj8tiq9J43EH4MKUBpdJR3Jh/4J8JVmehRxKAjGLjN8VAwhlbfa8kmORzSM1CWo0MkhmcvAX0ViCKzZZlfTtiyHLIhkrHRff0rr2G4gzgzRdoxJfOyno1VGWjpH1HLg2/urEAb8UwyJOZUyKARXE+x4L94ctnSOjwHlv4fXi0tLLA1UYJ0X/ko4rt9boVDmEelR86IsuRASLijT/2QqWM6OQiFqvvK7p9fQcCRW+WtjxJ8IyEhhIesLNjIJC4e9YRLiuxWE7odgvNaHAgMBAAGjgb0wgbowDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFEtIyHoLcnjyRn5zJ61M+Y38p9iBMB8GA1UdIwQYMBaAFM0EO2zqDz0YgUvrfCPJq2178qCYMEUGA1UdEQQ+MDyCD3d3dy5leGFtcGxlLmNvbYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLm9yZ4ILZXhhbXBsZS5vcmcwDQYJKoZIhvcNAQELBQADggEBAAbGnk4YVdvI8YlGZ6VceSqmVTZ631XdzunhW62HuHmVYDS/LUXSuRX6OUpRDca0PztLi5ZKaAQtwnDgc7ymMS6fD6A2tk9OjVmoa91j/iQtMPDmq4AFF1jKmf6b3SMsxU5q93ISFYhxHA8a7lVVpHdNBvScTu/9iXBypoRYapfEqIaJ68EqYlQ2lsBIkjnHAEpvuO4vOFR7OdfP9l1168e8rehW8iBQxCJIc9wp4VYgNW44nRJ2bGeI8Edy5a6RWn9oCpctX3zY67wNGh7kSDDcspwNo10C62zNk1KOMVsvjJ10LHLlZDXRKY6Ga0vSHQQ/rpGfVruoVYvULAyoMCA=", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAL1/D2S+LcZ/35dtUPUYx+KXHDKIMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkyMloXDTIzMTEyODE2MDkyMlowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9Daih/TwKp6iww0zHIg+9g7yOA4uf7VKV6h3g2XYhi7fpXAzyhCxt4uW8eNE9AEjQZ0DpErLYYKdrdeCTFj383AprhZopGFZlUDiUPjxVk735fZtZy8iq7oVgSUVCM6nQ4aa0x7u89rFMMlbYBA/6OdhlZ6jwdJIYaIKiteAsVzpD6n+O13q2pxzHJSP7VEO9ftFoIJ9CQi65+iXmOJNAm9aX3YIwFNJOfGp8KaNK5X8y71qoTzv70k15+qFOXdkWnFdhjKXBV0Ohf4g9W58MlupViuT8tz5SUJI+FlPODnXy8m73XHBtYsX2cqw7+XGGwOPXzAlTpJRZR7jbQ1N5AgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTNBDts6g89GIFL63wjyatte/KgmDAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAqnRsB3ymVNkCLBIKh9k0j1YUu4pRLvJOG5knIZ3XWjSV8egZ5xDPCxew8HLcOtFO8ofHP8NUL3h0BQJq/Di0CYprYq7lIQ0c17FqLEqWSMQ8OsZjdv7Z6gJByUe5dBMD9/0oy0VQCVYReDWw0tjdDuZ39en9obQmxj4wMg7DyTABpy5bWPnC36AJfWwooxOnoLwMUBdbaPD7P4w67wghPUt6w/8c2iZVFzoINlwf4Jv6wYWJfJpZKwpTMUPpjmb8/uOaMIEHihFAo+3QHBlF8PGn8zh/nF6svwyn6lKZqV3fCU6NfoOq80wjJdFg3U8aHibhV5HOG5QVNHKmQNAoNQ==", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.519153, + "t": 0.528396, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 4 + } + ], + "x_control_request": { + "http_request": "https://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "104.154.89.105:443", + "104.154.89.105:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "104.154.89.105:443": { + "status": true, + "failure": null + }, + "93.184.216.34:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "104.154.89.105:443": { + "server_name": "www.example.com", + "status": false, + "failure": "ssl_unknown_authority" + }, + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "104.154.89.105": { + "asn": 396982, + "flags": 1 + }, + "93.184.216.34": { + "asn": 15133, + "flags": 10 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:104.154.89.105 Flags:3}]", + "t": 0.012512 + }, + { + "msg": "conn 93.184.216.34:443: granted permission: true", + "t": 1.028422 + } + ], + "control_failure": null, + "x_dns_flags": 4, + "dns_experiment_failure": null, + "dns_consistency": "inconsistent", + "http_experiment_failure": null, + "x_blocking_flags": 33, + "x_null_null_flags": 0, + "body_length_match": true, + "headers_match": true, + "status_code_match": true, + "title_match": true, + "blocking": "dns", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 1.034907, + "test_start_time": "2023-11-27 16:09:22", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/observations.json new file mode 100644 index 000000000..8dcc41d2a --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithUnknownAuthorityWithInconsistentDNS/observations.json @@ -0,0 +1,140 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "104.154.89.105", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "104.154.89.105:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "ssl_unknown_authority", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": false, + "MatchWithControlIPAddressASN": false, + "ControlTLSHandshakeFailure": "ssl_unknown_authority", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "4": { + "DNSTransactionIDs": [], + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": "https://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/analysis.json new file mode 100644 index 000000000..9f5839859 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/analysis.json @@ -0,0 +1,16 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/measurement.json new file mode 100644 index 000000000..b515c8687 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/measurement.json @@ -0,0 +1,361 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://wrong.host.badssl.com/", + "measurement_start_time": "2023-11-27 16:09:21", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "104.154.89.105:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.010977, + "t": 0.017006, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.017021, + "t": 0.017021, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 287, + "operation": "write", + "proto": "tcp", + "t0": 0.017118, + "t": 0.017127, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.017129, + "t": 0.02694, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 1693, + "operation": "read", + "proto": "tcp", + "t0": 0.027041, + "t": 0.027042, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 30, + "operation": "write", + "proto": "tcp", + "t0": 0.027073, + "t": 0.027079, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.027085, + "t": 0.027085, + "transaction_id": 3 + }, + { + "address": "104.154.89.105:443", + "failure": null, + "num_bytes": 2269, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.027108, + "t": 0.027108, + "transaction_id": 3 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.00006, + "t": 0.00006, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 39, + "operation": "write", + "proto": "udp", + "t0": 0.000115, + "t": 0.00012, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 39, + "operation": "write", + "proto": "udp", + "t0": 0.000123, + "t": 0.000128, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 76, + "operation": "read", + "proto": "udp", + "t0": 0.000125, + "t": 0.005335, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 39, + "operation": "read", + "proto": "udp", + "t0": 0.000145, + "t": 0.006306, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006323, + "t": 0.006323, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "104.154.89.105", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "wrong.host.badssl.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000069, + "t": 0.005237, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "104.154.89.105", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "wrong.host.badssl.com", + "query_type": "A", + "raw_response": "VCOBAAABAAEAAAAABXdyb25nBGhvc3QGYmFkc3NsA2NvbQAAAQABBXdyb25nBGhvc3QGYmFkc3NsA2NvbQAAAQABAAAOEAAEaJpZaQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000095, + "t": 0.005349, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "wrong.host.badssl.com", + "query_type": "AAAA", + "raw_response": "F9yBAAABAAAAAAAABXdyb25nBGhvc3QGYmFkc3NsA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.00007, + "t": 0.006309, + "tags": [], + "transaction_id": 1 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "104.154.89.105", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.010977, + "t": 0.017006, + "tags": [], + "transaction_id": 3 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "104.154.89.105:443", + "cipher_suite": "", + "failure": "ssl_invalid_hostname", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDfjCCAmagAwIBAgIUPIhlWMvW7Gul55yyytqjEqhBGJcwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTIxWhcNMjMxMTI3MTcwOTIxWjA4MRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMR4wHAYDVQQDExV3cm9uZy1ob3N0LmJhZHNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDgGu+oUKY5DL9iQ+DYu+jfa/SrWH4/0v6o2mnyRP/HkhQbr750Gh87opvpC6Q5Z+4Q5GX6pM/2C8ZMxfF6IPrFAJMUMhdKEUiIqRnoXCEKEu3k6GZk61ZxyeZSBf1rCOkSZ6wTSI8ka6e6LQcjmL+Z0n0VUQKicxAC8qH9FsjakG+Tcd/S8jUWx2r4hk6eAFPy1Zjt5vPf3WRxFpCj5QLLhHWHgMbdU8D8Rtq9rm0kpCgls1aBshJwnY/Gg02Wy7p8pE2VLafs+lrspbK3Rc7FyDp6WGeB4eKxFuBpT4t099h/U6piEKWulGlJT/yhJTC9ebOasV7pNK/v2Zuy7+5dAgMBAAGjgZgwgZUwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFH4a0g0nG24BGifRQZsbHLhFE2+bMB8GA1UdIwQYMBaAFE93Q7CrjrtqtUhn9JuAv3/a745mMCAGA1UdEQQZMBeCFXdyb25nLWhvc3QuYmFkc3NsLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAKHELnT/u38Rtv46EXbS3JcpnRLQyiSJPczSmERC+498p8zE+3JnEBngmI7QgxLibnmLW8QvonbJ3iV2pZIpTsOuK4xTCwp5xrFNdww9kcqq0xF1qpUc4GQqbxNQrBOWryCcxvmWuZjOFZezmCyil2vhecwV/BcmpN/RkxhXDf9aFLxNSErLH9DAozWGwA7mH+kUZTdsHCvxp7ucMcXSNpZvwH/u7ax794feug19w6fmm+/Fk4h5aDm9YkSQ5OW3LTXJBWk/+cIT2rGk/jLATHhAMOnYHBbmAWVI60KbNMFW/jc3Krlb+C9JwtqLF8kVOuptpiTrAWUpWufVnFuMMgg==", + "format": "base64" + } + ], + "server_name": "wrong.host.badssl.com", + "t0": 0.017021, + "t": 0.027085, + "tags": [], + "tls_version": "", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://wrong.host.badssl.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "104.154.89.105:443", + "104.154.89.105:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "104.154.89.105:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "104.154.89.105:443": { + "server_name": "wrong.host.badssl.com", + "status": false, + "failure": "ssl_invalid_hostname" + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": -1, + "discovered_h3_endpoint": "", + "failure": "unknown_error", + "title": "", + "headers": {}, + "status_code": -1 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "104.154.89.105" + ] + }, + "ip_info": { + "104.154.89.105": { + "asn": 396982, + "flags": 3 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:104.154.89.105 Flags:3}]", + "t": 0.010914 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 0, + "x_null_null_flags": 4, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": false, + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.506555, + "test_start_time": "2023-11-27 16:09:21", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/observations.json new file mode 100644 index 000000000..a6983a512 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/badSSLWithWrongServerName/observations.json @@ -0,0 +1,87 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "wrong.host.badssl.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "wrong.host.badssl.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "wrong.host.badssl.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "104.154.89.105", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "104.154.89.105:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "ssl_invalid_hostname", + "TLSServerName": "wrong.host.badssl.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "ssl_invalid_hostname", + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/analysis.json new file mode 100644 index 000000000..4e0f0e6e3 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/analysis.json @@ -0,0 +1,20 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": { + "3": true + }, + "HTTPFinalResponsesWithTLS": { + "3": true + }, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/measurement.json new file mode 100644 index 000000000..98c3b5adc --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/measurement.json @@ -0,0 +1,478 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.org/", + "measurement_start_time": "2023-11-27 16:09:25", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.012385, + "t": 0.017588, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.017605, + "t": 0.017605, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.017704, + "t": 0.017718, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.017721, + "t": 0.025015, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.025119, + "t": 0.02512, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 866, + "operation": "read", + "proto": "tcp", + "t0": 0.025121, + "t": 0.025728, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.026619, + "t": 0.026626, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.026628, + "t": 0.026628, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.026649, + "t": 0.026649, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 305, + "operation": "write", + "proto": "tcp", + "t0": 0.0267, + "t": 0.026732, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 1208, + "operation": "read", + "proto": "tcp", + "t0": 0.026686, + "t": 0.032578, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 507, + "operation": "read", + "proto": "tcp", + "t0": 0.032614, + "t": 0.032693, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.032706, + "t": 0.032706, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.032724, + "t": 0.032729, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 4029, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.032735, + "t": 0.032735, + "transaction_id": 3 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000068, + "t": 0.000068, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000104, + "t": 0.000122, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000167, + "t": 0.000189, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000128, + "t": 0.005222, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000193, + "t": 0.0058, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.005836, + "t": 0.005836, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.org", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000088, + "t": 0.005453, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.org", + "query_type": "AAAA", + "raw_response": "+kOBAAABAAAAAAAAA3d3dwdleGFtcGxlA29yZwAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000077, + "t": 0.005228, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.org", + "query_type": "A", + "raw_response": "vwqBAAABAAEAAAAAA3d3dwdleGFtcGxlA29yZwAAAQABA3d3dwdleGFtcGxlA29yZwAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000138, + "t": 0.005804, + "tags": [], + "transaction_id": 1 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.org" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.org", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://www.example.org/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.026649, + "t": 0.032706, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.012385, + "t": 0.017588, + "tags": [], + "transaction_id": 3 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnTCCAoWgAwIBAgIUDYXv3Sk/3lKaCtDipbHnIMJ65CIwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTI1WhcNMjMxMTI3MTcwOTI1WjAyMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmOiPXSoEU3MkQybzKIaWvuIotNiNY7+hX21s652fKcUiE8d5RB39Y6dzzRgFhQ0lbbH3vvcjuZJO/i1tQvDWBXC+PKj1xzvn+6eU5JsW8ik/M/3dad8qOOdzQLcNFbk2u201Q1RLTyM+//1UoP5b62m/UDBYNm7LP4FUkXVCPA8yi4z6x4LUYtACIr5OMp/OReBrToIgwHVTodQG1aFd8nIwAYBlyLn1eRbvTUIR4P3Y/5tJcfj7Yzhg/y/wJDc/UM86+ovpxefnvjw8s04knsGymxTJEn4JovgxKrB2jpgcW59DN81ONeAH/qq/L7m3m+KMsydiGTMUl8gCCOCmzAgMBAAGjgb0wgbowDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFM7MN/DSi5T7ceUZ3pEyoOxY7U0MMB8GA1UdIwQYMBaAFHP4HizmvT2oomsChg3Oj/9C1UboMEUGA1UdEQQ+MDyCD3d3dy5leGFtcGxlLmNvbYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLm9yZ4ILZXhhbXBsZS5vcmcwDQYJKoZIhvcNAQELBQADggEBAK7zYSnBlCjAQT3pt4S2RXzy1eGnPbMGO+JTNwtCc9/klcpCdCA+3yRIjmRLswRDM/UIfQ+7QR+cCyhS+Q0leoXQn708kxW1NjpruOYCq8WXtLGmrDO0WA1nD71ndcOzXmxBSqUmbMJP8ys63ee8hm0M6vnI75alLqnRyskreyzejzg32c6QMJvQu69nsuszBPLxhLI87CSGQrUF0X86jz7bin1FYdI9glqau2bsTgbNQnnGOMH0/tB18Oq3H8AMZ2NWDlEn+IicHYOKnGDnYomCJTQWB3NexmTly7o35lGnxFcj7eUMe7mLqdVVMqTd6KK1ge/TM495kQLsk0u2IqY=", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUe9puWHtDKvOiIRA1qdk/ehqbtRYwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTI0WhcNMjMxMTI4MTYwOTI0WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPgVd217kKL50AKP8ZTk+K+Z5DkH9lKup8VhA7D7fw7cB5sj7tSoWAsjBE4wT6Zejz7knhcudSjoU5EhJxplHfnf3CKIDR6EEmeDXm+KThX0m18p/nEZ7YUPGYZF4BSRH6xF6uk6VFCx/2UtwFlQO2oDti+IM7oLI9PX4dM2/KM7R86woqh47RmBNJBMbwsH6dsANMQhAeb5w4+aAwhGfnH0NtpDeo4bxagQvFld4XstYeC5cuDg63Ch4S0M85F+uzSTf9xE525XDZTw3/AdL3d27DGB2THMzw+FJw34W0Z0VkAzXjgSubKIxaj0dQbaJtqPcJZYDNRtpfg2q/2kBSMCAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHP4HizmvT2oomsChg3Oj/9C1UboMBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQAqSziCH8sSco5k4QhRN4hjp4IAHBp5YHZ4rpRedTzcm7vuJ9IkmUERi9Mpgq2s53UbWODfTLgU+SP9z9sX0duD4/MMJC2F9tvU0KHaxz7Nbqj/tF2Bxin3EPy29kd4lua/ljk/YiR9nbJLtUTaK62SxxM4H6Sla9Eij/ZyDwl6cTfnFnyWx+vz3NwjO2v4MoX/R5sMOioZckhqWLsOXh94CyAOfqx0KjAuFSxwUn9SIHIPfHuM2lBHwkEBxgrc8NQT7E7JOGwWe6OuzP3TgC1qOd5z4dQloCTKW2ktUXPpWsKDyyuA7Vy+WSbv3EftlaHCvyhFaIj8NxSCnUWU/rlY", + "format": "base64" + } + ], + "server_name": "www.example.org", + "t0": 0.017605, + "t": 0.026628, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://www.example.org/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "93.184.216.34:443", + "93.184.216.34:80" + ], + "x_quic_enabled": false + }, + "control": null, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.012317 + }, + { + "msg": "conn 93.184.216.34:443: granted permission: true", + "t": 0.026637 + } + ], + "control_failure": "unknown_failure: httpapi: all endpoints failed: [ connection_reset; connection_reset; connection_reset; connection_reset;]", + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 32, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": false, + "accessible": true + }, + "test_name": "web_connectivity", + "test_runtime": 0.50608, + "test_start_time": "2023-11-27 16:09:25", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/observations.json new file mode 100644 index 000000000..c9046e8a3 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPSWebsite/observations.json @@ -0,0 +1,92 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.org", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "www.example.org", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.org", + "HTTPRequestURL": "https://www.example.org/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/analysis.json new file mode 100644 index 000000000..f8de1396d --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/analysis.json @@ -0,0 +1,18 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": { + "3": true + }, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/measurement.json new file mode 100644 index 000000000..197f5c59d --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/measurement.json @@ -0,0 +1,498 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://www.example.org/", + "measurement_start_time": "2023-11-27 16:09:23", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011368, + "t": 0.016792, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.016809, + "t": 0.016809, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 283, + "operation": "write", + "proto": "tcp", + "t0": 0.016861, + "t": 0.016893, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011404, + "t": 0.017143, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.017159, + "t": 0.017159, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.01725, + "t": 0.017256, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 1671, + "operation": "read", + "proto": "tcp", + "t0": 0.01684, + "t": 0.022886, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.022916, + "t": 0.022916, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 1671, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.022953, + "t": 0.022953, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.017259, + "t": 0.024448, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.024548, + "t": 0.024549, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 867, + "operation": "read", + "proto": "tcp", + "t0": 0.02455, + "t": 0.025055, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.02595, + "t": 0.025958, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.02596, + "t": 0.02596, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.025977, + "t": 0.025981, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2315, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.025987, + "t": 0.025987, + "transaction_id": 4 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000072, + "t": 0.000072, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000104, + "t": 0.00011, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000165, + "t": 0.000185, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000125, + "t": 0.006084, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.00019, + "t": 0.006441, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006467, + "t": 0.006467, + "transaction_id": 2 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.org", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000067, + "t": 0.00537, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.org", + "query_type": "AAAA", + "raw_response": "ap2BAAABAAAAAAAAA3d3dwdleGFtcGxlA29yZwAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000079, + "t": 0.006088, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.org", + "query_type": "A", + "raw_response": "QHiBAAABAAEAAAAAA3d3dwdleGFtcGxlA29yZwAAAQABA3d3dwdleGFtcGxlA29yZwAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000124, + "t": 0.006444, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:80", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.org" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.org", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "http://www.example.org/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.016809, + "t": 0.022916, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011368, + "t": 0.016792, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011404, + "t": 0.017143, + "tags": [], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnjCCAoagAwIBAgIVAJtNChTSgGGpMWWdUtGxDTUFBS8KMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MDkyM1oXDTIzMTEyNzE3MDkyM1owMjEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApVsjtQbSnF1JEbOCDT9OTPKHy0IRAiBjK1G/9c0dOzniAJYIiSJIQx5cwf2DszRh/BywRbcO1vd3yrLV7aFXWd7SISqbvcspTGOfnI7T1oLUmnZih7830/+RZL7tuki5PvzgtDbs3MsJMtbTJyNd/OUCeXYVIETGvdvKU42d9SpeXA2cgOuZuB8l774lzg8fim/ZWjch7LPQzo/3njniLclkRLAN+ywjYrNPIZu0fMIYU+VEuJ/zalCvhDrMmF4Ji/6FX0/6Vrw3RRe2Ae1VpC+IDI8yEUGTfivuM9Jzntbnx19kuv9OKVbotkLSyNOjbVS8vvThlcoZD0cuIjAqaQIDAQABo4G9MIG6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBScTPBQM1/cTJ3y73lOM+t61w2GijAfBgNVHSMEGDAWgBRiFKRCcR8LfW5qbbtaw+Nv+YrszDBFBgNVHREEPjA8gg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQCB05W3RaavbamB3f8aIN6r5kT+hG5nkicWaEowKY4oQ6alGcskx1a52PaLFAV7xNjyxT40uClBv7k+GYlpzO6cLAESu5YgmaLIF/h2RXk4IsZwhvU7dDPUdHKpSADhLKpoJ/Nl9kCrTtC29bO0hMMC1p7pPjA2vQJ62uYhz7dqf3U/VB8WuTL5npQIPlSaIba1d/4NLVkes1T5VRdWGRBSFfVjgZHI8DDsEEXxQ3V1WkxYtl3HrQwptLpfO2vVa0qBywAqfwJMMAJlqyNqp5aA4K2D0WDu1Fo4D+48npgg5rDrcv6ia3eir7xXQcOjpq5eaDWv5JGnMygmj+lGkVNO", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUQHyeyZ7Izmt1QHcn2xL3BM3qk4AwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTIzWhcNMjMxMTI4MTYwOTIzWjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALTHIFDNesCvumv0Z5A5YErpDaInkJ/2AVxvu8Onec3xtdPoXor8vtnaZ+p3F5lcnw+SA6g+jDAGFyMtP/uAF3GKUdnvk1UaLo+M6Aax1V9NEaj+l+XxngMNY78oO/+CbrodOhw7QlzklL3XmEOW1edaKEq1ZCYzkC8y5YtrKGugiA3yFfCrF1kOaZQLjJAhk3FwVD8uK0FksFrtTG4eZegQxhVpLyt0c4b+ajYISkdLM4hs4LYpNkmXqe1j0iSktyGxCS4BXncVSI/LWqJn3Xp+v1DpY5pZ3PuaDsNoqzK9V/otMw8yT1Cz7iULM4xITc1ckzXjowLtte9SuR2NyK0CAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFGIUpEJxHwt9bmptu1rD42/5iuzMMBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQAhVZIiu0mM9L9Q2ZUSW2QFy6atpjP4/VqwUtGuOqn2uFFdXQMdIm8AamdYRs7rpGZkQlZGO3B29p65kLGVfXfOXGm+Qiqxyy0Vh8lLhZ7gsK7B+qGZmbNhIRggpGIrpyy5UeIEk6BnFrhVEw3hiCFaAkOv9e+6NKpTx12NMlp017C9/0Cm2+tXIRsos8qCO/BWhe17hENnF08legy6uCuFROqqAazylu4V1DjsFDzpfZudqvUS3Wd5eVIwHNvra0SY6S2N4cvPxkiHH2tHhqw6PJas2m5V1Y3rTWGxXDTVdGaB1MNBMU/YTWrUDQtOmdeBG3XmpbKI8KmJidYnda6z", + "format": "base64" + } + ], + "server_name": "www.example.org", + "t0": 0.017159, + "t": 0.02596, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 4 + } + ], + "x_control_request": { + "http_request": "http://www.example.org/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "93.184.216.34:443", + "93.184.216.34:80" + ], + "x_quic_enabled": false + }, + "control": null, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.011274 + }, + { + "msg": "conn 93.184.216.34:80: granted permission: true", + "t": 0.0168 + } + ], + "control_failure": "unknown_failure: httpapi: all endpoints failed: [ connection_reset; connection_reset; connection_reset; connection_reset;]", + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 0, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": null, + "accessible": null + }, + "test_name": "web_connectivity", + "test_runtime": 0.506799, + "test_start_time": "2023-11-27 16:09:23", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/observations.json new file mode 100644 index 000000000..0af6b25a6 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/controlFailureWithSuccessfulHTTPWebsite/observations.json @@ -0,0 +1,133 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "www.example.org", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.org", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.org/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "4": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.org", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.org", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/analysis.json new file mode 100644 index 000000000..61a5d50d2 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/analysis.json @@ -0,0 +1,25 @@ +{ + "DNSExperimentFailure": "android_dns_cache_no_data", + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": { + "2": true + }, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 1, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": {}, + "HTTPDiffUncommonHeadersIntersection": { + "alt-svc": true, + "content-length": true + }, + "HTTPFinalResponses": { + "3": true + }, + "HTTPFinalResponsesWithTLS": { + "3": true + }, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/measurement.json new file mode 100644 index 000000000..252bdeef5 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/measurement.json @@ -0,0 +1,501 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.com/", + "measurement_start_time": "2023-11-27 16:09:25", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011435, + "t": 0.017145, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.017166, + "t": 0.017166, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.017262, + "t": 0.017276, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.017279, + "t": 0.024791, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.024884, + "t": 0.024885, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 868, + "operation": "read", + "proto": "tcp", + "t0": 0.024886, + "t": 0.025029, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.025908, + "t": 0.025916, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.025918, + "t": 0.025918, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.025937, + "t": 0.025937, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 305, + "operation": "write", + "proto": "tcp", + "t0": 0.025986, + "t": 0.02602, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 1715, + "operation": "read", + "proto": "tcp", + "t0": 0.026025, + "t": 0.031871, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.032076, + "t": 0.032076, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.032171, + "t": 0.03218, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 4031, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.032195, + "t": 0.032195, + "transaction_id": 3 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000055, + "t": 0.000055, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000089, + "t": 0.000149, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000152, + "t": 0.000174, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000155, + "t": 0.005704, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000179, + "t": 0.005828, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.005877, + "t": 0.005877, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "LZyBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000064, + "t": 0.005711, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "AWyBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000131, + "t": 0.005838, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "getaddrinfo", + "failure": "android_dns_cache_no_data", + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000084, + "t": 0.005954, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.025937, + "t": 0.032076, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011435, + "t": 0.017145, + "tags": [], + "transaction_id": 3 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnjCCAoagAwIBAgIVANQ6lJE+IdSnt8e3OkDFOFbzEblxMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MDkyNVoXDTIzMTEyNzE3MDkyNVowMjEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu0cmmf4OG009fqxlToJYMsUNrPq9gC96Cygn1U0QLZy77/kLxz9c+wsTAacKRbsZFIt0PqeabatZdBbnupDpL54fm7F0Z17EzgvUEj+2Uy5avkZvVbCAjL4agAx0ElZFmq7m2rn4FUTA/TreAPlg24biMzgfK4iYTa+MxXrmr8eP10jvG6Ri//n3qZ0AiQYsaQyCZ97rNGX0TZPZmN+tLR/cxC9s+GVqP5xj3WgaXiuCRMhE76REEZNbNTGT64X60l0X3jTETfV7yBpYShpUrJS+o6aIAk+5CHPg+uGzkCx3A+EmoNYgF9hjXp4d1jDeXBUk8S1y4NVB/VlDlkQYFQIDAQABo4G9MIG6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRjnsmpYWPW0X/k4+W7dTzSatd1UzAfBgNVHSMEGDAWgBSNX4PPDDoYWhgxOLd9c7KR+9aPhDBFBgNVHREEPjA8gg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQBhJOyZzYwuzEMhOHLY79UswJXDmXw0HtzPoJSDfiS9PFGXY9LVaoQA2i9ahAbJcLSt1cuBn+I0+w++wuasUvpACJ5C/mxU9DQ4ukcd6gU3GkNXkJ6ldfXAyZLbXb3RjH5oo/Pfz/P5bYu6LqNs2h5/17vJJjeDr9NsWjgC5c2OUXpNtOv+lhVHtmOqbjDBpb1iwgMf1aXUBd8bHbQkbLo6J8PQjo69ElmdW9yj9UF2IX52MDDkPc47vhpU4ozY9YcROfRNSdwZDNWhESJrhXn5Nmsh7v0uTOD5GJH3bDoOxPMj+YbmtwoW/QJKwNsODYfkOutSBrSSx4TXs+syOKRc", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAMOSOaV9qf6p3Q0rnpbSg7Dz5sRSMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkyNVoXDTIzMTEyODE2MDkyNVowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVdKO6kl1WBL3j+exwKkhDBOKpeLy9imseWVuxhico1cRT1j+YvVJ9io1XeelmBioeLJNASoPhRJt9rR5YPogwAwl1Rz9krH1VZ7iFHeEFjsojUOrfrw4WatqBnJfV7FoVG+pKtG/o13wS2zBKyo5eAfORnh8TfhIknAjnBnyzeSnG265S/qPuyYAoy5AL/e0ur4Na9EIVmpZQxrkEeS+n5c72EcxfERCA1sGLlfLACi0+N3Jwrqc9iEm5WubYLQ3WROges22wODcNz26Lw0IpDJZeIAqCK1mAs4U8UCQrO0LsSAD6BpYrjNSeK/ZRN7+SiqLBoXxrQ4kPcqGRWM+TAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSNX4PPDDoYWhgxOLd9c7KR+9aPhDAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAGBOujdsh7Pg5PLYPceWAbbWrTpQfL82pYP3AngKIZIJRXBWNBKveZKk1IEJcGIo9o6118FGcfL3nqlAgZqX9WF8r0d4jBu21uzUG1Fe59VRu8HAJjcn8NMFR94sQZ+5GWoQvKAI/+TZcouNgZr6gO6E6QpmDdDG/0FCPE1nFkDR8OMepOSe+fAtczM1spY6dXWlqukatd2FZGm0EWS3bTz1jF2REnmSPsCJFrnQt5IpPWR8wD9zAjpjsnT8xB8MDPy64aWPqzWIQT06R0AgTlGveOareO/kzcLUn/ZVygKcE9Vi+NiWiSX3DrU7Ht50bpyw5JiMz/g+BIqvHJtDgMQ==", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.017166, + "t": 0.025918, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "93.184.216.34:443", + "93.184.216.34:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "93.184.216.34:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "93.184.216.34": { + "asn": 15133, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:93.184.216.34 Flags:2}]", + "t": 0.011376 + }, + { + "msg": "conn 93.184.216.34:443: granted permission: true", + "t": 0.025927 + } + ], + "control_failure": null, + "x_dns_flags": 2, + "dns_experiment_failure": "android_dns_cache_no_data", + "dns_consistency": "inconsistent", + "http_experiment_failure": null, + "x_blocking_flags": 33, + "x_null_null_flags": 0, + "body_length_match": true, + "headers_match": true, + "status_code_match": true, + "title_match": true, + "blocking": "dns", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.506237, + "test_start_time": "2023-11-27 16:09:25", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/observations.json new file mode 100644 index 000000000..b1a0220bd --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingAndroidDNSCacheNoData/observations.json @@ -0,0 +1,136 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "android_dns_cache_no_data", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": "https://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/analysis.json new file mode 100644 index 000000000..23c80081a --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/analysis.json @@ -0,0 +1,25 @@ +{ + "DNSExperimentFailure": "dns_nxdomain_error", + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": { + "2": true + }, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 1, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": {}, + "HTTPDiffUncommonHeadersIntersection": { + "alt-svc": true, + "content-length": true + }, + "HTTPFinalResponses": { + "3": true + }, + "HTTPFinalResponsesWithTLS": { + "3": true + }, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/measurement.json new file mode 100644 index 000000000..6ff738444 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/measurement.json @@ -0,0 +1,511 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.com/", + "measurement_start_time": "2023-11-27 16:09:26", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011742, + "t": 0.017089, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.017105, + "t": 0.017105, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.017201, + "t": 0.01721, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.017215, + "t": 0.025465, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.025557, + "t": 0.025558, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 867, + "operation": "read", + "proto": "tcp", + "t0": 0.025559, + "t": 0.025705, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.0266, + "t": 0.026607, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.026609, + "t": 0.026609, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.026627, + "t": 0.026627, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 305, + "operation": "write", + "proto": "tcp", + "t0": 0.02669, + "t": 0.026721, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 1208, + "operation": "read", + "proto": "tcp", + "t0": 0.02668, + "t": 0.032186, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 507, + "operation": "read", + "proto": "tcp", + "t0": 0.032222, + "t": 0.032543, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.032559, + "t": 0.032559, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.032579, + "t": 0.032585, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 4030, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.032593, + "t": 0.032593, + "transaction_id": 3 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000053, + "t": 0.000053, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000088, + "t": 0.000094, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000097, + "t": 0.000118, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000137, + "t": 0.005192, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000099, + "t": 0.006034, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006058, + "t": 0.006058, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "6taBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000077, + "t": 0.005198, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "RM+BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000062, + "t": 0.006042, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "getaddrinfo", + "failure": "dns_nxdomain_error", + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000073, + "t": 0.00615, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.026627, + "t": 0.032559, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011742, + "t": 0.017089, + "tags": [], + "transaction_id": 3 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnjCCAoagAwIBAgIVANkH9/llAciwP58S1bAB7zsTAzzrMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MDkyNloXDTIzMTEyNzE3MDkyNlowMjEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy9NeUwBkaCcDwXpQuHHx+PsDrpN+FUlsjS9fXqBrWgELHrOSVn2Zg8bNlm4D7VTPVh/tBN88vqQwRSRsukiuV+lMbJagQQBynDQHhHuFfwXLnD94U1Koi9QKb42EVTXLAWo2X+eofp30Tyj/h4xCNvTv46WbyIiUpL9jKeowfWxK26pIc8oV9t/RYoewsIWl6uUnoZnWCSsCh3Mo0Wdh/1WctTpAJsy0X+YdLUAWVwHgfg06coq0ebKX+4j0oFDew8QyXjqEbcmCFxDoIdAh3h5wVsyD8Ifx11id7VUhK+q76hzW8KRdzES60IBmMXhp3B7jnOIkCWcO+Dgos5/QWQIDAQABo4G9MIG6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSjZ9V1DzK3lEqjpETK40sYWL8ZADAfBgNVHSMEGDAWgBTAmFHLvqZbG4Vmwln8SrXh+u5ksTBFBgNVHREEPjA8gg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQAoz5uAQmUcUZ8lAIz2FBbWXEbJIMlg4MhF4Expk9gF4JkI/T9OnXArNcUM7MQZIgH33M3CzoJKtE//K2F2pHqo+pCiTOH04MoJYs7YKL612kgzbfhw9SRPCpMV4n/W6QQU8g0CK9EOtCaYMysSAvHyiOT9WI1XkqAJuvfHTLBBmUjx10ig7zj/J+IPsEYGHNrMvBqCUaPZvisqB1o0rHOja6u1756v8Up7zLWP+rvN8ZMAcW1wgxNV8NtHOuXnSe190o+kz73wM15Sqk6svxO/W2sBlNfQJ2ble2wuMgDxiWl2B6KWGXgFOcTMuwhbaNDuhVl0XFWAgJu2W7UKxZ4V", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIULr0zF5d2U011cwoE2ffjXtX8HGcwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTI2WhcNMjMxMTI4MTYwOTI2WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkapOyU5Hffey9fYGf/o5kn7C7O0S0b11yK5Ts55Lntp5mV0YJbPK8PnMAfeW/kChMaBj0F5JXLbFrYX2e7hIGxw6hZrKXqylIW3+wTD3FDYW5nu06gLAV7D7cejfNIDpwXcWfogI+JBR1ivGI1p7mGNstbLuGBdqcwn6bkL1/AL5Qsdse64mlkbtXClvObZWSKm3xHxSYKuRiVQHTw8z1B71etSPT0OeoM2Rha1iofBm0d1abxI/hp8rfQXoH+vyuYIJyd52qBfXl0+ZOUsFC8abAbpMr8RoUG664WTGdSsLSRo+Eow88cWIklvDyok6NimgUac29pX97jktA4GF8CAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMCYUcu+plsbhWbCWfxKteH67mSxMBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQCHIh/msQovOzaY4/sRl95pWYjJhUQm1cE9pCy5aCuAtNmXpX5zcCUVesJC4JBQIqfMMce08I4E+AixNt/fkqpr8mza5yfbUwaVFh1WJH6kWhnVH12o/ns3ZvRgCz56t7NspGsfDoE6hdjEU5SlnKcqYrbkdfNcjL8OCg5Q/RuaSCfrat725cNanhKYPZQ+GrlnJ+RDnNAqdzD6gaN+FmCZOo0Za/M5eRuYJPf3YK3722JiPUeIMWDSXlKXqp/lVoHJOneQBav35eGrcP8U0/c7KedquDhrUGunxdaM8+thvRkrUdapRAja6Ys1oNXios/kZTUyYnjMPItj01S5nFnj", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.017105, + "t": 0.026609, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "93.184.216.34:443", + "93.184.216.34:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "93.184.216.34:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "93.184.216.34": { + "asn": 15133, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:93.184.216.34 Flags:2}]", + "t": 0.011691 + }, + { + "msg": "conn 93.184.216.34:443: granted permission: true", + "t": 0.026618 + } + ], + "control_failure": null, + "x_dns_flags": 2, + "dns_experiment_failure": "dns_nxdomain_error", + "dns_consistency": "inconsistent", + "http_experiment_failure": null, + "x_blocking_flags": 33, + "x_null_null_flags": 0, + "body_length_match": true, + "headers_match": true, + "status_code_match": true, + "title_match": true, + "blocking": "dns", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.506481, + "test_start_time": "2023-11-27 16:09:26", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/observations.json new file mode 100644 index 000000000..ab26edd3a --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsBlockingNXDOMAIN/observations.json @@ -0,0 +1,136 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_nxdomain_error", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": "https://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/analysis.json new file mode 100644 index 000000000..e53951b95 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/analysis.json @@ -0,0 +1,23 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 1, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": {}, + "HTTPDiffUncommonHeadersIntersection": { + "alt-svc": true, + "content-length": true + }, + "HTTPFinalResponses": { + "3": true + }, + "HTTPFinalResponsesWithTLS": { + "3": true + }, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/measurement.json new file mode 100644 index 000000000..8e50e2470 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/measurement.json @@ -0,0 +1,694 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.com/", + "measurement_start_time": "2023-11-27 16:09:28", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "130.192.182.17:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.010538, + "t": 0.016724, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.016746, + "t": 0.016746, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.016844, + "t": 0.016853, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.016855, + "t": 0.03675, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 1738, + "operation": "read", + "proto": "tcp", + "t0": 0.036844, + "t": 0.036845, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.037707, + "t": 0.037717, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.037721, + "t": 0.037721, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.037744, + "t": 0.037744, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 305, + "operation": "write", + "proto": "tcp", + "t0": 0.03779, + "t": 0.037817, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 1208, + "operation": "read", + "proto": "tcp", + "t0": 0.037783, + "t": 0.04731, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 507, + "operation": "read", + "proto": "tcp", + "t0": 0.047348, + "t": 0.047784, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.047798, + "t": 0.047798, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.047817, + "t": 0.047825, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 4029, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.047832, + "t": 0.047832, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.063851, + "t": 0.06904, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.069052, + "t": 0.069052, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.069137, + "t": 0.069144, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.069146, + "t": 0.076953, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.077038, + "t": 0.077039, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 866, + "operation": "read", + "proto": "tcp", + "t0": 0.07704, + "t": 0.077067, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.077906, + "t": 0.077913, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.077915, + "t": 0.077915, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.087954, + "t": 0.087959, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2314, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.087966, + "t": 0.087966, + "transaction_id": 4 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000061, + "t": 0.000061, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000098, + "t": 0.000118, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000176, + "t": 0.000189, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000123, + "t": 0.003757, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000197, + "t": 0.003991, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.004015, + "t": 0.004015, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [ + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "59yBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.004006, + "t": 0.006147, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "IkaBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.003772, + "t": 0.006266, + "tags": [], + "transaction_id": 1 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.182.17", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000105, + "t": 0.003875, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "IkaBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000071, + "t": 0.003761, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.182.17", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "59yBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEgsC2EQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000157, + "t": 0.003994, + "tags": [], + "transaction_id": 1 + } + ], + "requests": [ + { + "network": "tcp", + "address": "130.192.182.17:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.037744, + "t": 0.047798, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "130.192.182.17", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.010538, + "t": 0.016724, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.063851, + "t": 0.06904, + "tags": [], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "130.192.182.17:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnTCCAoWgAwIBAgIUdrv5xEkkgpmT3cq+CdRmrTjCgj4wDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTI4WhcNMjMxMTI3MTcwOTI4WjAyMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCorcpLd6MqA2HRSXAbk7OTmyulAzFV7lfBfWHDIo/thiXYZ1XRPD4dFLaZTdiI8ULt6L8w5qBE4878WGt4PCjAPeeg1+ycr2EUnwlMlrGwDX1ncwsp+cyLa4pAIizdKyxRqGtzxIFUdDh134zUCd39FZlIgk9VIZmytleA+PISFV6flBt4zeiJWyggj92jRklF+nmdFXSSunIfHAkeqDGoEv27Besc8eYfiv/RZa/ZTbI+/YH6Hc4bHg8LPGiOMqYGa1Vd89W9B69L/V4RVukZhHIpwN1jvVo1gSBhsYcg3LBoPP2PGYTySYyJsfVdWmyl7XiNoHylk20p+s/2w8g7AgMBAAGjgb0wgbowDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFJklbGfDSlqtutTYB3HBXOYOWciPMB8GA1UdIwQYMBaAFDxugnyO2fSRymQ3xWXCceNfZ9M5MEUGA1UdEQQ+MDyCD3d3dy5leGFtcGxlLmNvbYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLm9yZ4ILZXhhbXBsZS5vcmcwDQYJKoZIhvcNAQELBQADggEBANkXtdHWCVOACV+lRJbVtpumjis8TdEEJOZGjzux6UY/8CVznunXmo9itkFEdCaDrH2wco8z/NPAjA86nuwt/7/yvgh4YZYTSoFrvWVaOrLwZICTWLPBjQi64BkctPtXElfpW7zX5lWEHpkMpp2Nk79kkdYykArR+Yb2Mz3zqGLhx1pesrc12xhsZ84ViHfPRcCjEb2z/YH9cZxnUER/bfvsjwJ4aJ8m5S341xP4QDhh1KuJqVKvtL0TKHTgwzxBXDL/8Z1p0MEO69J8CnST2hKwZ4QUULTEOs6fYxsRALjmoR18d2KkVS3CETGkcwQQqMFNUnJgfzBl3BlYefzH+WI=", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUIV+XGPruAJJ2WPz2lv7My6RXorswDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTI4WhcNMjMxMTI4MTYwOTI4WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOovTYdIrYuQpUn09DkKi2rKmU+Af8Vz7/LxGd5+BZppTjOaebAl2eE/TM2KWfnp4LHyZpNwEz7FxJQ00PZ9lp3wVF9n4N68Pdsd0bb2UK+M4jSmUA6ZCfhdeJBKcjn5yv2Y0NKpyJXXUXNlRHj2jCaoukFo+h3ELrBIqriapX9xWwY8YnhY6kuwoladbghf3mWlYo5TdMkGr9wlxEDre5IKxIam7GcyaAlKFQ6pVXIH6KQv0soX0zu7Rq2MFipKi4dnGuK4Zpsek5lM9s+3Z2rpwcrGPhkgXDOHqH+gLrmtNpaxtOsfXyDJPNkA7q5dZVH7LUDUZ5zYFWQcO0mgtwkCAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFDxugnyO2fSRymQ3xWXCceNfZ9M5MBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQDpWe2jfptUMVF8CU8h0KrJGtqIE9PZRIIYh3/TbQ4AyYa+UPd3eur4MMS2HwZUtu7UIGYjZLmt8jlWrq20paOkkg6ty46Ca3KZHBM2x3+DXsbFuSMqASdAWFpRPT51HacyDuSXm+F28FQ3RbHNknmjSKNG1WVAEN7yZIuR/nMu+p/byzyCjBHqXP9MQUGwrYahe9Dj0K0vS17npygdjEJu+d/uIQYQAvdWneCXuTsSTwX68zDWqGwbbpHNbwqZX/BBj9Jw1x7Ydi0pjSFtfdm38+vTAwHyBSzqB2XmYNzGVA13DO2ORFhX0CMVTm4/AI2xgfTExY6U/ou+OzD2I4nk", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.016746, + "t": 0.037721, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnTCCAoWgAwIBAgIUdrv5xEkkgpmT3cq+CdRmrTjCgj4wDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTI4WhcNMjMxMTI3MTcwOTI4WjAyMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCorcpLd6MqA2HRSXAbk7OTmyulAzFV7lfBfWHDIo/thiXYZ1XRPD4dFLaZTdiI8ULt6L8w5qBE4878WGt4PCjAPeeg1+ycr2EUnwlMlrGwDX1ncwsp+cyLa4pAIizdKyxRqGtzxIFUdDh134zUCd39FZlIgk9VIZmytleA+PISFV6flBt4zeiJWyggj92jRklF+nmdFXSSunIfHAkeqDGoEv27Besc8eYfiv/RZa/ZTbI+/YH6Hc4bHg8LPGiOMqYGa1Vd89W9B69L/V4RVukZhHIpwN1jvVo1gSBhsYcg3LBoPP2PGYTySYyJsfVdWmyl7XiNoHylk20p+s/2w8g7AgMBAAGjgb0wgbowDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFJklbGfDSlqtutTYB3HBXOYOWciPMB8GA1UdIwQYMBaAFDxugnyO2fSRymQ3xWXCceNfZ9M5MEUGA1UdEQQ+MDyCD3d3dy5leGFtcGxlLmNvbYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLm9yZ4ILZXhhbXBsZS5vcmcwDQYJKoZIhvcNAQELBQADggEBANkXtdHWCVOACV+lRJbVtpumjis8TdEEJOZGjzux6UY/8CVznunXmo9itkFEdCaDrH2wco8z/NPAjA86nuwt/7/yvgh4YZYTSoFrvWVaOrLwZICTWLPBjQi64BkctPtXElfpW7zX5lWEHpkMpp2Nk79kkdYykArR+Yb2Mz3zqGLhx1pesrc12xhsZ84ViHfPRcCjEb2z/YH9cZxnUER/bfvsjwJ4aJ8m5S341xP4QDhh1KuJqVKvtL0TKHTgwzxBXDL/8Z1p0MEO69J8CnST2hKwZ4QUULTEOs6fYxsRALjmoR18d2KkVS3CETGkcwQQqMFNUnJgfzBl3BlYefzH+WI=", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUIV+XGPruAJJ2WPz2lv7My6RXorswDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTI4WhcNMjMxMTI4MTYwOTI4WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOovTYdIrYuQpUn09DkKi2rKmU+Af8Vz7/LxGd5+BZppTjOaebAl2eE/TM2KWfnp4LHyZpNwEz7FxJQ00PZ9lp3wVF9n4N68Pdsd0bb2UK+M4jSmUA6ZCfhdeJBKcjn5yv2Y0NKpyJXXUXNlRHj2jCaoukFo+h3ELrBIqriapX9xWwY8YnhY6kuwoladbghf3mWlYo5TdMkGr9wlxEDre5IKxIam7GcyaAlKFQ6pVXIH6KQv0soX0zu7Rq2MFipKi4dnGuK4Zpsek5lM9s+3Z2rpwcrGPhkgXDOHqH+gLrmtNpaxtOsfXyDJPNkA7q5dZVH7LUDUZ5zYFWQcO0mgtwkCAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFDxugnyO2fSRymQ3xWXCceNfZ9M5MBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQDpWe2jfptUMVF8CU8h0KrJGtqIE9PZRIIYh3/TbQ4AyYa+UPd3eur4MMS2HwZUtu7UIGYjZLmt8jlWrq20paOkkg6ty46Ca3KZHBM2x3+DXsbFuSMqASdAWFpRPT51HacyDuSXm+F28FQ3RbHNknmjSKNG1WVAEN7yZIuR/nMu+p/byzyCjBHqXP9MQUGwrYahe9Dj0K0vS17npygdjEJu+d/uIQYQAvdWneCXuTsSTwX68zDWqGwbbpHNbwqZX/BBj9Jw1x7Ydi0pjSFtfdm38+vTAwHyBSzqB2XmYNzGVA13DO2ORFhX0CMVTm4/AI2xgfTExY6U/ou+OzD2I4nk", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.069052, + "t": 0.077915, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 4 + } + ], + "x_control_request": { + "http_request": "https://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "130.192.182.17:443", + "130.192.182.17:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "130.192.182.17:443": { + "status": true, + "failure": null + }, + "93.184.216.34:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "130.192.182.17:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + }, + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "130.192.182.17": { + "asn": 137, + "flags": 9 + }, + "93.184.216.34": { + "asn": 15133, + "flags": 10 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:130.192.182.17 Flags:3}]", + "t": 0.010497 + }, + { + "msg": "conn 130.192.182.17:443: granted permission: true", + "t": 0.037734 + }, + { + "msg": "conn 93.184.216.34:443: denied permission: timed out sending", + "t": 0.087936 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 32, + "x_null_null_flags": 0, + "body_length_match": true, + "headers_match": true, + "status_code_match": true, + "title_match": true, + "blocking": false, + "accessible": true + }, + "test_name": "web_connectivity", + "test_runtime": 0.50433, + "test_start_time": "2023-11-27 16:09:28", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/observations.json new file mode 100644 index 000000000..aa75455e0 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPSURL/observations.json @@ -0,0 +1,140 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "130.192.182.17", + "IPAddressASN": 137, + "IPAddressOrg": "Consortium GARR", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "130.192.182.17:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": "https://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": false, + "MatchWithControlIPAddressASN": false, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "4": { + "DNSTransactionIDs": [], + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/analysis.json new file mode 100644 index 000000000..618a14e76 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/analysis.json @@ -0,0 +1,20 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 1, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": {}, + "HTTPDiffUncommonHeadersIntersection": { + "content-length": true + }, + "HTTPFinalResponses": { + "3": true + }, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/measurement.json new file mode 100644 index 000000000..9b4b3d447 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/measurement.json @@ -0,0 +1,738 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://www.example.com/", + "measurement_start_time": "2023-11-27 16:09:27", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "130.192.182.17:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011921, + "t": 0.017388, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.01741, + "t": 0.01741, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.017518, + "t": 0.017526, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011902, + "t": 0.018216, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.018232, + "t": 0.018232, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:80", + "failure": null, + "num_bytes": 283, + "operation": "write", + "proto": "tcp", + "t0": 0.018297, + "t": 0.018324, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:80", + "failure": null, + "num_bytes": 1651, + "operation": "read", + "proto": "tcp", + "t0": 0.018285, + "t": 0.036075, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.036286, + "t": 0.036286, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:80", + "failure": null, + "num_bytes": 1651, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.03639, + "t": 0.03639, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.017528, + "t": 0.040523, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.040634, + "t": 0.040635, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 868, + "operation": "read", + "proto": "tcp", + "t0": 0.040636, + "t": 0.040869, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.04175, + "t": 0.041757, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.041762, + "t": 0.041762, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.041797, + "t": 0.041803, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 2316, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.04181, + "t": 0.04181, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.068842, + "t": 0.074025, + "transaction_id": 5 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.068838, + "t": 0.074251, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.074276, + "t": 0.074276, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.074369, + "t": 0.07438, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.074382, + "t": 0.082399, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 1740, + "operation": "read", + "proto": "tcp", + "t0": 0.082493, + "t": 0.082494, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.083343, + "t": 0.083351, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.083354, + "t": 0.083354, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.083374, + "t": 0.08338, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2316, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.083386, + "t": 0.083386, + "transaction_id": 6 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.00007, + "t": 0.00007, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000108, + "t": 0.000118, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000144, + "t": 0.000174, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000122, + "t": 0.003917, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000178, + "t": 0.004392, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.004425, + "t": 0.004425, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "LgOBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.003934, + "t": 0.005482, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "SRSBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.004416, + "t": 0.006071, + "tags": [], + "transaction_id": 1 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.182.17", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000069, + "t": 0.003329, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "LgOBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.00008, + "t": 0.003925, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.182.17", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "SRSBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEgsC2EQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000127, + "t": 0.004398, + "tags": [], + "transaction_id": 1 + } + ], + "requests": [ + { + "network": "tcp", + "address": "130.192.182.17:80", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "http://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Mon, 27 Nov 2023 16:09:27 GMT" + ] + ], + "headers": { + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Mon, 27 Nov 2023 16:09:27 GMT" + } + }, + "t0": 0.018232, + "t": 0.036286, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "130.192.182.17", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011921, + "t": 0.017388, + "tags": [], + "transaction_id": 4 + }, + { + "ip": "130.192.182.17", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011902, + "t": 0.018216, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.068842, + "t": 0.074025, + "tags": [], + "transaction_id": 5 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.068838, + "t": 0.074251, + "tags": [], + "transaction_id": 6 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "130.192.182.17:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnjCCAoagAwIBAgIVALhpxe1Fk0C4V6YcdLQ9WO1N8FaiMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MDkyN1oXDTIzMTEyNzE3MDkyN1owMjEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyTZ4feyF+M5jkkynTxfdDx4IWGvu+MRcmY8053JDxmA5zIo4UvTZ3hJYwPxTAGWfFrU2drW2NZIKIwLD2xy2kzmiIUbLmhH4mAU6w+7zV6V/S2++3E3r/exRd/8KUvWP5vGG3WQUAoraRSuPrnhQjn3Wn9oUcwrTcGwiLwwKRliCqCoS1l8Qm/uaaV5iygidTTYXKMl/VczHQza0XRD23J+Orx3Olrsv1JINFFq5kOLzZ9RKjfiELm4A5uj41bXV/UUpaAWXaQHM9/KxZz9jwETLvOPShbzuH+19N+VPB5h9c4nZUgz1gMTYHGrsPalDpU4SqYSrOQPzi/pNcMQx4wIDAQABo4G9MIG6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSBLr6yW+PHANCBvHoFMCxblnokojAfBgNVHSMEGDAWgBQtdu/sFVVi3aR4h8Io+2QKH0ErPDBFBgNVHREEPjA8gg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQCl2IsyIaalLLgzqkH1XmLL5oIlWnpBy52rM+zDgTQPM/6PLo4yJMW8f6S7n5JVQJ2b6lIMTbNllN2oFpFF3tK56m28JJxyzvdYuekLdU5+1eMSmRCv6f9/V6o1GzGDiOuuiw/HVXRt2PM/PyUTTZgc7bmaM4ITpXGBV3+n/KLUTlINgEsTbVhnCT41UmZS/a3wUJd//fyBM0sjXTYQxCHZWvWv9x0GeUXJqugtQTAUMf1COIOT8i9gyUHe+I3ZcXFLMmmXeYFhp9XBwLMBfnz0y/ePRyU6rktqjymlKUhqSsb0xfA4o5JrH/DNYyB7LNVIfq57mcFdCp7QqVePR/MW", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAIB+XnH3i5CDUoFt4Gtk8hB4ujL5MA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkyN1oXDTIzMTEyODE2MDkyN1owHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTxF79DP+lmctu8QdJFeHjUC1OXxGK3lx6LT9J4+KHV+JJ6ydRHuoaBlStpNig5M9Uls+7LmqTtUCr/fueF+Ldhmssna9T47q2iUFTKQC37toWF0jQ+P2kvFU+vALBXsk2XBNJDGkEsEBB320D42B5mpvkCCMve34uh7m2N77XT66Mgrcn/DpT5xTXKY+k7RG4WrjYhk+/ETY+m49y5IOx2cv36EBapYYieVCefwPtFV5FKDGXyYPb0LLhnkz7ZGJJQB4JV5wOYFOSjH5hkWCB4JWcAzu4PNY5e+6Lku+v8ZdO1+aU6atsUG37W1UKgnIn2FLlxyEv7p8pXldLjmFJAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQtdu/sFVVi3aR4h8Io+2QKH0ErPDAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEA0uWmLKkJP3+iY4mK/qmxQx+st7ntjp34lG9/T82DDy1melA+T5WpCQFq1fUnjCt4e9YKdPDHRSgvVR38t9GJubIF7+3rvmMfjPjCr1oTXCp5f/BK8EZCbcaA/AwWxrIeShfQFGs/B5TCH8qQY4fZAfJbdV8z2i7hgSKekh1Y9lylZ8d0J5d2BlY1/H4UXIWLnIlotGsu6/5dTVGgNKkWCmAZ5eTzIKBj49a/MppA3c+6L+o+sVqwcyQJJMBcgUk6gx+iJiJhzWvMwsU6FktWrLZkG1MQJ8si9oHJsVDAb4lpX20aBMrvuQvszoPNMHl2YuT1IfMkLvpIKJcmqvRPRg==", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.01741, + "t": 0.041762, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 4 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnjCCAoagAwIBAgIVALhpxe1Fk0C4V6YcdLQ9WO1N8FaiMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MDkyN1oXDTIzMTEyNzE3MDkyN1owMjEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyTZ4feyF+M5jkkynTxfdDx4IWGvu+MRcmY8053JDxmA5zIo4UvTZ3hJYwPxTAGWfFrU2drW2NZIKIwLD2xy2kzmiIUbLmhH4mAU6w+7zV6V/S2++3E3r/exRd/8KUvWP5vGG3WQUAoraRSuPrnhQjn3Wn9oUcwrTcGwiLwwKRliCqCoS1l8Qm/uaaV5iygidTTYXKMl/VczHQza0XRD23J+Orx3Olrsv1JINFFq5kOLzZ9RKjfiELm4A5uj41bXV/UUpaAWXaQHM9/KxZz9jwETLvOPShbzuH+19N+VPB5h9c4nZUgz1gMTYHGrsPalDpU4SqYSrOQPzi/pNcMQx4wIDAQABo4G9MIG6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSBLr6yW+PHANCBvHoFMCxblnokojAfBgNVHSMEGDAWgBQtdu/sFVVi3aR4h8Io+2QKH0ErPDBFBgNVHREEPjA8gg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQCl2IsyIaalLLgzqkH1XmLL5oIlWnpBy52rM+zDgTQPM/6PLo4yJMW8f6S7n5JVQJ2b6lIMTbNllN2oFpFF3tK56m28JJxyzvdYuekLdU5+1eMSmRCv6f9/V6o1GzGDiOuuiw/HVXRt2PM/PyUTTZgc7bmaM4ITpXGBV3+n/KLUTlINgEsTbVhnCT41UmZS/a3wUJd//fyBM0sjXTYQxCHZWvWv9x0GeUXJqugtQTAUMf1COIOT8i9gyUHe+I3ZcXFLMmmXeYFhp9XBwLMBfnz0y/ePRyU6rktqjymlKUhqSsb0xfA4o5JrH/DNYyB7LNVIfq57mcFdCp7QqVePR/MW", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAIB+XnH3i5CDUoFt4Gtk8hB4ujL5MA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkyN1oXDTIzMTEyODE2MDkyN1owHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTxF79DP+lmctu8QdJFeHjUC1OXxGK3lx6LT9J4+KHV+JJ6ydRHuoaBlStpNig5M9Uls+7LmqTtUCr/fueF+Ldhmssna9T47q2iUFTKQC37toWF0jQ+P2kvFU+vALBXsk2XBNJDGkEsEBB320D42B5mpvkCCMve34uh7m2N77XT66Mgrcn/DpT5xTXKY+k7RG4WrjYhk+/ETY+m49y5IOx2cv36EBapYYieVCefwPtFV5FKDGXyYPb0LLhnkz7ZGJJQB4JV5wOYFOSjH5hkWCB4JWcAzu4PNY5e+6Lku+v8ZdO1+aU6atsUG37W1UKgnIn2FLlxyEv7p8pXldLjmFJAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQtdu/sFVVi3aR4h8Io+2QKH0ErPDAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEA0uWmLKkJP3+iY4mK/qmxQx+st7ntjp34lG9/T82DDy1melA+T5WpCQFq1fUnjCt4e9YKdPDHRSgvVR38t9GJubIF7+3rvmMfjPjCr1oTXCp5f/BK8EZCbcaA/AwWxrIeShfQFGs/B5TCH8qQY4fZAfJbdV8z2i7hgSKekh1Y9lylZ8d0J5d2BlY1/H4UXIWLnIlotGsu6/5dTVGgNKkWCmAZ5eTzIKBj49a/MppA3c+6L+o+sVqwcyQJJMBcgUk6gx+iJiJhzWvMwsU6FktWrLZkG1MQJ8si9oHJsVDAb4lpX20aBMrvuQvszoPNMHl2YuT1IfMkLvpIKJcmqvRPRg==", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.074276, + "t": 0.083354, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 6 + } + ], + "x_control_request": { + "http_request": "http://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "130.192.182.17:443", + "130.192.182.17:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "130.192.182.17:443": { + "status": true, + "failure": null + }, + "130.192.182.17:80": { + "status": true, + "failure": null + }, + "93.184.216.34:443": { + "status": true, + "failure": null + }, + "93.184.216.34:80": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "130.192.182.17:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + }, + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "130.192.182.17": { + "asn": 137, + "flags": 9 + }, + "93.184.216.34": { + "asn": 15133, + "flags": 10 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:130.192.182.17 Flags:3}]", + "t": 0.011861 + }, + { + "msg": "conn 130.192.182.17:80: granted permission: true", + "t": 0.018223 + }, + { + "msg": "conn 93.184.216.34:80: denied permission: timed out sending", + "t": 0.084054 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 32, + "x_null_null_flags": 0, + "body_length_match": true, + "headers_match": true, + "status_code_match": true, + "title_match": true, + "blocking": false, + "accessible": true + }, + "test_name": "web_connectivity", + "test_runtime": 0.504877, + "test_start_time": "2023-11-27 16:09:27", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/observations.json new file mode 100644 index 000000000..54db7213a --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToProxyWithHTTPURL/observations.json @@ -0,0 +1,228 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "130.192.182.17", + "IPAddressASN": 137, + "IPAddressOrg": "Consortium GARR", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "130.192.182.17:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": false, + "MatchWithControlIPAddressASN": false, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "4": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "130.192.182.17", + "IPAddressASN": 137, + "IPAddressOrg": "Consortium GARR", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "130.192.182.17:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": false, + "MatchWithControlIPAddressASN": false, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "5": { + "DNSTransactionIDs": [], + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 5, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "6": { + "DNSTransactionIDs": [], + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json new file mode 100644 index 000000000..819d311e4 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json @@ -0,0 +1,20 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 0.12263535551206783, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": { + "access": true + }, + "HTTPDiffUncommonHeadersIntersection": {}, + "HTTPFinalResponses": { + "3": true + }, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/measurement.json new file mode 100644 index 000000000..1d12848a3 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/measurement.json @@ -0,0 +1,520 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://www.example.com/", + "measurement_start_time": "2023-11-27 16:09:29", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.012329, + "t": 0.017444, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.017472, + "t": 0.017472, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 283, + "operation": "write", + "proto": "tcp", + "t0": 0.017518, + "t": 0.017552, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.012346, + "t": 0.018048, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.018066, + "t": 0.018066, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.018154, + "t": 0.018161, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 207, + "operation": "read", + "proto": "tcp", + "t0": 0.017506, + "t": 0.020318, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": "eof_error", + "operation": "read", + "proto": "tcp", + "t0": 0.020368, + "t": 0.02037, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.020376, + "t": 0.020376, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 207, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.02042, + "t": 0.02042, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.018163, + "t": 0.025959, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 1739, + "operation": "read", + "proto": "tcp", + "t0": 0.02606, + "t": 0.026061, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.026945, + "t": 0.026953, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.026955, + "t": 0.026955, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.026971, + "t": 0.026978, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2315, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.026987, + "t": 0.026987, + "transaction_id": 4 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000074, + "t": 0.000074, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.00013, + "t": 0.00015, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000163, + "t": 0.000179, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000154, + "t": 0.00474, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000183, + "t": 0.006627, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006647, + "t": 0.006647, + "transaction_id": 2 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000068, + "t": 0.005911, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "TxSBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000085, + "t": 0.004748, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "agGBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000083, + "t": 0.006632, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:80", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "http://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eAccess Denied\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eAccess Denied\u003c/h1\u003e\n\t\u003cp\u003eThis request cannot be served in your jurisdiction.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [], + "headers": {} + }, + "t0": 0.017472, + "t": 0.020376, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.012329, + "t": 0.017444, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.012346, + "t": 0.018048, + "tags": [], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnTCCAoWgAwIBAgIUCkELZQtsq3kipkz8lg9aSz06Au0wDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTI5WhcNMjMxMTI3MTcwOTI5WjAyMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDCixrPYpBazxhIkLr5a+4b7MhuE5amlfM0CW68G/3owdWzIjcN1/A3such88FXE0PAvjDfxL6Z8yzQydNU+S8TFUBx0eYpl5kUzelgt/dxxOpKJxDKJiOVI0XDYGWRUEWLPP63/o2LYS7bsk8fHxbWpDkpOk27HYNvTgJeu8+mpqyyMdNGMb78W3GV2nFEtQez7kgJmAqB16xHmmrPehfv/InWalmmzHccn1DoBqWTiWQZEDQvRAvDJE7GrFPVQwsIkNFcEfu9xfbDS/zur5b3+DNm7AkHEvTl0Yn0k0gcB+zvuoWK+xFb06b7e0W4W5tCJtRIIkUj4fUYiHKZojiZAgMBAAGjgb0wgbowDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFBzhcyEuzIwpFY04VNMaNGzM1TlmMB8GA1UdIwQYMBaAFImIYXQuL3Ouem9hmueEda65CzyaMEUGA1UdEQQ+MDyCD3d3dy5leGFtcGxlLmNvbYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLm9yZ4ILZXhhbXBsZS5vcmcwDQYJKoZIhvcNAQELBQADggEBAL34IC9oFg/OgsqlpV3GvTZISG6AKPlUTM4bV8RLxOc2AlcP18jGJAJSmJ6wdBn/lwl5kkfScP/nUP44YYn2zo9vw/NbK1T48a8INp2OlvLTv4L+ICoJwjgrrN8A4JOyDTHI0rMm/y1HSOMdTtHg8rX3s0xVeDJZHn1QrFeIfZ8qFCV122dpd/7Far/NWyuW7iXoqF+Q00ur3J/7aL2jQdiLZsEIv8ARJDLEenuVgqhgcVZboP3cQgNMOn9xivVG91Fg9av1Akagcn0p852J213kTzOBtDQA+bzFwsQcwye1pYMAXKXPbBF4VOLIHfmsxdJDbo+8b251nWQ1RbVGwVw=", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAPTEPjffk2IgnK1te0JhDNloZl7jMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkyOFoXDTIzMTEyODE2MDkyOFowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSR+id8ZTnwcUwzUyG2w0dxSFcHICILVHhMGqNbs4HruxvbF8I71qhX0r/aGh3LvTrbGu+fLVwDlX8foxxo0szHn0wloy7m3LsQMqlhJ8onbJPGgVX/bgMf65HxX0ToOYAbXB7Lg0eCLiIsNvgXXsmO5FTRwyttwEi0SkUT/RV+E6BT76Xpe5B1bGXJv+F6a0nZaX+jdGpwKpavVgxqQO4QIzAIUbNzZj8yP6YC7Kwtl44E6p8Vpt3hK7GOpePdBXp7jU7ODF5/ryJJ+4ytLvhCNU52rUFzOeHuGgcV295zry1gLmR5VsC1K1S+FBRozJzpflqoXi9XxmfW3opr/A3AgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJiGF0Li9zrnpvYZrnhHWuuQs8mjAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAMlOT/fJNSVxhBYmIHzsauCyRdzSSpRbuMwdLQuqLQ6DdaFeX/smHWyLEBt2w/QvMw1Ce7ulR5lHFeTkbhiH53SdGirTP89lVFyEVCIrpZbo91CVaR22+xisHL01SHtFnIVFOidCiLtb0BGu/YWvOpIZB11z6rrXpNPP/QEiJRoE7wWXy30KH+vNvbNNCUBv+AnZwPvavg2s2afk7VA+x831jdqJhBJrt2Te/jZhCUKcCtIYcu6i1xEPlkBtAYWvoYD0/4BYWGU9zSdrjIr7f03FMEhGkrnUWew2hHOU7BBltcVCNoL9QZVfhJE6JteyjFFdCbNaF4dWRnhQZVhoXEw==", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.018066, + "t": 0.026955, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 4 + } + ], + "x_control_request": { + "http_request": "http://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "93.184.216.34:443", + "93.184.216.34:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "93.184.216.34:443": { + "status": true, + "failure": null + }, + "93.184.216.34:80": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "93.184.216.34": { + "asn": 15133, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.012295 + }, + { + "msg": "conn 93.184.216.34:80: granted permission: true", + "t": 0.017462 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 16, + "x_null_null_flags": 0, + "body_length_match": false, + "headers_match": false, + "status_code_match": true, + "title_match": false, + "blocking": "http-diff", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.506959, + "test_start_time": "2023-11-27 16:09:29", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/observations.json new file mode 100644 index 000000000..dbfcda2a4 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/observations.json @@ -0,0 +1,138 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 188, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": {}, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Access Denied", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "4": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json new file mode 100644 index 000000000..819d311e4 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json @@ -0,0 +1,20 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 0.12263535551206783, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": { + "access": true + }, + "HTTPDiffUncommonHeadersIntersection": {}, + "HTTPFinalResponses": { + "3": true + }, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/measurement.json new file mode 100644 index 000000000..61f0f9954 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/measurement.json @@ -0,0 +1,740 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://www.example.com/", + "measurement_start_time": "2023-11-27 16:09:30", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "130.192.182.17:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011031, + "t": 0.016359, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.016378, + "t": 0.016378, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:80", + "failure": null, + "num_bytes": 283, + "operation": "write", + "proto": "tcp", + "t0": 0.016438, + "t": 0.016465, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011035, + "t": 0.016728, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.016742, + "t": 0.016742, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.016831, + "t": 0.016838, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:80", + "failure": null, + "num_bytes": 207, + "operation": "read", + "proto": "tcp", + "t0": 0.016418, + "t": 0.019944, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:80", + "failure": "eof_error", + "operation": "read", + "proto": "tcp", + "t0": 0.019971, + "t": 0.019973, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.01998, + "t": 0.01998, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:80", + "failure": null, + "num_bytes": 207, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.019999, + "t": 0.019999, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.01684, + "t": 0.036746, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.036838, + "t": 0.036838, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 867, + "operation": "read", + "proto": "tcp", + "t0": 0.036839, + "t": 0.036852, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.037712, + "t": 0.037729, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.037732, + "t": 0.037732, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.037749, + "t": 0.037757, + "transaction_id": 4 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 2315, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.037765, + "t": 0.037765, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.063387, + "t": 0.068794, + "transaction_id": 5 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.063364, + "t": 0.069264, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.069277, + "t": 0.069277, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.06936, + "t": 0.069366, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.069367, + "t": 0.076707, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.076798, + "t": 0.076799, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 867, + "operation": "read", + "proto": "tcp", + "t0": 0.0768, + "t": 0.076816, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.077679, + "t": 0.077686, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.077689, + "t": 0.077689, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.077707, + "t": 0.077714, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2315, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.07772, + "t": 0.07772, + "transaction_id": 6 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000058, + "t": 0.000058, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000093, + "t": 0.000098, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000097, + "t": 0.000118, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000123, + "t": 0.003624, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000119, + "t": 0.003753, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.003773, + "t": 0.003773, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "OQyBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.003764, + "t": 0.005777, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "eVGBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.003642, + "t": 0.006252, + "tags": [], + "transaction_id": 1 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.182.17", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "eVGBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEgsC2EQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000078, + "t": 0.00363, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "OQyBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000066, + "t": 0.003756, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.182.17", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000077, + "t": 0.003862, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "130.192.182.17:80", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "http://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eAccess Denied\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eAccess Denied\u003c/h1\u003e\n\t\u003cp\u003eThis request cannot be served in your jurisdiction.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [], + "headers": {} + }, + "t0": 0.016378, + "t": 0.01998, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "130.192.182.17", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011031, + "t": 0.016359, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "130.192.182.17", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011035, + "t": 0.016728, + "tags": [], + "transaction_id": 4 + }, + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.063387, + "t": 0.068794, + "tags": [], + "transaction_id": 5 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.063364, + "t": 0.069264, + "tags": [], + "transaction_id": 6 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "130.192.182.17:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnjCCAoagAwIBAgIVAMDErcB4UM+6M7jWUAhAUUwNt2/mMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MDkzMFoXDTIzMTEyNzE3MDkzMFowMjEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0CvQa4vawn26MIXVpb4vG760kLQfZPC8JcJS3krNt0onDfdCYcSzCGMxLk2qE3DVxMvseVwoTy/6vHzxdpeg2oRszUYFEd1tkXLCmmSFqA7GTwLma/wY9Xe2ObOWfLU4WeycVDq4htAHJaiUz5bSlixREkD5G2IH+EFuxhOPefXW+o8KsRl+5NAhm0Tk35qY7aim0fcv/kAwqt/1aaRPWfKb3Gfi3grdtTW9o56w6Lh8IiD2MXnJK2JIklYwW8xL288BeX/fJLPWNLhUJZsxHuGXZgsSv4UDA5+Ut0Cg2NSYxzh6uIia2e37O2XR4O4Wv8GRwYaWgchM1Bj8bzezZQIDAQABo4G9MIG6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQFT381TvXABqTzd8JAsxhegCRBkTAfBgNVHSMEGDAWgBQhE4GWHU0sPEog0xE1rkNphZlp0jBFBgNVHREEPjA8gg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQCvxoTpreA9SnFTPQGBjy9TzeCthLmLD+dUdt9OouFc25rzyN6/7mn3W1DH21n5bZpuQastMJgomZT+ciuu+dFaQmJZbBdGJLcUR6wsgY/A3Sc4U7g8fGOxj/Vl4O/yscBodw6azLHlLEStJqqLY0RUa/S5EWdDcwF0hI69An+5ick+RbmfgX9f5mieCMfw9R4lNsYvaw6xj1KJS8aUzD7xw/QoOK87nE2RgaSyrTY8EW1bmzMYyzBQq5jeYOx/4dBYmbFv4u0dJs8oVIvRbvTRkcUnQk+Px2hhUDzLrB90GGNIdDsyh6iuoRdd3pi0CXRMtLHHWREKJhYok5Cz5mFd", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUe/+MkHn1Xt/AZtDGUHWWzLpfD84wDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTMwWhcNMjMxMTI4MTYwOTMwWjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMSahwKSTH0AV0jZp75QTqKmVhgtsG2N7K2Y9WQQVaJYalTK0VUqozfUkFX7adDQet/nxWbYHAYaDITXV1Sh+cvmFJprm9AS3nq5T8rhJ1wTTYhIHoAgqvqHZh1xBJVcWYylXsmQpTVLo/WpiNGDe8QXDw2E9i2yggCZZutrqGGdOLI/LJ0qtFwVLP5D0NBYhyonwYlol0tFD9rZAxpiTWNDVtS4nuXoPDrbsq2J5yxKCCvBK7hPFPTj9MrY93sHmFS9rpKxX5BBQ5axwhfAIQuuzWZl3fr5m5BdTBMmKpCNF8C65TQuSSuQZ2r0J5YQHw1cjaD2KqJoYhFdtB0/IW8CAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCETgZYdTSw8SiDTETWuQ2mFmWnSMBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQCmx5KwlrJn1TaakOsAOtSRYcE8ZJ6uydYx+rWzDjQmW1b/dbRjb9IsJ9fcCIwam21bkxc99Rr4ExhAS2xI5v2BUNP76VhdWKwNwKgR02z6KRp+62J8u2oGhmgsQbybTYFlZoMx/ijruZyQaI0TSzC+7nhsHqYl7EIKEV0aiWK1Dq7lvNkABHIVHpXEMswNKtuhxY/iX39mnA2RAaU8sbvGrvI2O8FIhJ10o2Ulq/mpLRfjdstQpN2NCZPX0NP9SQ0wF5VkVs+aH0QqSVvZx5CbzNMIOaAc191sRrSqvlnPqRps8dR5BQO2cZ8+V/XmiGkup+kNUFqauVuUmrsLa5Oa", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.016742, + "t": 0.037732, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 4 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnjCCAoagAwIBAgIVAMDErcB4UM+6M7jWUAhAUUwNt2/mMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MDkzMFoXDTIzMTEyNzE3MDkzMFowMjEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0CvQa4vawn26MIXVpb4vG760kLQfZPC8JcJS3krNt0onDfdCYcSzCGMxLk2qE3DVxMvseVwoTy/6vHzxdpeg2oRszUYFEd1tkXLCmmSFqA7GTwLma/wY9Xe2ObOWfLU4WeycVDq4htAHJaiUz5bSlixREkD5G2IH+EFuxhOPefXW+o8KsRl+5NAhm0Tk35qY7aim0fcv/kAwqt/1aaRPWfKb3Gfi3grdtTW9o56w6Lh8IiD2MXnJK2JIklYwW8xL288BeX/fJLPWNLhUJZsxHuGXZgsSv4UDA5+Ut0Cg2NSYxzh6uIia2e37O2XR4O4Wv8GRwYaWgchM1Bj8bzezZQIDAQABo4G9MIG6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQFT381TvXABqTzd8JAsxhegCRBkTAfBgNVHSMEGDAWgBQhE4GWHU0sPEog0xE1rkNphZlp0jBFBgNVHREEPjA8gg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQCvxoTpreA9SnFTPQGBjy9TzeCthLmLD+dUdt9OouFc25rzyN6/7mn3W1DH21n5bZpuQastMJgomZT+ciuu+dFaQmJZbBdGJLcUR6wsgY/A3Sc4U7g8fGOxj/Vl4O/yscBodw6azLHlLEStJqqLY0RUa/S5EWdDcwF0hI69An+5ick+RbmfgX9f5mieCMfw9R4lNsYvaw6xj1KJS8aUzD7xw/QoOK87nE2RgaSyrTY8EW1bmzMYyzBQq5jeYOx/4dBYmbFv4u0dJs8oVIvRbvTRkcUnQk+Px2hhUDzLrB90GGNIdDsyh6iuoRdd3pi0CXRMtLHHWREKJhYok5Cz5mFd", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUe/+MkHn1Xt/AZtDGUHWWzLpfD84wDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTMwWhcNMjMxMTI4MTYwOTMwWjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMSahwKSTH0AV0jZp75QTqKmVhgtsG2N7K2Y9WQQVaJYalTK0VUqozfUkFX7adDQet/nxWbYHAYaDITXV1Sh+cvmFJprm9AS3nq5T8rhJ1wTTYhIHoAgqvqHZh1xBJVcWYylXsmQpTVLo/WpiNGDe8QXDw2E9i2yggCZZutrqGGdOLI/LJ0qtFwVLP5D0NBYhyonwYlol0tFD9rZAxpiTWNDVtS4nuXoPDrbsq2J5yxKCCvBK7hPFPTj9MrY93sHmFS9rpKxX5BBQ5axwhfAIQuuzWZl3fr5m5BdTBMmKpCNF8C65TQuSSuQZ2r0J5YQHw1cjaD2KqJoYhFdtB0/IW8CAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCETgZYdTSw8SiDTETWuQ2mFmWnSMBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQCmx5KwlrJn1TaakOsAOtSRYcE8ZJ6uydYx+rWzDjQmW1b/dbRjb9IsJ9fcCIwam21bkxc99Rr4ExhAS2xI5v2BUNP76VhdWKwNwKgR02z6KRp+62J8u2oGhmgsQbybTYFlZoMx/ijruZyQaI0TSzC+7nhsHqYl7EIKEV0aiWK1Dq7lvNkABHIVHpXEMswNKtuhxY/iX39mnA2RAaU8sbvGrvI2O8FIhJ10o2Ulq/mpLRfjdstQpN2NCZPX0NP9SQ0wF5VkVs+aH0QqSVvZx5CbzNMIOaAc191sRrSqvlnPqRps8dR5BQO2cZ8+V/XmiGkup+kNUFqauVuUmrsLa5Oa", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.069277, + "t": 0.077689, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 6 + } + ], + "x_control_request": { + "http_request": "http://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "130.192.182.17:443", + "130.192.182.17:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "130.192.182.17:443": { + "status": true, + "failure": null + }, + "130.192.182.17:80": { + "status": true, + "failure": null + }, + "93.184.216.34:443": { + "status": true, + "failure": null + }, + "93.184.216.34:80": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "130.192.182.17:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + }, + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "130.192.182.17": { + "asn": 137, + "flags": 9 + }, + "93.184.216.34": { + "asn": 15133, + "flags": 10 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:130.192.182.17 Flags:3}]", + "t": 0.010973 + }, + { + "msg": "conn 130.192.182.17:80: granted permission: true", + "t": 0.016366 + }, + { + "msg": "conn 93.184.216.34:80: denied permission: timed out sending", + "t": 0.078806 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 16, + "x_null_null_flags": 0, + "body_length_match": false, + "headers_match": false, + "status_code_match": true, + "title_match": false, + "blocking": "http-diff", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.504475, + "test_start_time": "2023-11-27 16:09:30", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/observations.json new file mode 100644 index 000000000..39fb1a3a4 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/observations.json @@ -0,0 +1,224 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "130.192.182.17", + "IPAddressASN": 137, + "IPAddressOrg": "Consortium GARR", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "130.192.182.17:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 188, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": {}, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Access Denied", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": false, + "MatchWithControlIPAddressASN": false, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "4": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "130.192.182.17", + "IPAddressASN": 137, + "IPAddressOrg": "Consortium GARR", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "130.192.182.17:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": false, + "MatchWithControlIPAddressASN": false, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "5": { + "DNSTransactionIDs": [], + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 5, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "6": { + "DNSTransactionIDs": [], + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/analysis.json new file mode 100644 index 000000000..80a44a3da --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/analysis.json @@ -0,0 +1,19 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": { + "6": true, + "7": true + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/measurement.json new file mode 100644 index 000000000..af2afa5a0 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/measurement.json @@ -0,0 +1,664 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://bit.ly/32447", + "measurement_start_time": "2023-11-27 16:09:31", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "67.199.248.11:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011465, + "t": 0.016824, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.016849, + "t": 0.016849, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 272, + "operation": "write", + "proto": "tcp", + "t0": 0.016951, + "t": 0.016962, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.016968, + "t": 0.02494, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.025032, + "t": 0.025033, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 817, + "operation": "read", + "proto": "tcp", + "t0": 0.025034, + "t": 0.025193, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.026062, + "t": 0.026069, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.026072, + "t": 0.026072, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.02609, + "t": 0.02609, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 301, + "operation": "write", + "proto": "tcp", + "t0": 0.026127, + "t": 0.026163, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 148, + "operation": "read", + "proto": "tcp", + "t0": 0.026166, + "t": 0.032138, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.032172, + "t": 0.032172, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.032197, + "t": 0.032203, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 2413, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.03221, + "t": 0.03221, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": "connection_refused", + "operation": "connect", + "proto": "tcp", + "t0": 0.043732, + "t": 0.047151, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": "connection_refused", + "operation": "connect", + "proto": "tcp", + "t0": 0.043728, + "t": 0.047743, + "transaction_id": 7 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000065, + "t": 0.000065, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000099, + "t": 0.000115, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000143, + "t": 0.000164, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "read", + "proto": "udp", + "t0": 0.000169, + "t": 0.006212, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 46, + "operation": "read", + "proto": "udp", + "t0": 0.000121, + "t": 0.006576, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006606, + "t": 0.006606, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_start", + "t0": 0.032234, + "t": 0.032234, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.032273, + "t": 0.032277, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.03234, + "t": 0.032358, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.032362, + "t": 0.038734, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.032299, + "t": 0.039108, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.039133, + "t": 0.039133, + "transaction_id": 4 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "bit.ly", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000076, + "t": 0.005872, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "bit.ly", + "query_type": "AAAA", + "raw_response": "gcyBAAABAAAAAAAAA2JpdAJseQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000124, + "t": 0.006218, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "bit.ly", + "query_type": "A", + "raw_response": "zJ2BAAABAAEAAAAAA2JpdAJseQAAAQABA2JpdAJseQAAAQABAAAOEAAEQ8f4Cw==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000076, + "t": 0.006582, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.032248, + "t": 0.038266, + "tags": [], + "transaction_id": 5 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "OE+BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.03232, + "t": 0.03874, + "tags": [], + "transaction_id": 4 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "DHaBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.03225, + "t": 0.039112, + "tags": [], + "transaction_id": 4 + } + ], + "requests": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "bit.ly" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "bit.ly", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://bit.ly/32447" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 308, + "headers_list": [ + [ + "Content-Length", + "0" + ], + [ + "Date", + "Mon, 27 Nov 2023 16:09:31 GMT" + ], + [ + "Location", + "http://www.example.com/" + ] + ], + "headers": { + "Content-Length": "0", + "Date": "Mon, 27 Nov 2023 16:09:31 GMT", + "Location": "http://www.example.com/" + } + }, + "t0": 0.02609, + "t": 0.032172, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "67.199.248.11", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011465, + "t": 0.016824, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": "connection_refused", + "success": false + }, + "t0": 0.043732, + "t": 0.047151, + "tags": [], + "transaction_id": 6 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": "connection_refused", + "success": false + }, + "t0": 0.043728, + "t": 0.047743, + "tags": [], + "transaction_id": 7 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDazCCAlOgAwIBAgIUOJGBVcMge+M/GVvFUREeQhex2rAwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTMxWhcNMjMxMTI3MTcwOTMxWjApMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMQ8wDQYDVQQDEwZiaXQubHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCuklhYtwGgVl0RzP+hNrMyKMFXJrHswKW4htsVe+T23Ysv4PqtN2RkH+rn0mlJKxkmD8MRW1oXCVlUAXInBJPE28zUI8FeChFBExKcYSC98KiBawVQhpCQ6OV00fs6Jrd+UoIvsrf9l99Nc/sdSC9uXR0NEjRp0hJY1YAskp4hV/wXEBwRZzxTxQQv+udpuebGRpEn9Jm64bFYMUgkiKdlYjm45Rqpl92vo1exorazfIrwTYbRTy+2p+RyzMkosWzIx1RTPKh4LJIKYjyNq6zOYeJ/Xk+hSQ90lx9QslSRtdXu3xJS62gKGleD3iMijhwQHlX2k2lKmdjvd0+ZE9ClAgMBAAGjgZQwgZEwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFJvSfLJQY4x41j/bdCH8I/poByqDMB8GA1UdIwQYMBaAFCapZEMR8rRn+8lT0FyOti/yFfgYMBwGA1UdEQQVMBOCBmJpdC5seYIJYml0bHkuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQCBsmRWv8M4tIf+YevXt352t1lUN20MeO2cZTU1dsPu0U9yXEACzRgfLSHw2J+SQXW0/QTgVvqLRbUb76re9BGY7hzmq4IZeNKUOALgWWo9/BYC87HcrokvSa3wo0gIDtBLde7BE0fswX0WIUb0SGvVO0z1UXh1xRVcLCtJMZIl1p88Q1MLp9uIR4e3iQsXjg4914DrAEvHoo04IDashE8Mr8d6uzyIKapttTfGz7E8OwOT9dRQaJtMyYaR3tOUEP6OkbrPr2HBM7k1MCrObQf9wNh7HrygJMOkfBuDmOtsjY+lX8sQU7EpBGshkmgXtWl8h4Kt7c9U0R61MnYOmaFe", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVANJslwzZzI13yNnkrmLyPbh5GXrbMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkzMFoXDTIzMTEyODE2MDkzMFowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTJam4H2idwfxtrRis5v66WG6VOSLjCdFUSNVP7Z11P44uU4uRLDIPYH4p5dzeEmCfHBTA8D1FgAS/kLI9Zs8JGsRMrK9EMZiUZ64ZCooNVVYIUbXx9nx1Bywvf4U0I12aX5gdalqg2jVEUEHy4Saq+FEVgoneq1t6roPzx65q52CEIiZRqmNjsfKYolxvQy4chb6Q0LxexdLEcJAe8AoOpHpClhJNZ0drV7AygBdzMg1OjXPHriGwAWq23T7TrhzYty2T2T6fxMGX9n4W4CsDqoTFVPhWZ7g1ECMo7IUesyVLj9PLmfuEEwpuTpj7sJ/yuVgA0UOPpo0GrS3KyW8rAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQmqWRDEfK0Z/vJU9BcjrYv8hX4GDAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAiutrSy00wbsGlrCYPK2eZkYOTTQMQgIalIDrHeFRolRpR3IbROOziP3mXW9fr1XYTct+zTxbc6XEAgA2ecoPo6srTGoJKpA25JJHB81BVsFQ2zUZljmvo3J7TAcxZlKiYb2tl38kyVFNn8/AT7DUaf+/M1BD+CqrZZNRAK+r/i7Rjv0ng1QJbiLiabFNkjc5knAFLLNbOt3nfuW2r8X7nc3EMhTkdqzInT452fioLp/f1eX1zJNPRnIuntNEwvWeNYE3mLX7nilJVIMKHqypnO+RSyWrmC3Phc8HctWl1k4XEn43DvruRnGioWQTEApBmBQFoymeeTgAwQ7KtktzYw==", + "format": "base64" + } + ], + "server_name": "bit.ly", + "t0": 0.016849, + "t": 0.026072, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://bit.ly/32447", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "67.199.248.11:443", + "67.199.248.11:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "67.199.248.11:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "67.199.248.11:443": { + "server_name": "bit.ly", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "67.199.248.11" + ] + }, + "ip_info": { + "67.199.248.11": { + "asn": 396982, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:67.199.248.11 Flags:3}]", + "t": 0.011406 + }, + { + "msg": "conn 67.199.248.11:443: granted permission: true", + "t": 0.02608 + }, + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.043688 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 8, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.539465, + "test_start_time": "2023-11-27 16:09:31", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/observations.json new file mode 100644 index 000000000..3c75bbf44 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTP/observations.json @@ -0,0 +1,228 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "bit.ly", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "4": { + "DNSTransactionIDs": [ + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "67.199.248.11", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "67.199.248.11:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "bit.ly", + "HTTPRequestURL": "https://bit.ly/32447", + "HTTPFailure": "", + "HTTPResponseStatusCode": 308, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Content-Length": true, + "Date": true, + "Location": true + }, + "HTTPResponseLocation": "http://www.example.com/", + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "6": { + "DNSTransactionIDs": [ + 5, + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "connection_refused", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "7": { + "DNSTransactionIDs": [ + 5, + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 7, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "connection_refused", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/analysis.json new file mode 100644 index 000000000..b09118c64 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/analysis.json @@ -0,0 +1,18 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": { + "6": true + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/measurement.json new file mode 100644 index 000000000..c98e66c25 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/measurement.json @@ -0,0 +1,643 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://bit.ly/21645", + "measurement_start_time": "2023-11-27 16:09:32", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "67.199.248.11:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.010648, + "t": 0.015624, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.015651, + "t": 0.015651, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 272, + "operation": "write", + "proto": "tcp", + "t0": 0.01575, + "t": 0.015762, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.015765, + "t": 0.023531, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.023625, + "t": 0.023626, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 818, + "operation": "read", + "proto": "tcp", + "t0": 0.023627, + "t": 0.023648, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.024529, + "t": 0.024535, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.024538, + "t": 0.024538, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.024556, + "t": 0.024556, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 301, + "operation": "write", + "proto": "tcp", + "t0": 0.024591, + "t": 0.024616, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 149, + "operation": "read", + "proto": "tcp", + "t0": 0.024619, + "t": 0.030494, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.030524, + "t": 0.030524, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.030547, + "t": 0.030553, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 2415, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.03056, + "t": 0.03056, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": "connection_refused", + "operation": "connect", + "proto": "tcp", + "t0": 0.042063, + "t": 0.045626, + "transaction_id": 6 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000062, + "t": 0.000062, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.00012, + "t": 0.000126, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000157, + "t": 0.000163, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 46, + "operation": "read", + "proto": "udp", + "t0": 0.000167, + "t": 0.005039, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "read", + "proto": "udp", + "t0": 0.000131, + "t": 0.005879, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.005899, + "t": 0.005899, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_start", + "t0": 0.030628, + "t": 0.030628, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.030701, + "t": 0.030718, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.030707, + "t": 0.030722, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.030729, + "t": 0.036605, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.03073, + "t": 0.036852, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.036882, + "t": 0.036882, + "transaction_id": 4 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "bit.ly", + "query_type": "A", + "raw_response": "mvCBAAABAAEAAAAAA2JpdAJseQAAAQABA2JpdAJseQAAAQABAAAOEAAEQ8f4Cw==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000132, + "t": 0.005049, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "bit.ly", + "query_type": "AAAA", + "raw_response": "6ICBAAABAAAAAAAAA2JpdAJseQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000072, + "t": 0.005883, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "bit.ly", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000105, + "t": 0.006369, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.030597, + "t": 0.036732, + "tags": [], + "transaction_id": 5 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "ZhyBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.030679, + "t": 0.036611, + "tags": [], + "transaction_id": 4 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "ztGBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.030685, + "t": 0.036858, + "tags": [], + "transaction_id": 4 + } + ], + "requests": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "bit.ly" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "bit.ly", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://bit.ly/21645" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 308, + "headers_list": [ + [ + "Content-Length", + "0" + ], + [ + "Date", + "Mon, 27 Nov 2023 16:09:32 GMT" + ], + [ + "Location", + "https://www.example.com/" + ] + ], + "headers": { + "Content-Length": "0", + "Date": "Mon, 27 Nov 2023 16:09:32 GMT", + "Location": "https://www.example.com/" + } + }, + "t0": 0.024556, + "t": 0.030524, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "67.199.248.11", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.010648, + "t": 0.015624, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": "connection_refused", + "success": false + }, + "t0": 0.042063, + "t": 0.045626, + "tags": [], + "transaction_id": 6 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDbDCCAlSgAwIBAgIVANUwSgVjCFoesdgocbbzsUNwmLhtMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MDkzMloXDTIzMTEyNzE3MDkzMlowKTEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEPMA0GA1UEAxMGYml0Lmx5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsojHoR8ZcIlTrCrb7zVmFD8MUvaPKrzHtJ7xd83bKk1XylB7FrqN6Pecvz4MVmkMrzneMwzcEuZLYEi+5WoxH6moOnRpnmvsayF2Wc1+H6uhvSe7V8wHAVQLDn0U0NgZtR1MbIczhCoMtmuACdGcpYY9RPeF2owFI/DUTWhWmwfVYc31YKuSKrMJ3d0UHk+y8oRwqZxue8PAWwl2KqxoY02p4VoOaCe2mLiH6rdAwRLqfLzCcDlPeJHnTePielyaY1k28unHkNvZTdpewbIs6WrTfBCVGMsaopCHCcoXjqBAySqKguENryIViuWvuE4dFYYscVov0ifCLUOvK5HVJQIDAQABo4GUMIGRMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSL0ulqNeInx7yImND3jB/K+uQBXTAfBgNVHSMEGDAWgBTHrPFRWHlqMbi654zqiNPPGQwa9zAcBgNVHREEFTATggZiaXQubHmCCWJpdGx5LmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAWTKzWTaa6cVNoiSiVvyuctfSA0i9KHQXM4muiq92jaDjLPcQ7D+p516h3ZYfe0uBvM8D+AH0iMUQLzF19I9eCEmK+KjMGHqk0by0Rs3UWlaWYAHdEKuq1eCGwPqUhpLt6SQmFLF9Nqo5exFXC/vL7fKzQxZrqf8xKerUO1AXCH8cCaknIew6m16nI1ilwjELWKn80bNtBKTu841043ZtGJa/sLohy+zNQwuMjjHyciBiVMJ9rneDG033mAmQ+r+salkv6VAIMd8Gzm+EB5D8Kt/dru+/LBzlx00vpEXGQxtR+X3e18WLLt8Jy7ZaWoZSYzP2azJDOF7Dl39nL6hsWw==", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAPt2TI1ZRWvOCvb58bffF+cHFyERMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkzMVoXDTIzMTEyODE2MDkzMVowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCnyGzdRsw7ohckVLuBi6iOVZWkfMtiDoBnQk8H2cFux7sPbIO8Kd0yYG7k552A4kJNQ3qTAfcaxkscmrk5+MaqFwrKiXuq9qhYWTUJPCMx9CeOdy+YaBUAC+yqn64nNl04CB/wdUvC2Bs/6eWBddZ3UvqHlA7yuild4KqTyxfevZbTCYSEimwxMdL9mJZP2mGGmjTGrirULUhUpNIp5N5qxLXFS7aAvq64ssEL1F+nytVuGMHD4cCRxWT4j/nCLaMGuc43aiOHbsBghLPEG17Fwt+eYGHQKGd95xts/UY4BmLNqXDK0j/xe9ocA++0oAPwV+dUdhCDA5U1h7XLaDExAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTHrPFRWHlqMbi654zqiNPPGQwa9zAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAJKLOQ6DJauqCnhSS7OSQkDd6f9SDTEjZkjQHbuVWLeT/XGlTOhVRffHBA87LPTm31FuM8DfnPJGGZ8seGzrO5I5h8E99RcB/E9FeT2UmH7LZfpyWipc/hGiBE73VGkDHRx9GnUlJBU0ov3hRl8bZnLHe44k2NkC8KzHtCe93LxzCRxyIHM53Iv2S0ZoiNxNoXL7yHyg1TFCY4PJmYj/l1W8SsBoCYFZi71E7AKQ4g+tNJk0uiNUdwiwY4o5UBk7jcTWAN2Qcc0CFtw3gwl8qbSPOVFe7ylFqjD9Y5+WgTs41iqT+ZACVsmoiNliOHuJ3xS9EvXuLY0ad+9YlVd4QRw==", + "format": "base64" + } + ], + "server_name": "bit.ly", + "t0": 0.015651, + "t": 0.024538, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://bit.ly/21645", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "67.199.248.11:443", + "67.199.248.11:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "67.199.248.11:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "67.199.248.11:443": { + "server_name": "bit.ly", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "67.199.248.11" + ] + }, + "ip_info": { + "67.199.248.11": { + "asn": 396982, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:67.199.248.11 Flags:3}]", + "t": 0.010595 + }, + { + "msg": "conn 67.199.248.11:443: granted permission: true", + "t": 0.024547 + }, + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.042033 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 8, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.537222, + "test_start_time": "2023-11-27 16:09:32", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/observations.json new file mode 100644 index 000000000..0b72231c8 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS/observations.json @@ -0,0 +1,182 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "bit.ly", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "4": { + "DNSTransactionIDs": [ + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "67.199.248.11", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "67.199.248.11:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "bit.ly", + "HTTPRequestURL": "https://bit.ly/21645", + "HTTPFailure": "", + "HTTPResponseStatusCode": 308, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Content-Length": true, + "Date": true, + "Location": true + }, + "HTTPResponseLocation": "https://www.example.com/", + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "6": { + "DNSTransactionIDs": [ + 5, + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "connection_refused", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/analysis.json new file mode 100644 index 000000000..e6958a5f1 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/analysis.json @@ -0,0 +1,21 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": { + "6": true + }, + "TCPTransactionsWithUnexplainedUnexpectedFailures": { + "6": true, + "7": true + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/measurement.json new file mode 100644 index 000000000..016ff63ad --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/measurement.json @@ -0,0 +1,814 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://bit.ly/32447", + "measurement_start_time": "2023-11-27 16:09:33", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "67.199.248.11:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011742, + "t": 0.017104, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.017119, + "t": 0.017119, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 272, + "operation": "write", + "proto": "tcp", + "t0": 0.017206, + "t": 0.017215, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.017217, + "t": 0.025839, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 1689, + "operation": "read", + "proto": "tcp", + "t0": 0.025926, + "t": 0.025927, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.026807, + "t": 0.026814, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.026817, + "t": 0.026817, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.026835, + "t": 0.026835, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 301, + "operation": "write", + "proto": "tcp", + "t0": 0.026878, + "t": 0.026919, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 148, + "operation": "read", + "proto": "tcp", + "t0": 0.026924, + "t": 0.032676, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.032714, + "t": 0.032714, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.032739, + "t": 0.032745, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 2413, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.032752, + "t": 0.032752, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.044882, + "t": 0.04973, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.049746, + "t": 0.049746, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 303, + "operation": "write", + "proto": "tcp", + "t0": 0.049782, + "t": 0.049808, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.044872, + "t": 0.050936, + "transaction_id": 7 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.050946, + "t": 0.050946, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.051028, + "t": 0.051032, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:80", + "failure": "connection_reset", + "operation": "read", + "proto": "tcp", + "t0": 0.049781, + "t": 0.053205, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.053215, + "t": 0.053215, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.053233, + "t": 0.053233, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": "connection_reset", + "operation": "read", + "proto": "tcp", + "t0": 0.051034, + "t": 0.054518, + "transaction_id": 7 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.054522, + "t": 0.054522, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.054538, + "t": 0.054538, + "transaction_id": 7 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000067, + "t": 0.000067, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000099, + "t": 0.000118, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000111, + "t": 0.00013, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "read", + "proto": "udp", + "t0": 0.000123, + "t": 0.005918, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 46, + "operation": "read", + "proto": "udp", + "t0": 0.000136, + "t": 0.006036, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006061, + "t": 0.006061, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_start", + "t0": 0.0328, + "t": 0.0328, + "transaction_id": 5 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.032823, + "t": 0.032837, + "transaction_id": 5 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.032857, + "t": 0.032873, + "transaction_id": 5 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.032878, + "t": 0.039037, + "transaction_id": 5 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.032842, + "t": 0.039749, + "transaction_id": 5 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.039771, + "t": 0.039771, + "transaction_id": 5 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "bit.ly", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000068, + "t": 0.005576, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "bit.ly", + "query_type": "AAAA", + "raw_response": "hLeBAAABAAAAAAAAA2JpdAJseQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000074, + "t": 0.005924, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "bit.ly", + "query_type": "A", + "raw_response": "uleBAAABAAEAAAAAA2JpdAJseQAAAQABA2JpdAJseQAAAQABAAAOEAAEQ8f4Cw==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000091, + "t": 0.00604, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.032785, + "t": 0.039516, + "tags": [], + "transaction_id": 4 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "eROBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.032822, + "t": 0.03905, + "tags": [], + "transaction_id": 5 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "sTeBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.032807, + "t": 0.039752, + "tags": [], + "transaction_id": 5 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:80", + "failure": "connection_reset", + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "https://bit.ly/32447" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "https://bit.ly/32447", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "http://www.example.com/" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 0, + "headers_list": [], + "headers": {} + }, + "t0": 0.049746, + "t": 0.053215, + "tags": [], + "transaction_id": 6 + }, + { + "network": "tcp", + "address": "67.199.248.11:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "bit.ly" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "bit.ly", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://bit.ly/32447" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 308, + "headers_list": [ + [ + "Content-Length", + "0" + ], + [ + "Date", + "Mon, 27 Nov 2023 16:09:33 GMT" + ], + [ + "Location", + "http://www.example.com/" + ] + ], + "headers": { + "Content-Length": "0", + "Date": "Mon, 27 Nov 2023 16:09:33 GMT", + "Location": "http://www.example.com/" + } + }, + "t0": 0.026835, + "t": 0.032714, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "67.199.248.11", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011742, + "t": 0.017104, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.044882, + "t": 0.04973, + "tags": [], + "transaction_id": 6 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.044872, + "t": 0.050936, + "tags": [], + "transaction_id": 7 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDazCCAlOgAwIBAgIUQx8BOnWMX2oGRTd03IiMItQkgbcwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTMzWhcNMjMxMTI3MTcwOTMzWjApMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMQ8wDQYDVQQDEwZiaXQubHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7zL+J4Y4/u3O9qQtsMv3y7QcQVf4nI4rq3fzMn/Bgw0oaqnRrTAF37wvkPdSWbC2l0RyXTa6Ik0FjtHhyu3HKcz0pEdF/gFjJ3rBnbDzl8EF7De9Y/UoP1ORK/wgDV3aPksXspB7ZTh2vH+1qkBRsp3hKoTEBMNxWhX0awnPTnnOhSR99rX5kj7prSVzf0COTtG6W8RK92/TxYhhuiOc/bMlCw5KIigB6EMkftm3tL181i9glZDnTllmNYjqellMjoirVAIEal/DqdDlkaseaI/8EnBZdKPHG+4P1MuSQ1GSKMPNl+dvdBM9xyAc9wA+/+Lqzfs17UdzuPuwyLA6DAgMBAAGjgZQwgZEwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFGQfd7KUQD3kxopeZs5VQJQVG4A3MB8GA1UdIwQYMBaAFJ7Vg3ztCwKcmKwtuIF2VQJEYsPdMBwGA1UdEQQVMBOCBmJpdC5seYIJYml0bHkuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQB4fkQQ973OmgOFGxYEMx3pME5IRD4BUzsNO5pPYtlJAGZHDJTQmG2r1j5dE3G2WHGlOmx+/vF6Se+Nmf/07vU0rTv6kR3dBNWsXiTWAV250CI81OVMLbqWedc9A72WAIjR9M42ghuAgltz829wl7CyzqLon/Uafu7y34+OkIqH9KL382+cuPTOevqabJNLJXqCyPox2z1hWAGlxIa8IjIoELZyvDwug0+8yVflZgi9GiWnnrxqLSyPxo3QHY9Dpjw3XMC9o56nwn3OX4XQ/sdSvfM/nrnrLpneYZ9rhfh/76u78/yKC2fmC50SQccGzyiAzqD2tdhljF6Fh1fsGEEW", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVALKNeXukpoStdHTJWl3y/qQEwzT2MA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkzMloXDTIzMTEyODE2MDkzMlowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDKCsKz/FEDBCc36FgyHZ0H+dWIcRTGdKu7UCzWOq6ObT/dYcEF2mbyp5eCfuh9dq/YmRXr7U5Mbhis6PJ73GZm451VbImJpRHoQOm3K+DF24vK7I726o4lsVFJlaQMSdoisErFHlMTMfx3VGOmUBSpfSO2YPfnuYI5LT07nvFyqQfWtS5y8IqKx1ZHC+Qjw2+j89qGfnQhurFP0mG8n/9YfH4F8QTxbESbvUADecUi6mKFPrlpD0jQ1GLbuwFG7Q5pJ3DZED2x7LpvIn872bIWF3pPCPdQ33fcrK7a0w94baH9B1z0oYfh5hhTUjdIRvo5f3YMFfGJYZo7FY7QvGgbAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSe1YN87QsCnJisLbiBdlUCRGLD3TAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAhBzbiGC2YaK1isqUGAfZJi6XXOMl3xfXQp9zukSECvTG/rMuRP1VCdfshGACgb5n55eWk29eoh/GRGzFXh9lebNn10OLskwaYS1OW3UHECZ2bwFV++eJUKgZJhqgJzMq3tC9ssqRTMBqZfPsqpRhbtoZGwiYGm3LVGV3PuBVd2iuWZYoskOKIrbct+XOP5qMA0DhJ5SbfqjTXVrBiC+EDA/FAIYdZPk03Inlc2nm0MxmUnq/zXGKZyH0+IJtg5F8xk8hgVL3w8Amg40hneM5GWJSazacz6i41wTVfnaKPKZxvRqAfu7Ug9tY8dIgTWpMcWBpCR7wNZJl1INw2XqcrQ==", + "format": "base64" + } + ], + "server_name": "bit.ly", + "t0": 0.017119, + "t": 0.026817, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "", + "failure": "connection_reset", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [], + "server_name": "www.example.com", + "t0": 0.050946, + "t": 0.054522, + "tags": [], + "tls_version": "", + "transaction_id": 7 + } + ], + "x_control_request": { + "http_request": "https://bit.ly/32447", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "67.199.248.11:443", + "67.199.248.11:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "67.199.248.11:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "67.199.248.11:443": { + "server_name": "bit.ly", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "67.199.248.11" + ] + }, + "ip_info": { + "67.199.248.11": { + "asn": 396982, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:67.199.248.11 Flags:3}]", + "t": 0.011699 + }, + { + "msg": "conn 67.199.248.11:443: granted permission: true", + "t": 0.026826 + }, + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.044829 + }, + { + "msg": "conn 93.184.216.34:80: granted permission: true", + "t": 0.049738 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 8, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.540267, + "test_start_time": "2023-11-27 16:09:33", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/observations.json new file mode 100644 index 000000000..4ba0b570a --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTP/observations.json @@ -0,0 +1,228 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "bit.ly", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "5": { + "DNSTransactionIDs": [ + 5 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "67.199.248.11", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "67.199.248.11:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "bit.ly", + "HTTPRequestURL": "https://bit.ly/32447", + "HTTPFailure": "", + "HTTPResponseStatusCode": 308, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Content-Length": true, + "Date": true, + "Location": true + }, + "HTTPResponseLocation": "http://www.example.com/", + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "6": { + "DNSTransactionIDs": [ + 4, + 5 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.com/", + "HTTPFailure": "connection_reset", + "HTTPResponseStatusCode": 0, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": {}, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "7": { + "DNSTransactionIDs": [ + 4, + 5 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 7, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "connection_reset", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/analysis.json new file mode 100644 index 000000000..b09118c64 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/analysis.json @@ -0,0 +1,18 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": { + "6": true + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/measurement.json new file mode 100644 index 000000000..0583458aa --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/measurement.json @@ -0,0 +1,700 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://bit.ly/21645", + "measurement_start_time": "2023-11-27 16:09:34", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "67.199.248.11:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.010794, + "t": 0.015543, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.015558, + "t": 0.015558, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 272, + "operation": "write", + "proto": "tcp", + "t0": 0.015647, + "t": 0.015655, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.015658, + "t": 0.02356, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.023651, + "t": 0.023652, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 817, + "operation": "read", + "proto": "tcp", + "t0": 0.023653, + "t": 0.023679, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.024547, + "t": 0.024555, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.024557, + "t": 0.024557, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.024577, + "t": 0.024577, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 301, + "operation": "write", + "proto": "tcp", + "t0": 0.024621, + "t": 0.024652, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 149, + "operation": "read", + "proto": "tcp", + "t0": 0.024614, + "t": 0.029923, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.029954, + "t": 0.029954, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.029982, + "t": 0.029987, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 2414, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.029995, + "t": 0.029995, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.041497, + "t": 0.046736, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.046747, + "t": 0.046747, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.046836, + "t": 0.046843, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": "connection_reset", + "operation": "read", + "proto": "tcp", + "t0": 0.046844, + "t": 0.050207, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.050211, + "t": 0.050211, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.050231, + "t": 0.050231, + "transaction_id": 6 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.00007, + "t": 0.00007, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000104, + "t": 0.000109, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000123, + "t": 0.000126, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "read", + "proto": "udp", + "t0": 0.000129, + "t": 0.005555, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 46, + "operation": "read", + "proto": "udp", + "t0": 0.000146, + "t": 0.00568, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.005719, + "t": 0.005719, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_start", + "t0": 0.030088, + "t": 0.030088, + "transaction_id": 5 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.030115, + "t": 0.030136, + "transaction_id": 5 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.030127, + "t": 0.030141, + "transaction_id": 5 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.03014, + "t": 0.03616, + "transaction_id": 5 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.030157, + "t": 0.036399, + "transaction_id": 5 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.03643, + "t": 0.03643, + "transaction_id": 5 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "bit.ly", + "query_type": "AAAA", + "raw_response": "zbeBAAABAAAAAAAAA2JpdAJseQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000078, + "t": 0.005559, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "bit.ly", + "query_type": "A", + "raw_response": "fGCBAAABAAEAAAAAA2JpdAJseQAAAQABA2JpdAJseQAAAQABAAAOEAAEQ8f4Cw==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000105, + "t": 0.005688, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "bit.ly", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000078, + "t": 0.006041, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.030032, + "t": 0.036054, + "tags": [], + "transaction_id": 4 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "PvaBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.030096, + "t": 0.036171, + "tags": [], + "transaction_id": 5 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "fCmBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.030106, + "t": 0.036402, + "tags": [], + "transaction_id": 5 + } + ], + "requests": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "bit.ly" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "bit.ly", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://bit.ly/21645" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 308, + "headers_list": [ + [ + "Content-Length", + "0" + ], + [ + "Date", + "Mon, 27 Nov 2023 16:09:34 GMT" + ], + [ + "Location", + "https://www.example.com/" + ] + ], + "headers": { + "Content-Length": "0", + "Date": "Mon, 27 Nov 2023 16:09:34 GMT", + "Location": "https://www.example.com/" + } + }, + "t0": 0.024577, + "t": 0.029954, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "67.199.248.11", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.010794, + "t": 0.015543, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.041497, + "t": 0.046736, + "tags": [], + "transaction_id": 6 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDazCCAlOgAwIBAgIUPkyrm/7WN9ez/+Pfx3zaraGiDtwwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTM0WhcNMjMxMTI3MTcwOTM0WjApMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMQ8wDQYDVQQDEwZiaXQubHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3zv7tppTanCyTbNIvRmo2SF2MzUoFZrzqRT0GwAPjNoAMDUNARA7dGwg2/OY+kGt3W2h3gDNR26IEyDCgY4PFEHNfOiqk6IKZ+0rc14D/Zqpf+kmB+1mst217iBxpzHkr7OSrLvxgDTglXy3ZqIalgOQGputB9t2y+LDjfQnx92hjiULXU2iw9jUz3CdzZwAnvb9L9LjYwEW3b7gjvyVTPrRRG2XZgTF7bgeXCVuGHyii1Bxl1oPZxpM5ggG8CG5xlmkv77zsXBwRYzoC+SLQ+r+YqO+bunQjhghG6PdIx4Ko5y0XTwGsKtnOzkhIz9hRpLifBrDKBZ+afRM1wSHdAgMBAAGjgZQwgZEwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPANP8ta6qTxdlNX7iCq1/Tf24KaMB8GA1UdIwQYMBaAFGT/pMlRJOitcILkK4c+cV7OkwBaMBwGA1UdEQQVMBOCBmJpdC5seYIJYml0bHkuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQA1Y5B1KbLnk3I1mLyAdkSoklPXBh4IQd4HsxarVYM18ho5LhrnS4mZPrXGG8WRkkg3AXPo1n1HVy4N+shgev/XByyNDxn8WHH9NyDw+ZaD9fGKipnmIJQCUcyFQ6pOKoOTDRWr8hOPtE6iMLC+Ee8onldbVAAI+bCgTyyxIOQ+JfD6203o2s0EfXg9u5vJ7kxscXD04ejSIfySR4tVi+VpHgo/XoY2/7zbF3g/+as5ZVrBmEsbLxnat4n2bsmDZbUOZmtCDFEPRF9SWcSeRY5kRHm9g7jf3X5YtrhHC+da+lzIp2aRbSPl5Yg1TR4/RcK99jAEQs2xRx5xdPasQZUW", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAN7KCCJONruVA6YXDhZ0LnAPCf9GMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkzM1oXDTIzMTEyODE2MDkzM1owHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVjFyOrj3SDGBqeMDoPmFIQ8D8UUXW8diOtYB6rQ+LYfnpf329EF9uVd2oDarK5XFM+T2E5vgk5X7YuliWS0WCh2T0zHPFBfCeQEgClOw7HxK/cBtg4iB8pDt7/MkuLhw0jv6IMLWq3vkJ02rD4EhIljMbMuHzLW1YLGapgMNQzmdb8oUp3YswtcfeLlhuAcY8YCXwnO6d7hllgIX/18eJACBMZd6o5mdpC7bTqMY4pDKnO3YSmwJuaNGHctGUfT8i3X/ODWKkq9mjV/R5FsT6ljIz9nRoDZAg4KPisj8lgPbwlTnLp7HXckgq4J7rZ6NV+IQDa7Zjnmee2uDnAC5pAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRk/6TJUSTorXCC5CuHPnFezpMAWjAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAFjFZ3M1+ZLdFwGLUpRmJax9/9Sm01XL0pguVxL/tmW1uqB634LklgGXQpwcOCoyMa5gjMImITU/wKmUW/0+SB8/2rMydsc3gpewb4LLe6nNd/ZPz2avJNvioXNIowQbxJPC0LGJWqi1t0b9XKIhCzuzfB4MOt2M3UP8Qhlvkaws859dZmluANxCaMryQprbrOeCpKNLJ6XcWiVFyo+EdIjBm0Oo8UACFImK36xSOE27QjGYNSXyAIIyBE44UpGrd4VYP6B7qabnrxaZaMCGGgW3sOrKZg4JBIv5HtGGzyB+ZHww+95NtNRzhLt/O2JSWL0G8Da2OPgq6sL+PlUk3Lw==", + "format": "base64" + } + ], + "server_name": "bit.ly", + "t0": 0.015558, + "t": 0.024557, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "", + "failure": "connection_reset", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [], + "server_name": "www.example.com", + "t0": 0.046747, + "t": 0.050211, + "tags": [], + "tls_version": "", + "transaction_id": 6 + } + ], + "x_control_request": { + "http_request": "https://bit.ly/21645", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "67.199.248.11:443", + "67.199.248.11:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "67.199.248.11:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "67.199.248.11:443": { + "server_name": "bit.ly", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "67.199.248.11" + ] + }, + "ip_info": { + "67.199.248.11": { + "asn": 396982, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:67.199.248.11 Flags:3}]", + "t": 0.01074 + }, + { + "msg": "conn 67.199.248.11:443: granted permission: true", + "t": 0.024567 + }, + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.041465 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 8, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.536667, + "test_start_time": "2023-11-27 16:09:34", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/observations.json new file mode 100644 index 000000000..fca0c6d7f --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenConnectionResetForHTTPS/observations.json @@ -0,0 +1,182 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "bit.ly", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "5": { + "DNSTransactionIDs": [ + 5 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "67.199.248.11", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "67.199.248.11:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "bit.ly", + "HTTPRequestURL": "https://bit.ly/21645", + "HTTPFailure": "", + "HTTPResponseStatusCode": 308, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Content-Length": true, + "Date": true, + "Location": true + }, + "HTTPResponseLocation": "https://www.example.com/", + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "6": { + "DNSTransactionIDs": [ + 4, + 5 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "connection_reset", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/analysis.json new file mode 100644 index 000000000..e6958a5f1 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/analysis.json @@ -0,0 +1,21 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": { + "6": true + }, + "TCPTransactionsWithUnexplainedUnexpectedFailures": { + "6": true, + "7": true + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/measurement.json new file mode 100644 index 000000000..85aa30931 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/measurement.json @@ -0,0 +1,814 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://bit.ly/32447", + "measurement_start_time": "2023-11-27 16:09:35", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "67.199.248.11:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.01141, + "t": 0.016268, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.016283, + "t": 0.016283, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 272, + "operation": "write", + "proto": "tcp", + "t0": 0.016368, + "t": 0.016376, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.016378, + "t": 0.024421, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 1689, + "operation": "read", + "proto": "tcp", + "t0": 0.024524, + "t": 0.024525, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.025415, + "t": 0.025422, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.025424, + "t": 0.025424, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.025443, + "t": 0.025443, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 301, + "operation": "write", + "proto": "tcp", + "t0": 0.025479, + "t": 0.025508, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 148, + "operation": "read", + "proto": "tcp", + "t0": 0.025512, + "t": 0.030651, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.030696, + "t": 0.030696, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.030721, + "t": 0.030727, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 2413, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.030734, + "t": 0.030734, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.043082, + "t": 0.048662, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.048676, + "t": 0.048676, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 303, + "operation": "write", + "proto": "tcp", + "t0": 0.048747, + "t": 0.048772, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.043076, + "t": 0.048916, + "transaction_id": 7 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.048928, + "t": 0.048928, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.04901, + "t": 0.049017, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:80", + "failure": "eof_error", + "operation": "read", + "proto": "tcp", + "t0": 0.048701, + "t": 0.05165, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.05168, + "t": 0.05168, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.051694, + "t": 0.051694, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": "eof_error", + "operation": "read", + "proto": "tcp", + "t0": 0.049019, + "t": 0.051893, + "transaction_id": 7 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.051897, + "t": 0.051897, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.051918, + "t": 0.051918, + "transaction_id": 7 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000064, + "t": 0.000064, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000097, + "t": 0.000103, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000169, + "t": 0.000193, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "read", + "proto": "udp", + "t0": 0.000118, + "t": 0.0051, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 46, + "operation": "read", + "proto": "udp", + "t0": 0.000209, + "t": 0.005933, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.005957, + "t": 0.005957, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_start", + "t0": 0.030758, + "t": 0.030758, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.030788, + "t": 0.030804, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.030856, + "t": 0.030873, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.030811, + "t": 0.036648, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.030889, + "t": 0.036895, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.036926, + "t": 0.036926, + "transaction_id": 4 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "bit.ly", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000082, + "t": 0.005814, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "bit.ly", + "query_type": "AAAA", + "raw_response": "pXeBAAABAAAAAAAAA2JpdAJseQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000073, + "t": 0.005104, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "bit.ly", + "query_type": "A", + "raw_response": "YHKBAAABAAEAAAAAA2JpdAJseQAAAQABA2JpdAJseQAAAQABAAAOEAAEQ8f4Cw==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000109, + "t": 0.005937, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.030772, + "t": 0.036786, + "tags": [], + "transaction_id": 5 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "6EWBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.030766, + "t": 0.036654, + "tags": [], + "transaction_id": 4 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "sC+BAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.030821, + "t": 0.0369, + "tags": [], + "transaction_id": 4 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:80", + "failure": "eof_error", + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "https://bit.ly/32447" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "https://bit.ly/32447", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "http://www.example.com/" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 0, + "headers_list": [], + "headers": {} + }, + "t0": 0.048676, + "t": 0.05168, + "tags": [], + "transaction_id": 6 + }, + { + "network": "tcp", + "address": "67.199.248.11:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "bit.ly" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "bit.ly", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://bit.ly/32447" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 308, + "headers_list": [ + [ + "Content-Length", + "0" + ], + [ + "Date", + "Mon, 27 Nov 2023 16:09:35 GMT" + ], + [ + "Location", + "http://www.example.com/" + ] + ], + "headers": { + "Content-Length": "0", + "Date": "Mon, 27 Nov 2023 16:09:35 GMT", + "Location": "http://www.example.com/" + } + }, + "t0": 0.025443, + "t": 0.030696, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "67.199.248.11", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.01141, + "t": 0.016268, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.043082, + "t": 0.048662, + "tags": [], + "transaction_id": 6 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.043076, + "t": 0.048916, + "tags": [], + "transaction_id": 7 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDazCCAlOgAwIBAgIUDQG+xF6RAe7SE0ULMzYpJQQKFRcwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTM1WhcNMjMxMTI3MTcwOTM1WjApMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMQ8wDQYDVQQDEwZiaXQubHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDys743mDPeqqhh1tvMIbrmPCOv8+BevCB/y31GQXwrvknHgjeflzLPYvo7j4VxbqPpddQPh7u6vuxq/PP4y+kB+4zViaqbgpnM8jewbbaF3N7BZfBwAc1xkx44bnb2YWlaNgjtWBILoJi5ztaKUafgOPtDKDWrX2MHMOtrImslqWe4GBQJsKlfGXG0h6JbFiysiVPaGcJXfRGgP2oXMaRUBCbTlD/iEhXECQohpImhgJELwioL5UM7Akxr1dgAQw4tubNDCh0tczUG4ZXDs0ngQQchUk8wETAWS85QFKl6h3hLKN4aEbkdIwbufF5AjZN8KRo6GoYgF6LoJIKWHtD1AgMBAAGjgZQwgZEwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFI9Bx+TTIgIfi5eNxJyp7qLfdywwMB8GA1UdIwQYMBaAFHZeboS15Ylu1CDqyI2lpmFsgkBpMBwGA1UdEQQVMBOCBmJpdC5seYIJYml0bHkuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQAOLGKrIOqwnoY6qV7ZOPQ2HzqdyfmO1M5oSt/GOZfwEU0h2J8LGBiHH9ZImq/LE2KIiLyhZ43ArvZ8rvW56J9cKDBEx7pmR0NDnjbQpa54K3Gg1d3izRasqt0PIaqcRcENOlpqcFLJhu6wz9T8L8Wai72yR/EKb9EFMRWE++8J78yQNCPvMMRyFbHRw24/73YMIQ8DVMb/5Zsu2ZjKKALqzytgOijSO8McendHWYyC1XeptsC88UE306/3zsQzKCNH3epjbaESEhriq8Mch/htLUDR/2bD+zv2xboLqWwa/jD/UKYax/VAhjTIQa4Ea0VUiIqZoVkWQ+LR7eNH+K8/", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAKw+LzJL0zOBkqHjJbAGsTKKpxKRMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkzNVoXDTIzMTEyODE2MDkzNVowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9fl+mKOVlvhTw7kKznBqVVKC7Bm5XGZqZm84h0+vBiunkD4x3ywtt8i99b//n282qO69mUt57JhegPOirjT/1IhGgwP40h9biglHvXT4F/V1X2PnX9UW5UmiEa4ixe0HkSmXLPUCwabUwntIG81AOXsRCjYf6uAJK8SmbYMNMpV/9Lf3oZ29GvvIE/PJRYg2j9NNhF2SfdH2bGefhh3e5yXxQfuljN3qAEvP5c/ohUkR1JdxJo2zR2b8ZEG1MnrA3DwEvszD9BXHjnarW+IMvG5IRX6gL3NY54USgZqq8oPJzMlBlW4JsOxIdWVTHZSfaX7Kv3isEHhUmRlslam9/AgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2Xm6EteWJbtQg6siNpaZhbIJAaTAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAF5HbTXbqUD7I1wXVviAO6UAwuKKoBi7MLUwdPU/Gx3bFJEofFWmTmje9uZzg4E2iNBXlyiZ9W9SSQfbklzWLdvFqlp7QGQBOJuF/lm15aciW7WJ9YlGVu4Msqe+ofkachkwOKn2K6fgBTCQFMrmaKsHW7TMoj97EMv+oh0Eei5J8KaCY09R+p5oqBzPR52yQDoYzTrutFaN9t8tWrX8Ay7phtANiPnaiXZDPNcBBwM8pT+zMld0ybGmKn+1izafOxNy0wDKvC2KRa6+oN47ScBK/ihtWPwuSlrUxjgXMw8vz3FX+DDc6AnbwTORBZ4vnqcoXAErE23grvQEK/e1NKA==", + "format": "base64" + } + ], + "server_name": "bit.ly", + "t0": 0.016283, + "t": 0.025424, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "", + "failure": "eof_error", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [], + "server_name": "www.example.com", + "t0": 0.048928, + "t": 0.051897, + "tags": [], + "tls_version": "", + "transaction_id": 7 + } + ], + "x_control_request": { + "http_request": "https://bit.ly/32447", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "67.199.248.11:443", + "67.199.248.11:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "67.199.248.11:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "67.199.248.11:443": { + "server_name": "bit.ly", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "67.199.248.11" + ] + }, + "ip_info": { + "67.199.248.11": { + "asn": 396982, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:67.199.248.11 Flags:3}]", + "t": 0.011367 + }, + { + "msg": "conn 67.199.248.11:443: granted permission: true", + "t": 0.025433 + }, + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.043042 + }, + { + "msg": "conn 93.184.216.34:80: granted permission: true", + "t": 0.048668 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 8, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.53731, + "test_start_time": "2023-11-27 16:09:35", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/observations.json new file mode 100644 index 000000000..eb3b33d46 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTP/observations.json @@ -0,0 +1,228 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "bit.ly", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "4": { + "DNSTransactionIDs": [ + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "67.199.248.11", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "67.199.248.11:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "bit.ly", + "HTTPRequestURL": "https://bit.ly/32447", + "HTTPFailure": "", + "HTTPResponseStatusCode": 308, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Content-Length": true, + "Date": true, + "Location": true + }, + "HTTPResponseLocation": "http://www.example.com/", + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "6": { + "DNSTransactionIDs": [ + 5, + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.com/", + "HTTPFailure": "eof_error", + "HTTPResponseStatusCode": 0, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": {}, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "7": { + "DNSTransactionIDs": [ + 5, + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 7, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "eof_error", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/analysis.json new file mode 100644 index 000000000..b09118c64 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/analysis.json @@ -0,0 +1,18 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": { + "6": true + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/measurement.json new file mode 100644 index 000000000..a399a40f7 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/measurement.json @@ -0,0 +1,700 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://bit.ly/21645", + "measurement_start_time": "2023-11-27 16:09:36", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "67.199.248.11:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.012624, + "t": 0.017708, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.017728, + "t": 0.017728, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 272, + "operation": "write", + "proto": "tcp", + "t0": 0.017818, + "t": 0.017829, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.017832, + "t": 0.025495, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.025593, + "t": 0.025594, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 817, + "operation": "read", + "proto": "tcp", + "t0": 0.025595, + "t": 0.025608, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.026518, + "t": 0.026525, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.026527, + "t": 0.026527, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.026546, + "t": 0.026546, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 301, + "operation": "write", + "proto": "tcp", + "t0": 0.026603, + "t": 0.026635, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 149, + "operation": "read", + "proto": "tcp", + "t0": 0.026589, + "t": 0.032086, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.032115, + "t": 0.032115, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.032142, + "t": 0.032146, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 2414, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.032154, + "t": 0.032154, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.049432, + "t": 0.055144, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.055157, + "t": 0.055157, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.055234, + "t": 0.055242, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": "eof_error", + "operation": "read", + "proto": "tcp", + "t0": 0.055243, + "t": 0.058728, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.058733, + "t": 0.058733, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.058758, + "t": 0.058758, + "transaction_id": 6 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000097, + "t": 0.000097, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000132, + "t": 0.000154, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000136, + "t": 0.000158, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 46, + "operation": "read", + "proto": "udp", + "t0": 0.000163, + "t": 0.005823, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "read", + "proto": "udp", + "t0": 0.000157, + "t": 0.005936, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.005959, + "t": 0.005959, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_start", + "t0": 0.032187, + "t": 0.032187, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.032218, + "t": 0.032252, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.032268, + "t": 0.032283, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.032256, + "t": 0.042648, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.032286, + "t": 0.043007, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.043051, + "t": 0.043051, + "transaction_id": 4 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "bit.ly", + "query_type": "A", + "raw_response": "6l2BAAABAAEAAAAAA2JpdAJseQAAAQABA2JpdAJseQAAAQABAAAOEAAEQ8f4Cw==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000117, + "t": 0.005831, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "bit.ly", + "query_type": "AAAA", + "raw_response": "hLKBAAABAAAAAAAAA2JpdAJseQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.00011, + "t": 0.005939, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "bit.ly", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000062, + "t": 0.006174, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "qamBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.032194, + "t": 0.042654, + "tags": [], + "transaction_id": 4 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "b+aBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.032213, + "t": 0.043012, + "tags": [], + "transaction_id": 4 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.032194, + "t": 0.043137, + "tags": [], + "transaction_id": 5 + } + ], + "requests": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "bit.ly" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "bit.ly", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://bit.ly/21645" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 308, + "headers_list": [ + [ + "Content-Length", + "0" + ], + [ + "Date", + "Mon, 27 Nov 2023 16:09:36 GMT" + ], + [ + "Location", + "https://www.example.com/" + ] + ], + "headers": { + "Content-Length": "0", + "Date": "Mon, 27 Nov 2023 16:09:36 GMT", + "Location": "https://www.example.com/" + } + }, + "t0": 0.026546, + "t": 0.032115, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "67.199.248.11", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.012624, + "t": 0.017708, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.049432, + "t": 0.055144, + "tags": [], + "transaction_id": 6 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDazCCAlOgAwIBAgIUQk1e0YCq20BLoDAhG6owP1+wlmkwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTM2WhcNMjMxMTI3MTcwOTM2WjApMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMQ8wDQYDVQQDEwZiaXQubHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCoY5lDixCUa4GGlR1prwlb2n3y3G7jjQRqqfoSTs3CIgisrGCuGlW2BM8eHfBmm75Bxd702fz5e6ienTCdSI3C0OS7wNbB6rsTa1XgIRQDjilo6g5a6LWGgmP4VI9E0mnWaM0ANcsLb9II/+swiyF8on846Nul3ZJgsX1X0RTQH0wjmlhM4Rn0qAisT97wGuYfoPOEj4QRBuun/rZFMwEl5E7klPkI29ctQ/SMyM+L1A796F0o9fP6faXO+GpN+wRd16i1Yz4KN6GdGvdCAJQMWnX8/7UMrxtQ8+dmyi3nGRC+ylWpIMMSTcgOetsIzz0h3zYsfnIT1yYOqz+c7J3nAgMBAAGjgZQwgZEwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFBw7jqDU5yE3iBBk497ryHvkhdaSMB8GA1UdIwQYMBaAFNdbpXPdazfTjLsb7IzLRN3hEWpbMBwGA1UdEQQVMBOCBmJpdC5seYIJYml0bHkuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQCiEpuwrZpIrlf5qYSkXhvt8BClBH5BkPhFDIIpuMNnXxiZ1gqqdIVrKw5ZvDrYF2b9xH29d/E/tJA2zNUzTLCmkVnaiX4aodo2rsQMZlmnuTGV8tbmw92gykbDoQ8xEXIHD7N5p+DHcpVOqIgLBAi+rQWTDep09U/FHF3VY0ahqCpsJMgkrImIWo1ByUAwUvZn531WjEd2L0pZXJ1iA5kGoPB08s+9Y3aL/cBLMVEAooccqGZ3O043b60QFxE57Z1WAiTS6wlES0zyboPWgc3cqMKbcuQ+3DwFbxIBrpdaJYvFpHrat0s/pW79PNHiGdWmN4gJEApHEX6lGBd3IAwa", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAPJWlHLEkr/oub2MavYt4Am7A8qUMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkzNloXDTIzMTEyODE2MDkzNlowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBOTQEyNCqYbGBFd6KlWii/wQ048F6YpFMaOwsu4NrlZ56VALL7B4fGUXo+MAXEJFDJ7tV0Sf+1XYEv/+pXkFJzGROBEMePz111LB3XJHFrCPzJdxcJvnw9luLivSENZ2fMXiBbtOov9cN5a0x1f7dLUwsa9DDNr+DTfZm+gfE7b1oOCeA4+qF3an+EOHKYJrXbRgUh2sfRgkGrpjIIDmR+tNcEWMl/ZJz+ZQP8Hr4AG/7s4VY8QLVzA2NeFdpMEg1jLd0UY/vX/nwXeFPYKm6av2qt2qX9iORlpQNgbvOPBbM6faNgkmDPgwTmz2QklxlrbovzXejjqm2QhRvEAHlAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTXW6Vz3Ws304y7G+yMy0Td4RFqWzAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEABcxe7vmujpzd5062IFq43bMYkqYCdPJ7qkelP0+H+rdxfay1F661hq02HotSK9pwWL4q3scsevkBEIq+h7d3zWiNkZi7Eic1F220zo5ExVlr4Umza/X4TnSq5OGyrQm5D8+wZBXzbprUbDp8o+oxEvEnuSyvH7MtjwuFYL5agyuXL7d7PRrYyJwcxlAN2Gz5o51jdF5uR+LLkhQdB9ca5xZrqXWodzp+poCxOJ3GnHJ3q41/+l5owphF390BCHilyBlIX5Sd+8c6grDjHEyL2hMOsYASHsYYkP6yH98efOm085bKcdSLNvW03IZB1Z7SFETFo2I64xQy/qjG2dzwSg==", + "format": "base64" + } + ], + "server_name": "bit.ly", + "t0": 0.017728, + "t": 0.026527, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "", + "failure": "eof_error", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [], + "server_name": "www.example.com", + "t0": 0.055157, + "t": 0.058733, + "tags": [], + "tls_version": "", + "transaction_id": 6 + } + ], + "x_control_request": { + "http_request": "https://bit.ly/21645", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "67.199.248.11:443", + "67.199.248.11:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "67.199.248.11:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "67.199.248.11:443": { + "server_name": "bit.ly", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "67.199.248.11" + ] + }, + "ip_info": { + "67.199.248.11": { + "asn": 396982, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:67.199.248.11 Flags:3}]", + "t": 0.012566 + }, + { + "msg": "conn 67.199.248.11:443: granted permission: true", + "t": 0.026536 + }, + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.049397 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 8, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.543462, + "test_start_time": "2023-11-27 16:09:36", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/observations.json new file mode 100644 index 000000000..1308f2bc7 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenEOFForHTTPS/observations.json @@ -0,0 +1,182 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "bit.ly", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "4": { + "DNSTransactionIDs": [ + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "67.199.248.11", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "67.199.248.11:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "bit.ly", + "HTTPRequestURL": "https://bit.ly/21645", + "HTTPFailure": "", + "HTTPResponseStatusCode": 308, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Content-Length": true, + "Date": true, + "Location": true + }, + "HTTPResponseLocation": "https://www.example.com/", + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "6": { + "DNSTransactionIDs": [ + 4, + 5 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "eof_error", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/analysis.json new file mode 100644 index 000000000..68d083096 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/analysis.json @@ -0,0 +1,19 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": { + "4": true, + "5": true + }, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/measurement.json new file mode 100644 index 000000000..193a4f0a7 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/measurement.json @@ -0,0 +1,637 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://bit.ly/21645", + "measurement_start_time": "2023-11-27 16:09:34", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "67.199.248.11:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.0117, + "t": 0.01715, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.017167, + "t": 0.017167, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 272, + "operation": "write", + "proto": "tcp", + "t0": 0.017255, + "t": 0.017263, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.017265, + "t": 0.025053, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 1689, + "operation": "read", + "proto": "tcp", + "t0": 0.025153, + "t": 0.025154, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.026015, + "t": 0.026022, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.026024, + "t": 0.026024, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.026045, + "t": 0.026045, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 301, + "operation": "write", + "proto": "tcp", + "t0": 0.02609, + "t": 0.026119, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 149, + "operation": "read", + "proto": "tcp", + "t0": 0.026081, + "t": 0.03189, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.031937, + "t": 0.031937, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.031965, + "t": 0.031977, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 2414, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.031985, + "t": 0.031985, + "transaction_id": 3 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000297, + "t": 0.000297, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000332, + "t": 0.000351, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000419, + "t": 0.00043, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "read", + "proto": "udp", + "t0": 0.00036, + "t": 0.00729, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 46, + "operation": "read", + "proto": "udp", + "t0": 0.000433, + "t": 0.007652, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.007677, + "t": 0.007677, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_start", + "t0": 0.032011, + "t": 0.032011, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.03204, + "t": 0.032055, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.032067, + "t": 0.03208, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.032084, + "t": 0.036085, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.032064, + "t": 0.036448, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.036458, + "t": 0.036458, + "transaction_id": 4 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "QXCBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.036458, + "t": 0.03849, + "tags": [], + "transaction_id": 4 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "UcOBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.036095, + "t": 0.038728, + "tags": [], + "transaction_id": 4 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "bit.ly", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000229, + "t": 0.007181, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "bit.ly", + "query_type": "AAAA", + "raw_response": "K4uBAAABAAAAAAAAA2JpdAJseQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000307, + "t": 0.007294, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "bit.ly", + "query_type": "A", + "raw_response": "XxCBAAABAAEAAAAAA2JpdAJseQAAAQABA2JpdAJseQAAAQABAAAOEAAEQ8f4Cw==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000401, + "t": 0.007657, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_nxdomain_error", + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "UcOBAwABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB", + "rcode": 3, + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.032046, + "t": 0.03609, + "tags": [], + "transaction_id": 4 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_nxdomain_error", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "QXCBAwABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "rcode": 3, + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.032018, + "t": 0.036452, + "tags": [], + "transaction_id": 4 + }, + { + "answers": null, + "engine": "getaddrinfo", + "failure": "dns_nxdomain_error", + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.032043, + "t": 0.036573, + "tags": [], + "transaction_id": 5 + } + ], + "requests": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "bit.ly" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "bit.ly", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://bit.ly/21645" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 308, + "headers_list": [ + [ + "Content-Length", + "0" + ], + [ + "Date", + "Mon, 27 Nov 2023 16:09:34 GMT" + ], + [ + "Location", + "https://www.example.com/" + ] + ], + "headers": { + "Content-Length": "0", + "Date": "Mon, 27 Nov 2023 16:09:34 GMT", + "Location": "https://www.example.com/" + } + }, + "t0": 0.026045, + "t": 0.031937, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "67.199.248.11", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.0117, + "t": 0.01715, + "tags": [], + "transaction_id": 3 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDazCCAlOgAwIBAgIUZKkq7MfZRYQSXzgHz9BqQ/eOZM4wDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTM0WhcNMjMxMTI3MTcwOTM0WjApMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMQ8wDQYDVQQDEwZiaXQubHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDjfPF9sWHbwobmZnbEOy9UXA0gbr3PvpKlmALETr9fBI3x8fuMNY6m7c0s6kSWsC7PfiTzvTgiok6VFibjNAOXOom1ct80n5I5oXkAJJU+rxF5YOccfObzdyEt6FXdqSIzjfrGoSqONA9Xg2f9hXYYWG938g6a+LYgpRs6zLsac+r6R/T4plut4VDAfPIDlyj5jlpXbxIA9mDOJxmDpucPoOZKhx5lSpCEEqD0SP7Jr9UmbtyWH62NhvRiAQNmepGEWpsx7OAN7OGd65E6IgCfAgY/Dd8KE/yavUMFOpW+cDmZ4HVf2iPWam8SxxAVxwilP/5EAJB0IuzRlhAz8B6NAgMBAAGjgZQwgZEwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOmkhzY7uTXs/kjjmfEz+qcgx/bJMB8GA1UdIwQYMBaAFAkJkg4EI0d8k93B5BL4zDj24Pz4MBwGA1UdEQQVMBOCBmJpdC5seYIJYml0bHkuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQABYU8hOpol4/zbVtPu8RrpRaXB7WSB650dby6ifCTapDZeQ7sq/3JcnlB4fisDqT3koxO3eTEzNeIIWuoxovr6v5NrTY7wJaMM3dzNazGhxASn6ilX+vyl5itnTRMOdEzUORqJyGvve24DBXnQxO4x7ZThU5Sc6bgka1mvkIehj+T/wLBF0VmTfv5Cq3RvrniwetbHZGlzZ9PZggTwLvjtilHbqeh+FJV+wkSf6TqbmJL6rM8rf0u5ToqEs3/YLQ0KjIR4UCZa5/L7ezdRqZh0RFHD/09P1eAC9UZxrzyRZe14zdf+yJJ3i+Pj5AiFpMXCu+U8lrjElbmEmbgYQT9U", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAPm2P522Y36l5UfkBL18mx3kn5lgMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkzNFoXDTIzMTEyODE2MDkzNFowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMF/gpYsS6d6FFJzN5vUWvojLfwT0fP2LURfjd/JSUH40p61Lt6uG42OtmrOBypFL+H3TeV3pedfqu840ejYEo4KwOC1mcGHAqpMoPuxtsUjZsMSEmTn1eO8sAmTrmZIp2tuw8hM90b1EvXMJosdzlHSdixkb+cmhjrsnVQivSgCoIGZ+RQRK7MZPO5VMIOYzjFcpAsGTKp5N1vyn2fP0/I2Q00GIWVwkIIrHycuoGYsQxdwkoA9O2VwcXhVwkNOHoKa7KnMSTEnqm1XADgWyhXBlsqmkBtc7iel+TeWqo992VfWiZYGnHmHWFDBpZBUNtiANNBdX3k77Uur5c/GUxAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQJCZIOBCNHfJPdweQS+Mw49uD8+DAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEANz0PoRoBRxIAKZsyicaUij59HEzQ4x/Pzpf2/dDT8UHdniwmWHye9di9iZI/5LopnyNLuHBTinH+Stnx+jiYxDYYGZ3VqVWMNHX6cT0S7Z/kRCoH+C0uHXXPGkAgUP464gBwGerk3BTzCa98lK/KuHym/gaoJ6HygSXzodI/P64tNmknpu0kZy0XW8+6IrQhVH9/auORVzNCMUu5VdMRLOxKX/VqbpoSEMh4cKrxZ9aWsjEEIZMQeT/E8OA/Dw59JzNyaDjaBp49H0YNis2mGBwJIZOWuoNvttyjzX2FSZfCinPKpt6++8VJm4ZYIUddF4KntL+V+di+1BujL9pGKw==", + "format": "base64" + } + ], + "server_name": "bit.ly", + "t0": 0.017167, + "t": 0.026024, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://bit.ly/21645", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "67.199.248.11:443", + "67.199.248.11:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "67.199.248.11:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "67.199.248.11:443": { + "server_name": "bit.ly", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "67.199.248.11" + ] + }, + "ip_info": { + "67.199.248.11": { + "asn": 396982, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:67.199.248.11 Flags:3}]", + "t": 0.011645 + }, + { + "msg": "conn 67.199.248.11:443: granted permission: true", + "t": 0.026035 + }, + { + "msg": "create with []", + "t": 0.043905 + } + ], + "control_failure": null, + "x_dns_flags": 2, + "dns_experiment_failure": null, + "dns_consistency": "inconsistent", + "http_experiment_failure": null, + "x_blocking_flags": 1, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "dns", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.536868, + "test_start_time": "2023-11-27 16:09:34", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/observations.json new file mode 100644 index 000000000..6b46406f0 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenNXDOMAIN/observations.json @@ -0,0 +1,176 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "bit.ly", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "4": { + "DNSTransactionIDs": [ + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_nxdomain_error", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "5": { + "DNSTransactionIDs": [ + 5 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_nxdomain_error", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "67.199.248.11", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "67.199.248.11:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "bit.ly", + "HTTPRequestURL": "https://bit.ly/21645", + "HTTPFailure": "", + "HTTPResponseStatusCode": 308, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Content-Length": true, + "Date": true, + "Location": true + }, + "HTTPResponseLocation": "https://www.example.com/", + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/analysis.json new file mode 100644 index 000000000..e6958a5f1 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/analysis.json @@ -0,0 +1,21 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": { + "6": true + }, + "TCPTransactionsWithUnexplainedUnexpectedFailures": { + "6": true, + "7": true + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/measurement.json new file mode 100644 index 000000000..eae796c1c --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/measurement.json @@ -0,0 +1,824 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://bit.ly/32447", + "measurement_start_time": "2023-11-27 16:09:37", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "67.199.248.11:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011667, + "t": 0.017853, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.017869, + "t": 0.017869, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 272, + "operation": "write", + "proto": "tcp", + "t0": 0.017962, + "t": 0.01797, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.017972, + "t": 0.025024, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.025112, + "t": 0.025113, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 817, + "operation": "read", + "proto": "tcp", + "t0": 0.025114, + "t": 0.026105, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.026989, + "t": 0.026995, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.026998, + "t": 0.026998, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.027019, + "t": 0.027019, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 301, + "operation": "write", + "proto": "tcp", + "t0": 0.027062, + "t": 0.027095, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 148, + "operation": "read", + "proto": "tcp", + "t0": 0.027059, + "t": 0.03247, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.032502, + "t": 0.032502, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.032524, + "t": 0.03253, + "transaction_id": 3 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 2413, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.032537, + "t": 0.032537, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.044527, + "t": 0.049878, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.049893, + "t": 0.049893, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 303, + "operation": "write", + "proto": "tcp", + "t0": 0.049945, + "t": 0.049968, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.044515, + "t": 0.049984, + "transaction_id": 7 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.049996, + "t": 0.049996, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.050081, + "t": 0.050085, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:80", + "failure": "eof_error", + "operation": "read", + "proto": "tcp", + "t0": 0.04993, + "t": 10.049789, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 10.049797, + "t": 10.049797, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 10.049843, + "t": 10.049843, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": "eof_error", + "operation": "read", + "proto": "tcp", + "t0": 0.050086, + "t": 10.049845, + "transaction_id": 7 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 10.049853, + "t": 10.049853, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 10.049878, + "t": 10.049878, + "transaction_id": 7 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000057, + "t": 0.000057, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000089, + "t": 0.000094, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000134, + "t": 0.000159, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "read", + "proto": "udp", + "t0": 0.000124, + "t": 0.006058, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 46, + "operation": "read", + "proto": "udp", + "t0": 0.000169, + "t": 0.006299, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006331, + "t": 0.006331, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_start", + "t0": 0.032556, + "t": 0.032556, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.032593, + "t": 0.032607, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.032612, + "t": 0.032614, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.032617, + "t": 0.037749, + "transaction_id": 4 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.032624, + "t": 0.03906, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.039077, + "t": 0.039077, + "transaction_id": 4 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "bit.ly", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000067, + "t": 0.005714, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "bit.ly", + "query_type": "AAAA", + "raw_response": "9vqBAAABAAAAAAAAA2JpdAJseQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000066, + "t": 0.006063, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "bit.ly", + "query_type": "A", + "raw_response": "VKuBAAABAAEAAAAAA2JpdAJseQAAAQABA2JpdAJseQAAAQABAAAOEAAEQ8f4Cw==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000115, + "t": 0.006303, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.032572, + "t": 0.038222, + "tags": [], + "transaction_id": 5 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "MASBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.032571, + "t": 0.037756, + "tags": [], + "transaction_id": 4 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "DayBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.032595, + "t": 0.039064, + "tags": [], + "transaction_id": 4 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:80", + "failure": "generic_timeout_error", + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "https://bit.ly/32447" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "https://bit.ly/32447", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "http://www.example.com/" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 0, + "headers_list": [], + "headers": {} + }, + "t0": 0.049893, + "t": 10.049797, + "tags": [], + "transaction_id": 6 + }, + { + "network": "tcp", + "address": "67.199.248.11:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "bit.ly" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "bit.ly", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://bit.ly/32447" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 308, + "headers_list": [ + [ + "Content-Length", + "0" + ], + [ + "Date", + "Mon, 27 Nov 2023 16:09:37 GMT" + ], + [ + "Location", + "http://www.example.com/" + ] + ], + "headers": { + "Content-Length": "0", + "Date": "Mon, 27 Nov 2023 16:09:37 GMT", + "Location": "http://www.example.com/" + } + }, + "t0": 0.027019, + "t": 0.032502, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "67.199.248.11", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011667, + "t": 0.017853, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.044527, + "t": 0.049878, + "tags": [], + "transaction_id": 6 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.044515, + "t": 0.049984, + "tags": [], + "transaction_id": 7 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDazCCAlOgAwIBAgIUcerXMoztse3D0FRQu5CgimyXogIwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTM3WhcNMjMxMTI3MTcwOTM3WjApMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMQ8wDQYDVQQDEwZiaXQubHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDeT6lhVnwFNjW7GDjfwenViUJ30A9IoP9en9FFiBBZE+bzvpFjRnNc079WiaCTawgDJKk4O4vWJNUSv2XsShMwpu/vY+nhUgYdNo2UNa1aD/Um0wAUkH+eoq6VXF/+EEogapob0NmpUNntVbZf0AB2NgNA8k2OAm61zKH9+MOmuBHEIcNC5Loqd4pv4QejSFSB6n676mNVecHQ8uv87KnAIxnQ5fkIbThabjdq6VXFMqgnqzzuTQV5nzORX0OY2n7Z7ZJc7RR4hRZMbhIwb0kjO9Vjz9IyopM6a4OWf/cdWl3yPfMMczIEWpYw3+Gp4Z6RKBjvLwJs0hbRrcW8lmcXAgMBAAGjgZQwgZEwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFArzD3YBCJ89Zs49l8R6QaK+gqBzMB8GA1UdIwQYMBaAFOB97KdXR9+UA3euGd5JpQGAuqUtMBwGA1UdEQQVMBOCBmJpdC5seYIJYml0bHkuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQB12dFQtCHw7DwvvP2HW50V8X6030NtGervN0+w2VRmZ4qUQLlSmjMpXpfzZ8BDberd375D5LUui5JN6X9Q44AFBhL/5msGQMXpmBNRw8cnqXT7SDC03H3gaGbblbqMutYMEW87R/5USLYKqLbc1DUtOO4lv3Rq8AtzxMTF+wFj3BhUcVfijb9hE5/fr4df6LG6l5NsVzvMbrMiBVBNULbFjNkSuUiERey3vpRMz/Xz+Me9xQa9EHz7Ihbyfz3+ADjDFPjs2asOfgK9FieISjUzuQVFnnNYDdVXg4gq8qWlU63KeeH5+sIKsqk3HmLMSqx2aFXR6/sAAXVDdjIeDvTc", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVALN6sFz9p6LziIR3JGFJsw0O6n3wMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDkzN1oXDTIzMTEyODE2MDkzN1owHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4qsAKeAeX1/YcaYAPwII8LWJQ7iX6C8PdoPrYaiOmtXWeKuDSVymcupKfS1MUgHtSNLiVF2WrdotR6eSIzR98nRIGg2MwGBrGHK9OClsHXQKhvhCFCUF+Xd/sHDpN8Pkdg+73/w1IPswl98GShM/WRlhni0NRJRsPqtLS8Vvlst5jeyflUMaq77SHhUjnr3/yiz0hzPT3REG1Ar2VXnPl38BUl1Tgwtds5Q3lTka2OlcE2++3uKKBjWtsyWYvxP9mJoOnrFCLNEOJ+mGrJ/lxIsAFq0X7yatHji+EodnpnLQjdGAdMRZmbpvEbRilqqrl/m9X6GBkFIc4wmgQcD23AgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgfeynV0fflAN3rhneSaUBgLqlLTAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAmw9bFPvLDeufiHkLQbNoya8uXGgNhOxN0CL9k9jIURM29Vvro0Geh6lRgl63ulLPLEhdNhhuje509m4dp5VhorhrFPyNrlWtypeho849JIa6LdoGeRYV1F9C7lT2RUfjxyajKW4RncL3X7WfeLbiHUs1jCfzn+4/6vrpmQW7j535Dr2vGV77Xyd4LN227/8GsX5pU1GFKsJe5yMOJ7VdUQnbQE037Zw4G+i5Ocmz476kq1zoyOHI4Hdp8E/E9Gshhwiy1YxgnL1O9oVrnABdMZxhGDQVUCYHFQ289yhQ/+NTkW4qHWv0SoV+tUqXsSVy4bgh0kYjsk1dhTgDRcENDw==", + "format": "base64" + } + ], + "server_name": "bit.ly", + "t0": 0.017869, + "t": 0.026998, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "", + "failure": "generic_timeout_error", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [], + "server_name": "www.example.com", + "t0": 0.049996, + "t": 10.049853, + "tags": [], + "tls_version": "", + "transaction_id": 7 + } + ], + "x_control_request": { + "http_request": "https://bit.ly/32447", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "67.199.248.11:443", + "67.199.248.11:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "67.199.248.11:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "67.199.248.11:443": { + "server_name": "bit.ly", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "67.199.248.11" + ] + }, + "ip_info": { + "67.199.248.11": { + "asn": 396982, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:67.199.248.11 Flags:3}]", + "t": 0.011607 + }, + { + "msg": "conn 67.199.248.11:443: granted permission: true", + "t": 0.027007 + }, + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.044486 + }, + { + "msg": "conn 93.184.216.34:80: granted permission: true", + "t": 0.049885 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 8, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 10.050348, + "test_start_time": "2023-11-27 16:09:37", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/observations.json new file mode 100644 index 000000000..bc63b8411 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTP/observations.json @@ -0,0 +1,228 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "bit.ly", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "4": { + "DNSTransactionIDs": [ + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "67.199.248.11", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "67.199.248.11:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "bit.ly", + "HTTPRequestURL": "https://bit.ly/32447", + "HTTPFailure": "", + "HTTPResponseStatusCode": 308, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Content-Length": true, + "Date": true, + "Location": true + }, + "HTTPResponseLocation": "http://www.example.com/", + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "6": { + "DNSTransactionIDs": [ + 5, + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.com/", + "HTTPFailure": "generic_timeout_error", + "HTTPResponseStatusCode": 0, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": {}, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "7": { + "DNSTransactionIDs": [ + 5, + 4 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 7, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "generic_timeout_error", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/analysis.json new file mode 100644 index 000000000..829a0e97c --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/analysis.json @@ -0,0 +1,18 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": { + "7": true + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/measurement.json new file mode 100644 index 000000000..eebf5a36a --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/measurement.json @@ -0,0 +1,927 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://bit.ly/21645", + "measurement_start_time": "2023-11-27 16:09:48", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "67.199.248.11:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.033006, + "t": 0.039552, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.039568, + "t": 0.039568, + "transaction_id": 4 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 272, + "operation": "write", + "proto": "tcp", + "t0": 0.039665, + "t": 0.039673, + "transaction_id": 4 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.039675, + "t": 0.047339, + "transaction_id": 4 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.047427, + "t": 0.047428, + "transaction_id": 4 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 816, + "operation": "read", + "proto": "tcp", + "t0": 0.047429, + "t": 0.04758, + "transaction_id": 4 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.048463, + "t": 0.048473, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.048475, + "t": 0.048475, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.048502, + "t": 0.048502, + "transaction_id": 4 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 301, + "operation": "write", + "proto": "tcp", + "t0": 0.048554, + "t": 0.048584, + "transaction_id": 4 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 149, + "operation": "read", + "proto": "tcp", + "t0": 0.048548, + "t": 0.053943, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.053988, + "t": 0.053988, + "transaction_id": 4 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.054017, + "t": 0.054022, + "transaction_id": 4 + }, + { + "address": "67.199.248.11:443", + "failure": null, + "num_bytes": 2413, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.054029, + "t": 0.054029, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.066119, + "t": 0.071115, + "transaction_id": 7 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.071127, + "t": 0.071127, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.071209, + "t": 0.071216, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:443", + "failure": "generic_timeout_error", + "operation": "read", + "proto": "tcp", + "t0": 0.071217, + "t": 10.070991, + "transaction_id": 7 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 10.07101, + "t": 10.07101, + "transaction_id": 7 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 10.071061, + "t": 10.071061, + "transaction_id": 7 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000107, + "t": 0.000107, + "transaction_id": 2 + }, + { + "address": "172.64.41.4:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.005939, + "t": 0.011963, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.011977, + "t": 0.011977, + "transaction_id": 2 + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 292, + "operation": "write", + "proto": "tcp", + "t0": 0.012073, + "t": 0.012081, + "transaction_id": 2 + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.012084, + "t": 0.020354, + "transaction_id": 2 + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 1718, + "operation": "read", + "proto": "tcp", + "t0": 0.020459, + "t": 0.02046, + "transaction_id": 2 + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.021325, + "t": 0.021332, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.021337, + "t": 0.021337, + "transaction_id": 2 + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 397, + "operation": "write", + "proto": "tcp", + "t0": 0.021372, + "t": 0.0214, + "transaction_id": 2 + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 161, + "operation": "read", + "proto": "tcp", + "t0": 0.021381, + "t": 0.026944, + "transaction_id": 2 + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 397, + "operation": "write", + "proto": "tcp", + "t0": 0.026986, + "t": 0.026993, + "transaction_id": 2 + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 183, + "operation": "read", + "proto": "tcp", + "t0": 0.026968, + "t": 0.032825, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.032869, + "t": 0.032869, + "transaction_id": 2 + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.032878, + "t": 0.032916, + "transaction_id": 2 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 13335, + "as_org_name": "Cloudflare Inc", + "answer_type": "A", + "ipv4": "172.64.41.4", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "mozilla.cloudflare-dns.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000169, + "t": 0.005827, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "172.64.41.4", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.005939, + "t": 0.011963, + "tags": [], + "transaction_id": 2 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "172.64.41.4:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDiTCCAnGgAwIBAgIVAJkWNG04T2ds+mLulpWH6cRMf0GUMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MDk0OFoXDTIzMTEyNzE3MDk0OFowPTEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEjMCEGA1UEAxMabW96aWxsYS5jbG91ZGZsYXJlLWRucy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1mVu09aBiBvI/zzwsp85ABpzhocRjEhW8wfO+AGpmeLxTBcCLOXoFE/naFLqx9VTv+3UnhzhjI3gjiHUI1VgJy4s8thPrRz7W277yLAhqV3T6vblCSEamoH1OlYUergf0ySmXSVTV2vvezoERbmX/6ty6354coj4nJtp8KWEcBSNxIrJXsHUQtc+I5GxjeU6ebhXr+SNtlNtXchdTy/Pu/Gcs6Q2ZyySp3zUVSMt7+R8WY7SQQ8lq/h0LRtZFOfZi/5zNxdb8l+APmezRz6896wcyqyPnvyc6afMQZQ9ExfVrfJW5/DgmnrBam36Tr21QL5QAocLmPd5hRG3P5k35AgMBAAGjgZ0wgZowDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCXxKXqGf5A1hZSkQAW7aJCMF00hMB8GA1UdIwQYMBaAFPh8rJWRLsiCABoFG+34mVOrrR43MCUGA1UdEQQeMByCGm1vemlsbGEuY2xvdWRmbGFyZS1kbnMuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQBS7nbPW/g5cabdXu8yfl/gJ/UZXJmhRHCDha9DSG+4ROkYMa8rsbcpCgLY/ye5pNZ1v12NlN44fPEcRrxybHi2VsiqU2R2NsxV1ldKQ4qmnyWxE3b6Fa4+Za2nJLzI9nkjtdRxq4cUyAWt0DGJ9y+FDKE1g/N+npCJoA0QBMWdMH0zBR91r+QSgyvl7DbAnbmObhDfVLb59t/uH9fH5wwZdqxeW9iql4aWnZ9TCdcy156SmLztveYExGiSABux7GOMGoX6umUTwcSkL4GjLQh/paaGxnIYkcDLhNa3lXgCoe34HZH6qEs+DO/GDizs3y2cPthZpRH8wCc9tunBk6q3", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUL+DptxTzZ6vtTe1DoEUB6AGnizEwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTQ3WhcNMjMxMTI4MTYwOTQ3WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKixTjmUMd+YGUGa+BEsCn3FVucWfCEfro39oFZYRetVlFVp0pUGhlxkMAjvOULlSPuHuD+d46m8PRU+ZYmHI9tvzP63Ef+LFSRriRFF8oASzWaceK+q5KsqgXmMoxJAH0tComzNRaGRfuPluMuXXK+I+NIyS2JDWs4T0U6JZ+I9VuIY/rDppK5F6wGFVVQNTM0IBFJ2iM6N5PtCEbYkAIHdeq0bLbx8NZNsapc6E0Qr2Af5MlhYq16i3tcxjc7j81PnAv9Z+Y5d2xth3xGMqLDWqtynAj62GHJdEhlCiEAcDaf0SWRsS6/2Tc7Jg6A9CZYevzEDxJhS5U8DNz1ZSS0CAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPh8rJWRLsiCABoFG+34mVOrrR43MBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQB5GNxEdyQBjAh8r71nKY0nAlAngNo/gyMOhYDn1FqMg4tWLLzoiKWlhfe3A+Z/ueOer+7m+bIcGB0HUFeHVd46lb5064AwgILdUsbqx3pBNaCmj0VCMhYCg8CzS8WdkK99yAfqMZNKUvSg05UOPB0VM0h4zcKDrLtt9RXcu6e19bpqtBfGBqax00pSQlVT7mzhInI3GnFXrobMOYSDokmxLt4GZY7AV+MXVRXXa7beuJ3gS1KaKcTgzlZb73YtdeEPNHxI+QwX2keTvHvJIm3IaCUTiD1ZqUaRnorTQ5YUDrpmm3wTtPqvo1Xy0zLqudbMHcHXxFmpOBZEFUUkYUMz", + "format": "base64" + } + ], + "server_name": "mozilla.cloudflare-dns.com", + "t0": 0.011977, + "t": 0.021337, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 2 + } + ] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000085, + "t": 0.000085, + "transaction_id": 3 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000163, + "t": 0.000181, + "transaction_id": 3 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "udp", + "t0": 0.000208, + "t": 0.000226, + "transaction_id": 3 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 46, + "operation": "read", + "proto": "udp", + "t0": 0.000186, + "t": 0.005467, + "transaction_id": 3 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 24, + "operation": "read", + "proto": "udp", + "t0": 0.000231, + "t": 0.006062, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006081, + "t": 0.006081, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "resolve_start", + "t0": 0.054063, + "t": 0.054063, + "transaction_id": 6 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.054096, + "t": 0.054114, + "transaction_id": 6 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.054112, + "t": 0.054116, + "transaction_id": 6 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.05414, + "t": 0.059939, + "transaction_id": 6 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.054145, + "t": 0.06089, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.060912, + "t": 0.060912, + "transaction_id": 6 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "bit.ly", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000067, + "t": 0.00535, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "bit.ly", + "query_type": "A", + "raw_response": "XJyBAAABAAEAAAAAA2JpdAJseQAAAQABA2JpdAJseQAAAQABAAAOEAAEQ8f4Cw==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000144, + "t": 0.005472, + "tags": [], + "transaction_id": 3 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "bit.ly", + "query_type": "AAAA", + "raw_response": "AVqBAAABAAAAAAAAA2JpdAJseQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000094, + "t": 0.006067, + "tags": [], + "transaction_id": 3 + }, + { + "answers": null, + "engine": "doh", + "failure": "dns_no_answer", + "hostname": "bit.ly", + "query_type": "AAAA", + "raw_response": "yn2BAAABAAAAAAAAA2JpdAJseQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://mozilla.cloudflare-dns.com/dns-query", + "t0": 0.000114, + "t": 0.026971, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 396982, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "67.199.248.11", + "ttl": null + } + ], + "engine": "doh", + "failure": null, + "hostname": "bit.ly", + "query_type": "A", + "raw_response": "AnaBAAABAAEAAAAAA2JpdAJseQAAAQABA2JpdAJseQAAAQABAAAOEAAEQ8f4Cw==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://mozilla.cloudflare-dns.com/dns-query", + "t0": 0.000181, + "t": 0.032847, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.054039, + "t": 0.059459, + "tags": [], + "transaction_id": 5 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "1F2BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.05407, + "t": 0.059945, + "tags": [], + "transaction_id": 6 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "dQWBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.054075, + "t": 0.060894, + "tags": [], + "transaction_id": 6 + } + ], + "requests": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "bit.ly" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "bit.ly", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://bit.ly/21645" + }, + "response": { + "body": "", + "body_is_truncated": false, + "code": 308, + "headers_list": [ + [ + "Content-Length", + "0" + ], + [ + "Date", + "Mon, 27 Nov 2023 16:09:48 GMT" + ], + [ + "Location", + "https://www.example.com/" + ] + ], + "headers": { + "Content-Length": "0", + "Date": "Mon, 27 Nov 2023 16:09:48 GMT", + "Location": "https://www.example.com/" + } + }, + "t0": 0.048502, + "t": 0.053988, + "tags": [], + "transaction_id": 4 + } + ], + "tcp_connect": [ + { + "ip": "67.199.248.11", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.033006, + "t": 0.039552, + "tags": [], + "transaction_id": 4 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.066119, + "t": 0.071115, + "tags": [], + "transaction_id": 7 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "67.199.248.11:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDazCCAlOgAwIBAgIUXN4xkuYdSmh8JDENFYuy+ff3dH8wDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTQ4WhcNMjMxMTI3MTcwOTQ4WjApMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMQ8wDQYDVQQDEwZiaXQubHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1mVu09aBiBvI/zzwsp85ABpzhocRjEhW8wfO+AGpmeLxTBcCLOXoFE/naFLqx9VTv+3UnhzhjI3gjiHUI1VgJy4s8thPrRz7W277yLAhqV3T6vblCSEamoH1OlYUergf0ySmXSVTV2vvezoERbmX/6ty6354coj4nJtp8KWEcBSNxIrJXsHUQtc+I5GxjeU6ebhXr+SNtlNtXchdTy/Pu/Gcs6Q2ZyySp3zUVSMt7+R8WY7SQQ8lq/h0LRtZFOfZi/5zNxdb8l+APmezRz6896wcyqyPnvyc6afMQZQ9ExfVrfJW5/DgmnrBam36Tr21QL5QAocLmPd5hRG3P5k35AgMBAAGjgZQwgZEwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCXxKXqGf5A1hZSkQAW7aJCMF00hMB8GA1UdIwQYMBaAFPh8rJWRLsiCABoFG+34mVOrrR43MBwGA1UdEQQVMBOCBmJpdC5seYIJYml0bHkuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQB21QX5/MTdAp6fkjDKKVbClGDci+ZQWtQIQjtN3o9bk10GnBASKbH62bbo2vNlmrer7QvZ2B8BFu1KYuYHY2S46SoQirROsVINWaLHbJYRDvRlLHYxKTcH4sX1gs9bIawDUmruMhO7NVrBvYf8p89HUrz2Ak03N+wUUC4JKUZak+7ufwYqbO2rR7MNcs0IH+BefbQ89O0p+wgvGxFAqnAwXD/YONNM8AXg6av1BSX5crLiUkdl9EbB7PXfv+LuxLSmcCekD3ccnbIqcL0js6eK+ZOn30csokSmJ/PrPbTDxaJLLH1JkLUnT7ND9j12HpngpjqviM/qi9RxFZ9IBfEx", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUL+DptxTzZ6vtTe1DoEUB6AGnizEwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTQ3WhcNMjMxMTI4MTYwOTQ3WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKixTjmUMd+YGUGa+BEsCn3FVucWfCEfro39oFZYRetVlFVp0pUGhlxkMAjvOULlSPuHuD+d46m8PRU+ZYmHI9tvzP63Ef+LFSRriRFF8oASzWaceK+q5KsqgXmMoxJAH0tComzNRaGRfuPluMuXXK+I+NIyS2JDWs4T0U6JZ+I9VuIY/rDppK5F6wGFVVQNTM0IBFJ2iM6N5PtCEbYkAIHdeq0bLbx8NZNsapc6E0Qr2Af5MlhYq16i3tcxjc7j81PnAv9Z+Y5d2xth3xGMqLDWqtynAj62GHJdEhlCiEAcDaf0SWRsS6/2Tc7Jg6A9CZYevzEDxJhS5U8DNz1ZSS0CAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPh8rJWRLsiCABoFG+34mVOrrR43MBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQB5GNxEdyQBjAh8r71nKY0nAlAngNo/gyMOhYDn1FqMg4tWLLzoiKWlhfe3A+Z/ueOer+7m+bIcGB0HUFeHVd46lb5064AwgILdUsbqx3pBNaCmj0VCMhYCg8CzS8WdkK99yAfqMZNKUvSg05UOPB0VM0h4zcKDrLtt9RXcu6e19bpqtBfGBqax00pSQlVT7mzhInI3GnFXrobMOYSDokmxLt4GZY7AV+MXVRXXa7beuJ3gS1KaKcTgzlZb73YtdeEPNHxI+QwX2keTvHvJIm3IaCUTiD1ZqUaRnorTQ5YUDrpmm3wTtPqvo1Xy0zLqudbMHcHXxFmpOBZEFUUkYUMz", + "format": "base64" + } + ], + "server_name": "bit.ly", + "t0": 0.039568, + "t": 0.048475, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 4 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "", + "failure": "generic_timeout_error", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [], + "server_name": "www.example.com", + "t0": 0.071127, + "t": 10.07101, + "tags": [], + "tls_version": "", + "transaction_id": 7 + } + ], + "x_control_request": { + "http_request": "https://bit.ly/21645", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "67.199.248.11:443", + "67.199.248.11:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "67.199.248.11:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "67.199.248.11:443": { + "server_name": "bit.ly", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "67.199.248.11" + ] + }, + "ip_info": { + "67.199.248.11": { + "asn": 396982, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:67.199.248.11 Flags:7}]", + "t": 0.032954 + }, + { + "msg": "conn 67.199.248.11:443: granted permission: true", + "t": 0.048486 + }, + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.066091 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 8, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 10.071391, + "test_start_time": "2023-11-27 16:09:48", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/observations.json new file mode 100644 index 000000000..5c184bd2a --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/redirectWithConsistentDNSAndThenTimeoutForHTTPS/observations.json @@ -0,0 +1,223 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "bit.ly", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "3": { + "DNSTransactionIDs": [ + 3 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "bit.ly", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "6": { + "DNSTransactionIDs": [ + 6 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "4": { + "DNSTransactionIDs": [ + 1, + 3, + 2 + ], + "DNSDomain": "bit.ly", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "67.199.248.11", + "IPAddressASN": 396982, + "IPAddressOrg": "Google LLC", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "67.199.248.11:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "bit.ly", + "HTTPRequestURL": "https://bit.ly/21645", + "HTTPFailure": "", + "HTTPResponseStatusCode": 308, + "HTTPResponseBodyLength": 0, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Content-Length": true, + "Date": true, + "Location": true + }, + "HTTPResponseLocation": "https://www.example.com/", + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": false, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "7": { + "DNSTransactionIDs": [ + 5, + 6 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 7, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "generic_timeout_error", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/analysis.json new file mode 100644 index 000000000..9b9b50f27 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/analysis.json @@ -0,0 +1,21 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 1, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": {}, + "HTTPDiffUncommonHeadersIntersection": { + "alt-svc": true, + "content-length": true + }, + "HTTPFinalResponses": { + "3": true + }, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/measurement.json new file mode 100644 index 000000000..98405c103 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/measurement.json @@ -0,0 +1,543 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://www.example.com/", + "measurement_start_time": "2023-11-27 16:09:58", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.010315, + "t": 0.015533, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.015557, + "t": 0.015557, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 283, + "operation": "write", + "proto": "tcp", + "t0": 0.01561, + "t": 0.015644, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.010333, + "t": 0.015875, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.015889, + "t": 0.015889, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.015982, + "t": 0.015987, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 1671, + "operation": "read", + "proto": "tcp", + "t0": 0.015602, + "t": 0.021269, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.021312, + "t": 0.021312, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 1671, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.021343, + "t": 0.021343, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.015989, + "t": 0.023309, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.023409, + "t": 0.02341, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 866, + "operation": "read", + "proto": "tcp", + "t0": 0.023411, + "t": 0.023665, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.024569, + "t": 0.024577, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.024579, + "t": 0.024579, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.024597, + "t": 0.024604, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2314, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.02461, + "t": 0.02461, + "transaction_id": 4 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000084, + "t": 0.000084, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000118, + "t": 0.000123, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000173, + "t": 0.000193, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000128, + "t": 0.005545, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000196, + "t": 0.006385, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006413, + "t": 0.006413, + "transaction_id": 2 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000064, + "t": 0.00591, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "KvKBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000091, + "t": 0.005552, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "Po6BAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000115, + "t": 0.006389, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:80", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "http://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.015557, + "t": 0.021312, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.010315, + "t": 0.015533, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.010333, + "t": 0.015875, + "tags": [], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnTCCAoWgAwIBAgIUJCKMw8A7J0DEYNZA25SIQTyM6iYwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI3MTUwOTU4WhcNMjMxMTI3MTcwOTU4WjAyMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5aByLFtfP/FVuxpwhiN9zOOjD8vw3i/41FOpvpbGy8LcCIhnCkqizCXn6tUAfzGH4NgbIcEvtIAO5E0KBWSJpErRIJF4i0YOElIEdpNfHQNi7y/G2CtO+pE2ArIZU234ZWby3ItAVhpXaQqJ7vrqIWGbnsYaNk2CAfcyZZn4Lqq9ASZWio2NbciSBkPfW31rwOf0uZX13nbcr9h9Wfk2vFeWuMjbgJ/83Ucp4qkxAlIlFj2yQUOAxb6zBJ8PF85Ebnzm5YdVOYq7U0U3lydKSrHLvNETX1SQKlnD+/cmwRg7MF7IPgdoStuJWkR2vlOL+PFg88deg02agyJVZhQdhAgMBAAGjgb0wgbowDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFKfMriCP2y2FYXNUllBCN+MUaK2gMB8GA1UdIwQYMBaAFPPo3Rlf7D2jZuBduu3zE2Gut1cMMEUGA1UdEQQ+MDyCD3d3dy5leGFtcGxlLmNvbYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLm9yZ4ILZXhhbXBsZS5vcmcwDQYJKoZIhvcNAQELBQADggEBAFwtUfFlbI6aKpL3zp1JFXMq0atFJ3bnUo1Lgy26SY4sgNi14IrUyhyNp84nzj8BpLJIs7Xxpas/k+/AHj7lxlA26Qq6sMNC/n0RF0FRAJBO0NxSdng5+KRYV0+8fv3nvJwFOxcEnP6ghUkmLCCJ0JPfeGfROUNQ8rV5rQN71judFX9YBfCyrUFP7sCrQMw+VODm1GigMXiauBoDQexVLtWJZHeRtEMbgn9viFv8J5gWRX9t8t5IuL2VuiC/pjao5bl/X+Y+LMmn9m1BKJd4AhSD5l/mOnkXvNFRsM9CPQgXgQelHqIKfXICm8f+Um6UrU+jlQjXCquJlQcoYt1Wyh8=", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUXJ+QmD68MYvOVE1ebF2Y2XiEyRgwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjMxMTI2MTYwOTU4WhcNMjMxMTI4MTYwOTU4WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMuv/plF/W/TKt46Vva1lRDIDrVRKD88ZDbMxLKaDdjr9ioRlI2PQKV/y8X7FpyQdLDuV43wgTMg4Vryx1fY+iHroRBKwdOQOjyFLGxgkZPrwGbT6Z66C8iBealdeFTQsLEWm9eVM1WA8gMZd3Evu2rVh8sU3tG1aXIYWveQGCMCVzKkEqzDPvKXVwDGUNtgr48S1NO3RybPN3EhwBbiqwPBgavdAYHIVk2xH1AYks6LhgXCkRnSGDnRd20I3vXk7uoYW5p7cf5sHWKDpgJ6Aq2XqSxfXBemzVmPqEAKI8Q41Z5V9DYGfmyqIy3rA39cW7FJkec5EDGvPiyVoSUiK6UCAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPPo3Rlf7D2jZuBduu3zE2Gut1cMMBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQCECmSpB5kUQTt6GI9nAsEGBh5bRFMwf+aaQjKkU/UEbyHuFLXu+BjNOxq+z353u5ox0sWSQH/vWeHQahA6M/sY8XwEMdNQz+W10I4lvkSRsBt62fiwoHqRhoeFG8oVHr8q2VMTqw/oY795PDet/0FsvTA/qsBcS7UhmW1YDrgHJOL0ulrVvJR4FDW0T6M4kG3dvTBlYos63MChlLXp5oQJNeAIsq3YafvnOOW5we28ZrHxRH6tUa95kUZbAcBWJRNQt1LXQuGbG9IJP6PimzmNJ0Kl6h8QThKrBsTveCtCohRPTez/ZR4At1P794vBHWj6tZrOEfdktsfDq4PpLLUb", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.015889, + "t": 0.024579, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 4 + } + ], + "x_control_request": { + "http_request": "http://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "93.184.216.34:443", + "93.184.216.34:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "93.184.216.34:443": { + "status": true, + "failure": null + }, + "93.184.216.34:80": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "93.184.216.34": { + "asn": 15133, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.01026 + }, + { + "msg": "conn 93.184.216.34:80: granted permission: true", + "t": 0.015549 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 32, + "x_null_null_flags": 0, + "body_length_match": true, + "headers_match": true, + "status_code_match": true, + "title_match": true, + "blocking": false, + "accessible": true + }, + "test_name": "web_connectivity", + "test_runtime": 0.506753, + "test_start_time": "2023-11-27 16:09:58", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/observations.json new file mode 100644 index 000000000..6eb8c2de9 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTP/observations.json @@ -0,0 +1,143 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "4": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/analysis.json new file mode 100644 index 000000000..e53951b95 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/analysis.json @@ -0,0 +1,23 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 1, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": {}, + "HTTPDiffUncommonHeadersIntersection": { + "alt-svc": true, + "content-length": true + }, + "HTTPFinalResponses": { + "3": true + }, + "HTTPFinalResponsesWithTLS": { + "3": true + }, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/measurement.json new file mode 100644 index 000000000..911bd32f8 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/measurement.json @@ -0,0 +1,499 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.com/", + "measurement_start_time": "2023-11-27 16:09:59", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.010807, + "t": 0.016276, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.016292, + "t": 0.016292, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.016384, + "t": 0.016394, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.016396, + "t": 0.024539, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 1740, + "operation": "read", + "proto": "tcp", + "t0": 0.024637, + "t": 0.024638, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.025539, + "t": 0.025546, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.025548, + "t": 0.025548, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.025566, + "t": 0.025566, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 305, + "operation": "write", + "proto": "tcp", + "t0": 0.025608, + "t": 0.025642, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 1715, + "operation": "read", + "proto": "tcp", + "t0": 0.025648, + "t": 0.03186, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.031903, + "t": 0.031903, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.031919, + "t": 0.031925, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 4031, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.031937, + "t": 0.031937, + "transaction_id": 3 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000061, + "t": 0.000061, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000121, + "t": 0.000125, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000097, + "t": 0.000156, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000164, + "t": 0.00569, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.00013, + "t": 0.005927, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.005963, + "t": 0.005963, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "PKGBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000071, + "t": 0.005695, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "RzGBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000103, + "t": 0.005933, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000111, + "t": 0.006054, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.025566, + "t": 0.031903, + "tags": [], + "transaction_id": 3 + } + ], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.010807, + "t": 0.016276, + "tags": [], + "transaction_id": 3 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnjCCAoagAwIBAgIVAIoJ9jbFJ8P2Y+3L3+cI+sIiudGuMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MDk1OVoXDTIzMTEyNzE3MDk1OVowMjEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs4C80O8RS5X+Wkwq+gT4R4oufFitZn5Hme2Tfn85jIM9eNPz8hdqTmCiBjXGeF01Fr7bVMubD3Tgh5MbL7VbCNXmCMWsFxZID5CVOI+F8GxrI4mwdtRQF18S2S9JE1qqbeFnn0wFKv2uujHj9p44z4fdddnzo8o6VO2TPCbFYQcIXFOyUY7cxXv+N7dHSu8Js5HF8CAiG1JRco025tqBm6OwteeT/ob6pZh3mqWDJ632vOECbYaI/O0coD/hrOf1yDaXGY5eLXOcQf4MFF/4D6nm+9YqFSKp1X6woM6KPPgTTZaEtKmcBbRDPqL1AI5pFWEgkqjnj1L134lHRkzuowIDAQABo4G9MIG6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQyoPYyRsjJshxBuhjtNzghVCeGtTAfBgNVHSMEGDAWgBRAeaRAYTx0/Kib7A6vYIg8arw2pjBFBgNVHREEPjA8gg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQAK9ekRhjL2dB4nTO3ErjbaAOAAZUJXVudRFKGoFxxMQnMETSzaJod4zRZqWQNfNHC4LY1Yv6gqNkvO6AlUf4jL4qI6dsLnQQe4BVlR0/wtz7r7rPTkEmtgJS1LctV3GyhhtOh8qoU5mA9o4pE8DaIMAVQVhmfj6LUccrnkLwMyuZfY1I24Rp+mMWSm91t+sWosyb7+RNVxwRY3P3ON+2ILuCtinyuDnhf4VO+KRRxs6/pF6UsvXAvq6urKJO9iOIqM3AYaSgASrjyM/xUGB3OJS4JR96Y5viHF7DxfnMtJ9clK1rTMjbkDwVY6ORMioSD5uHRGO6xyl4yjk8TNTcsY", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAKRagY7H4SLjC/59lH55/Lg4pTbVMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MDk1OVoXDTIzMTEyODE2MDk1OVowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbQSWApGoUWAUY10RDWFv0FH4wCf/IkcPJ/HQWZxHYI3h2EksZ1BJygdr73nsnH71lu1Biimqkkoafufj7/XUSCJ2Vc+7LbG8FO/Y0zzdHcY3kB8R+CKj3AhhixZdVKgchid+x+LbLJKgo02nnfjg9+YnjahMwPoyEE0C3At8GsH6OT/3LnjjJ1bQEUpfjTKuEDubrtScvKVDqn7ePsXcm0k/WaWxnDaQcZsyhkatP0QAPDZoHap36nlDp8ULlfdEccO0Y0j9LY121zaDPs6/fy1ykJ2oyYr9nqdYMAoss6I8T2ESatbpfGpeebsHhjmHWWGJcXxIjfbj2YfFU3asLAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRAeaRAYTx0/Kib7A6vYIg8arw2pjAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAUOOkp7jclC18dmev9e0uBJpV/NsxQmKJn2KFkCjdu2O7Ua+Y4xFjd3YaY3N8S7xWgyknR7yeC/wscZT9vc9lsAV3jlr+dXbmz+NXYg21cnv/D0mC02ojjj3urQBpQg9RIi+ASdSkvj3jHbn3NJH+kxYBSwBUZGjw8Fqh0+Tow69TP/Xf6J5/GoWTjw6qtzsnYDWAfiA3Q7SMYXlmpggjRwuJzww4XoLwsDEZKn2guBZR1u8VSJYff/UrdIlFFaS8PQEpOaKlYt293X+dH3qTTJAOGBu+ndUtBhCLmJ4jyNDPsO60E+NVwMdRg8QypVvufJkvbAMNIhxLuwSvVVUB+w==", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.016292, + "t": 0.025548, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "93.184.216.34:443", + "93.184.216.34:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "93.184.216.34:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "93.184.216.34": { + "asn": 15133, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.010756 + }, + { + "msg": "conn 93.184.216.34:443: granted permission: true", + "t": 0.025557 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 32, + "x_null_null_flags": 0, + "body_length_match": true, + "headers_match": true, + "status_code_match": true, + "title_match": true, + "blocking": false, + "accessible": true + }, + "test_name": "web_connectivity", + "test_runtime": 0.506299, + "test_start_time": "2023-11-27 16:09:59", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/observations.json new file mode 100644 index 000000000..fa86ac397 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/successWithHTTPS/observations.json @@ -0,0 +1,97 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": "https://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/analysis.json new file mode 100644 index 000000000..c792580bd --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/analysis.json @@ -0,0 +1,18 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": { + "3": true + }, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/measurement.json new file mode 100644 index 000000000..d4459bb83 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/measurement.json @@ -0,0 +1,281 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.com/", + "measurement_start_time": "2023-11-27 16:10:00", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "93.184.216.34:443", + "failure": "generic_timeout_error", + "operation": "connect", + "proto": "tcp", + "t0": 0.011348, + "t": 1.011431, + "transaction_id": 3 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000099, + "t": 0.000099, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.00013, + "t": 0.000135, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000214, + "t": 0.000234, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000259, + "t": 0.005741, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.00017, + "t": 0.005856, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.005881, + "t": 0.005881, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "Hr6BAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000189, + "t": 0.005748, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "bCGBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000105, + "t": 0.005864, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000062, + "t": 0.005982, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": "generic_timeout_error", + "success": false + }, + "t0": 0.011348, + "t": 1.011431, + "tags": [], + "transaction_id": 3 + } + ], + "tls_handshakes": [], + "x_control_request": { + "http_request": "https://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "93.184.216.34:443", + "93.184.216.34:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "93.184.216.34:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "93.184.216.34": { + "asn": 15133, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.01129 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 2, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "tcp_ip", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 1.011657, + "test_start_time": "2023-11-27 16:10:00", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/observations.json new file mode 100644 index 000000000..c15bc74de --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectTimeout/observations.json @@ -0,0 +1,92 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "generic_timeout_error", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/analysis.json new file mode 100644 index 000000000..eb540a9de --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/analysis.json @@ -0,0 +1,23 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 1, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": {}, + "HTTPDiffUncommonHeadersIntersection": { + "alt-svc": true, + "content-length": true + }, + "HTTPFinalResponses": { + "5": true + }, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": { + "3": true + }, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/measurement.json new file mode 100644 index 000000000..cd3d7911e --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/measurement.json @@ -0,0 +1,626 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://www.example.org/", + "measurement_start_time": "2023-11-27 16:10:01", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "83.224.65.41:80", + "failure": "connection_refused", + "operation": "connect", + "proto": "tcp", + "t0": 0.010981, + "t": 0.014492, + "transaction_id": 3 + }, + { + "address": "83.224.65.41:443", + "failure": "connection_refused", + "operation": "connect", + "proto": "tcp", + "t0": 0.010971, + "t": 0.016159, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.054179, + "t": 0.059484, + "transaction_id": 5 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.054172, + "t": 0.059605, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.059617, + "t": 0.059617, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.059704, + "t": 0.05971, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.059712, + "t": 0.06727, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 1740, + "operation": "read", + "proto": "tcp", + "t0": 0.067352, + "t": 0.067353, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.068187, + "t": 0.068194, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.068197, + "t": 0.068197, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.068211, + "t": 0.068217, + "transaction_id": 6 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2316, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.068222, + "t": 0.068222, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.559511, + "t": 0.559511, + "transaction_id": 5 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 283, + "operation": "write", + "proto": "tcp", + "t0": 0.559589, + "t": 0.559628, + "transaction_id": 5 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 1671, + "operation": "read", + "proto": "tcp", + "t0": 0.559573, + "t": 0.565146, + "transaction_id": 5 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.56521, + "t": 0.56521, + "transaction_id": 5 + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 1671, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.565239, + "t": 0.565239, + "transaction_id": 5 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000072, + "t": 0.000072, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000118, + "t": 0.000146, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000147, + "t": 0.000152, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000157, + "t": 0.003803, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.00015, + "t": 0.004033, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.00406, + "t": 0.00406, + "transaction_id": 2 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.org", + "query_type": "AAAA", + "raw_response": "evqBAAABAAAAAAAAA3d3dwdleGFtcGxlA29yZwAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.003816, + "t": 0.005586, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.org", + "query_type": "A", + "raw_response": "AoCBAAABAAEAAAAAA3d3dwdleGFtcGxlA29yZwAAAQABA3d3dwdleGFtcGxlA29yZwAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.004046, + "t": 0.005954, + "tags": [], + "transaction_id": 2 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 30722, + "as_org_name": "Vodafone Italia S.p.A.", + "answer_type": "A", + "ipv4": "83.224.65.41", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.org", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000066, + "t": 0.003924, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.org", + "query_type": "AAAA", + "raw_response": "evqBAAABAAAAAAAAA3d3dwdleGFtcGxlA29yZwAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000119, + "t": 0.003807, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 30722, + "as_org_name": "Vodafone Italia S.p.A.", + "answer_type": "A", + "ipv4": "83.224.65.41", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.org", + "query_type": "A", + "raw_response": "AoCBAAABAAEAAAAAA3d3dwdleGFtcGxlA29yZwAAAQABA3d3dwdleGFtcGxlA29yZwAAAQABAAAOEAAEU+BBKQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000091, + "t": 0.004037, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:80", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.example.org" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.example.org", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "http://www.example.org/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.559511, + "t": 0.56521, + "tags": [], + "transaction_id": 5 + } + ], + "tcp_connect": [ + { + "ip": "83.224.65.41", + "port": 80, + "status": { + "failure": "connection_refused", + "success": false + }, + "t0": 0.010981, + "t": 0.014492, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "83.224.65.41", + "port": 443, + "status": { + "failure": "connection_refused", + "success": false + }, + "t0": 0.010971, + "t": 0.016159, + "tags": [], + "transaction_id": 4 + }, + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.054179, + "t": 0.059484, + "tags": [], + "transaction_id": 5 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.054172, + "t": 0.059605, + "tags": [], + "transaction_id": 6 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnjCCAoagAwIBAgIVAJ3kBKho02jxODN/+Qj0hz+5pHd2MA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNzE1MTAwMVoXDTIzMTEyNzE3MTAwMVowMjEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxjUHtmLNe/fLU7ZNwFY2eUF5VVxnGBphsrgy0uhP/HNR+vqm/ir+1p6aSBkzDUws6rUKaKwLJbvcYnJgfflHoCKIz6EWEoR8x8WXHFoQTcEtON6+5JcFC57qL+ywzDaLcL4UhJr4fB7eEfTgvx8PLxRjTdBkP7UUThgSQytZ4TWFdPmNZQsezRXT2a9fbW1pC0JBfJD+lXxxLto5szJfDYjfsaXLRUsMeDrwu3kvRc2cWS6surCDx9FikDU5kgXyf6qrxbsGEO8/2iYnY5n9DL86m5FfB1r1s1P4QCqhM7hOo1OtYCmNoR83Qwj4niIdtyvtiVyK87x8ViZjXSqT+QIDAQABo4G9MIG6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQ+xZkDPNidlkkn/AJjjHa0h10BcTAfBgNVHSMEGDAWgBTeZ12Jl+tz79WvQpXFQ4aKBZPwNDBFBgNVHREEPjA8gg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQBKYkddd+kgekggrVOdleB615RULc4OnYMNBofKDtx7yGWSqfgW4ZU5G25J3bq0FJlhImHE0HjFUtsyvLRbqVxvChXuGUgEY7iYsnzg2MncNMoBf/L9zzzmXxc20WUi3yKL9r/I4aWdpd4RCc53/0reHWCfTGT1Za847LvVfHr5jqCi8sqQh2oaN3MniD6fOrgq29LydMAETbDN0AChRca/tFx8eLsY5d8zKJHZqzR8XFt+2KaTy7nplDW9UM49+PMMJM7oGG6uLclQgbaN1P8gmZhlKBoZY4nBXkuEK9Rv3UVlv4BRdUBU8hHu3B/ymb1/yydWYUd/oofuzANXec08", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVANbpZi66UNAH0vG3r5dE9LCkSNTlMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTIzMTEyNjE2MTAwMVoXDTIzMTEyODE2MTAwMVowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCr3N9dl/xzgJ2gv5kNB0tMjALp2zDX1QYtNOKtGCQfzNKJiKqrqcsItPBSqf+MvzhvPMoehbC8Q6U4ivSZZAz3lvxxtwm+Hnfh0Jm4OodS4vxxl2otDGUcxI5Z5/MEpJ/tepKbMRz1RsRym/AiN3utf2W4cFj1MScMEqIpXGaiDarHC1a6r1gUngb7YztkLaFDKLR4/UBBlXMRanpblcXFkix5SXKQjD+CRLIoXVF3lvcJys8CZBlNocle2Wfm2oypKE9zg27cmxL8AT7GeeHlEhlhcUOpL2EvsY8uFP75kcSmyaBbHFFurJDpA7i2YlTMRjY2VQN2mwGbWZAnTpN7AgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTeZ12Jl+tz79WvQpXFQ4aKBZPwNDAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAa6ZJpwaUObl0EA/3VbUHfd+dMifUGa8rWMfILDp51S9R/QnY9OsA8KTR5aoB1fQUnRXicQu+w84QNsflTbD6SW5S+ivbFWCLaGPMyV7R43CAN4vEITWqImw1WXdQgSfjm9agwUNhRlPOpbCQbVzjncNLyO+FdPSe0KxPHr7hJSAZ5R6ml4NENf9Vae+ORaao+dPLXlXdPOXRqOLqKnd4DhivYf1Bfm7X+dwtsB+1LHQkt+/ObNGJrob4BudwpGFCRNOiztIn7VCJAvR2Yx48aOIiwJo8NzUMdOcc7Dw5jwoXYarcb6fkH5MPt5ygLns4Jav5NKfQg9bQ3a9PvCzoWg==", + "format": "base64" + } + ], + "server_name": "www.example.org", + "t0": 0.059617, + "t": 0.068197, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 6 + } + ], + "x_control_request": { + "http_request": "http://www.example.org/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "83.224.65.41:443", + "83.224.65.41:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "83.224.65.41:443": { + "status": false, + "failure": "connection_refused_error" + }, + "83.224.65.41:80": { + "status": true, + "failure": null + }, + "93.184.216.34:443": { + "status": true, + "failure": null + }, + "93.184.216.34:80": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "93.184.216.34:443": { + "server_name": "www.example.org", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.org:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "83.224.65.41": { + "asn": 30722, + "flags": 1 + }, + "93.184.216.34": { + "asn": 15133, + "flags": 10 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:83.224.65.41 Flags:3}]", + "t": 0.010906 + }, + { + "msg": "conn 93.184.216.34:80: granted permission: true", + "t": 0.559491 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 34, + "x_null_null_flags": 0, + "body_length_match": true, + "headers_match": true, + "status_code_match": true, + "title_match": true, + "blocking": "tcp_ip", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.565524, + "test_start_time": "2023-11-27 16:10:01", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/observations.json new file mode 100644 index 000000000..bf66c4841 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tcpBlockingConnectionRefusedWithInconsistentDNS/observations.json @@ -0,0 +1,229 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "www.example.org", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.org", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.org", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "83.224.65.41", + "IPAddressASN": 30722, + "IPAddressOrg": "Vodafone Italia S.p.A.", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "83.224.65.41:80", + "TCPConnectFailure": "connection_refused", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": false, + "MatchWithControlIPAddressASN": false, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "4": { + "DNSTransactionIDs": [ + 1, + 2 + ], + "DNSDomain": "www.example.org", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "83.224.65.41", + "IPAddressASN": 30722, + "IPAddressOrg": "Vodafone Italia S.p.A.", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "83.224.65.41:443", + "TCPConnectFailure": "connection_refused", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "connection_refused_error", + "MatchWithControlIPAddress": false, + "MatchWithControlIPAddressASN": false, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "5": { + "DNSTransactionIDs": [], + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 5, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.org/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "6": { + "DNSTransactionIDs": [], + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.org", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/analysis.json new file mode 100644 index 000000000..9a34aa1ad --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/analysis.json @@ -0,0 +1,18 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": { + "3": true + }, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/measurement.json new file mode 100644 index 000000000..3d7151523 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/measurement.json @@ -0,0 +1,339 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.com/", + "measurement_start_time": "2023-11-27 16:10:02", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.011478, + "t": 0.017181, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.017195, + "t": 0.017195, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.017287, + "t": 0.017295, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": "connection_reset", + "operation": "read", + "proto": "tcp", + "t0": 0.017297, + "t": 0.020884, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.020887, + "t": 0.020887, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.020906, + "t": 0.020906, + "transaction_id": 3 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000056, + "t": 0.000056, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.00009, + "t": 0.000099, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000127, + "t": 0.000131, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000126, + "t": 0.006231, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000136, + "t": 0.006474, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006508, + "t": 0.006508, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000064, + "t": 0.005645, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "G9eBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000064, + "t": 0.006236, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "+TmBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000109, + "t": 0.00648, + "tags": [], + "transaction_id": 1 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.011478, + "t": 0.017181, + "tags": [], + "transaction_id": 3 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "", + "failure": "connection_reset", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [], + "server_name": "www.example.com", + "t0": 0.017195, + "t": 0.020887, + "tags": [], + "tls_version": "", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "93.184.216.34:443", + "93.184.216.34:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "93.184.216.34:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "93.184.216.34": { + "asn": 15133, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:93.184.216.34 Flags:3}]", + "t": 0.011432 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 4, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.506758, + "test_start_time": "2023-11-27 16:10:02", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/observations.json new file mode 100644 index 000000000..92e3c02f7 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithConsistentDNS/observations.json @@ -0,0 +1,92 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "connection_reset", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/analysis.json new file mode 100644 index 000000000..5da2a782e --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/analysis.json @@ -0,0 +1,21 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": { + "130.192.182.17": true + }, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": { + "3": true, + "4": true + }, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/measurement.json new file mode 100644 index 000000000..49d889a4f --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/measurement.json @@ -0,0 +1,469 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.com/", + "measurement_start_time": "2023-11-27 16:10:03", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "130.192.182.17:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.010019, + "t": 0.015723, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.01574, + "t": 0.01574, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.01584, + "t": 0.015848, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": "connection_reset", + "operation": "read", + "proto": "tcp", + "t0": 0.015851, + "t": 0.018829, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.018833, + "t": 0.018833, + "transaction_id": 3 + }, + { + "address": "130.192.182.17:443", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.018851, + "t": 0.018851, + "transaction_id": 3 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.063686, + "t": 0.068644, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.068657, + "t": 0.068657, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.068741, + "t": 0.068749, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": "connection_reset", + "operation": "read", + "proto": "tcp", + "t0": 0.06875, + "t": 0.072468, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.072477, + "t": 0.072477, + "transaction_id": 4 + }, + { + "address": "93.184.216.34:443", + "failure": null, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.072501, + "t": 0.072501, + "transaction_id": 4 + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000057, + "t": 0.000057, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000108, + "t": 0.000113, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000114, + "t": 0.000118, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000122, + "t": 0.003937, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000118, + "t": 0.004547, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.004574, + "t": 0.004574, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [ + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "CyGBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.004563, + "t": 0.005741, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "irCBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.00395, + "t": 0.005855, + "tags": [], + "transaction_id": 1 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.182.17", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000067, + "t": 0.00348, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "irCBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000066, + "t": 0.003943, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.182.17", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "CyGBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEgsC2EQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000087, + "t": 0.004553, + "tags": [], + "transaction_id": 1 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "130.192.182.17", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.010019, + "t": 0.015723, + "tags": [], + "transaction_id": 3 + }, + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.063686, + "t": 0.068644, + "tags": [], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "130.192.182.17:443", + "cipher_suite": "", + "failure": "connection_reset", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [], + "server_name": "www.example.com", + "t0": 0.01574, + "t": 0.018833, + "tags": [], + "tls_version": "", + "transaction_id": 3 + }, + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "", + "failure": "connection_reset", + "negotiated_protocol": "", + "no_tls_verify": false, + "peer_certificates": [], + "server_name": "www.example.com", + "t0": 0.068657, + "t": 0.072477, + "tags": [], + "tls_version": "", + "transaction_id": 4 + } + ], + "x_control_request": { + "http_request": "https://www.example.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "130.192.182.17:443", + "130.192.182.17:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "130.192.182.17:443": { + "status": true, + "failure": null + }, + "93.184.216.34:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "130.192.182.17:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + }, + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "130.192.182.17": { + "asn": 137, + "flags": 9 + }, + "93.184.216.34": { + "asn": 15133, + "flags": 10 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:130.192.182.17 Flags:3}]", + "t": 0.009972 + } + ], + "control_failure": null, + "x_dns_flags": 4, + "dns_experiment_failure": null, + "dns_consistency": "inconsistent", + "http_experiment_failure": null, + "x_blocking_flags": 5, + "x_null_null_flags": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "dns", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.504877, + "test_start_time": "2023-11-27 16:10:03", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/observations.json new file mode 100644 index 000000000..87c544b1b --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/tlsBlockingConnectionResetWithInconsistentDNS/observations.json @@ -0,0 +1,135 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "3": { + "DNSTransactionIDs": [ + 2, + 1 + ], + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "130.192.182.17", + "IPAddressASN": 137, + "IPAddressOrg": "Consortium GARR", + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "130.192.182.17:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "connection_reset", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": false, + "MatchWithControlIPAddressASN": false, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "4": { + "DNSTransactionIDs": [], + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressOrg": "Edgecast Inc.", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "connection_reset", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/analysis.json new file mode 100644 index 000000000..fa27d2617 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/analysis.json @@ -0,0 +1,16 @@ +{ + "DNSExperimentFailure": "dns_nxdomain_error", + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": null, + "HTTPDiffStatusCodeMatch": null, + "HTTPDiffTitleDifferentLongWords": null, + "HTTPDiffUncommonHeadersIntersection": null, + "HTTPFinalResponses": {}, + "HTTPFinalResponsesWithTLS": {}, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/measurement.json new file mode 100644 index 000000000..506e55407 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/measurement.json @@ -0,0 +1,216 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://www.example.xyz/", + "measurement_start_time": "2023-11-27 16:10:04", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.00008, + "t": 0.00008, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.00011, + "t": 0.000117, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000147, + "t": 0.000151, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000122, + "t": 0.005807, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.00016, + "t": 0.006174, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006187, + "t": 0.006187, + "transaction_id": 2 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": null, + "engine": "getaddrinfo", + "failure": "dns_nxdomain_error", + "hostname": "www.example.xyz", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000071, + "t": 0.005592, + "tags": [], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_nxdomain_error", + "hostname": "www.example.xyz", + "query_type": "AAAA", + "raw_response": "c6KBAwABAAAAAAAAA3d3dwdleGFtcGxlA3h5egAAHAAB", + "rcode": 3, + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000088, + "t": 0.005811, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_nxdomain_error", + "hostname": "www.example.xyz", + "query_type": "A", + "raw_response": "LkmBAwABAAAAAAAAA3d3dwdleGFtcGxlA3h5egAAAQAB", + "rcode": 3, + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000121, + "t": 0.00618, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [], + "x_control_request": { + "http_request": "http://www.example.xyz/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": null, + "x_quic_enabled": false + }, + "control": { + "tcp_connect": {}, + "quic_handshake": {}, + "http_request": { + "body_length": -1, + "discovered_h3_endpoint": "", + "failure": "dns_lookup_error", + "title": "", + "headers": {}, + "status_code": -1 + }, + "http3_request": null, + "dns": { + "failure": "dns_name_error", + "addrs": [] + } + }, + "x_conn_priority_log": [ + { + "msg": "create with []", + "t": 0.011593 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": "dns_nxdomain_error", + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 0, + "x_null_null_flags": 1, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": false, + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.50638, + "test_start_time": "2023-11-27 16:10:04", + "test_version": "0.5.26" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/observations.json new file mode 100644 index 000000000..e98689ff9 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/websiteDownNXDOMAIN/observations.json @@ -0,0 +1,85 @@ +{ + "DNSLookupFailures": { + "1": { + "DNSTransactionIDs": [ + 1 + ], + "DNSDomain": "www.example.xyz", + "DNSLookupFailure": "dns_nxdomain_error", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.xyz", + "ControlDNSLookupFailure": "dns_name_error", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "www.example.xyz", + "DNSLookupFailure": "dns_nxdomain_error", + "DNSQueryType": "A", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.xyz", + "ControlDNSLookupFailure": "dns_name_error", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": {} +} \ No newline at end of file From 1eaaac071af3411a63e55edcf4269d41c5c77d63 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 27 Nov 2023 17:55:20 +0100 Subject: [PATCH 29/66] start adding tests for the minipipeline --- internal/minipipeline/analysis.go | 1 - internal/minipipeline/qa_test.go | 78 +++++++++++++++++++ .../httpDiffWithConsistentDNS/analysis.json | 6 +- .../httpDiffWithInconsistentDNS/analysis.json | 6 +- 4 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 internal/minipipeline/qa_test.go diff --git a/internal/minipipeline/analysis.go b/internal/minipipeline/analysis.go index 21311dfc5..c954a2377 100644 --- a/internal/minipipeline/analysis.go +++ b/internal/minipipeline/analysis.go @@ -554,7 +554,6 @@ func (wa *WebAnalysis) ComputeHTTPDiffTitleDifferentLongWords(c *WebObservations for word, score := range words { if (score & (byProbe | byTH)) != (byProbe | byTH) { state[word] = true - break } } diff --git a/internal/minipipeline/qa_test.go b/internal/minipipeline/qa_test.go new file mode 100644 index 000000000..8cfbdbb17 --- /dev/null +++ b/internal/minipipeline/qa_test.go @@ -0,0 +1,78 @@ +package minipipeline_test + +import ( + "os" + "path/filepath" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/ooni/probe-cli/v3/internal/minipipeline" + "github.com/ooni/probe-cli/v3/internal/must" + "github.com/ooni/probe-cli/v3/internal/runtimex" +) + +func testCmpDiffUsingGenericMaps(origLeft, origRight any) string { + rawLeft := must.MarshalJSON(origLeft) + rawRight := must.MarshalJSON(origRight) + var left map[string]any + must.UnmarshalJSON(rawLeft, &left) + var right map[string]any + must.UnmarshalJSON(rawRight, &right) + return cmp.Diff(left, right) +} + +func testMustRunAllWebTestCases(t *testing.T, topdir string) { + t.Run(topdir, func(t *testing.T) { + entries := runtimex.Try1(os.ReadDir(topdir)) + for _, entry := range entries { + if !entry.IsDir() { + continue + } + t.Run(entry.Name(), func(t *testing.T) { + fullpath := filepath.Join(topdir, entry.Name()) + // read the raw measurement from the test case + measurementFile := filepath.Join(fullpath, "measurement.json") + measurementRaw := must.ReadFile(measurementFile) + var measurementData minipipeline.Measurement + must.UnmarshalJSON(measurementRaw, &measurementData) + + // load the expected container from the test case + expectedContainerFile := filepath.Join(fullpath, "observations.json") + expectedContainerRaw := must.ReadFile(expectedContainerFile) + var expectedContainerData minipipeline.WebObservationsContainer + must.UnmarshalJSON(expectedContainerRaw, &expectedContainerData) + + // load the expected analysis from the test case + expectedAnalysisFile := filepath.Join(fullpath, "analysis.json") + expectedAnalysisRaw := must.ReadFile(expectedAnalysisFile) + var expectedAnalysisData minipipeline.WebAnalysis + must.UnmarshalJSON(expectedAnalysisRaw, &expectedAnalysisData) + + // load the measurement into the pipeline + gotContainerData, err := minipipeline.LoadWebMeasurement(&measurementData) + if err != nil { + t.Fatal(err) + } + + // analyze the measurement + gotAnalysisData := minipipeline.AnalyzeWebMeasurement(gotContainerData) + + t.Run("observations", func(t *testing.T) { + if diff := testCmpDiffUsingGenericMaps(&expectedContainerData, gotContainerData); diff != "" { + t.Fatal(diff) + } + }) + + t.Run("analysis", func(t *testing.T) { + if diff := testCmpDiffUsingGenericMaps(&expectedAnalysisData, gotAnalysisData); diff != "" { + t.Fatal(diff) + } + }) + }) + } + }) +} + +func TestQAWeb(t *testing.T) { + testMustRunAllWebTestCases(t, filepath.Join("testdata", "webconnectivity", "generated")) +} diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json index 819d311e4..5fd0e0667 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithConsistentDNS/analysis.json @@ -6,7 +6,9 @@ "HTTPDiffBodyProportionFactor": 0.12263535551206783, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": { - "access": true + "access": true, + "default": true, + "denied": true }, "HTTPDiffUncommonHeadersIntersection": {}, "HTTPFinalResponses": { @@ -17,4 +19,4 @@ "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, "TCPTransactionsWithUnexplainedUnexpectedFailures": {} -} \ No newline at end of file +} diff --git a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json index 819d311e4..5fd0e0667 100644 --- a/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json +++ b/internal/minipipeline/testdata/webconnectivity/generated/httpDiffWithInconsistentDNS/analysis.json @@ -6,7 +6,9 @@ "HTTPDiffBodyProportionFactor": 0.12263535551206783, "HTTPDiffStatusCodeMatch": true, "HTTPDiffTitleDifferentLongWords": { - "access": true + "access": true, + "default": true, + "denied": true }, "HTTPDiffUncommonHeadersIntersection": {}, "HTTPFinalResponses": { @@ -17,4 +19,4 @@ "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, "TCPTransactionsWithUnexpectedHTTPFailures": {}, "TCPTransactionsWithUnexplainedUnexpectedFailures": {} -} \ No newline at end of file +} From df33632373deef70feda802c4446ecca2edb8a1c Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 27 Nov 2023 18:16:57 +0100 Subject: [PATCH 30/66] add tests for the minipipeline command --- .gitignore | 1 + internal/cmd/minipipeline/main.go | 44 +- internal/cmd/minipipeline/main_test.go | 50 + .../cmd/minipipeline/testdata/analysis.json | 23 + .../minipipeline/testdata/measurement.json | 986 ++++++++++++++++++ .../minipipeline/testdata/observations.json | 158 +++ 6 files changed, 1233 insertions(+), 29 deletions(-) create mode 100644 internal/cmd/minipipeline/main_test.go create mode 100644 internal/cmd/minipipeline/testdata/analysis.json create mode 100644 internal/cmd/minipipeline/testdata/measurement.json create mode 100644 internal/cmd/minipipeline/testdata/observations.json diff --git a/.gitignore b/.gitignore index d632bd8b7..a013e6918 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /*.csv /*.deb /*.exe +/*.json /*.jsonl /*.pprof /*.sqlite3 diff --git a/internal/cmd/minipipeline/main.go b/internal/cmd/minipipeline/main.go index dd21eaead..4dc738ca6 100644 --- a/internal/cmd/minipipeline/main.go +++ b/internal/cmd/minipipeline/main.go @@ -1,40 +1,26 @@ package main import ( + "fmt" "os" "github.com/ooni/probe-cli/v3/internal/minipipeline" "github.com/ooni/probe-cli/v3/internal/must" - "github.com/ooni/probe-cli/v3/internal/pipeline" + "github.com/ooni/probe-cli/v3/internal/runtimex" ) -func main() { - rawMeasurement := must.ReadFile(os.Args[1]) - var meas pipeline.CanonicalMeasurement - must.UnmarshalJSON(rawMeasurement, &meas) - - container := minipipeline.NewWebObservationsContainer() - container.CreateDNSLookupFailures(meas.TestKeys.Unwrap().Queries...) - container.CreateKnownIPAddresses(meas.TestKeys.Unwrap().Queries...) - container.CreateKnownTCPEndpoints(meas.TestKeys.Unwrap().TCPConnect...) - container.NoteTLSHandshakeResults(meas.TestKeys.Unwrap().TLSHandshakes...) - container.NoteHTTPRoundTripResults(meas.TestKeys.Unwrap().Requests...) - container.NoteControlResults(meas.TestKeys.Unwrap().XControlRequest.Unwrap(), meas.TestKeys.Unwrap().Control.Unwrap()) - - must.WriteFile("observation.json", must.MarshalJSON(container), 0600) - - analysis := &minipipeline.WebAnalysis{} - analysis.ComputeDNSExperimentFailure(container) - analysis.ComputeDNSTransactionsWithBogons(container) - analysis.ComputeDNSTransactionsWithUnexpectedFailures(container) - analysis.ComputeDNSPossiblyInvalidAddrs(container) - analysis.ComputeTCPTransactionsWithUnexpectedTCPConnectFailures(container) - analysis.ComputeTCPTransactionsWithUnexpectedTLSHandshakeFailures(container) - analysis.ComputeTCPTransactionsWithUnexpectedHTTPFailures(container) - analysis.ComputeHTTPDiffBodyProportionFactor(container) - analysis.ComputeHTTPDiffStatusCodeMatch(container) - analysis.ComputeHTTPDiffUncommonHeadersIntersection(container) - analysis.ComputeHTTPDiffTitleDifferentLongWords(container) +var ( + mustWriteFileFn = must.WriteFile + inputs = os.Args[1:] +) - must.WriteFile("analysis.json", must.MarshalJSON(analysis), 0600) +func main() { + for idx, name := range inputs { + var meas minipipeline.Measurement + must.UnmarshalJSON(must.ReadFile(name), &meas) + container := runtimex.Try1(minipipeline.LoadWebMeasurement(&meas)) + mustWriteFileFn(fmt.Sprintf("observations-%010d.json", idx), must.MarshalJSON(container), 0600) + analysis := minipipeline.AnalyzeWebMeasurement(container) + mustWriteFileFn(fmt.Sprintf("analysis-%010d.json", idx), must.MarshalJSON(analysis), 0600) + } } diff --git a/internal/cmd/minipipeline/main_test.go b/internal/cmd/minipipeline/main_test.go new file mode 100644 index 000000000..80400048e --- /dev/null +++ b/internal/cmd/minipipeline/main_test.go @@ -0,0 +1,50 @@ +package main + +import ( + "io/fs" + "path/filepath" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/ooni/probe-cli/v3/internal/must" +) + +func mustloadfile(filename string) (object map[string]any) { + data := must.ReadFile(filename) + must.UnmarshalJSON(data, &object) + return +} + +func mustloaddata(contentmap map[string][]byte, key string) (object map[string]any) { + data := contentmap[key] + must.UnmarshalJSON(data, &object) + return +} + +func TestMain(t *testing.T) { + // make sure we're reading from the expected input + inputs = []string{filepath.Join("testdata/measurement.json")} + + // make sure we store the expected output + contentmap := make(map[string][]byte) + mustWriteFileFn = func(filename string, content []byte, mode fs.FileMode) { + contentmap[filename] = content + } + + // run the main function + main() + + // make sure the generated observations are good + expectedObservations := mustloadfile(filepath.Join("testdata", "observations.json")) + gotObservations := mustloaddata(contentmap, "observations-0000000000.json") + if diff := cmp.Diff(expectedObservations, gotObservations); diff != "" { + t.Fatal(diff) + } + + // make sure the generated analysis is good + expectedAnalysis := mustloadfile(filepath.Join("testdata", "analysis.json")) + gotAnalysis := mustloaddata(contentmap, "analysis-0000000000.json") + if diff := cmp.Diff(expectedAnalysis, gotAnalysis); diff != "" { + t.Fatal(diff) + } +} diff --git a/internal/cmd/minipipeline/testdata/analysis.json b/internal/cmd/minipipeline/testdata/analysis.json new file mode 100644 index 000000000..6484ef312 --- /dev/null +++ b/internal/cmd/minipipeline/testdata/analysis.json @@ -0,0 +1,23 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 1, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": {}, + "HTTPDiffUncommonHeadersIntersection": { + "x-drupal-cache": true, + "x-generator": true + }, + "HTTPFinalResponses": { + "4": true + }, + "HTTPFinalResponsesWithTLS": { + "4": true + }, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} diff --git a/internal/cmd/minipipeline/testdata/measurement.json b/internal/cmd/minipipeline/testdata/measurement.json new file mode 100644 index 000000000..305465825 --- /dev/null +++ b/internal/cmd/minipipeline/testdata/measurement.json @@ -0,0 +1,986 @@ +{ + "annotations": { + "architecture": "arm64", + "engine_name": "ooniprobe-engine", + "engine_version": "3.20.0-alpha", + "go_version": "go1.20.11", + "platform": "macos", + "vcs_modified": "true", + "vcs_revision": "1eaaac071af3411a63e55edcf4269d41c5c77d63", + "vcs_time": "2023-11-27T16:55:20Z", + "vcs_tool": "git" + }, + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://nexa.polito.it/", + "measurement_start_time": "2023-11-27 17:05:00", + "probe_asn": "AS30722", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Vodafone Italia S.p.A.", + "report_id": "20231127T170500Z_webconnectivity_IT_30722_n1_keQcbSW2K4LoWC9c", + "resolver_asn": "AS30722", + "resolver_ip": "91.80.36.88", + "resolver_network_name": "Vodafone Italia S.p.A.", + "software_name": "miniooni", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://1.th.ooni.org", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "130.192.16.171:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.093297, + "t": 0.154834, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.15486, + "t": 0.15486, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 280, + "operation": "write", + "proto": "tcp", + "t0": 0.155095, + "t": 0.15513, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.155134, + "t": 0.18851, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 3957, + "operation": "read", + "proto": "tcp", + "t0": 0.188732, + "t": 0.188772, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 80, + "operation": "write", + "proto": "tcp", + "t0": 0.193892, + "t": 0.193915, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.193924, + "t": 0.193924, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.193968, + "t": 0.193968, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 304, + "operation": "write", + "proto": "tcp", + "t0": 0.194091, + "t": 0.194109, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 158, + "operation": "read", + "proto": "tcp", + "t0": 0.194948, + "t": 0.226114, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 4864, + "operation": "read", + "proto": "tcp", + "t0": 0.226159, + "t": 0.236533, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 3776, + "operation": "read", + "proto": "tcp", + "t0": 0.236932, + "t": 0.236965, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 2880, + "operation": "read", + "proto": "tcp", + "t0": 0.236969, + "t": 0.237599, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 5760, + "operation": "read", + "proto": "tcp", + "t0": 0.237604, + "t": 0.257691, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 4320, + "operation": "read", + "proto": "tcp", + "t0": 0.257839, + "t": 0.268806, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 15698, + "operation": "read", + "proto": "tcp", + "t0": 0.268812, + "t": 0.270366, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.270579, + "t": 0.270579, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.270868, + "t": 0.270917, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": "connection_already_closed", + "operation": "read", + "proto": "tcp", + "t0": 0.270564, + "t": 0.271008, + "transaction_id": 4 + }, + { + "address": "130.192.16.171:443", + "failure": null, + "num_bytes": 41989, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.271046, + "t": 0.271046, + "transaction_id": 4 + } + ], + "x_dns_whoami": { + "system_v4": [ + { + "address": "91.80.36.88" + } + ], + "udp_v4": { + "8.8.4.4:53": [ + { + "address": "91.80.36.88" + } + ] + } + }, + "x_doh": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000834, + "t": 0.000834, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.004079, + "t": 0.020861, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.020896, + "t": 0.020896, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 276, + "operation": "write", + "proto": "tcp", + "t0": 0.02106, + "t": 0.021101, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.021114, + "t": 0.054429, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 3856, + "operation": "read", + "proto": "tcp", + "t0": 0.054733, + "t": 0.054765, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.060409, + "t": 0.060486, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.060502, + "t": 0.060502, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 86, + "operation": "write", + "proto": "tcp", + "t0": 0.060567, + "t": 0.060596, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 161, + "operation": "write", + "proto": "tcp", + "t0": 0.060688, + "t": 0.060714, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 159, + "operation": "write", + "proto": "tcp", + "t0": 0.060728, + "t": 0.060745, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 38, + "operation": "write", + "proto": "tcp", + "t0": 0.060776, + "t": 0.060812, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 159, + "operation": "write", + "proto": "tcp", + "t0": 0.060933, + "t": 0.060954, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 93, + "operation": "read", + "proto": "tcp", + "t0": 0.060649, + "t": 0.077923, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 31, + "operation": "write", + "proto": "tcp", + "t0": 0.077966, + "t": 0.078012, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 283, + "operation": "read", + "proto": "tcp", + "t0": 0.078024, + "t": 0.089493, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 1182, + "operation": "read", + "proto": "tcp", + "t0": 0.089627, + "t": 0.090785, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 39, + "operation": "write", + "proto": "tcp", + "t0": 0.090846, + "t": 0.090883, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.09104, + "t": 0.09104, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.091081, + "t": 0.091123, + "transaction_id": 2 + }, + { + "address": "8.8.4.4:443", + "failure": "connection_already_closed", + "operation": "read", + "proto": "tcp", + "t0": 0.09094, + "t": 0.091199, + "transaction_id": 2 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2001:4860:4860::8888", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2001:4860:4860::8844", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "8.8.4.4", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "8.8.8.8", + "ttl": null + }, + { + "answer_type": "CNAME", + "hostname": "dns.google.", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "dns.google", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.001062, + "t": 0.002296, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "8.8.4.4", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.004079, + "t": 0.020861, + "tags": [], + "transaction_id": 2 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "8.8.4.4:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "h2", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIFGDCCBACgAwIBAgIQV9EpXtZaAjIK1doVgAiHbDANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzAeFw0yMzEwMjMxMTI1MDlaFw0yNDAxMTUxMTI1MDhaMBUxEzARBgNVBAMTCmRucy5nb29nbGUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS/h4r6JssCIvWEJSayKcnU8yd62kOQ4nX+ra3QCso7RsHWaa0cdXRD4Dlhp5zsPurOwO5eSiB8rh43WszpRlHio4IC/DCCAvgwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAxKBjtasHcGqzIQq1F88UFwyR+AMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJGFPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVwby9jZXJ0cy9ndHMxYzMuZGVyMIGsBgNVHREEgaQwgaGCCmRucy5nb29nbGWCDmRucy5nb29nbGUuY29tghAqLmRucy5nb29nbGUuY29tggs4ODg4Lmdvb2dsZYIQZG5zNjQuZG5zLmdvb2dsZYcECAgICIcECAgEBIcQIAFIYEhgAAAAAAAAAACIiIcQIAFIYEhgAAAAAAAAAACIRIcQIAFIYEhgAAAAAAAAAABkZIcQIAFIYEhgAAAAAAAAAAAAZDAhBgNVHSAEGjAYMAgGBmeBDAECATAMBgorBgEEAdZ5AgUDMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmxzLnBraS5nb29nL2d0czFjMy9mVkp4YlYtS3Rtay5jcmwwggEFBgorBgEEAdZ5AgQCBIH2BIHzAPEAdgB2/4g/Crb7lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6dAAAAYtcfwTwAAAEAwBHMEUCIEa9qmHU71YRD8ZX1TSa2jBiONx20tbOJlk8dj3j1FV8AiEAxglkfgFJCkauQvmgI8g0roFLWm4MBVLlOHt828bwJtQAdwDatr9rP7W2Ip+bwrtca+hwkXFsu1GEhTS9pD0wSNf7qwAAAYtcfwT6AAAEAwBIMEYCIQDNd9M5OMbThgFYWdEAdVYUI0MreFE0mHYFf2WhYRLRuQIhAO5KcKJoPcn7i+9SrNgHLof5JHywjWdTBr/Fct5NtqpyMA0GCSqGSIb3DQEBCwUAA4IBAQBpMDRC5q9XalL82MimRvztLMrsU4AZ38z2Kohm2wvvjF25MBwIUzI5xxYE7TFCVocdImxYY9izdvs0F3jVzYmWVyu6lvXYqMeAZf0j7YqvoXNm3rRgwgZkuviikmKJfR0E7Dy6Fyu3c+IVx62aOwDooOrjdjdkLoDQdcOCBU26IniROrScN4O8zHoZ7qVYwAFRS/a8A27loqz3oNzXm5UC5490tU0mtiqIHJR8Gzsa0s8C1vHhLkYb6lcxw4UnP7wfIjyyD9Ene6a0iwOa6y2MvH+7GGAD5pfUg2mE3eYvatYaE9hP/TiAkGP27+OhSFhpSRZgZIik3yXwAndd60Wl", + "format": "base64" + }, + { + "data": "MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAwMDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzpkgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsXlOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcmBA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKAgOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwLtmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYDVR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcwAoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcGA1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3BraS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcNAQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQcSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrLRklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2YrPxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IERlQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGsYye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjOz23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJGAJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKwjuDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd", + "format": "base64" + }, + { + "data": "MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UECxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYxOTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwSiV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351kKSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZDrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zkj5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esWCruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35EiEua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbapsZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUHMAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAyMAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIFAwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvid0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=", + "format": "base64" + } + ], + "server_name": "dns.google", + "t0": 0.020896, + "t": 0.060502, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 2 + } + ] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.0008, + "t": 0.0008, + "transaction_id": 3 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 32, + "operation": "write", + "proto": "udp", + "t0": 0.001301, + "t": 0.001329, + "transaction_id": 3 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 32, + "operation": "write", + "proto": "udp", + "t0": 0.001311, + "t": 0.001371, + "transaction_id": 3 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 48, + "operation": "read", + "proto": "udp", + "t0": 0.001361, + "t": 0.030029, + "transaction_id": 3 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 82, + "operation": "read", + "proto": "udp", + "t0": 0.001417, + "t": 0.031817, + "transaction_id": 3 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.03185, + "t": 0.03185, + "transaction_id": 3 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.16.171", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "nexa.polito.it", + "query_type": "A", + "raw_response": "9ESBgAABAAEAAAAABG5leGEGcG9saXRvAml0AAABAAHADAABAAEAAVGAAASCwBCr", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.001128, + "t": 0.030047, + "tags": [], + "transaction_id": 3 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "nexa.polito.it", + "query_type": "AAAA", + "raw_response": "4dCBgAABAAAAAQAABG5leGEGcG9saXRvAml0AAAcAAHAEQAGAAEAACowACYIbGVvbmFyZG/AEQRyb290wCx4lj/+AAAqMAAABwgAEnUAAAFRgA==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000817, + "t": 0.031832, + "tags": [], + "transaction_id": 3 + }, + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.16.171", + "ttl": null + }, + { + "answer_type": "CNAME", + "hostname": "nexa.polito.it.", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "nexa.polito.it", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000639, + "t": 0.032278, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 137, + "as_org_name": "Consortium GARR", + "answer_type": "A", + "ipv4": "130.192.16.171", + "ttl": null + } + ], + "engine": "doh", + "failure": null, + "hostname": "nexa.polito.it", + "query_type": "A", + "raw_response": "IHGBgAABAAEAAAABBG5leGEGcG9saXRvAml0AAABAAHADAABAAEAAFRgAASCwBCrAAApAgAAAIAAAZkADAGVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.google/dns-query", + "t0": 0.001105, + "t": 0.090905, + "tags": [], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "doh", + "failure": "dns_no_answer", + "hostname": "nexa.polito.it", + "query_type": "AAAA", + "raw_response": "zmOBgAABAAAAAQABBG5leGEGcG9saXRvAml0AAAcAAHAEQAGAAEAAAcIACYIbGVvbmFyZG/AEQRyb290wCx4lj/+AAAqMAAABwgAEnUAAAFRgAAAKQIAAACAAAF3AAwBcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.google/dns-query", + "t0": 0.000872, + "t": 0.091008, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "130.192.16.171:443", + "alpn": "http/1.1", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "nexa.polito.it" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "nexa.polito.it", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://nexa.polito.it/" + }, + "response": { + "body": "\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Nexa Center for Internet & Society | Il centro Nexa è un centro di ricerca del Dipartimento di Automatica e Informatica del Politecnico di Torino\n \n\n\n\n \n\n\n\n\n\n\n\n\n\n \n \n\n\n\n\n
\n
\n \n\n
\n\t\n\t\n\t\t\t\t\t\t
\n\t\t\t\t\"Nexa\n\t\t\t
\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t\t
\n
\n\n \n
\n \n
\"RSS
\n
\"Mail\"
\n
\"Communia
\n
\"Nexa
\n
\"Nexa
\n
\"Nexa
\n
\"github
\n
\n\n\n \n
\n
\n\t\t\t\t\t\n\t\t\t \n\t\t\t
\n\n\t\t\t
\n\t\t\t\t
\n \n
\n\t\t\t
\n\t\t\t\n\t\t\t \t\t\t\n\t\t\t
\n\t\t\t\t

\n\t\t\t\t
\n\t\t\t
\n\t\t\t\t\n\n
\n\n \n\t \n\t\t\t\t\t
\n\t\t \n \n\t\t\t\t\n\t\n\t
\n\t\t
\n\n\t\t\t\n\t\t\t\t\t\n\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\n\n\t\t\t\n\t\t\t
\t\t\t\n\t\t\t \n\t\t\t\t\t\t\t
\n\n\t\t\t\t \n\t\t\t \n\t\t\t\t
\n
\n\n \n
\n \n
\n \n \n \n
\n \n
\n
\n\n\n\n
    \n \t
  • \t
    \n\t\t\n\t\t\t\n\t\t\n\n\t\t\t\t\n\t\t\n\t\t\n\t\t\t\t\n\n\t\t\n\t\t\t\t\t

    \n\t\t\tnews \t\t\t

    \n\t\t\t\t\t\t\n\t\t\n\t\t\n\n\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    \"\"
    \t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    Il nuovo saggio del co-direttore del Centro Nexa Juan Carlo De Martin

    \nData di uscita: 22 settembre 2023
    \n \n
    \t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tmore >\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\n\t\t\n\t\t\n\t\t\t
    \n
  • \n
  • \t
    \n\t\t\n\t\t\t\n\t\t\n\n\t\t\t\t\n\t\t\n\t\t\n\t\t\t\t\t

    \n\t\t\tevents \t\t\t

    \n\t\t\t\t\n\n\t\t\n\t\t\t\t\t\t\n\t\t\n\t\t\n\n\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    \"\"
    \t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    15 dicembre 2023

    \nTwitter hashtag della conferenza: #nexa2023
    \n \n
    \t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tmore >\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\n\t\t\n\t\t\n\t\t\t
    \n
  • \n
  • \t
    \n\t\t\n\t\t\t\n\t\t\n\n\t\t\t\t\n\t\t\n\t\t\n\t\t\t\t\n\n\t\t\n\t\t\t\t\t

    \n\t\t\tnews \t\t\t

    \n\t\t\t\t\t\t\n\t\t\n\t\t\n\n\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    \"\"
    \t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    L'intervista di Dealogando al co-direttore del Centro Nexa Maurizio Borghi
    \n \n
    \t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tmore >\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\n\t\t\n\t\t\n\t\t\t
    \n
  • \n
  • \t
    \n\t\t\n\t\t\t\n\t\t\t\t\t

    \n\t\t\tlunch seminar \t\t\t

    \n\t\t\n\n\t\t\t\t\n\t\t\n\t\t\n\t\t\t\t\n\n\t\t\n\t\t\t\t\t\t\n\t\t\n\t\t\n\n\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    \"\"
    \t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    22 novembre 2023

    \nGIACOMO PISANI (Euricse)
    \n \n
    \t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tmore >\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\n\t\t\n\t\t\n\t\t\t
    \n
  • \n
  • \t
    \n\t\t\n\t\t\t\n\t\t\n\n\t\t\t\t\t

    \n\t\t\tmercoledì di nexa \t\t\t

    \n\t\t\t\t\n\t\t\n\t\t\n\t\t\t\t\n\n\t\t\n\t\t\t\t\t\t\n\t\t\n\t\t\n\n\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    \"\"
    \t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    8 novembre 2023

    \nGUGLIELMO TAMBURRINI (Università di Napoli Federico II)
    \n \n
    \t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tmore >\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\n\t\t\n\t\t\n\t\t\t
    \n
  • \n
  • \t
    \n\t\t\n\t\t\t\n\t\t\t\t\t

    \n\t\t\tlunch seminar \t\t\t

    \n\t\t\n\n\t\t\t\t\n\t\t\n\t\t\n\t\t\t\t\n\n\t\t\n\t\t\t\t\t\t\n\t\t\n\t\t\n\n\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    \"\"
    \t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    25 ottobre 2023

    \nLORENZO LAUDADIO (Politecnico di Torino)
    \n \n
    \t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tmore >\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\n\t\t\n\t\t\n\t\t\t
    \n
  • \n
  • \t
    \n\t\t\n\t\t\t\n\t\t\n\n\t\t\t\t\t

    \n\t\t\tmercoledì di nexa \t\t\t

    \n\t\t\t\t\n\t\t\n\t\t\n\t\t\t\t\n\n\t\t\n\t\t\t\t\t\t\n\t\t\n\t\t\n\n\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    \"\"
    \t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    11 ottobre 2023

    \nSTEVEN UMBRELLO (Institute for Ethics and Emerging Technologies)
    \n \n
    \t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tmore >\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\n\t\t\n\t\t\n\t\t\t
    \n
  • \n
\n\n\n\n
\n
\n\n\n\n\n
\n \n

Pages

\n \n \n \n \n
\n\n\n \n
\n
\n \n\t\t\t \n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\n\t\t\t \n\t\t
\n \n\t\t\n\t\t\t
\n\t\t\t\t\t\t\t\t
\n
\n\n

Upcoming events

\n \n
\n \n
\n \n \n \n
\n
\n

December

13

2023

\n\n\t
\n\n\n\t\t\t\t \n\t\t\n\t\t\t
\t\t\n\t
\n\t \n\n\n\t\n\t \n\n\n\t
\n\n\n\t\t\t\t \n\t\t\n\t\t\t\nPer il ciclo di incontri “i Mercoledì di Nexa” (ogni 2° mercoledì del mese) \n167° Mercoledì di Nexa\nInternet fatta a pezzi\nSovranità digitale,...\t\t\n\t
\n\t \n
\n
\n \n \n \n \n \n \n
\n\n\n \n
\n
\n\n

Recent Publications

\n \n
\n \n
\n \n \n \n
\n
\n \n \n \n \n \n \n
\n\n\n \n
\n
\n\t\t\t
\n\t\t \n\n\t
\n \n\t\t\t
\n\t\n\n\t\n\t
\n\t\t
\n
\n\n

search

\n \n
\n \n
\n
\n \n \n
\n
\n\n
\n
\n\n\n \n
\n
\n\n

join our community

\n \n
\n \n

Iscriviti alle nostre mailing lists, contattaci, esplora i nostri corsi, controlla le nostre offerte di lavoro, compila il nostro form per essere aggiornato su future opportunità (come bandi per assegni o borse di ricerca).

\n
\n\n\n \n
\n
\n\n

recommended links

\n \n \n\n\n \n
\n\n
\n\t
\t\t\t\t\n\n\t\n\n
\n
\n
\n\n \n
\n \n
\nNexa Center for Internet & Society
\nVia Boggio, 65/a 10138 Torino, Italy
\nPh. +39 011 090 7217 | Fax +39 011 090
\n7216 | email: info [at] nexa [dot] polito
\n[dot] it\n
\n
\nIl Centro Nexa è un centro di ricerca
\ndel Dipartimento di Automatica e
\nInformatica
del Politecnico di Torino.\n
\n
\nTranne dove altrimenti indicato, il
\ncontenuto di questo sito è rilasciato
\nsecondo i termini della licenza Creative
\nCommons Attribuzione 3.0 Unported
. / Unless otherwise noted this
\n
\n\n
\n\n\n \n
\n
\n
\n\n
\n \n\n\n\n\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Cache-Control", + "public, max-age=3600" + ], + [ + "Content-Language", + "en" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Mon, 27 Nov 2023 17:04:59 GMT" + ], + [ + "Etag", + "\"1701103514-0\"" + ], + [ + "Expires", + "Sun, 19 Nov 1978 05:00:00 GMT" + ], + [ + "Last-Modified", + "Mon, 27 Nov 2023 16:45:14 GMT" + ], + [ + "Link", + "; rel=\"canonical\",; rel=\"shortlink\"" + ], + [ + "Server", + "Apache" + ], + [ + "Vary", + "Cookie,Accept-Encoding" + ], + [ + "X-Content-Type-Options", + "nosniff" + ], + [ + "X-Content-Type-Options", + "nosniff" + ], + [ + "X-Drupal-Cache", + "HIT" + ], + [ + "X-Frame-Options", + "SAMEORIGIN" + ], + [ + "X-Generator", + "Drupal 7 (http://drupal.org)" + ] + ], + "headers": { + "Cache-Control": "public, max-age=3600", + "Content-Language": "en", + "Content-Type": "text/html; charset=utf-8", + "Date": "Mon, 27 Nov 2023 17:04:59 GMT", + "Etag": "\"1701103514-0\"", + "Expires": "Sun, 19 Nov 1978 05:00:00 GMT", + "Last-Modified": "Mon, 27 Nov 2023 16:45:14 GMT", + "Link": "; rel=\"canonical\",; rel=\"shortlink\"", + "Server": "Apache", + "Vary": "Cookie,Accept-Encoding", + "X-Content-Type-Options": "nosniff", + "X-Drupal-Cache": "HIT", + "X-Frame-Options": "SAMEORIGIN", + "X-Generator": "Drupal 7 (http://drupal.org)" + } + }, + "t0": 0.193968, + "t": 0.270579, + "tags": [], + "transaction_id": 4 + } + ], + "tcp_connect": [ + { + "ip": "130.192.16.171", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.093297, + "t": 0.154834, + "tags": [], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "130.192.16.171:443", + "cipher_suite": "TLS_AES_256_GCM_SHA384", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIE6jCCA9KgAwIBAgISBFZAokdZbIYMk8UEQfda7OD0MA0GCSqGSIb3DQEBCwUAMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJSMzAeFw0yMzExMjYyMTU3NDZaFw0yNDAyMjQyMTU3NDVaMBkxFzAVBgNVBAMTDm5leGEucG9saXRvLml0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmT5S9vysl7/q/mlUTELHA/85n/HPM2IPOMIbCWfDssRt83yX7dhy2KYk8SdaRNSb2h9FK8tUeWEu9n4mDgbEtDdHfxB4nLWY78zce9b8v3vUwCkKZgEKRS8ZB32wG+AJbOHn5Ds9G/KFdWFcsaJQ+jwLBMqmkjLna8yJ5ZwM8oo/n+IJQ8HEp5+oT7y+QNBrouv2yhBHKch7f7kaVTgtScwW1CM9WvomMemvqvvAY/PGXsa2XbBLuOR6XgMFNnH9wUFazUDXwYYJ8LYfratZO2K8PT1eq0l+SFocPVa09axmc/bbCQbzj6y2C/g8f1LhdrXj8LM2+ptHTO5ZB91YDwIDAQABo4ICETCCAg0wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRUZYql9vA0pcfbTQG0Id9tiKxlEjAfBgNVHSMEGDAWgBQULrMXt1hWy65QCUDmH6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9yMy5vLmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3IzLmkubGVuY3Iub3JnLzAZBgNVHREEEjAQgg5uZXhhLnBvbGl0by5pdDATBgNVHSAEDDAKMAgGBmeBDAECATCCAQUGCisGAQQB1nkCBAIEgfYEgfMA8QB2AEiw42vapkc0D+VqAvqdMOscUgHLVt0sgdm7v6s52IRzAAABjA3aaEkAAAQDAEcwRQIhALTycpqlJItldS4D4ctuQ9f09H3UZt/6oLwW/CNsqrUxAiBBEXQ0dqDr3dUhpAQ453EJjMw+x6q/CQCn5YDGOYvJmQB3AO7N0GTV2xrOxVy3nbTNE6Iyh0Z8vOzew1FIWUZxH7WbAAABjA3aaFEAAAQDAEgwRgIhAIIaT+IKrkJNJr6pGYgkARd5f4V/OPFdMTIdUbxDUK/hAiEA4t7hJKXi4ynSTW56DXWZSdiCx4Yr4lQW6sNKktd1fqMwDQYJKoZIhvcNAQELBQADggEBALF05LJnguNww36BYN/zTZVM9/UtHoX35Qa746Mn5//YYv6oxa57Ic8yUUGbUxvMUBzkCl3Fhkt3Qa74D6X5tH5bBVLPsy3h7fFZt7mcSM+rXMLFTfJolnfsbhp8esfdVCLsgpuTU9QFQFXalsZTFnlkUwfZF8IzuU0hNRr//pYHy38nXXsLVLNY7y/ivEKuxMWvO5Re5dxafReOCBssPVeEJAoQb21nfOkUh/8HZpi2uPxasRZrLE/jhaVMivzbTPX9baEsyA/gRWmr4+6TlvlB8xe3zCLgI3XTEene+umZ+z5x0grCIgX4v6P7AR0VuahzY1tlnVa+zYkksdWxO5M=", + "format": "base64" + }, + { + "data": "MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAwWhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3MgRW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cPR5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdxsxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8ZutmNHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxgZ3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQBgt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6WPTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wlikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQzCkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BImlJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1OyK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90IdshCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6ZvMldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqXnLRbwHOoq7hHwg==", + "format": "base64" + }, + { + "data": "MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1owTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XCov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpLwYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+DLtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5ysR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZXmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBcSLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2qlPRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TNDTwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwSwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEBATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQub3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9EU1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26ZtuMA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuGWCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9Ohe8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFCDfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5", + "format": "base64" + } + ], + "server_name": "nexa.polito.it", + "t0": 0.15486, + "t": 0.193924, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 4 + } + ], + "x_control_request": { + "http_request": "https://nexa.polito.it/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" + ] + }, + "tcp_connect": [ + "130.192.16.171:443", + "130.192.16.171:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "130.192.16.171:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "130.192.16.171:443": { + "server_name": "nexa.polito.it", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 36564, + "discovered_h3_endpoint": "", + "failure": null, + "title": "Nexa Center for Internet & Society | Il centro Nexa è un centro di ricerca del Dipartimento di Automatica e Informatica del Politecnico di Torino", + "headers": { + "Cache-Control": "public, max-age=3600", + "Content-Language": "en", + "Content-Type": "text/html; charset=utf-8", + "Date": "Mon, 27 Nov 2023 17:05:00 GMT", + "Etag": "\"1701103514-0\"", + "Expires": "Sun, 19 Nov 1978 05:00:00 GMT", + "Last-Modified": "Mon, 27 Nov 2023 16:45:14 GMT", + "Link": "; rel=\"canonical\",; rel=\"shortlink\"", + "Server": "Apache", + "Vary": "Cookie,Accept-Encoding", + "X-Content-Type-Options": "nosniff", + "X-Drupal-Cache": "HIT", + "X-Frame-Options": "SAMEORIGIN", + "X-Generator": "Drupal 7 (http://drupal.org)" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "130.192.16.171" + ] + }, + "ip_info": { + "130.192.16.171": { + "asn": 137, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:130.192.16.171 Flags:7}]", + "t": 0.091374 + }, + { + "msg": "conn 130.192.16.171:443: granted permission: true", + "t": 0.193943 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 32, + "x_null_null_flags": 0, + "body_length_match": true, + "headers_match": true, + "status_code_match": true, + "title_match": true, + "blocking": false, + "accessible": true + }, + "test_name": "web_connectivity", + "test_runtime": 1.417294625, + "test_start_time": "2023-11-27 17:04:58", + "test_version": "0.5.26" +} diff --git a/internal/cmd/minipipeline/testdata/observations.json b/internal/cmd/minipipeline/testdata/observations.json new file mode 100644 index 000000000..e4c5231ba --- /dev/null +++ b/internal/cmd/minipipeline/testdata/observations.json @@ -0,0 +1,158 @@ +{ + "DNSLookupFailures": { + "2": { + "DNSTransactionIDs": [ + 2 + ], + "DNSDomain": "nexa.polito.it", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "nexa.polito.it", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + "3": { + "DNSTransactionIDs": [ + 3 + ], + "DNSDomain": "nexa.polito.it", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "IPAddress": null, + "IPAddressASN": null, + "IPAddressOrg": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "nexa.polito.it", + "ControlDNSLookupFailure": "", + "ControlTCPConnectFailure": null, + "MatchWithControlIPAddress": null, + "MatchWithControlIPAddressASN": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": null, + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + }, + "KnownTCPEndpoints": { + "4": { + "DNSTransactionIDs": [ + 3, + 1, + 2 + ], + "DNSDomain": "nexa.polito.it", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "IPAddress": "130.192.16.171", + "IPAddressASN": 137, + "IPAddressOrg": "Consortium GARR", + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "130.192.16.171:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "nexa.polito.it", + "HTTPRequestURL": "https://nexa.polito.it/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 36564, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Cache-Control": true, + "Content-Language": true, + "Content-Type": true, + "Date": true, + "Etag": true, + "Expires": true, + "Last-Modified": true, + "Link": true, + "Server": true, + "Vary": true, + "X-Content-Type-Options": true, + "X-Drupal-Cache": true, + "X-Frame-Options": true, + "X-Generator": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Nexa Center for Internet & Society | Il centro Nexa è un centro di ricerca del Dipartimento di Automatica e Informatica del Politecnico di Torino", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": null, + "ControlDNSLookupFailure": null, + "ControlTCPConnectFailure": "", + "MatchWithControlIPAddress": true, + "MatchWithControlIPAddressASN": true, + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 36564, + "ControlHTTPResponseHeadersKeys": { + "Cache-Control": true, + "Content-Language": true, + "Content-Type": true, + "Date": true, + "Etag": true, + "Expires": true, + "Last-Modified": true, + "Link": true, + "Server": true, + "Vary": true, + "X-Content-Type-Options": true, + "X-Drupal-Cache": true, + "X-Frame-Options": true, + "X-Generator": true + }, + "ControlHTTPResponseTitle": "Nexa Center for Internet & Society | Il centro Nexa è un centro di ricerca del Dipartimento di Automatica e Informatica del Politecnico di Torino" + } + } +} From 5ad838769a926ba4a8eb7dbc45a59ad3254b2766 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 27 Nov 2023 18:27:33 +0100 Subject: [PATCH 31/66] more testing --- internal/minipipeline/qa_test.go | 1 + .../webconnectivity/generated/README.md | 1 + .../testdata/webconnectivity/manual/README.md | 1 + .../manual/youtube/analysis.json | 27 + .../manual/youtube/measurement.json | 4630 +++++++++++++++++ .../manual/youtube/observations.json | 1329 +++++ 6 files changed, 5989 insertions(+) create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/README.md create mode 100644 internal/minipipeline/testdata/webconnectivity/manual/README.md create mode 100644 internal/minipipeline/testdata/webconnectivity/manual/youtube/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/manual/youtube/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/manual/youtube/observations.json diff --git a/internal/minipipeline/qa_test.go b/internal/minipipeline/qa_test.go index 8cfbdbb17..3046010b0 100644 --- a/internal/minipipeline/qa_test.go +++ b/internal/minipipeline/qa_test.go @@ -75,4 +75,5 @@ func testMustRunAllWebTestCases(t *testing.T, topdir string) { func TestQAWeb(t *testing.T) { testMustRunAllWebTestCases(t, filepath.Join("testdata", "webconnectivity", "generated")) + testMustRunAllWebTestCases(t, filepath.Join("testdata", "webconnectivity", "manual")) } diff --git a/internal/minipipeline/testdata/webconnectivity/generated/README.md b/internal/minipipeline/testdata/webconnectivity/generated/README.md new file mode 100644 index 000000000..6baa15787 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/README.md @@ -0,0 +1 @@ +Test cases automatically generated from webconnectivityqa. diff --git a/internal/minipipeline/testdata/webconnectivity/manual/README.md b/internal/minipipeline/testdata/webconnectivity/manual/README.md new file mode 100644 index 000000000..f7582182c --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/manual/README.md @@ -0,0 +1 @@ +Manually curated test cases. diff --git a/internal/minipipeline/testdata/webconnectivity/manual/youtube/analysis.json b/internal/minipipeline/testdata/webconnectivity/manual/youtube/analysis.json new file mode 100644 index 000000000..3b80e9b19 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/manual/youtube/analysis.json @@ -0,0 +1,27 @@ +{ + "DNSExperimentFailure": null, + "DNSTransactionsWithBogons": {}, + "DNSTransactionsWithUnexpectedFailures": {}, + "DNSPossiblyInvalidAddrs": {}, + "HTTPDiffBodyProportionFactor": 0.6327409384828159, + "HTTPDiffStatusCodeMatch": true, + "HTTPDiffTitleDifferentLongWords": {}, + "HTTPDiffUncommonHeadersIntersection": { + "accept-ch": true, + "alt-svc": true, + "cross-origin-opener-policy": true, + "origin-trial": true, + "permissions-policy": true, + "report-to": true + }, + "HTTPFinalResponses": { + "8": true + }, + "HTTPFinalResponsesWithTLS": { + "8": true + }, + "TCPTransactionsWithUnexpectedTCPConnectFailures": {}, + "TCPTransactionsWithUnexpectedTLSHandshakeFailures": {}, + "TCPTransactionsWithUnexpectedHTTPFailures": {}, + "TCPTransactionsWithUnexplainedUnexpectedFailures": {} +} diff --git a/internal/minipipeline/testdata/webconnectivity/manual/youtube/measurement.json b/internal/minipipeline/testdata/webconnectivity/manual/youtube/measurement.json new file mode 100644 index 000000000..77d74c369 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/manual/youtube/measurement.json @@ -0,0 +1,4630 @@ +{ + "annotations": { + "architecture": "arm64", + "engine_name": "ooniprobe-engine", + "engine_version": "3.20.0-alpha", + "go_version": "go1.20.11", + "platform": "macos", + "vcs_modified": "true", + "vcs_revision": "1eaaac071af3411a63e55edcf4269d41c5c77d63", + "vcs_time": "2023-11-27T16:55:20Z", + "vcs_tool": "git" + }, + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.youtube.com/", + "measurement_start_time": "2023-11-27 17:00:19", + "probe_asn": "AS30722", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Vodafone Italia S.p.A.", + "report_id": "20231127T170019Z_webconnectivity_IT_30722_n1_jxD6XdPOm17Pnhif", + "resolver_asn": "AS30722", + "resolver_ip": "91.80.36.88", + "resolver_network_name": "Vodafone Italia S.p.A.", + "software_name": "miniooni", + "software_version": "3.20.0-alpha", + "test_helpers": { + "backend": { + "address": "https://1.th.ooni.org", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "142.250.180.142:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.110712, + "t": 0.129648, + "transaction_id": 5 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.110947, + "t": 0.129699, + "transaction_id": 8 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.129725, + "t": 0.129725, + "transaction_id": 5 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.12974, + "t": 0.12974, + "transaction_id": 8 + }, + { + "address": "[2a00:1450:4002:416::200e]:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.110833, + "t": 0.129765, + "transaction_id": 13 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.129834, + "t": 0.129834, + "transaction_id": 13 + }, + { + "address": "142.250.180.142:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.130073, + "t": 0.130132, + "transaction_id": 5 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.130115, + "t": 0.130171, + "transaction_id": 8 + }, + { + "address": "[2a00:1450:4002:416::200e]:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.130161, + "t": 0.130224, + "transaction_id": 13 + }, + { + "address": "216.58.204.142:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.11137, + "t": 0.131017, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.131042, + "t": 0.131042, + "transaction_id": 6 + }, + { + "address": "216.58.209.46:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.111194, + "t": 0.131048, + "transaction_id": 9 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.131082, + "t": 0.131082, + "transaction_id": 9 + }, + { + "address": "[2a00:1450:4002:402::200e]:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.111145, + "t": 0.13115, + "transaction_id": 11 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.13118, + "t": 0.13118, + "transaction_id": 11 + }, + { + "address": "216.58.209.46:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.131381, + "t": 0.131419, + "transaction_id": 9 + }, + { + "address": "216.58.204.142:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.131415, + "t": 0.131467, + "transaction_id": 6 + }, + { + "address": "[2a00:1450:4002:402::200e]:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.131472, + "t": 0.131529, + "transaction_id": 11 + }, + { + "address": "[2a00:1450:4002:403::200e]:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.111337, + "t": 0.132858, + "transaction_id": 12 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.132883, + "t": 0.132883, + "transaction_id": 12 + }, + { + "address": "142.251.209.46:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.111661, + "t": 0.132953, + "transaction_id": 14 + }, + { + "address": "216.58.205.46:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.111852, + "t": 0.132959, + "transaction_id": 15 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.132982, + "t": 0.132982, + "transaction_id": 14 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.133012, + "t": 0.133012, + "transaction_id": 15 + }, + { + "address": "[2a00:1450:4002:809::200e]:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.111739, + "t": 0.133142, + "transaction_id": 10 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.133172, + "t": 0.133172, + "transaction_id": 10 + }, + { + "address": "[2a00:1450:4002:403::200e]:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.133192, + "t": 0.133233, + "transaction_id": 12 + }, + { + "address": "[2a00:1450:4002:414::200e]:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.111708, + "t": 0.133287, + "transaction_id": 4 + }, + { + "address": "142.251.209.46:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.133275, + "t": 0.13331, + "transaction_id": 14 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.133317, + "t": 0.133317, + "transaction_id": 4 + }, + { + "address": "216.58.205.46:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.133308, + "t": 0.133344, + "transaction_id": 15 + }, + { + "address": "[2a00:1450:4002:809::200e]:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.133464, + "t": 0.1335, + "transaction_id": 10 + }, + { + "address": "[2a00:1450:4002:414::200e]:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.133622, + "t": 0.133647, + "transaction_id": 4 + }, + { + "address": "142.250.180.174:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.111918, + "t": 0.137368, + "transaction_id": 7 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.137396, + "t": 0.137396, + "transaction_id": 7 + }, + { + "address": "142.250.180.174:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 0.13769, + "t": 0.137726, + "transaction_id": 7 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.130175, + "t": 0.165604, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 824, + "operation": "read", + "proto": "tcp", + "t0": 0.165933, + "t": 0.165941, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 5369, + "operation": "read", + "proto": "tcp", + "t0": 0.165942, + "t": 0.166729, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.17204, + "t": 0.172133, + "transaction_id": 8 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.172155, + "t": 0.172155, + "transaction_id": 8 + }, + { + "address": "142.251.209.46:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.133318, + "t": 0.172205, + "transaction_id": 14 + }, + { + "address": "[2a00:1450:4002:416::200e]:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.13023, + "t": 0.172207, + "transaction_id": 13 + }, + { + "address": "142.250.180.142:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.130139, + "t": 0.172235, + "transaction_id": 5 + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.172247, + "t": 0.172247, + "transaction_id": 8 + }, + { + "address": "216.58.209.46:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.131424, + "t": 0.17226, + "transaction_id": 9 + }, + { + "address": "216.58.205.46:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.133349, + "t": 0.172351, + "transaction_id": 15 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 86, + "operation": "write", + "proto": "tcp", + "t0": 0.172356, + "t": 0.172383, + "transaction_id": 8 + }, + { + "address": "[2a00:1450:4002:416::200e]:443", + "failure": null, + "num_bytes": 3048, + "operation": "read", + "proto": "tcp", + "t0": 0.172423, + "t": 0.17243, + "transaction_id": 13 + }, + { + "address": "142.251.209.46:443", + "failure": null, + "num_bytes": 6193, + "operation": "read", + "proto": "tcp", + "t0": 0.172422, + "t": 0.172454, + "transaction_id": 14 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 199, + "operation": "write", + "proto": "tcp", + "t0": 0.172465, + "t": 0.17249, + "transaction_id": 8 + }, + { + "address": "142.250.180.142:443", + "failure": null, + "num_bytes": 6194, + "operation": "read", + "proto": "tcp", + "t0": 0.1725, + "t": 0.172543, + "transaction_id": 5 + }, + { + "address": "216.58.209.46:443", + "failure": null, + "num_bytes": 6194, + "operation": "read", + "proto": "tcp", + "t0": 0.172544, + "t": 0.172571, + "transaction_id": 9 + }, + { + "address": "216.58.205.46:443", + "failure": null, + "num_bytes": 2224, + "operation": "read", + "proto": "tcp", + "t0": 0.172578, + "t": 0.172583, + "transaction_id": 15 + }, + { + "address": "[2a00:1450:4002:403::200e]:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.133238, + "t": 0.174773, + "transaction_id": 12 + }, + { + "address": "216.58.205.46:443", + "failure": null, + "num_bytes": 3970, + "operation": "read", + "proto": "tcp", + "t0": 0.172585, + "t": 0.174805, + "transaction_id": 15 + }, + { + "address": "[2a00:1450:4002:416::200e]:443", + "failure": null, + "num_bytes": 3145, + "operation": "read", + "proto": "tcp", + "t0": 0.172432, + "t": 0.174805, + "transaction_id": 13 + }, + { + "address": "[2a00:1450:4002:403::200e]:443", + "failure": null, + "num_bytes": 3048, + "operation": "read", + "proto": "tcp", + "t0": 0.17503, + "t": 0.175037, + "transaction_id": 12 + }, + { + "address": "216.58.204.142:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.131472, + "t": 0.175542, + "transaction_id": 6 + }, + { + "address": "216.58.204.142:443", + "failure": null, + "num_bytes": 6194, + "operation": "read", + "proto": "tcp", + "t0": 0.176093, + "t": 0.176128, + "transaction_id": 6 + }, + { + "address": "[2a00:1450:4002:809::200e]:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.133505, + "t": 0.177692, + "transaction_id": 10 + }, + { + "address": "[2a00:1450:4002:809::200e]:443", + "failure": null, + "num_bytes": 632, + "operation": "read", + "proto": "tcp", + "t0": 0.177924, + "t": 0.17793, + "transaction_id": 10 + }, + { + "address": "[2a00:1450:4002:402::200e]:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.131539, + "t": 0.177938, + "transaction_id": 11 + }, + { + "address": "[2a00:1450:4002:402::200e]:443", + "failure": null, + "num_bytes": 6194, + "operation": "read", + "proto": "tcp", + "t0": 0.178104, + "t": 0.178129, + "transaction_id": 11 + }, + { + "address": "216.58.209.46:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.179877, + "t": 0.179904, + "transaction_id": 9 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.179917, + "t": 0.179917, + "transaction_id": 9 + }, + { + "address": "142.250.180.142:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.1799, + "t": 0.179926, + "transaction_id": 5 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.179932, + "t": 0.179932, + "transaction_id": 5 + }, + { + "address": "142.250.180.174:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.13773, + "t": 0.179951, + "transaction_id": 7 + }, + { + "address": "[2a00:1450:4002:809::200e]:443", + "failure": null, + "num_bytes": 5561, + "operation": "read", + "proto": "tcp", + "t0": 0.177932, + "t": 0.179987, + "transaction_id": 10 + }, + { + "address": "142.251.209.46:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.180099, + "t": 0.180131, + "transaction_id": 14 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.180139, + "t": 0.180139, + "transaction_id": 14 + }, + { + "address": "142.250.180.174:443", + "failure": null, + "num_bytes": 6193, + "operation": "read", + "proto": "tcp", + "t0": 0.180127, + "t": 0.180157, + "transaction_id": 7 + }, + { + "address": "216.58.205.46:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.180714, + "t": 0.18074, + "transaction_id": 15 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.180747, + "t": 0.180747, + "transaction_id": 15 + }, + { + "address": "[2a00:1450:4002:414::200e]:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.133651, + "t": 0.180795, + "transaction_id": 4 + }, + { + "address": "[2a00:1450:4002:414::200e]:443", + "failure": null, + "num_bytes": 6195, + "operation": "read", + "proto": "tcp", + "t0": 0.180961, + "t": 0.180991, + "transaction_id": 4 + }, + { + "address": "[2a00:1450:4002:416::200e]:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.180984, + "t": 0.181019, + "transaction_id": 13 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.181026, + "t": 0.181026, + "transaction_id": 13 + }, + { + "address": "[2a00:1450:4002:403::200e]:443", + "failure": null, + "num_bytes": 3147, + "operation": "read", + "proto": "tcp", + "t0": 0.175041, + "t": 0.181221, + "transaction_id": 12 + }, + { + "address": "216.58.204.142:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.181431, + "t": 0.181458, + "transaction_id": 6 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.181486, + "t": 0.181486, + "transaction_id": 6 + }, + { + "address": "[2a00:1450:4002:402::200e]:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.183152, + "t": 0.183177, + "transaction_id": 11 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.183185, + "t": 0.183185, + "transaction_id": 11 + }, + { + "address": "[2a00:1450:4002:809::200e]:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.184603, + "t": 0.184629, + "transaction_id": 10 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.184642, + "t": 0.184642, + "transaction_id": 10 + }, + { + "address": "142.250.180.174:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.184763, + "t": 0.184779, + "transaction_id": 7 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.184792, + "t": 0.184792, + "transaction_id": 7 + }, + { + "address": "[2a00:1450:4002:414::200e]:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.185432, + "t": 0.185448, + "transaction_id": 4 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.185456, + "t": 0.185456, + "transaction_id": 4 + }, + { + "address": "[2a00:1450:4002:403::200e]:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.186076, + "t": 0.186099, + "transaction_id": 12 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.186106, + "t": 0.186106, + "transaction_id": 12 + }, + { + "address": "216.58.205.46:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.190988, + "t": 0.190998, + "transaction_id": 15 + }, + { + "address": "216.58.205.46:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.191025, + "t": 0.191025, + "transaction_id": 15 + }, + { + "address": "216.58.209.46:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.191027, + "t": 0.191041, + "transaction_id": 9 + }, + { + "address": "142.250.180.142:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.190955, + "t": 0.191052, + "transaction_id": 5 + }, + { + "address": "216.58.209.46:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.191068, + "t": 0.191068, + "transaction_id": 9 + }, + { + "address": "142.251.209.46:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.191067, + "t": 0.191088, + "transaction_id": 14 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 93, + "operation": "read", + "proto": "tcp", + "t0": 0.172489, + "t": 0.191099, + "transaction_id": 8 + }, + { + "address": "142.251.209.46:443", + "failure": null, + "num_bytes": 6769, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.191111, + "t": 0.191111, + "transaction_id": 14 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 31, + "operation": "write", + "proto": "tcp", + "t0": 0.191109, + "t": 0.191121, + "transaction_id": 8 + }, + { + "address": "142.250.180.142:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.191143, + "t": 0.191143, + "transaction_id": 5 + }, + { + "address": "[2a00:1450:4002:416::200e]:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.191132, + "t": 0.191157, + "transaction_id": 13 + }, + { + "address": "[2a00:1450:4002:416::200e]:443", + "failure": null, + "num_bytes": 6769, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.191181, + "t": 0.191181, + "transaction_id": 13 + }, + { + "address": "216.58.204.142:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.191602, + "t": 0.191618, + "transaction_id": 6 + }, + { + "address": "216.58.204.142:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.191641, + "t": 0.191641, + "transaction_id": 6 + }, + { + "address": "[2a00:1450:4002:402::200e]:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.193444, + "t": 0.193518, + "transaction_id": 11 + }, + { + "address": "[2a00:1450:4002:402::200e]:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.193553, + "t": 0.193553, + "transaction_id": 11 + }, + { + "address": "142.250.180.174:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.194856, + "t": 0.194882, + "transaction_id": 7 + }, + { + "address": "[2a00:1450:4002:809::200e]:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.194881, + "t": 0.194898, + "transaction_id": 10 + }, + { + "address": "142.250.180.174:443", + "failure": null, + "num_bytes": 6769, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.194903, + "t": 0.194903, + "transaction_id": 7 + }, + { + "address": "[2a00:1450:4002:809::200e]:443", + "failure": null, + "num_bytes": 6769, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.194929, + "t": 0.194929, + "transaction_id": 10 + }, + { + "address": "[2a00:1450:4002:414::200e]:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.195589, + "t": 0.195608, + "transaction_id": 4 + }, + { + "address": "[2a00:1450:4002:414::200e]:443", + "failure": null, + "num_bytes": 6771, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.195636, + "t": 0.195636, + "transaction_id": 4 + }, + { + "address": "[2a00:1450:4002:403::200e]:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.196247, + "t": 0.196266, + "transaction_id": 12 + }, + { + "address": "[2a00:1450:4002:403::200e]:443", + "failure": null, + "num_bytes": 6771, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.196291, + "t": 0.196291, + "transaction_id": 12 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 6862, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.2299, + "t": 0.2299, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.191128, + "t": 0.238112, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 4495, + "operation": "read", + "proto": "tcp", + "t0": 0.238128, + "t": 0.238902, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.239047, + "t": 0.239948, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 4090, + "operation": "read", + "proto": "tcp", + "t0": 0.239955, + "t": 0.240879, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.240919, + "t": 0.240941, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 5600, + "operation": "read", + "proto": "tcp", + "t0": 0.240913, + "t": 0.27029, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 4200, + "operation": "read", + "proto": "tcp", + "t0": 0.270348, + "t": 0.271486, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 4200, + "operation": "read", + "proto": "tcp", + "t0": 0.271505, + "t": 0.273039, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.273062, + "t": 0.273282, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 4200, + "operation": "read", + "proto": "tcp", + "t0": 0.273294, + "t": 0.274585, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.274667, + "t": 0.274707, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.274736, + "t": 0.274774, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.274647, + "t": 0.275651, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 2800, + "operation": "read", + "proto": "tcp", + "t0": 0.275671, + "t": 0.277262, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.277277, + "t": 0.278647, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 8192, + "operation": "read", + "proto": "tcp", + "t0": 0.278659, + "t": 0.27935, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 208, + "operation": "read", + "proto": "tcp", + "t0": 0.279426, + "t": 0.279453, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.279469, + "t": 0.27951, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.279528, + "t": 0.279558, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 4200, + "operation": "read", + "proto": "tcp", + "t0": 0.279458, + "t": 0.280472, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.28049, + "t": 0.281124, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 2306, + "operation": "read", + "proto": "tcp", + "t0": 0.281136, + "t": 0.281883, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 494, + "operation": "read", + "proto": "tcp", + "t0": 0.281895, + "t": 0.281922, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.281932, + "t": 0.284438, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.284454, + "t": 0.285307, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 3706, + "operation": "read", + "proto": "tcp", + "t0": 0.28532, + "t": 0.286508, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 3294, + "operation": "read", + "proto": "tcp", + "t0": 0.286525, + "t": 0.286543, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.286581, + "t": 0.286601, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.286635, + "t": 0.286652, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 3706, + "operation": "read", + "proto": "tcp", + "t0": 0.286569, + "t": 0.287932, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 494, + "operation": "read", + "proto": "tcp", + "t0": 0.287954, + "t": 0.287983, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 4200, + "operation": "read", + "proto": "tcp", + "t0": 0.28799, + "t": 0.289209, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 2306, + "operation": "read", + "proto": "tcp", + "t0": 0.289222, + "t": 0.29087, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 3294, + "operation": "read", + "proto": "tcp", + "t0": 0.290879, + "t": 0.290892, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.290902, + "t": 0.290924, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.290954, + "t": 0.290979, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.290998, + "t": 0.291014, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.290943, + "t": 0.292142, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 2800, + "operation": "read", + "proto": "tcp", + "t0": 0.29216, + "t": 0.292693, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.292703, + "t": 0.293306, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 3420, + "operation": "read", + "proto": "tcp", + "t0": 0.293322, + "t": 0.294783, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 2180, + "operation": "read", + "proto": "tcp", + "t0": 0.294792, + "t": 0.294811, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.294819, + "t": 0.295107, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 3420, + "operation": "read", + "proto": "tcp", + "t0": 0.295114, + "t": 0.296149, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 780, + "operation": "read", + "proto": "tcp", + "t0": 0.296158, + "t": 0.296176, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.296206, + "t": 0.296234, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 35, + "operation": "write", + "proto": "tcp", + "t0": 0.296253, + "t": 0.296272, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1400, + "operation": "read", + "proto": "tcp", + "t0": 0.296195, + "t": 0.301087, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 4200, + "operation": "read", + "proto": "tcp", + "t0": 0.3011, + "t": 0.301832, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 620, + "operation": "read", + "proto": "tcp", + "t0": 0.301854, + "t": 0.303128, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 7618, + "operation": "read", + "proto": "tcp", + "t0": 0.303136, + "t": 0.303141, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 7000, + "operation": "read", + "proto": "tcp", + "t0": 0.303157, + "t": 0.303164, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 1562, + "operation": "read", + "proto": "tcp", + "t0": 0.303215, + "t": 0.30324, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 382309, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.880968, + "t": 0.880968, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 382309, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.021149, + "t": 1.021149, + "transaction_id": 8 + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 1.043186, + "t": 1.043186, + "transaction_id": 8 + }, + { + "address": "142.251.209.14:443", + "failure": null, + "num_bytes": 561130, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.044015, + "t": 1.044015, + "transaction_id": 8 + }, + { + "address": "[2607:f8b0:400b:807::200e]:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 1.095913, + "t": 1.218617, + "transaction_id": 20 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 1.218727, + "t": 1.218727, + "transaction_id": 20 + }, + { + "address": "[2607:f8b0:400b:807::200e]:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 1.219124, + "t": 1.219209, + "transaction_id": 20 + }, + { + "address": "142.251.41.46:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 1.095816, + "t": 1.222128, + "transaction_id": 24 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 1.222163, + "t": 1.222163, + "transaction_id": 24 + }, + { + "address": "142.251.41.46:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 1.222493, + "t": 1.222548, + "transaction_id": 24 + }, + { + "address": "[2607:f8b0:400b:80c::200e]:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 1.096169, + "t": 1.223685, + "transaction_id": 21 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 1.223726, + "t": 1.223726, + "transaction_id": 21 + }, + { + "address": "142.251.32.78:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 1.095829, + "t": 1.223881, + "transaction_id": 16 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 1.223918, + "t": 1.223918, + "transaction_id": 16 + }, + { + "address": "[2607:f8b0:400b:80c::200e]:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 1.224119, + "t": 1.224187, + "transaction_id": 21 + }, + { + "address": "142.251.32.78:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 1.22423, + "t": 1.224274, + "transaction_id": 16 + }, + { + "address": "[2607:f8b0:400b:803::200e]:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 1.096267, + "t": 1.224323, + "transaction_id": 17 + }, + { + "address": "142.251.41.78:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 1.096127, + "t": 1.224341, + "transaction_id": 22 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 1.224351, + "t": 1.224351, + "transaction_id": 17 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 1.224377, + "t": 1.224377, + "transaction_id": 22 + }, + { + "address": "[2607:f8b0:400b:803::200e]:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 1.22464, + "t": 1.224689, + "transaction_id": 17 + }, + { + "address": "[2607:f8b0:400b:80f::200e]:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 1.096254, + "t": 1.224741, + "transaction_id": 18 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 1.224762, + "t": 1.224762, + "transaction_id": 18 + }, + { + "address": "142.251.41.78:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 1.224876, + "t": 1.224919, + "transaction_id": 22 + }, + { + "address": "172.217.1.14:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 1.095932, + "t": 1.224968, + "transaction_id": 19 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 1.225018, + "t": 1.225018, + "transaction_id": 19 + }, + { + "address": "[2607:f8b0:400b:80f::200e]:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 1.225044, + "t": 1.22508, + "transaction_id": 18 + }, + { + "address": "142.251.33.174:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 1.096281, + "t": 1.2251319999999999, + "transaction_id": 23 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 1.225152, + "t": 1.225152, + "transaction_id": 23 + }, + { + "address": "172.217.1.14:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 1.225349, + "t": 1.225428, + "transaction_id": 19 + }, + { + "address": "142.251.33.174:443", + "failure": null, + "num_bytes": 281, + "operation": "write", + "proto": "tcp", + "t0": 1.225702, + "t": 1.225751, + "transaction_id": 23 + }, + { + "address": "[2607:f8b0:400b:807::200e]:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 1.21922, + "t": 1.3642210000000001, + "transaction_id": 20 + }, + { + "address": "[2607:f8b0:400b:807::200e]:443", + "failure": null, + "num_bytes": 6195, + "operation": "read", + "proto": "tcp", + "t0": 1.364797, + "t": 1.364844, + "transaction_id": 20 + }, + { + "address": "[2607:f8b0:400b:807::200e]:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 1.372578, + "t": 1.372621, + "transaction_id": 20 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 1.372647, + "t": 1.372647, + "transaction_id": 20 + }, + { + "address": "142.251.33.174:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 1.225757, + "t": 1.372681, + "transaction_id": 23 + }, + { + "address": "142.251.41.78:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 1.2249240000000001, + "t": 1.372686, + "transaction_id": 22 + }, + { + "address": "142.251.32.78:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 1.2242790000000001, + "t": 1.3726880000000001, + "transaction_id": 16 + }, + { + "address": "[2607:f8b0:400b:80f::200e]:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 1.225084, + "t": 1.3726880000000001, + "transaction_id": 18 + }, + { + "address": "142.251.32.78:443", + "failure": null, + "num_bytes": 6194, + "operation": "read", + "proto": "tcp", + "t0": 1.372906, + "t": 1.372928, + "transaction_id": 16 + }, + { + "address": "142.251.33.174:443", + "failure": null, + "num_bytes": 6194, + "operation": "read", + "proto": "tcp", + "t0": 1.372918, + "t": 1.372942, + "transaction_id": 23 + }, + { + "address": "142.251.41.78:443", + "failure": null, + "num_bytes": 6194, + "operation": "read", + "proto": "tcp", + "t0": 1.372961, + "t": 1.373004, + "transaction_id": 22 + }, + { + "address": "[2607:f8b0:400b:80f::200e]:443", + "failure": null, + "num_bytes": 6194, + "operation": "read", + "proto": "tcp", + "t0": 1.373046, + "t": 1.373067, + "transaction_id": 18 + }, + { + "address": "[2607:f8b0:400b:803::200e]:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 1.224693, + "t": 1.3739430000000001, + "transaction_id": 17 + }, + { + "address": "172.217.1.14:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 1.225432, + "t": 1.373944, + "transaction_id": 19 + }, + { + "address": "142.251.41.46:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 1.222553, + "t": 1.3739460000000001, + "transaction_id": 24 + }, + { + "address": "[2607:f8b0:400b:80c::200e]:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 1.224193, + "t": 1.374024, + "transaction_id": 21 + }, + { + "address": "[2607:f8b0:400b:803::200e]:443", + "failure": null, + "num_bytes": 6193, + "operation": "read", + "proto": "tcp", + "t0": 1.374122, + "t": 1.374142, + "transaction_id": 17 + }, + { + "address": "142.251.41.46:443", + "failure": null, + "num_bytes": 6195, + "operation": "read", + "proto": "tcp", + "t0": 1.3741349999999999, + "t": 1.374156, + "transaction_id": 24 + }, + { + "address": "[2607:f8b0:400b:80c::200e]:443", + "failure": null, + "num_bytes": 6194, + "operation": "read", + "proto": "tcp", + "t0": 1.3742, + "t": 1.374221, + "transaction_id": 21 + }, + { + "address": "172.217.1.14:443", + "failure": null, + "num_bytes": 6194, + "operation": "read", + "proto": "tcp", + "t0": 1.374235, + "t": 1.374308, + "transaction_id": 19 + }, + { + "address": "[2607:f8b0:400b:803::200e]:443", + "failure": null, + "num_bytes": 6769, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.376978, + "t": 1.376978, + "transaction_id": 17 + }, + { + "address": "142.251.41.78:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 1.379372, + "t": 1.379418, + "transaction_id": 22 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 1.379432, + "t": 1.379432, + "transaction_id": 22 + }, + { + "address": "142.251.32.78:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 1.37964, + "t": 1.379677, + "transaction_id": 16 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 1.379689, + "t": 1.379689, + "transaction_id": 16 + }, + { + "address": "142.251.33.174:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 1.37991, + "t": 1.379931, + "transaction_id": 23 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 1.379939, + "t": 1.379939, + "transaction_id": 23 + }, + { + "address": "142.251.41.46:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 1.381249, + "t": 1.381271, + "transaction_id": 24 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 1.381278, + "t": 1.381278, + "transaction_id": 24 + }, + { + "address": "[2607:f8b0:400b:803::200e]:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 1.381708, + "t": 1.381744, + "transaction_id": 17 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 1.381757, + "t": 1.381757, + "transaction_id": 17 + }, + { + "address": "[2607:f8b0:400b:80f::200e]:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 1.38189, + "t": 1.3819270000000001, + "transaction_id": 18 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 1.381942, + "t": 1.381942, + "transaction_id": 18 + }, + { + "address": "[2607:f8b0:400b:80c::200e]:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 1.382057, + "t": 1.382087, + "transaction_id": 21 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 1.382094, + "t": 1.382094, + "transaction_id": 21 + }, + { + "address": "[2607:f8b0:400b:807::200e]:443", + "failure": null, + "num_bytes": 6771, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.382798, + "t": 1.382798, + "transaction_id": 20 + }, + { + "address": "[2607:f8b0:400b:807::200e]:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 1.382776, + "t": 1.382801, + "transaction_id": 20 + }, + { + "address": "[2607:f8b0:400b:807::200e]:443", + "failure": null, + "num_bytes": 6771, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.38285, + "t": 1.38285, + "transaction_id": 20 + }, + { + "address": "172.217.1.14:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 1.384042, + "t": 1.384071, + "transaction_id": 19 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 1.3840810000000001, + "t": 1.3840810000000001, + "transaction_id": 19 + }, + { + "address": "142.251.32.78:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 1.389751, + "t": 1.389766, + "transaction_id": 16 + }, + { + "address": "142.251.41.78:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 1.3897599999999999, + "t": 1.38978, + "transaction_id": 22 + }, + { + "address": "142.251.32.78:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.389799, + "t": 1.389799, + "transaction_id": 16 + }, + { + "address": "142.251.41.78:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.389808, + "t": 1.389808, + "transaction_id": 22 + }, + { + "address": "142.251.33.174:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 1.390004, + "t": 1.390016, + "transaction_id": 23 + }, + { + "address": "142.251.33.174:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.390033, + "t": 1.390033, + "transaction_id": 23 + }, + { + "address": "142.251.41.46:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 1.391485, + "t": 1.3915009999999999, + "transaction_id": 24 + }, + { + "address": "142.251.41.46:443", + "failure": null, + "num_bytes": 6771, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.391519, + "t": 1.391519, + "transaction_id": 24 + }, + { + "address": "[2607:f8b0:400b:803::200e]:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 1.39185, + "t": 1.391869, + "transaction_id": 17 + }, + { + "address": "[2607:f8b0:400b:803::200e]:443", + "failure": null, + "num_bytes": 6769, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.391887, + "t": 1.391887, + "transaction_id": 17 + }, + { + "address": "[2607:f8b0:400b:80f::200e]:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 1.392004, + "t": 1.392017, + "transaction_id": 18 + }, + { + "address": "[2607:f8b0:400b:80f::200e]:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.39204, + "t": 1.39204, + "transaction_id": 18 + }, + { + "address": "[2607:f8b0:400b:80c::200e]:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 1.3921510000000001, + "t": 1.3921649999999999, + "transaction_id": 21 + }, + { + "address": "[2607:f8b0:400b:80c::200e]:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.392183, + "t": 1.392183, + "transaction_id": 21 + }, + { + "address": "172.217.1.14:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 1.394353, + "t": 1.394371, + "transaction_id": 19 + }, + { + "address": "172.217.1.14:443", + "failure": null, + "num_bytes": 6770, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.3943889999999999, + "t": 1.3943889999999999, + "transaction_id": 19 + } + ], + "x_dns_whoami": { + "system_v4": [ + { + "address": "91.80.36.88" + } + ], + "udp_v4": { + "8.8.4.4:53": [ + { + "address": "91.80.36.88" + } + ] + } + }, + "x_doh": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000425, + "t": 0.000425, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.025882, + "t": 0.051755, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.051792, + "t": 0.051792, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 279, + "operation": "write", + "proto": "tcp", + "t0": 0.051978, + "t": 0.052052, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.052067, + "t": 0.078002, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 2926, + "operation": "read", + "proto": "tcp", + "t0": 0.078278, + "t": 0.078283, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 80, + "operation": "write", + "proto": "tcp", + "t0": 0.080889, + "t": 0.08093, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.08096, + "t": 0.08096, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 86, + "operation": "write", + "proto": "tcp", + "t0": 0.081057, + "t": 0.081078, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 164, + "operation": "write", + "proto": "tcp", + "t0": 0.081181, + "t": 0.081202, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 159, + "operation": "write", + "proto": "tcp", + "t0": 0.081211, + "t": 0.08123, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 38, + "operation": "write", + "proto": "tcp", + "t0": 0.081243, + "t": 0.081265, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 159, + "operation": "write", + "proto": "tcp", + "t0": 0.081269, + "t": 0.081286, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 542, + "operation": "read", + "proto": "tcp", + "t0": 0.081128, + "t": 0.107252, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 626, + "operation": "read", + "proto": "tcp", + "t0": 0.107313, + "t": 0.108977, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 31, + "operation": "write", + "proto": "tcp", + "t0": 0.109048, + "t": 0.109089, + "transaction_id": 2 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.10966, + "t": 0.10966, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.109708, + "t": 0.109755, + "transaction_id": 2 + }, + { + "address": "9.9.9.9:443", + "failure": "connection_already_closed", + "operation": "read", + "proto": "tcp", + "t0": 0.109223, + "t": 0.109867, + "transaction_id": 2 + } + ], + "queries": [ + { + "answers": [ + { + "asn": 19281, + "as_org_name": "Quad9", + "answer_type": "AAAA", + "ipv6": "2620:fe::9", + "ttl": null + }, + { + "asn": 19281, + "as_org_name": "Quad9", + "answer_type": "AAAA", + "ipv6": "2620:fe::fe", + "ttl": null + }, + { + "asn": 19281, + "as_org_name": "Quad9", + "answer_type": "A", + "ipv4": "9.9.9.9", + "ttl": null + }, + { + "asn": 19281, + "as_org_name": "Quad9", + "answer_type": "A", + "ipv4": "149.112.112.112", + "ttl": null + }, + { + "answer_type": "CNAME", + "hostname": "dns.quad9.net.", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "dns.quad9.net", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000647, + "t": 0.024963, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "9.9.9.9", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.025882, + "t": 0.051755, + "tags": [], + "transaction_id": 2 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "9.9.9.9:443", + "cipher_suite": "TLS_AES_256_GCM_SHA384", + "failure": null, + "negotiated_protocol": "h2", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIGyDCCBk6gAwIBAgIQDQsh8YVJ+5rl2I/Z0i4MlzAKBggqhkjOPQQDAzBWMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMTAwLgYDVQQDEydEaWdpQ2VydCBUTFMgSHlicmlkIEVDQyBTSEEzODQgMjAyMCBDQTEwHhcNMjMwNzMxMDAwMDAwWhcNMjQwODA2MjM1OTU5WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMIQmVya2VsZXkxDjAMBgNVBAoTBVF1YWQ5MRQwEgYDVQQDDAsqLnF1YWQ5Lm5ldDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH2L1x0DhQ0YJbM0HCmhJ9SsASVIiqDx6gK52FEsCGqsclbs+j2moJ9JCVWOrP65cxdcAvt4zCSRlG9DI4kOHWajggT3MIIE8zAfBgNVHSMEGDAWgBQKvAgpF4ylOW16Ds4zxy6z7fvDejAdBgNVHQ4EFgQUf6kSpdfGi0gCxz0qRW5AHkBg9JcwggGNBgNVHREEggGEMIIBgIILKi5xdWFkOS5uZXSCCXF1YWQ5Lm5ldIcECQkJCYcECQkJCocECQkJC4cECQkJDIcECQkJDYcECQkJDocECQkJD4cElXBwCYcElXBwCocElXBwC4cElXBwDIcElXBwDYcElXBwDocElXBwD4cElXBwcIcQJiAA/gAAAAAAAAAAAAAACYcQJiAA/gAAAAAAAAAAAAAAEIcQJiAA/gAAAAAAAAAAAAAAEYcQJiAA/gAAAAAAAAAAAAAAEocQJiAA/gAAAAAAAAAAAAAAE4cQJiAA/gAAAAAAAAAAAAAAFIcQJiAA/gAAAAAAAAAAAAAAFYcQJiAA/gAAAAAAAAAAAAAA/ocQJiAA/gAAAAAAAAAAAP4ACYcQJiAA/gAAAAAAAAAAAP4AEIcQJiAA/gAAAAAAAAAAAP4AEYcQJiAA/gAAAAAAAAAAAP4AEocQJiAA/gAAAAAAAAAAAP4AE4cQJiAA/gAAAAAAAAAAAP4AFIcQJiAA/gAAAAAAAAAAAP4AFTAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMIGbBgNVHR8EgZMwgZAwRqBEoEKGQGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRMU0h5YnJpZEVDQ1NIQTM4NDIwMjBDQTEtMS5jcmwwRqBEoEKGQGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRMU0h5YnJpZEVDQ1NIQTM4NDIwMjBDQTEtMS5jcmwwPgYDVR0gBDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGFBggrBgEFBQcBAQR5MHcwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEFBQcwAoZDaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTSHlicmlkRUNDU0hBMzg0MjAyMENBMS0xLmNydDAJBgNVHRMEAjAAMIIBfgYKKwYBBAHWeQIEAgSCAW4EggFqAWgAdgDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYmtrLxjAAAEAwBHMEUCIQCAWtmgTRnZsqjxZ7jdiDq0EEfxBB4kMj7oaZPv+URihQIgUJxBXliHw3ic/24+0NilFj/WfEcV1kNRARUhXS6xn08AdwBIsONr2qZHNA/lagL6nTDrHFIBy1bdLIHZu7+rOdiEcwAAAYmtrLxLAAAEAwBIMEYCIQClQbGksPNEGkRsO930WOdpYDBhFWVD44nw9ks9uyawJAIhAPypE9SPFDDkOgrOw+K++guz486lzdjaAfVzdyO6sw80AHUA2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0vaQ9MEjX+6sAAAGJray8FwAABAMARjBEAiBMmvofeflmsV3JoyFVid5GiJaPHkH9fDWkS93eP9fgEQIgfkTwCbSFNKnF47riYP4MJow7haBO+pFwRW5WAEC1AQQwCgYIKoZIzj0EAwMDaAAwZQIwOOsRrmNqg61CQTVH/6I6W1ZKb+5efJZpgZLVhCirpay7lyiuNyC1QkF6jfTAh+nGAjEAoRSNqC4pY/1GUJ3ygEjSOkUKlFnpXSxYIxJz9yJ43z05faF/uL+mrpAV9GXi2cpt", + "format": "base64" + }, + { + "data": "MIIEFzCCAv+gAwIBAgIQB/LzXIeod6967+lHmTUlvTANBgkqhkiG9w0BAQwFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaMFYxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMDAuBgNVBAMTJ0RpZ2lDZXJ0IFRMUyBIeWJyaWQgRUNDIFNIQTM4NCAyMDIwIENBMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMEbxppbmNmkKaDp1AS12+umsmxVwP/tmMZJLwYnUcu/cMEFesOxnYeJuq20ExfJqLSDyLiQ0cx0NTY8g3KwtdD3ImnI8YDEe0CPz2iHJlw5ifFNkU3aiYvkA8ND5b8vc6OCAYIwggF+MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAq8CCkXjKU5bXoOzjPHLrPt+8N6MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDA9BgNVHSAENjA0MAsGCWCGSAGG/WwCATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgGBmeBDAECAzANBgkqhkiG9w0BAQwFAAOCAQEAR1mBf9QbH7Bx9phdGLqYR5iwfnYr6v8ai6wms0KNMeZK6BnQ79oU59cUkqGS8qcuLa/7Hfb7U7CKP/zYFgrpsC62pQsYkDUmotr2qLcy/JUjS8ZFucTP5Hzu5sn4kL1y45nDHQsFfGqXbbKrAjbYwrwsAZI/BKOLdRHHuSm8EdCGupK8JvllyDfNJvaGEwwEqonleLHBTnm8dqMLUeTF0J5q/hosVq4GNiejcxwIfZMy0MJEGdqN9A57HSgDKwmKdsp33Id6rHtSJlWncg+d0ohP/rEhxRqhqjn1VtvChMQ1H3Dau0bwhr9kAMQ+959GG50jBbl9s08PqUU643QwmA==", + "format": "base64" + } + ], + "server_name": "dns.quad9.net", + "t0": 0.051792, + "t": 0.08096, + "tags": [], + "tls_version": "TLSv1.3", + "transaction_id": 2 + } + ] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000384, + "t": 0.000384, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000874, + "t": 0.000891, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.00104, + "t": 0.00106, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 179, + "operation": "read", + "proto": "udp", + "t0": 0.000899, + "t": 0.019911, + "transaction_id": 1 + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 163, + "operation": "read", + "proto": "udp", + "t0": 0.001073, + "t": 0.022453, + "transaction_id": 1 + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.023203, + "t": 0.023203, + "transaction_id": 1 + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:402::200e", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:403::200e", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:414::200e", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:416::200e", + "ttl": null + }, + { + "answer_type": "CNAME", + "hostname": "youtube-ui.l.google.com.", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.youtube.com", + "query_type": "AAAA", + "raw_response": "5zmBgAABAAUAAAAAA3d3dwd5b3V0dWJlA2NvbQAAHAABwAwABQABAAAAmgAWCnlvdXR1YmUtdWkBbAZnb29nbGXAGMAtABwAAQAAABsAECoAFFBAAgQCAAAAAAAAIA7ALQAcAAEAAAAbABAqABRQQAIEAwAAAAAAACAOwC0AHAABAAAAGwAQKgAUUEACBBQAAAAAAAAgDsAtABwAAQAAABsAECoAFFBAAgQWAAAAAAAAIA4=", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000409, + "t": 0.019946, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "216.58.205.46", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.250.180.142", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.250.180.174", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.251.209.14", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.251.209.46", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "216.58.204.142", + "ttl": null + }, + { + "answer_type": "CNAME", + "hostname": "youtube-ui.l.google.com.", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.youtube.com", + "query_type": "A", + "raw_response": "GlGBgAABAAcAAAAAA3d3dwd5b3V0dWJlA2NvbQAAAQABwAwABQABAAAAmgAWCnlvdXR1YmUtdWkBbAZnb29nbGXAGMAtAAEAAQAAACoABNg6zS7ALQABAAEAAAAqAASO+rSOwC0AAQABAAAAKgAEjvq0rsAtAAEAAQAAACoABI770Q7ALQABAAEAAAAqAASO+9EuwC0AAQABAAAAKgAE2DrMjg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000911, + "t": 0.022486, + "tags": [], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:402::200e", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:403::200e", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:414::200e", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:416::200e", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.250.180.142", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "216.58.204.142", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.250.180.174", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.251.209.14", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.251.209.46", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "216.58.205.46", + "ttl": null + }, + { + "answer_type": "CNAME", + "hostname": "youtube-ui.l.google.com.", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.youtube.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000477, + "t": 0.023412, + "tags": [], + "transaction_id": 3 + }, + { + "answers": [ + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:402::200e", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:809::200e", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:414::200e", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "AAAA", + "ipv6": "2a00:1450:4002:416::200e", + "ttl": null + }, + { + "answer_type": "CNAME", + "hostname": "youtube-ui.l.google.com.", + "ttl": null + } + ], + "engine": "doh", + "failure": null, + "hostname": "www.youtube.com", + "query_type": "AAAA", + "raw_response": "YDGBgAABAAUAAAABA3d3dwd5b3V0dWJlA2NvbQAAHAABwAwABQABAAAABQAWCnlvdXR1YmUtdWkBbAZnb29nbGXAGMAtABwAAQAAAEEAECoAFFBAAgQCAAAAAAAAIA7ALQAcAAEAAABBABAqABRQQAIICQAAAAAAACAOwC0AHAABAAAAQQAQKgAUUEACBBQAAAAAAAAgDsAtABwAAQAAAEEAECoAFFBAAgQWAAAAAAAAIA4AACkE0AAAgAAAAA==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.quad9.net/dns-query", + "t0": 0.000444, + "t": 0.109346, + "tags": [], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.251.209.14", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.251.209.46", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "216.58.209.46", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "216.58.204.142", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "216.58.205.46", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.250.180.142", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "142.250.180.174", + "ttl": null + }, + { + "answer_type": "CNAME", + "hostname": "youtube-ui.l.google.com.", + "ttl": null + } + ], + "engine": "doh", + "failure": null, + "hostname": "www.youtube.com", + "query_type": "A", + "raw_response": "evyBgAABAAgAAAABA3d3dwd5b3V0dWJlA2NvbQAAAQABwAwABQABAAAABQAWCnlvdXR1YmUtdWkBbAZnb29nbGXAGMAtAAEAAQAAAG8ABI770Q7ALQABAAEAAABvAASO+9EuwC0AAQABAAAAbwAE2DrRLsAtAAEAAQAAAG8ABNg6zI7ALQABAAEAAABvAATYOs0uwC0AAQABAAAAbwAEjvq0jsAtAAEAAQAAAG8ABI76tK4AACkE0AAAgAAAAA==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.quad9.net/dns-query", + "t0": 0.000939, + "t": 0.109379, + "tags": [], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "142.251.209.14:443", + "alpn": "h2", + "failure": null, + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "www.youtube.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "www.youtube.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.36" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://www.youtube.com/" + }, + "response": { + "body": "YouTube
AboutPressCopyrightContact usCreatorsAdvertiseDevelopersTermsPrivacyPolicy & SafetyHow YouTube worksTest new features
© 2023 Google LLC